@valtimo/form-view-model 12.6.1 → 12.8.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.
@@ -15,17 +15,20 @@
15
15
  */
16
16
  import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
17
17
  import moment from 'moment';
18
- import { BehaviorSubject, catchError, combineLatest, debounceTime, EMPTY, of, switchMap, take, tap, } from 'rxjs';
18
+ import { BehaviorSubject, combineLatest, filter, Subject, switchMap, take, tap, } from 'rxjs';
19
19
  import { FormioModule, } from '@formio/angular';
20
20
  import { distinctUntilChanged, map } from 'rxjs/operators';
21
21
  import { deepmerge } from 'deepmerge-ts';
22
+ import { HttpErrorResponse } from '@angular/common/http';
22
23
  import { CommonModule } from '@angular/common';
24
+ import { LayerModule } from 'carbon-components-angular';
23
25
  import * as i0 from "@angular/core";
24
26
  import * as i1 from "../../services";
25
27
  import * as i2 from "@ngx-translate/core";
26
28
  import * as i3 from "@valtimo/components";
27
29
  import * as i4 from "@angular/common";
28
30
  import * as i5 from "@formio/angular";
31
+ import * as i6 from "carbon-components-angular";
29
32
  moment.defaultFormat = 'DD MMM YYYY HH:mm';
30
33
  export class FormViewModelComponent {
31
34
  set options(optionsValue) {
@@ -39,6 +42,8 @@ export class FormViewModelComponent {
39
42
  const form = {
40
43
  loadInitialViewModel: () => instance.loadInitialViewModel(),
41
44
  updateViewModel: () => instance.updateViewModel(),
45
+ loadInitialStartFormViewModel: () => instance.loadInitialViewModelForStartForm(),
46
+ updateViewStartFormModel: () => instance.updateViewModelForStartForm(),
42
47
  ...formValue,
43
48
  };
44
49
  this.form$.next(form);
@@ -52,6 +57,9 @@ export class FormViewModelComponent {
52
57
  set isStartForm(isStartFormValue) {
53
58
  this.isStartForm$.next(isStartFormValue);
54
59
  }
60
+ set documentId(documentId) {
61
+ this.documentId$.next(documentId);
62
+ }
55
63
  set processDefinitionKey(processDefinitionKeyValue) {
56
64
  this.processDefinitionKey$.next(processDefinitionKeyValue);
57
65
  }
@@ -63,23 +71,27 @@ export class FormViewModelComponent {
63
71
  this.translateService = translateService;
64
72
  this.stateService = stateService;
65
73
  this.formSubmit = new EventEmitter();
66
- this.errors = [];
67
74
  this.refreshForm = new EventEmitter();
68
75
  this._preventNextPage = false;
69
76
  this._preventPreviousPage = false;
70
77
  this._isWizard = false;
78
+ this.pendingUpdateSubscription = null;
71
79
  this.submission$ = new BehaviorSubject({});
72
80
  this.form$ = new BehaviorSubject(undefined);
73
81
  this.formName$ = new BehaviorSubject(undefined);
82
+ this.formErrors$ = new BehaviorSubject([]);
74
83
  this.options$ = new BehaviorSubject(undefined);
75
84
  this.taskInstanceId$ = new BehaviorSubject(undefined);
76
85
  this.tokenSetInLocalStorage$ = new BehaviorSubject(false);
77
86
  this.change$ = new BehaviorSubject(null);
78
- this.blur$ = new BehaviorSubject(null);
87
+ this.blur$ = new Subject();
88
+ this.focus$ = new BehaviorSubject(null);
79
89
  this.loading$ = new BehaviorSubject(true);
80
90
  this.isStartForm$ = new BehaviorSubject(false);
91
+ this.documentId$ = new BehaviorSubject(null);
81
92
  this.processDefinitionKey$ = new BehaviorSubject(undefined);
82
93
  this.documentDefinitionName$ = new BehaviorSubject(undefined);
94
+ this.updateForm = new Subject();
83
95
  this.currentLanguage$ = this.translateService.stream('key').pipe(map(() => this.translateService.currentLang), distinctUntilChanged());
84
96
  this._overrideOptions$ = new BehaviorSubject({
85
97
  hooks: {
@@ -87,21 +99,24 @@ export class FormViewModelComponent {
87
99
  },
88
100
  });
89
101
  this.formioOptions$ = combineLatest([
90
- this.currentLanguage$,
91
102
  this.options$,
92
103
  this._overrideOptions$,
93
- ]).pipe(map(([language, options, overrideOptions]) => {
104
+ ]).pipe(map(([options, overrideOptions]) => {
105
+ return deepmerge(options, overrideOptions);
106
+ }));
107
+ this.renderOptions$ = combineLatest([this.currentLanguage$]).pipe(map(([language]) => {
94
108
  const formioTranslations = this.translateService.instant('formioTranslations');
95
- const defaultOptions = {
96
- ...options,
109
+ return {
97
110
  language,
98
- ...(formioTranslations === 'object' && {
99
- i18n: {
100
- [language]: this.stateService.flattenTranslationsObject(formioTranslations),
101
- },
102
- }),
111
+ ...(typeof formioTranslations === 'object'
112
+ ? {
113
+ language,
114
+ i18n: {
115
+ [language]: this.stateService.flattenTranslationsObject(formioTranslations),
116
+ },
117
+ }
118
+ : {}),
103
119
  };
104
- return deepmerge(defaultOptions, overrideOptions);
105
120
  }));
106
121
  }
107
122
  ngOnInit() {
@@ -111,71 +126,112 @@ export class FormViewModelComponent {
111
126
  else {
112
127
  this.loadInitialViewModel();
113
128
  }
129
+ this.focusSubscription = this.focus$
130
+ .pipe(filter(e => {
131
+ // We only want to handle blur events after entering an input
132
+ return !!e && e.target instanceof HTMLInputElement;
133
+ }))
134
+ .subscribe(() => {
135
+ this.pendingUpdateSubscription?.unsubscribe();
136
+ this.blurSubscription?.unsubscribe();
137
+ this.blurSubscription = this.blur$
138
+ .pipe(filter(e => {
139
+ // Filter out events where relatedTarget is not null.
140
+ // The relatedTarget will be null when no new input is focused.
141
+ return !e.relatedTarget;
142
+ }))
143
+ .subscribe(() => {
144
+ this.blurSubscription?.unsubscribe();
145
+ this.setWaitCursor(true);
146
+ this.updateForm.next(true);
147
+ });
148
+ });
149
+ this.updateSubscription = this.updateForm.subscribe(() => {
150
+ if (this.isStartForm$.value) {
151
+ this.updateViewModelForStartForm();
152
+ }
153
+ else {
154
+ this.updateViewModel();
155
+ }
156
+ });
157
+ }
158
+ ngOnDestroy() {
159
+ this.blurSubscription?.unsubscribe();
160
+ this.focusSubscription?.unsubscribe();
161
+ this.updateSubscription?.unsubscribe();
162
+ this.pendingUpdateSubscription?.unsubscribe();
163
+ this.setWaitCursor(false);
114
164
  }
115
165
  beforeSubmitHook(instance) {
116
166
  return (submission, callback) => instance.beforeSubmit(submission, callback);
117
167
  }
118
168
  beforeSubmit(submission, callback) {
169
+ this.pendingUpdateSubscription?.unsubscribe();
170
+ this.setWaitCursor(false);
119
171
  combineLatest([
120
172
  this.formName$,
121
173
  this.taskInstanceId$,
122
174
  this.processDefinitionKey$,
123
175
  this.documentDefinitionName$,
124
176
  this.isStartForm$,
177
+ this.documentId$,
125
178
  ])
126
- .pipe(take(1), switchMap(([formName, taskInstanceId, processDefinitionKey, documentDefinitionName, isStartForm,]) => isStartForm
179
+ .pipe(take(1), switchMap(([formName, taskInstanceId, processDefinitionKey, documentDefinitionName, isStartForm, documentId,]) => isStartForm
127
180
  ? this.viewModelService
128
- .submitViewModelForStartForm(formName, processDefinitionKey, documentDefinitionName, submission.data)
129
- .pipe(take(1), switchMap(response => {
130
- callback(null, submission);
131
- return of(response);
132
- }), catchError(error => {
133
- this.handleFormError(error);
134
- callback({ message: ' ', component: null }, null);
135
- return EMPTY; // return an empty observable to complete the stream
136
- }))
181
+ .submitViewModelForStartForm(formName, processDefinitionKey, documentId, documentDefinitionName, submission.data)
137
182
  : this.viewModelService
138
- .submitViewModel(formName, taskInstanceId, submission.data)
139
- .pipe(take(1), switchMap(response => {
183
+ .submitViewModel(formName, taskInstanceId, submission.data)))
184
+ .subscribe({
185
+ next: _ => {
140
186
  callback(null, submission);
141
- return of(response);
142
- }), catchError(error => {
143
- this.handleFormError(error);
144
- callback({ message: ' ', component: null }, null);
145
- return EMPTY; // return an empty observable to complete the stream
146
- }))))
147
- .subscribe();
187
+ },
188
+ error: err => {
189
+ this.handleSubmissionError(err, callback);
190
+ }
191
+ });
192
+ }
193
+ handleSubmissionError(error, callback) {
194
+ callback({ message: '', component: null, silent: true }, null);
195
+ if (error instanceof HttpErrorResponse) {
196
+ this.handleFormError(error);
197
+ }
148
198
  }
149
199
  handleFormError(error) {
150
200
  const formInstance = this.formio.formio;
151
- this.errors = [];
152
- if (error.error.componentErrors) {
201
+ this.formErrors$.next([]);
202
+ if (error.error?.componentErrors) {
203
+ const errors = [];
153
204
  error.error.componentErrors.forEach(componentError => {
154
205
  const component = formInstance.getComponent(componentError.component);
155
206
  if (component == null) {
156
- this.errors.push(componentError.message);
207
+ errors.push(componentError.message);
157
208
  }
158
209
  else {
159
- component?.setCustomValidity(componentError.message);
210
+ // `true` makes the error dirty, setting the css class properly
211
+ component.setCustomValidity(componentError.message, true);
160
212
  }
161
213
  });
214
+ this.formErrors$.next(errors);
162
215
  }
163
- else {
216
+ else if (error.error?.error) {
164
217
  const component = formInstance.getComponent(error.error?.component);
165
218
  if (component == null) {
166
- this.errors.push(error.error.error);
219
+ this.formErrors$.next([error.error.error]);
167
220
  }
168
221
  else {
169
- component?.setCustomValidity(error.error.error);
222
+ // `true` makes the error dirty, setting the css class properly
223
+ component.setCustomValidity(error.error.error, true);
170
224
  }
171
225
  }
172
226
  }
173
227
  onSubmit(submission) {
174
228
  this.formSubmit.next(submission);
175
229
  }
230
+ onFocus($event) {
231
+ this.focus$.next($event);
232
+ }
176
233
  onBlur(blurEvent) {
177
234
  this.blur$.next(blurEvent);
178
- this.handleChanges();
179
235
  }
180
236
  onChange(object) {
181
237
  if (object.data) {
@@ -185,12 +241,12 @@ export class FormViewModelComponent {
185
241
  onNextPage() {
186
242
  this._preventNextPage = true;
187
243
  this.formio.formio.setPage(this.formio.formio.page - 1);
188
- this.handleChanges();
244
+ this.updateForm.next(true);
189
245
  }
190
246
  onPreviousPage() {
191
247
  this._preventPreviousPage = true;
192
248
  this.formio.formio.setPage(this.formio.formio.page + 1);
193
- this.handleChanges();
249
+ this.updateForm.next(true);
194
250
  }
195
251
  handlePageChange() {
196
252
  if (this._preventNextPage) {
@@ -213,36 +269,11 @@ export class FormViewModelComponent {
213
269
  }))))
214
270
  .subscribe();
215
271
  }
216
- updateViewModel() {
217
- this.loading$
218
- .pipe(take(1), switchMap(updating => {
219
- if (!updating) {
220
- this.loading$.next(true);
221
- return combineLatest([this.formName$, this.taskInstanceId$, this.change$]).pipe(take(1), switchMap(([formName, taskInstanceId, change]) => this.viewModelService
222
- .updateViewModel(formName, taskInstanceId, change.data, this.formio.formio.page, this._isWizard)
223
- .pipe(tap({
224
- next: viewModel => {
225
- const submission = this.submission$.value;
226
- submission.data = viewModel;
227
- this.submission$.next(submission);
228
- this.handlePageChange();
229
- this.refreshForm.emit({ submission: submission });
230
- this.loading$.next(false);
231
- this.errors = [];
232
- },
233
- error: error => {
234
- this.loading$.next(false);
235
- this.handleFormError(error);
236
- },
237
- }))));
238
- }
239
- return of(null); // Fallback to return an observable if updating is true
240
- }))
241
- .subscribe();
242
- }
243
272
  loadInitialViewModelForStartForm() {
244
- combineLatest([this.formName$, this.processDefinitionKey$])
245
- .pipe(take(1), switchMap(([formName, processDefinitionKey]) => this.viewModelService.getViewModelForStartForm(formName, processDefinitionKey).pipe(tap(viewModel => {
273
+ combineLatest([this.formName$, this.processDefinitionKey$, this.documentId$])
274
+ .pipe(take(1), switchMap(([formName, processDefinitionKey, documentId]) => this.viewModelService
275
+ .getViewModelForStartForm(formName, processDefinitionKey, documentId)
276
+ .pipe(tap(viewModel => {
246
277
  this.submission$.next({ data: viewModel });
247
278
  this.change$.pipe(take(1)).subscribe(() => {
248
279
  this.loading$.next(false);
@@ -251,49 +282,63 @@ export class FormViewModelComponent {
251
282
  }))))
252
283
  .subscribe();
253
284
  }
285
+ updateViewModel() {
286
+ this.pendingUpdateSubscription?.unsubscribe();
287
+ this.pendingUpdateSubscription = combineLatest([
288
+ this.formName$,
289
+ this.taskInstanceId$,
290
+ this.change$,
291
+ ])
292
+ .pipe(take(1), switchMap(([formName, taskInstanceId, change]) => this.viewModelService
293
+ .updateViewModel(formName, taskInstanceId, change.data, this.formio.formio.page, this._isWizard)
294
+ .pipe(tap({
295
+ next: viewModel => this.handleViewModelUpdate(viewModel),
296
+ error: error => this.handleViewModelUpdateError(error),
297
+ }))))
298
+ .subscribe();
299
+ }
254
300
  updateViewModelForStartForm() {
255
- this.loading$
256
- .pipe(take(1), switchMap(updating => {
257
- if (!updating) {
258
- this.loading$.next(true);
259
- return combineLatest([this.formName$, this.processDefinitionKey$, this.change$]).pipe(take(1), switchMap(([formName, processDefinitionKey, change]) => this.viewModelService
260
- .updateViewModelForStartForm(formName, processDefinitionKey, change.data, this.formio.formio.page, this._isWizard)
261
- .pipe(tap({
262
- next: viewModel => {
263
- const submission = this.submission$.value;
264
- submission.data = viewModel;
265
- this.submission$.next(submission);
266
- this.handlePageChange();
267
- this.refreshForm.emit({ submission: submission });
268
- this.loading$.next(false);
269
- this.errors = [];
270
- },
271
- error: error => {
272
- this.loading$.next(false);
273
- this.handleFormError(error);
274
- },
275
- }))));
276
- }
277
- return of(null); // Fallback to return an observable if updating is true
278
- }))
301
+ this.pendingUpdateSubscription?.unsubscribe();
302
+ this.pendingUpdateSubscription = combineLatest([
303
+ this.formName$,
304
+ this.processDefinitionKey$,
305
+ this.change$,
306
+ this.documentId$,
307
+ ])
308
+ .pipe(take(1), switchMap(([formName, processDefinitionKey, change, documentId]) => this.viewModelService
309
+ .updateViewModelForStartForm(formName, processDefinitionKey, documentId, change.data, this.formio.formio.page, this._isWizard)
310
+ .pipe(tap({
311
+ next: viewModel => this.handleViewModelUpdate(viewModel),
312
+ error: error => this.handleViewModelUpdateError(error),
313
+ }))))
279
314
  .subscribe();
280
315
  }
281
- handleChanges() {
282
- this.blur$.pipe(debounceTime(500)).subscribe(() => {
283
- if (this.isStartForm$.value) {
284
- this.updateViewModelForStartForm();
285
- }
286
- else {
287
- this.updateViewModel();
288
- }
289
- });
316
+ handleViewModelUpdate(viewModel) {
317
+ const submission = this.submission$.value;
318
+ submission.data = viewModel;
319
+ this.submission$.next(submission);
320
+ this.handlePageChange();
321
+ this.refreshForm.emit({ submission });
322
+ this.pendingUpdateSubscription?.unsubscribe();
323
+ this.pendingUpdateSubscription = null;
324
+ this.formErrors$.next([]);
325
+ this.setWaitCursor(false);
326
+ }
327
+ handleViewModelUpdateError(error) {
328
+ this.pendingUpdateSubscription?.unsubscribe();
329
+ this.pendingUpdateSubscription = null;
330
+ this.handleFormError(error);
331
+ this.setWaitCursor(false);
332
+ }
333
+ setWaitCursor(enabled) {
334
+ document.body.style.cursor = enabled ? 'wait' : 'auto';
290
335
  }
291
336
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormViewModelComponent, deps: [{ token: i1.ViewModelService }, { token: i2.TranslateService }, { token: i3.FormIoStateService }], target: i0.ɵɵFactoryTarget.Component }); }
292
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FormViewModelComponent, isStandalone: true, selector: "valtimo-form-view-model", inputs: { options: "options", submission: "submission", form: "form", formName: "formName", taskInstanceId: "taskInstanceId", isStartForm: "isStartForm", processDefinitionKey: "processDefinitionKey", documentDefinitionName: "documentDefinitionName" }, outputs: { formSubmit: "formSubmit" }, viewQueries: [{ propertyName: "formio", first: true, predicate: ["formio"], descendants: true }], 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<div\n class=\"form-container formio-carbon\"\n *ngIf=\"{\n submission: submission$ | async,\n form: form$ | async,\n tokenSetInLocalStorage: tokenSetInLocalStorage$ | async,\n formioOptions: formioOptions$ | async,\n loading: loading$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.loading\" class=\"overlay\">\n <div class=\"spinner\">\n <i class=\"fa fa-spinner fa-spin\"></i>\n </div>\n </div>\n\n <div *ngIf=\"errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of errors\" class=\"pl-2\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n #formio\n [submission]=\"obs.submission\"\n [form]=\"obs.form\"\n [options]=\"obs.formioOptions\"\n [refresh]=\"refreshForm\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (focusout)=\"onBlur($event)\"\n (nextPage)=\"onNextPage()\"\n (prevPage)=\"onPreviousPage()\"\n ></formio>\n</div>\n", styles: [".form-container{position:relative}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fffc;z-index:1000;display:flex;justify-content:center;align-items:center;pointer-events:all}.spinner{font-size:3rem;color:#007bff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormioModule }, { kind: "component", type: i5.FormioComponent, selector: "formio" }] }); }
337
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FormViewModelComponent, isStandalone: true, selector: "valtimo-form-view-model", inputs: { options: "options", submission: "submission", form: "form", formName: "formName", taskInstanceId: "taskInstanceId", isStartForm: "isStartForm", documentId: "documentId", processDefinitionKey: "processDefinitionKey", documentDefinitionName: "documentDefinitionName" }, outputs: { formSubmit: "formSubmit" }, viewQueries: [{ propertyName: "formio", first: true, predicate: ["formio"], descendants: true }], 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<div\n class=\"form-container formio-carbon\"\n cdsLayer=\"1.0\"\n *ngIf=\"{\n submission: submission$ | async,\n form: form$ | async,\n tokenSetInLocalStorage: tokenSetInLocalStorage$ | async,\n formioOptions: formioOptions$ | async,\n loading: loading$ | async,\n errors: formErrors$ | async,\n renderOptions: renderOptions$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.loading\" class=\"overlay\">\n <div class=\"spinner\">\n <i class=\"fa fa-spinner fa-spin\"></i>\n </div>\n </div>\n\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\" class=\"pl-2\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n #formio\n [submission]=\"obs.submission\"\n [form]=\"obs.form\"\n [options]=\"obs.formioOptions\"\n [renderOptions]=\"obs.renderOptions\"\n [refresh]=\"refreshForm\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (focusin)=\"onFocus($event)\"\n (focusout)=\"onBlur($event)\"\n (nextPage)=\"onNextPage()\"\n (prevPage)=\"onPreviousPage()\"\n ></formio>\n</div>\n", styles: [".form-container{position:relative}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fffc;z-index:1000;display:flex;justify-content:center;align-items:center;pointer-events:all}.spinner{font-size:3rem;color:#007bff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormioModule }, { kind: "component", type: i5.FormioComponent, selector: "formio" }, { kind: "ngmodule", type: LayerModule }, { kind: "directive", type: i6.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }] }); }
293
338
  }
294
339
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormViewModelComponent, decorators: [{
295
340
  type: Component,
296
- args: [{ selector: 'valtimo-form-view-model', standalone: true, imports: [CommonModule, FormioModule], 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<div\n class=\"form-container formio-carbon\"\n *ngIf=\"{\n submission: submission$ | async,\n form: form$ | async,\n tokenSetInLocalStorage: tokenSetInLocalStorage$ | async,\n formioOptions: formioOptions$ | async,\n loading: loading$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.loading\" class=\"overlay\">\n <div class=\"spinner\">\n <i class=\"fa fa-spinner fa-spin\"></i>\n </div>\n </div>\n\n <div *ngIf=\"errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of errors\" class=\"pl-2\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n #formio\n [submission]=\"obs.submission\"\n [form]=\"obs.form\"\n [options]=\"obs.formioOptions\"\n [refresh]=\"refreshForm\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (focusout)=\"onBlur($event)\"\n (nextPage)=\"onNextPage()\"\n (prevPage)=\"onPreviousPage()\"\n ></formio>\n</div>\n", styles: [".form-container{position:relative}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fffc;z-index:1000;display:flex;justify-content:center;align-items:center;pointer-events:all}.spinner{font-size:3rem;color:#007bff}\n"] }]
341
+ args: [{ selector: 'valtimo-form-view-model', standalone: true, imports: [CommonModule, FormioModule, LayerModule], 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<div\n class=\"form-container formio-carbon\"\n cdsLayer=\"1.0\"\n *ngIf=\"{\n submission: submission$ | async,\n form: form$ | async,\n tokenSetInLocalStorage: tokenSetInLocalStorage$ | async,\n formioOptions: formioOptions$ | async,\n loading: loading$ | async,\n errors: formErrors$ | async,\n renderOptions: renderOptions$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.loading\" class=\"overlay\">\n <div class=\"spinner\">\n <i class=\"fa fa-spinner fa-spin\"></i>\n </div>\n </div>\n\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\" class=\"pl-2\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n #formio\n [submission]=\"obs.submission\"\n [form]=\"obs.form\"\n [options]=\"obs.formioOptions\"\n [renderOptions]=\"obs.renderOptions\"\n [refresh]=\"refreshForm\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (focusin)=\"onFocus($event)\"\n (focusout)=\"onBlur($event)\"\n (nextPage)=\"onNextPage()\"\n (prevPage)=\"onPreviousPage()\"\n ></formio>\n</div>\n", styles: [".form-container{position:relative}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fffc;z-index:1000;display:flex;justify-content:center;align-items:center;pointer-events:all}.spinner{font-size:3rem;color:#007bff}\n"] }]
297
342
  }], ctorParameters: () => [{ type: i1.ViewModelService }, { type: i2.TranslateService }, { type: i3.FormIoStateService }], propDecorators: { formio: [{
298
343
  type: ViewChild,
299
344
  args: ['formio']
@@ -309,6 +354,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
309
354
  type: Input
310
355
  }], isStartForm: [{
311
356
  type: Input
357
+ }], documentId: [{
358
+ type: Input
312
359
  }], processDefinitionKey: [{
313
360
  type: Input
314
361
  }], documentDefinitionName: [{
@@ -316,4 +363,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
316
363
  }], formSubmit: [{
317
364
  type: Output
318
365
  }] } });
319
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZm9ybS12aWV3LW1vZGVsL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLXZpZXctbW9kZWwvZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZm9ybS12aWV3LW1vZGVsL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLXZpZXctbW9kZWwvZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLGFBQWEsRUFDYixZQUFZLEVBQ1osS0FBSyxFQUVMLEVBQUUsRUFDRixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFFTCxZQUFZLEdBSWIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUl2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFFN0MsTUFBTSxDQUFDLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQztBQVMzQyxNQUFNLE9BQU8sc0JBQXNCO0lBR2pDLElBQWEsT0FBTyxDQUFDLFlBQWlCO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMs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TixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0E1V1Usc0JBQXNCO21HQUF0QixzQkFBc0Isd2RDckRuQyw0bURBcURBLGdUREZZLFlBQVksb1RBQUUsWUFBWTs7NEZBRXpCLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FHdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQztxSkFHaEIsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQUVOLE9BQU87c0JBQW5CLEtBQUs7Z0JBSU8sVUFBVTtzQkFBdEIsS0FBSztnQkFJTyxJQUFJO3NCQUFoQixLQUFLO2dCQVVPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBSU8sY0FBYztzQkFBMUIsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLO2dCQUlPLG9CQUFvQjtzQkFBaEMsS0FBSztnQkFJTyxzQkFBc0I7c0JBQWxDLEtBQUs7Z0JBSUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgRU1QVFksXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBGb3JtaW9Db21wb25lbnQsXG4gIEZvcm1pb01vZHVsZSxcbiAgRm9ybWlvT3B0aW9ucyxcbiAgRm9ybWlvU3VibWlzc2lvbixcbiAgRm9ybWlvU3VibWlzc2lvbkNhbGxiYWNrLFxufSBmcm9tICdAZm9ybWlvL2FuZ3VsYXInO1xuaW1wb3J0IHtWaWV3TW9kZWxTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge2Rpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7ZGVlcG1lcmdlfSBmcm9tICdkZWVwbWVyZ2UtdHMnO1xuaW1wb3J0IHtGb3JtSW9TdGF0ZVNlcnZpY2UsIFZhbHRpbW9Gb3JtaW9PcHRpb25zfSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxubW9tZW50LmRlZmF1bHRGb3JtYXQgPSAnREQgTU1NIFlZWVkgSEg6bW0nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWZvcm0tdmlldy1tb2RlbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLXZpZXctbW9kZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLXZpZXctbW9kZWwuY29tcG9uZW50LmNzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3JtaW9Nb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtVmlld01vZGVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgnZm9ybWlvJykgZm9ybWlvOiBGb3JtaW9Db21wb25lbnQ7XG5cbiAgQElucHV0KCkgc2V0IG9wdGlvbnMob3B0aW9uc1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnMkLm5leHQob3B0aW9uc1ZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzdWJtaXNzaW9uKHN1Ym1pc3Npb25WYWx1ZTogRm9ybWlvU3VibWlzc2lvbikge1xuICAgIHRoaXMuc3VibWlzc2lvbiQubmV4dChzdWJtaXNzaW9uVmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZvcm0oZm9ybVZhbHVlOiBvYmplY3QpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXM7XG4gICAgY29uc3QgZm9ybSA9IHtcbiAgICAgIGxvYWRJbml0aWFsVmlld01vZGVsOiAoKSA9PiBpbnN0YW5jZS5sb2FkSW5pdGlhbFZpZXdNb2RlbCgpLFxuICAgICAgdXBkYXRlVmlld01vZGVsOiAoKSA9PiBpbnN0YW5jZS51cGRhdGVWaWV3TW9kZWwoKSxcbiAgICAgIC4uLmZvcm1WYWx1ZSxcbiAgICB9O1xuICAgIHRoaXMuZm9ybSQubmV4dChmb3JtKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmb3JtTmFtZShmb3JtTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5mb3JtTmFtZSQubmV4dChmb3JtTmFtZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFza0luc3RhbmNlSWQodGFza0luc3RhbmNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMudGFza0luc3RhbmNlSWQkLm5leHQodGFza0luc3RhbmNlSWQpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGlzU3RhcnRGb3JtKGlzU3RhcnRGb3JtVmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzU3RhcnRGb3JtJC5uZXh0KGlzU3RhcnRGb3JtVmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHByb2Nlc3NEZWZpbml0aW9uS2V5KHByb2Nlc3NEZWZpbml0aW9uS2V5VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkkLm5leHQocHJvY2Vzc0RlZmluaXRpb25LZXlWYWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZG9jdW1lbnREZWZpbml0aW9uTmFtZShkb2N1bWVudERlZmluaXRpb25OYW1lVmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQubmV4dChkb2N1bWVudERlZmluaXRpb25OYW1lVmFsdWUpO1xuICB9XG5cbiAgQE91dHB1dCgpIGZvcm1TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwdWJsaWMgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgcmVmcmVzaEZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSBfcHJldmVudE5leHRQYWdlID0gZmFsc2U7XG4gIHByaXZhdGUgX3ByZXZlbnRQcmV2aW91c1BhZ2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNXaXphcmQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc3VibWlzc2lvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG9iamVjdD4odW5kZWZpbmVkKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1OYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZhbHRpbW9Gb3JtaW9PcHRpb25zPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFza0luc3RhbmNlSWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSB0b2tlblNldEluTG9jYWxTdG9yYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGJsdXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGb2N1c0V2ZW50PihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGxvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHVibGljIHJlYWRvbmx5IGlzU3RhcnRGb3JtJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvY2Vzc0RlZmluaXRpb25LZXkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPih1bmRlZmluZWQpO1xuXG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW50TGFuZ3VhZ2UkID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JykucGlwZShcbiAgICBtYXAoKCkgPT4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3ZlcnJpZGVPcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rm9ybWlvT3B0aW9ucz4oe1xuICAgIGhvb2tzOiB7XG4gICAgICBiZWZvcmVTdWJtaXQ6IHRoaXMuYmVmb3JlU3VibWl0SG9vayh0aGlzKSxcbiAgICB9LFxuICB9KTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWlvT3B0aW9ucyQ6IE9ic2VydmFibGU8VmFsdGltb0Zvcm1pb09wdGlvbnMgfCBGb3JtaW9PcHRpb25zPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY3VycmVudExhbmd1YWdlJCxcbiAgICB0aGlzLm9wdGlvbnMkLFxuICAgIHRoaXMuX292ZXJyaWRlT3B0aW9ucyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbbGFuZ3VhZ2UsIG9wdGlvbnMsIG92ZXJyaWRlT3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGZvcm1pb1RyYW5zbGF0aW9ucyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdmb3JtaW9UcmFuc2xhdGlvbnMnKTtcblxuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAuLi4oZm9ybWlvVHJhbnNsYXRpb25zID09PSAnb2JqZWN0JyAmJiB7XG4gICAgICAgICAgaTE4bjoge1xuICAgICAgICAgICAgW2xhbmd1YWdlXTogdGhpcy5zdGF0ZVNlcnZpY2UuZmxhdHRlblRyYW5zbGF0aW9uc09iamVjdChmb3JtaW9UcmFuc2xhdGlvbnMpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGRlZXBtZXJnZShkZWZhdWx0T3B0aW9ucywgb3ZlcnJpZGVPcHRpb25zKTtcbiAgICB9KVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld01vZGVsU2VydmljZTogVmlld01vZGVsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNlcnZpY2U6IEZvcm1Jb1N0YXRlU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU3RhcnRGb3JtJC52YWx1ZSkge1xuICAgICAgdGhpcy5sb2FkSW5pdGlhbFZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRJbml0aWFsVmlld01vZGVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJlZm9yZVN1Ym1pdEhvb2soaW5zdGFuY2U6IEZvcm1WaWV3TW9kZWxDb21wb25lbnQpOiAoc3VibWlzc2lvbiwgY2FsbGJhY2spID0+IHZvaWQge1xuICAgIHJldHVybiAoc3VibWlzc2lvbiwgY2FsbGJhY2spID0+IGluc3RhbmNlLmJlZm9yZVN1Ym1pdChzdWJtaXNzaW9uLCBjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgYmVmb3JlU3VibWl0KHN1Ym1pc3Npb246IGFueSwgY2FsbGJhY2s6IEZvcm1pb1N1Ym1pc3Npb25DYWxsYmFjayk6IHZvaWQge1xuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5mb3JtTmFtZSQsXG4gICAgICB0aGlzLnRhc2tJbnN0YW5jZUlkJCxcbiAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkkLFxuICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJCxcbiAgICAgIHRoaXMuaXNTdGFydEZvcm0kLFxuICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKFxuICAgICAgICAgIChbXG4gICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgIHRhc2tJbnN0YW5jZUlkLFxuICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgICAgICAgaXNTdGFydEZvcm0sXG4gICAgICAgICAgXSkgPT5cbiAgICAgICAgICAgIGlzU3RhcnRGb3JtXG4gICAgICAgICAgICAgID8gdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAuc3VibWl0Vmlld01vZGVsRm9yU3RhcnRGb3JtKFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHN1Ym1pc3Npb24uZGF0YVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc3VibWlzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRm9ybUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7bWVzc2FnZTogJyAnLCBjb21wb25lbnQ6IG51bGx9LCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7IC8vIHJldHVybiBhbiBlbXB0eSBvYnNlcnZhYmxlIHRvIGNvbXBsZXRlIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiB0aGlzLnZpZXdNb2RlbFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5zdWJtaXRWaWV3TW9kZWwoZm9ybU5hbWUsIHRhc2tJbnN0YW5jZUlkLCBzdWJtaXNzaW9uLmRhdGEpXG4gICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBzdWJtaXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGb3JtRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHttZXNzYWdlOiAnICcsIGNvbXBvbmVudDogbnVsbH0sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsgLy8gcmV0dXJuIGFuIGVtcHR5IG9ic2VydmFibGUgdG8gY29tcGxldGUgdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZvcm1FcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSB0aGlzLmZvcm1pby5mb3JtaW87XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBpZiAoZXJyb3IuZXJyb3IuY29tcG9uZW50RXJyb3JzKSB7XG4gICAgICBlcnJvci5lcnJvci5jb21wb25lbnRFcnJvcnMuZm9yRWFjaChjb21wb25lbnRFcnJvciA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGZvcm1JbnN0YW5jZS5nZXRDb21wb25lbnQoY29tcG9uZW50RXJyb3IuY29tcG9uZW50KTtcbiAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChjb21wb25lbnRFcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQ/LnNldEN1c3RvbVZhbGlkaXR5KGNvbXBvbmVudEVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZm9ybUluc3RhbmNlLmdldENvbXBvbmVudChlcnJvci5lcnJvcj8uY29tcG9uZW50KTtcbiAgICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yLmVycm9yLmVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudD8uc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3IuZXJyb3IuZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblN1Ym1pdChzdWJtaXNzaW9uOiBGb3JtaW9TdWJtaXNzaW9uKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtU3VibWl0Lm5leHQoc3VibWlzc2lvbik7XG4gIH1cblxuICBwdWJsaWMgb25CbHVyKGJsdXJFdmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYmx1ciQubmV4dChibHVyRXZlbnQpO1xuICAgIHRoaXMuaGFuZGxlQ2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlKG9iamVjdDogYW55KTogdm9pZCB7XG4gICAgaWYgKG9iamVjdC5kYXRhKSB7XG4gICAgICB0aGlzLmNoYW5nZSQubmV4dChvYmplY3QpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbk5leHRQYWdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3ByZXZlbnROZXh0UGFnZSA9IHRydWU7XG4gICAgdGhpcy5mb3JtaW8uZm9ybWlvLnNldFBhZ2UodGhpcy5mb3JtaW8uZm9ybWlvLnBhZ2UgLSAxKTtcbiAgICB0aGlzLmhhbmRsZUNoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblByZXZpb3VzUGFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wcmV2ZW50UHJldmlvdXNQYWdlID0gdHJ1ZTtcbiAgICB0aGlzLmZvcm1pby5mb3JtaW8uc2V0UGFnZSh0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSArIDEpO1xuICAgIHRoaXMuaGFuZGxlQ2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQYWdlQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wcmV2ZW50TmV4dFBhZ2UpIHtcbiAgICAgIHRoaXMuX3ByZXZlbnROZXh0UGFnZSA9IGZhbHNlO1xuICAgICAgdGhpcy5mb3JtaW8uZm9ybWlvLnNldFBhZ2UodGhpcy5mb3JtaW8uZm9ybWlvLnBhZ2UgKyAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3ByZXZlbnRQcmV2aW91c1BhZ2UpIHtcbiAgICAgIHRoaXMuX3ByZXZlbnRQcmV2aW91c1BhZ2UgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9ybWlvLmZvcm1pby5zZXRQYWdlKHRoaXMuZm9ybWlvLmZvcm1pby5wYWdlIC0gMSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxvYWRJbml0aWFsVmlld01vZGVsKCk6IHZvaWQge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZm9ybU5hbWUkLCB0aGlzLnRhc2tJbnN0YW5jZUlkJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKChbZm9ybU5hbWUsIHRhc2tJbnN0YW5jZUlkXSkgPT5cbiAgICAgICAgICB0aGlzLnZpZXdNb2RlbFNlcnZpY2UuZ2V0Vmlld01vZGVsKGZvcm1OYW1lLCB0YXNrSW5zdGFuY2VJZCkucGlwZShcbiAgICAgICAgICAgIHRhcCh2aWV3TW9kZWwgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb24kLm5leHQoe2RhdGE6IHZpZXdNb2RlbH0pO1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLl9pc1dpemFyZCA9IHRoaXMuZm9ybWlvLmZvcm0uZGlzcGxheSA9PT0gJ3dpemFyZCc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZpZXdNb2RlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmckXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKHVwZGF0aW5nID0+IHtcbiAgICAgICAgICBpZiAoIXVwZGF0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtTmFtZSQsIHRoaXMudGFza0luc3RhbmNlSWQkLCB0aGlzLmNoYW5nZSRdKS5waXBlKFxuICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoKFtmb3JtTmFtZSwgdGFza0luc3RhbmNlSWQsIGNoYW5nZV0pID0+XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAudXBkYXRlVmlld01vZGVsKFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGFza0luc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNXaXphcmRcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YXAoe1xuICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IHZpZXdNb2RlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJtaXNzaW9uID0gdGhpcy5zdWJtaXNzaW9uJC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pc3Npb24uZGF0YSA9IHZpZXdNb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWlzc2lvbiQubmV4dChzdWJtaXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRm9ybS5lbWl0KHtzdWJtaXNzaW9uOiBzdWJtaXNzaW9ufSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGb3JtRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZihudWxsKTsgLy8gRmFsbGJhY2sgdG8gcmV0dXJuIGFuIG9ic2VydmFibGUgaWYgdXBkYXRpbmcgaXMgdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGxvYWRJbml0aWFsVmlld01vZGVsRm9yU3RhcnRGb3JtKCk6IHZvaWQge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZm9ybU5hbWUkLCB0aGlzLnByb2Nlc3NEZWZpbml0aW9uS2V5JF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKChbZm9ybU5hbWUsIHByb2Nlc3NEZWZpbml0aW9uS2V5XSkgPT5cbiAgICAgICAgICB0aGlzLnZpZXdNb2RlbFNlcnZpY2UuZ2V0Vmlld01vZGVsRm9yU3RhcnRGb3JtKGZvcm1OYW1lLCBwcm9jZXNzRGVmaW5pdGlvbktleSkucGlwZShcbiAgICAgICAgICAgIHRhcCh2aWV3TW9kZWwgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb24kLm5leHQoe2RhdGE6IHZpZXdNb2RlbH0pO1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLl9pc1dpemFyZCA9IHRoaXMuZm9ybWlvLmZvcm0uZGlzcGxheSA9PT0gJ3dpemFyZCc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmckXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKHVwZGF0aW5nID0+IHtcbiAgICAgICAgICBpZiAoIXVwZGF0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtTmFtZSQsIHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkkLCB0aGlzLmNoYW5nZSRdKS5waXBlKFxuICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoKFtmb3JtTmFtZSwgcHJvY2Vzc0RlZmluaXRpb25LZXksIGNoYW5nZV0pID0+XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAudXBkYXRlVmlld01vZGVsRm9yU3RhcnRGb3JtKFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNXaXphcmRcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YXAoe1xuICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IHZpZXdNb2RlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJtaXNzaW9uID0gdGhpcy5zdWJtaXNzaW9uJC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pc3Npb24uZGF0YSA9IHZpZXdNb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWlzc2lvbiQubmV4dChzdWJtaXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRm9ybS5lbWl0KHtzdWJtaXNzaW9uOiBzdWJtaXNzaW9ufSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGb3JtRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZihudWxsKTsgLy8gRmFsbGJhY2sgdG8gcmV0dXJuIGFuIG9ic2VydmFibGUgaWYgdXBkYXRpbmcgaXMgdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuYmx1ciQucGlwZShkZWJvdW5jZVRpbWUoNTAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU3RhcnRGb3JtJC52YWx1ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3TW9kZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48ZGl2XG4gIGNsYXNzPVwiZm9ybS1jb250YWluZXIgZm9ybWlvLWNhcmJvblwiXG4gICpuZ0lmPVwie1xuICAgIHN1Ym1pc3Npb246IHN1Ym1pc3Npb24kIHwgYXN5bmMsXG4gICAgZm9ybTogZm9ybSQgfCBhc3luYyxcbiAgICB0b2tlblNldEluTG9jYWxTdG9yYWdlOiB0b2tlblNldEluTG9jYWxTdG9yYWdlJCB8IGFzeW5jLFxuICAgIGZvcm1pb09wdGlvbnM6IGZvcm1pb09wdGlvbnMkIHwgYXN5bmMsXG4gICAgbG9hZGluZzogbG9hZGluZyQgfCBhc3luYyxcbiAgfSBhcyBvYnNcIlxuPlxuICA8ZGl2ICpuZ0lmPVwib2JzLmxvYWRpbmdcIiBjbGFzcz1cIm92ZXJsYXlcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXNwaW5cIj48L2k+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJlcnJvcnMubGVuZ3RoID4gMFwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIHB0LTUgcGItNSBtYi0yXCI+XG4gICAgPG9sPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBlcnJvciBvZiBlcnJvcnNcIiBjbGFzcz1cInBsLTJcIj5cbiAgICAgICAge3sgZXJyb3IgfX1cbiAgICAgIDwvbGk+XG4gICAgPC9vbD5cbiAgPC9kaXY+XG5cbiAgPGZvcm1pb1xuICAgICNmb3JtaW9cbiAgICBbc3VibWlzc2lvbl09XCJvYnMuc3VibWlzc2lvblwiXG4gICAgW2Zvcm1dPVwib2JzLmZvcm1cIlxuICAgIFtvcHRpb25zXT1cIm9icy5mb3JtaW9PcHRpb25zXCJcbiAgICBbcmVmcmVzaF09XCJyZWZyZXNoRm9ybVwiXG4gICAgKHN1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCJcbiAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgIChmb2N1c291dCk9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgKG5leHRQYWdlKT1cIm9uTmV4dFBhZ2UoKVwiXG4gICAgKHByZXZQYWdlKT1cIm9uUHJldmlvdXNQYWdlKClcIlxuICA+PC9mb3JtaW8+XG48L2Rpdj5cbiJdfQ==
366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZm9ybS12aWV3LW1vZGVsL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLXZpZXctbW9kZWwvZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZm9ybS12aWV3LW1vZGVsL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLXZpZXctbW9kZWwvZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixNQUFNLEVBRU4sT0FBTyxFQUVQLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUVMLFlBQVksR0FJYixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBR3ZDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7O0FBRXRELE1BQU0sQ0FBQyxhQUFhLEdBQUcsbUJBQW1CLENBQUM7QUFTM0Ms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QUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVNLDBCQUEwQixDQUFDLEtBQXdCO1FBQ3hELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQWdCO1FBQ3BDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pELENBQUM7K0dBbGFVLHNCQUFzQjttR0FBdEIsc0JBQXNCLGtmQ3JEbkMsb3lEQTBEQSxnVERQWSxZQUFZLG9UQUFFLFlBQVksbUdBQUUsV0FBVzs7NEZBRXRDLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FHdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUM7cUpBRzdCLE1BQU07c0JBQTFCLFNBQVM7dUJBQUMsUUFBUTtnQkFFTixPQUFPO3NCQUFuQixLQUFLO2dCQUlPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8sSUFBSTtzQkFBaEIsS0FBSztnQkFZTyxRQUFRO3NCQUFwQixLQUFLO2dCQUlPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBSU8sV0FBVztzQkFBdkIsS0FBSztnQkFJTyxVQUFVO3NCQUF0QixLQUFLO2dCQUlPLG9CQUFvQjtzQkFBaEMsS0FBSztnQkFJTyxzQkFBc0I7c0JBQWxDLEtBQUs7Z0JBSUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEZvcm1pb0NvbXBvbmVudCxcbiAgRm9ybWlvTW9kdWxlLFxuICBGb3JtaW9PcHRpb25zLFxuICBGb3JtaW9TdWJtaXNzaW9uLFxuICBGb3JtaW9TdWJtaXNzaW9uQ2FsbGJhY2ssXG59IGZyb20gJ0Bmb3JtaW8vYW5ndWxhcic7XG5pbXBvcnQge1ZpZXdNb2RlbFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7ZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtkZWVwbWVyZ2V9IGZyb20gJ2RlZXBtZXJnZS10cyc7XG5pbXBvcnQge0Zvcm1Jb1N0YXRlU2VydmljZSwgVmFsdGltb0Zvcm1pb09wdGlvbnN9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7SHR0cEVycm9yUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtMYXllck1vZHVsZX0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5cbm1vbWVudC5kZWZhdWx0Rm9ybWF0ID0gJ0REIE1NTSBZWVlZIEhIOm1tJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsdGltby1mb3JtLXZpZXctbW9kZWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5jc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybWlvTW9kdWxlLCBMYXllck1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1WaWV3TW9kZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2Zvcm1pbycpIGZvcm1pbzogRm9ybWlvQ29tcG9uZW50O1xuXG4gIEBJbnB1dCgpIHNldCBvcHRpb25zKG9wdGlvbnNWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5vcHRpb25zJC5uZXh0KG9wdGlvbnNWYWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc3VibWlzc2lvbihzdWJtaXNzaW9uVmFsdWU6IEZvcm1pb1N1Ym1pc3Npb24pIHtcbiAgICB0aGlzLnN1Ym1pc3Npb24kLm5leHQoc3VibWlzc2lvblZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmb3JtKGZvcm1WYWx1ZTogb2JqZWN0KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzO1xuICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICBsb2FkSW5pdGlhbFZpZXdNb2RlbDogKCkgPT4gaW5zdGFuY2UubG9hZEluaXRpYWxWaWV3TW9kZWwoKSxcbiAgICAgIHVwZGF0ZVZpZXdNb2RlbDogKCkgPT4gaW5zdGFuY2UudXBkYXRlVmlld01vZGVsKCksXG4gICAgICBsb2FkSW5pdGlhbFN0YXJ0Rm9ybVZpZXdNb2RlbDogKCkgPT4gaW5zdGFuY2UubG9hZEluaXRpYWxWaWV3TW9kZWxGb3JTdGFydEZvcm0oKSxcbiAgICAgIHVwZGF0ZVZpZXdTdGFydEZvcm1Nb2RlbDogKCkgPT4gaW5zdGFuY2UudXBkYXRlVmlld01vZGVsRm9yU3RhcnRGb3JtKCksXG4gICAgICAuLi5mb3JtVmFsdWUsXG4gICAgfTtcbiAgICB0aGlzLmZvcm0kLm5leHQoZm9ybSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZm9ybU5hbWUoZm9ybU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuZm9ybU5hbWUkLm5leHQoZm9ybU5hbWUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRhc2tJbnN0YW5jZUlkKHRhc2tJbnN0YW5jZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRhc2tJbnN0YW5jZUlkJC5uZXh0KHRhc2tJbnN0YW5jZUlkKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpc1N0YXJ0Rm9ybShpc1N0YXJ0Rm9ybVZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1N0YXJ0Rm9ybSQubmV4dChpc1N0YXJ0Rm9ybVZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkb2N1bWVudElkKGRvY3VtZW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMuZG9jdW1lbnRJZCQubmV4dChkb2N1bWVudElkKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwcm9jZXNzRGVmaW5pdGlvbktleShwcm9jZXNzRGVmaW5pdGlvbktleVZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uS2V5JC5uZXh0KHByb2Nlc3NEZWZpbml0aW9uS2V5VmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUoZG9jdW1lbnREZWZpbml0aW9uTmFtZVZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLm5leHQoZG9jdW1lbnREZWZpbml0aW9uTmFtZVZhbHVlKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBmb3JtU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgcHVibGljIHJlZnJlc2hGb3JtID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgX3ByZXZlbnROZXh0UGFnZSA9IGZhbHNlO1xuICBwcml2YXRlIF9wcmV2ZW50UHJldmlvdXNQYWdlID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzV2l6YXJkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIHBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyByZWFkb25seSBzdWJtaXNzaW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7fSk7XG4gIHB1YmxpYyByZWFkb25seSBmb3JtJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8b2JqZWN0Pih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybU5hbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSBmb3JtRXJyb3JzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWYWx0aW1vRm9ybWlvT3B0aW9ucz4odW5kZWZpbmVkKTtcbiAgcHVibGljIHJlYWRvbmx5IHRhc2tJbnN0YW5jZUlkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5TZXRJbkxvY2FsU3RvcmFnZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGNoYW5nZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBibHVyJCA9IG5ldyBTdWJqZWN0PEZvY3VzRXZlbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBmb2N1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvY3VzRXZlbnQ+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgbG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNTdGFydEZvcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudElkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHByb2Nlc3NEZWZpbml0aW9uS2V5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcbiAgcHVibGljIHJlYWRvbmx5IHVwZGF0ZUZvcm0gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW50TGFuZ3VhZ2UkID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JykucGlwZShcbiAgICBtYXAoKCkgPT4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3ZlcnJpZGVPcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rm9ybWlvT3B0aW9ucz4oe1xuICAgIGhvb2tzOiB7XG4gICAgICBiZWZvcmVTdWJtaXQ6IHRoaXMuYmVmb3JlU3VibWl0SG9vayh0aGlzKSxcbiAgICB9LFxuICB9KTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWlvT3B0aW9ucyQ6IE9ic2VydmFibGU8VmFsdGltb0Zvcm1pb09wdGlvbnMgfCBGb3JtaW9PcHRpb25zPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMub3B0aW9ucyQsXG4gICAgdGhpcy5fb3ZlcnJpZGVPcHRpb25zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtvcHRpb25zLCBvdmVycmlkZU9wdGlvbnNdKSA9PiB7XG4gICAgICByZXR1cm4gZGVlcG1lcmdlKG9wdGlvbnMsIG92ZXJyaWRlT3B0aW9ucyk7XG4gICAgfSlcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVuZGVyT3B0aW9ucyQ6IE9ic2VydmFibGU8YW55PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuY3VycmVudExhbmd1YWdlJF0pLnBpcGUoXG4gICAgbWFwKChbbGFuZ3VhZ2VdKSA9PiB7XG4gICAgICBjb25zdCBmb3JtaW9UcmFuc2xhdGlvbnMgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnZm9ybWlvVHJhbnNsYXRpb25zJyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAuLi4odHlwZW9mIGZvcm1pb1RyYW5zbGF0aW9ucyA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgIGkxOG46IHtcbiAgICAgICAgICAgICAgICBbbGFuZ3VhZ2VdOiB0aGlzLnN0YXRlU2VydmljZS5mbGF0dGVuVHJhbnNsYXRpb25zT2JqZWN0KGZvcm1pb1RyYW5zbGF0aW9ucyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuICAgIH0pXG4gICk7XG5cbiAgcHJpdmF0ZSBmb2N1c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGJsdXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSB1cGRhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdNb2RlbFNlcnZpY2U6IFZpZXdNb2RlbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVTZXJ2aWNlOiBGb3JtSW9TdGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1N0YXJ0Rm9ybSQudmFsdWUpIHtcbiAgICAgIHRoaXMubG9hZEluaXRpYWxWaWV3TW9kZWxGb3JTdGFydEZvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2FkSW5pdGlhbFZpZXdNb2RlbCgpO1xuICAgIH1cblxuICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24gPSB0aGlzLmZvY3VzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihlID0+IHtcbiAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gaGFuZGxlIGJsdXIgZXZlbnRzIGFmdGVyIGVudGVyaW5nIGFuIGlucHV0XG4gICAgICAgICAgcmV0dXJuICEhZSAmJiBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5wZW5kaW5nVXBkYXRlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmJsdXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuYmx1clN1YnNjcmlwdGlvbiA9IHRoaXMuYmx1ciRcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihlID0+IHtcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBldmVudHMgd2hlcmUgcmVsYXRlZFRhcmdldCBpcyBub3QgbnVsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIHJlbGF0ZWRUYXJnZXQgd2lsbCBiZSBudWxsIHdoZW4gbm8gbmV3IGlucHV0IGlzIGZvY3VzZWQuXG4gICAgICAgICAgICAgIHJldHVybiAhZS5yZWxhdGVkVGFyZ2V0O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmJsdXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLnNldFdhaXRDdXJzb3IodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm0ubmV4dCh0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnVwZGF0ZUZvcm0uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU3RhcnRGb3JtJC52YWx1ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3TW9kZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmJsdXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnVwZGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZXRXYWl0Q3Vyc29yKGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBiZWZvcmVTdWJtaXRIb29rKGluc3RhbmNlOiBGb3JtVmlld01vZGVsQ29tcG9uZW50KTogKHN1Ym1pc3Npb24sIGNhbGxiYWNrKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gKHN1Ym1pc3Npb24sIGNhbGxiYWNrKSA9PiBpbnN0YW5jZS5iZWZvcmVTdWJtaXQoc3VibWlzc2lvbiwgY2FsbGJhY2spO1xuICB9XG5cbiAgcHVibGljIGJlZm9yZVN1Ym1pdChzdWJtaXNzaW9uOiBhbnksIGNhbGxiYWNrOiBGb3JtaW9TdWJtaXNzaW9uQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZXRXYWl0Q3Vyc29yKGZhbHNlKTtcblxuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5mb3JtTmFtZSQsXG4gICAgICB0aGlzLnRhc2tJbnN0YW5jZUlkJCxcbiAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkkLFxuICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJCxcbiAgICAgIHRoaXMuaXNTdGFydEZvcm0kLFxuICAgICAgdGhpcy5kb2N1bWVudElkJCxcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICAoW1xuICAgICAgICAgICAgZm9ybU5hbWUsXG4gICAgICAgICAgICB0YXNrSW5zdGFuY2VJZCxcbiAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICAgICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZSxcbiAgICAgICAgICAgIGlzU3RhcnRGb3JtLFxuICAgICAgICAgICAgZG9jdW1lbnRJZCxcbiAgICAgICAgICBdKSA9PlxuICAgICAgICAgICAgaXNTdGFydEZvcm1cbiAgICAgICAgICAgICAgPyB0aGlzLnZpZXdNb2RlbFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5zdWJtaXRWaWV3TW9kZWxGb3JTdGFydEZvcm0oXG4gICAgICAgICAgICAgICAgICAgIGZvcm1OYW1lLFxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3VibWlzc2lvbi5kYXRhXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAuc3VibWl0Vmlld01vZGVsKGZvcm1OYW1lLCB0YXNrSW5zdGFuY2VJZCwgc3VibWlzc2lvbi5kYXRhKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogXyA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgc3VibWlzc2lvbik7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlU3VibWlzc2lvbkVycm9yKGVyciwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VibWlzc2lvbkVycm9yKGVycm9yOiBhbnksIGNhbGxiYWNrOiBGb3JtaW9TdWJtaXNzaW9uQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBjYWxsYmFjayh7IG1lc3NhZ2U6ICcnLCBjb21wb25lbnQ6IG51bGwsIHNpbGVudDogdHJ1ZSB9LCBudWxsKTtcblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICB0aGlzLmhhbmRsZUZvcm1FcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGb3JtRXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUluc3RhbmNlID0gdGhpcy5mb3JtaW8uZm9ybWlvO1xuICAgIHRoaXMuZm9ybUVycm9ycyQubmV4dChbXSk7XG4gICAgaWYgKGVycm9yLmVycm9yPy5jb21wb25lbnRFcnJvcnMpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgICAgZXJyb3IuZXJyb3IuY29tcG9uZW50RXJyb3JzLmZvckVhY2goY29tcG9uZW50RXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBmb3JtSW5zdGFuY2UuZ2V0Q29tcG9uZW50KGNvbXBvbmVudEVycm9yLmNvbXBvbmVudCk7XG4gICAgICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGNvbXBvbmVudEVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGB0cnVlYCBtYWtlcyB0aGUgZXJyb3IgZGlydHksIHNldHRpbmcgdGhlIGNzcyBjbGFzcyBwcm9wZXJseVxuICAgICAgICAgIGNvbXBvbmVudC5zZXRDdXN0b21WYWxpZGl0eShjb21wb25lbnRFcnJvci5tZXNzYWdlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcm1FcnJvcnMkLm5leHQoZXJyb3JzKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yLmVycm9yPy5lcnJvcikge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZm9ybUluc3RhbmNlLmdldENvbXBvbmVudChlcnJvci5lcnJvcj8uY29tcG9uZW50KTtcbiAgICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmZvcm1FcnJvcnMkLm5leHQoW2Vycm9yLmVycm9yLmVycm9yXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBgdHJ1ZWAgbWFrZXMgdGhlIGVycm9yIGRpcnR5LCBzZXR0aW5nIHRoZSBjc3MgY2xhc3MgcHJvcGVybHlcbiAgICAgICAgY29tcG9uZW50LnNldEN1c3RvbVZhbGlkaXR5KGVycm9yLmVycm9yLmVycm9yLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TdWJtaXQoc3VibWlzc2lvbjogRm9ybWlvU3VibWlzc2lvbik6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1Ym1pdC5uZXh0KHN1Ym1pc3Npb24pO1xuICB9XG5cbiAgcHVibGljIG9uRm9jdXMoJGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5mb2N1cyQubmV4dCgkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uQmx1cihibHVyRXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmJsdXIkLm5leHQoYmx1ckV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNoYW5nZShvYmplY3Q6IGFueSk6IHZvaWQge1xuICAgIGlmIChvYmplY3QuZGF0YSkge1xuICAgICAgdGhpcy5jaGFuZ2UkLm5leHQob2JqZWN0KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25OZXh0UGFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wcmV2ZW50TmV4dFBhZ2UgPSB0cnVlO1xuICAgIHRoaXMuZm9ybWlvLmZvcm1pby5zZXRQYWdlKHRoaXMuZm9ybWlvLmZvcm1pby5wYWdlIC0gMSk7XG4gICAgdGhpcy51cGRhdGVGb3JtLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25QcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJldmVudFByZXZpb3VzUGFnZSA9IHRydWU7XG4gICAgdGhpcy5mb3JtaW8uZm9ybWlvLnNldFBhZ2UodGhpcy5mb3JtaW8uZm9ybWlvLnBhZ2UgKyAxKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm0ubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUGFnZUNoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcHJldmVudE5leHRQYWdlKSB7XG4gICAgICB0aGlzLl9wcmV2ZW50TmV4dFBhZ2UgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9ybWlvLmZvcm1pby5zZXRQYWdlKHRoaXMuZm9ybWlvLmZvcm1pby5wYWdlICsgMSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9wcmV2ZW50UHJldmlvdXNQYWdlKSB7XG4gICAgICB0aGlzLl9wcmV2ZW50UHJldmlvdXNQYWdlID0gZmFsc2U7XG4gICAgICB0aGlzLmZvcm1pby5mb3JtaW8uc2V0UGFnZSh0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkSW5pdGlhbFZpZXdNb2RlbCgpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1OYW1lJCwgdGhpcy50YXNrSW5zdGFuY2VJZCRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoW2Zvcm1OYW1lLCB0YXNrSW5zdGFuY2VJZF0pID0+XG4gICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlLmdldFZpZXdNb2RlbChmb3JtTmFtZSwgdGFza0luc3RhbmNlSWQpLnBpcGUoXG4gICAgICAgICAgICB0YXAodmlld01vZGVsID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zdWJtaXNzaW9uJC5uZXh0KHtkYXRhOiB2aWV3TW9kZWx9KTtcbiAgICAgICAgICAgICAgdGhpcy5jaGFuZ2UkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5faXNXaXphcmQgPSB0aGlzLmZvcm1pby5mb3JtLmRpc3BsYXkgPT09ICd3aXphcmQnO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkSW5pdGlhbFZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1OYW1lJCwgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbktleSQsIHRoaXMuZG9jdW1lbnRJZCRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoW2Zvcm1OYW1lLCBwcm9jZXNzRGVmaW5pdGlvbktleSwgZG9jdW1lbnRJZF0pID0+XG4gICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Vmlld01vZGVsRm9yU3RhcnRGb3JtKGZvcm1OYW1lLCBwcm9jZXNzRGVmaW5pdGlvbktleSwgZG9jdW1lbnRJZClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAodmlld01vZGVsID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb24kLm5leHQoe2RhdGE6IHZpZXdNb2RlbH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzV2l6YXJkID0gdGhpcy5mb3JtaW8uZm9ybS5kaXNwbGF5ID09PSAnd2l6YXJkJztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZpZXdNb2RlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZm9ybU5hbWUkLFxuICAgICAgdGhpcy50YXNrSW5zdGFuY2VJZCQsXG4gICAgICB0aGlzLmNoYW5nZSQsXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAoKFtmb3JtTmFtZSwgdGFza0luc3RhbmNlSWQsIGNoYW5nZV0pID0+XG4gICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAudXBkYXRlVmlld01vZGVsKFxuICAgICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgdGFza0luc3RhbmNlSWQsXG4gICAgICAgICAgICAgIGNoYW5nZS5kYXRhLFxuICAgICAgICAgICAgICB0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSxcbiAgICAgICAgICAgICAgdGhpcy5faXNXaXphcmRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHZpZXdNb2RlbCA9PiB0aGlzLmhhbmRsZVZpZXdNb2RlbFVwZGF0ZSh2aWV3TW9kZWwpLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB0aGlzLmhhbmRsZVZpZXdNb2RlbFVwZGF0ZUVycm9yKGVycm9yKSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZm9ybU5hbWUkLFxuICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbktleSQsXG4gICAgICB0aGlzLmNoYW5nZSQsXG4gICAgICB0aGlzLmRvY3VtZW50SWQkLFxuICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKChbZm9ybU5hbWUsIHByb2Nlc3NEZWZpbml0aW9uS2V5LCBjaGFuZ2UsIGRvY3VtZW50SWRdKSA9PlxuICAgICAgICAgIHRoaXMudmlld01vZGVsU2VydmljZVxuICAgICAgICAgICAgLnVwZGF0ZVZpZXdNb2RlbEZvclN0YXJ0Rm9ybShcbiAgICAgICAgICAgICAgZm9ybU5hbWUsXG4gICAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICAgICAgICBkb2N1bWVudElkLFxuICAgICAgICAgICAgICBjaGFuZ2UuZGF0YSxcbiAgICAgICAgICAgICAgdGhpcy5mb3JtaW8uZm9ybWlvLnBhZ2UsXG4gICAgICAgICAgICAgIHRoaXMuX2lzV2l6YXJkXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgdGFwKHtcbiAgICAgICAgICAgICAgICBuZXh0OiB2aWV3TW9kZWwgPT4gdGhpcy5oYW5kbGVWaWV3TW9kZWxVcGRhdGUodmlld01vZGVsKSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgPT4gdGhpcy5oYW5kbGVWaWV3TW9kZWxVcGRhdGVFcnJvcihlcnJvciksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVWaWV3TW9kZWxVcGRhdGUodmlld01vZGVsOiBvYmplY3QpOiB2b2lkIHtcbiAgICBjb25zdCBzdWJtaXNzaW9uID0gdGhpcy5zdWJtaXNzaW9uJC52YWx1ZTtcbiAgICBzdWJtaXNzaW9uLmRhdGEgPSB2aWV3TW9kZWw7XG4gICAgdGhpcy5zdWJtaXNzaW9uJC5uZXh0KHN1Ym1pc3Npb24pO1xuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZSgpO1xuICAgIHRoaXMucmVmcmVzaEZvcm0uZW1pdCh7c3VibWlzc2lvbn0pO1xuICAgIHRoaXMucGVuZGluZ1VwZGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIHRoaXMuZm9ybUVycm9ycyQubmV4dChbXSk7XG4gICAgdGhpcy5zZXRXYWl0Q3Vyc29yKGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVWaWV3TW9kZWxVcGRhdGVFcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5wZW5kaW5nVXBkYXRlU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB0aGlzLmhhbmRsZUZvcm1FcnJvcihlcnJvcik7XG4gICAgdGhpcy5zZXRXYWl0Q3Vyc29yKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0V2FpdEN1cnNvcihlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBlbmFibGVkID8gJ3dhaXQnIDogJ2F1dG8nO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxkaXZcbiAgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmb3JtaW8tY2FyYm9uXCJcbiAgY2RzTGF5ZXI9XCIxLjBcIlxuICAqbmdJZj1cIntcbiAgICBzdWJtaXNzaW9uOiBzdWJtaXNzaW9uJCB8IGFzeW5jLFxuICAgIGZvcm06IGZvcm0kIHwgYXN5bmMsXG4gICAgdG9rZW5TZXRJbkxvY2FsU3RvcmFnZTogdG9rZW5TZXRJbkxvY2FsU3RvcmFnZSQgfCBhc3luYyxcbiAgICBmb3JtaW9PcHRpb25zOiBmb3JtaW9PcHRpb25zJCB8IGFzeW5jLFxuICAgIGxvYWRpbmc6IGxvYWRpbmckIHwgYXN5bmMsXG4gICAgZXJyb3JzOiBmb3JtRXJyb3JzJCB8IGFzeW5jLFxuICAgIHJlbmRlck9wdGlvbnM6IHJlbmRlck9wdGlvbnMkIHwgYXN5bmMsXG4gIH0gYXMgb2JzXCJcbj5cbiAgPGRpdiAqbmdJZj1cIm9icy5sb2FkaW5nXCIgY2xhc3M9XCJvdmVybGF5XCI+XG4gICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1zcGluXCI+PC9pPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwib2JzLmVycm9ycy5sZW5ndGggPiAwXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgcHQtNSBwYi01IG1iLTJcIj5cbiAgICA8b2w+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IGVycm9yIG9mIG9icy5lcnJvcnNcIiBjbGFzcz1cInBsLTJcIj5cbiAgICAgICAge3sgZXJyb3IgfX1cbiAgICAgIDwvbGk+XG4gICAgPC9vbD5cbiAgPC9kaXY+XG5cbiAgPGZvcm1pb1xuICAgICNmb3JtaW9cbiAgICBbc3VibWlzc2lvbl09XCJvYnMuc3VibWlzc2lvblwiXG4gICAgW2Zvcm1dPVwib2JzLmZvcm1cIlxuICAgIFtvcHRpb25zXT1cIm9icy5mb3JtaW9PcHRpb25zXCJcbiAgICBbcmVuZGVyT3B0aW9uc109XCJvYnMucmVuZGVyT3B0aW9uc1wiXG4gICAgW3JlZnJlc2hdPVwicmVmcmVzaEZvcm1cIlxuICAgIChzdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiXG4gICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAoZm9jdXNpbik9XCJvbkZvY3VzKCRldmVudClcIlxuICAgIChmb2N1c291dCk9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgKG5leHRQYWdlKT1cIm9uTmV4dFBhZ2UoKVwiXG4gICAgKHByZXZQYWdlKT1cIm9uUHJldmlvdXNQYWdlKClcIlxuICA+PC9mb3JtaW8+XG48L2Rpdj5cbiJdfQ==