@valtimo/dossier-management 10.7.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/esm2022/lib/dossier-management-assignee/dossier-management-assignee.component.mjs +75 -0
  2. package/{esm2020 → esm2022}/lib/dossier-management-connect-modal/dossier-management-connect-modal.component.mjs +4 -4
  3. package/{esm2020 → esm2022}/lib/dossier-management-detail-container/dossier-management-detail-container.component.mjs +5 -5
  4. package/esm2022/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.mjs +100 -0
  5. package/esm2022/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.mjs +458 -0
  6. package/esm2022/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.mjs +416 -0
  7. package/esm2022/lib/dossier-management-link-process/dossier-management-link-process.component.mjs +84 -0
  8. package/esm2022/lib/dossier-management-list/dossier-management-list.component.mjs +75 -0
  9. package/esm2022/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.mjs +59 -0
  10. package/{esm2020 → esm2022}/lib/dossier-management-routing.module.mjs +5 -5
  11. package/{esm2020 → esm2022}/lib/dossier-management-upload/dossier-management-upload.component.mjs +5 -5
  12. package/esm2022/lib/dossier-management.module.mjs +167 -0
  13. package/{esm2020 → esm2022}/lib/tab.service.mjs +4 -4
  14. package/{fesm2020 → fesm2022}/valtimo-dossier-management.mjs +158 -247
  15. package/fesm2022/valtimo-dossier-management.mjs.map +1 -0
  16. package/lib/dossier-management-assignee/dossier-management-assignee.component.d.ts +1 -1
  17. package/lib/dossier-management-assignee/dossier-management-assignee.component.d.ts.map +1 -1
  18. package/lib/dossier-management-connect-modal/dossier-management-connect-modal.component.d.ts +1 -1
  19. package/lib/dossier-management-detail-container/dossier-management-detail-container.component.d.ts +1 -1
  20. package/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.d.ts +1 -3
  21. package/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.d.ts.map +1 -1
  22. package/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.d.ts +9 -10
  23. package/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.d.ts.map +1 -1
  24. package/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.d.ts +2 -2
  25. package/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.d.ts.map +1 -1
  26. package/lib/dossier-management-link-process/dossier-management-link-process.component.d.ts +2 -2
  27. package/lib/dossier-management-link-process/dossier-management-link-process.component.d.ts.map +1 -1
  28. package/lib/dossier-management-list/dossier-management-list.component.d.ts +1 -2
  29. package/lib/dossier-management-list/dossier-management-list.component.d.ts.map +1 -1
  30. package/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.d.ts +1 -1
  31. package/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.d.ts.map +1 -1
  32. package/lib/dossier-management-upload/dossier-management-upload.component.d.ts +1 -1
  33. package/lib/dossier-management.module.d.ts +14 -16
  34. package/lib/dossier-management.module.d.ts.map +1 -1
  35. package/lib/models/list-column.model.d.ts +1 -1
  36. package/lib/models/list-column.model.d.ts.map +1 -1
  37. package/package.json +8 -14
  38. package/esm2020/lib/dossier-management-assignee/dossier-management-assignee.component.mjs +0 -73
  39. package/esm2020/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.mjs +0 -104
  40. package/esm2020/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.mjs +0 -456
  41. package/esm2020/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.mjs +0 -417
  42. package/esm2020/lib/dossier-management-link-process/dossier-management-link-process.component.mjs +0 -84
  43. package/esm2020/lib/dossier-management-list/dossier-management-list.component.mjs +0 -76
  44. package/esm2020/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.mjs +0 -57
  45. package/esm2020/lib/dossier-management-roles/dossier-management-roles.component.mjs +0 -97
  46. package/esm2020/lib/dossier-management.module.mjs +0 -171
  47. package/fesm2015/valtimo-dossier-management.mjs +0 -1846
  48. package/fesm2015/valtimo-dossier-management.mjs.map +0 -1
  49. package/fesm2020/valtimo-dossier-management.mjs.map +0 -1
  50. package/lib/dossier-management-roles/dossier-management-roles.component.d.ts +0 -33
  51. package/lib/dossier-management-roles/dossier-management-roles.component.d.ts.map +0 -1
  52. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  53. /package/{esm2020 → esm2022}/lib/models/list-column.model.mjs +0 -0
  54. /package/{esm2020 → esm2022}/lib/tab.enum.mjs +0 -0
  55. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  56. /package/{esm2020 → esm2022}/valtimo-dossier-management.mjs +0 -0
@@ -1,417 +0,0 @@
1
- /*
2
- * Copyright 2015-2023 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { Component, EventEmitter, Output, ViewChild, } from '@angular/core';
17
- import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, of, Subscription, switchMap, take, tap, } from 'rxjs';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "@valtimo/document";
20
- import * as i2 from "@angular/router";
21
- import * as i3 from "@ngx-translate/core";
22
- import * as i4 from "@angular/platform-browser";
23
- import * as i5 from "@angular/common";
24
- import * as i6 from "@valtimo/components";
25
- import * as i7 from "@valtimo/user-interface";
26
- export class DossierManagementSearchFieldsComponent {
27
- constructor(documentService, route, translateService, sanitizer) {
28
- this.documentService = documentService;
29
- this.route = route;
30
- this.translateService = translateService;
31
- this.sanitizer = sanitizer;
32
- this.searchField = new EventEmitter();
33
- this.downloadName$ = new BehaviorSubject('');
34
- this.downloadUrl$ = new BehaviorSubject(undefined);
35
- this.disableInput$ = new BehaviorSubject(false);
36
- this.selectedSearchField$ = new BehaviorSubject(null);
37
- this.formData$ = new BehaviorSubject(null);
38
- this.valid$ = new BehaviorSubject(false);
39
- this.subscriptions = new Subscription();
40
- this.COLUMNS = [
41
- {
42
- viewType: 'string',
43
- sortable: false,
44
- propertyName: 'title',
45
- translationKey: 'title',
46
- },
47
- {
48
- viewType: 'string',
49
- sortable: false,
50
- propertyName: 'key',
51
- translationKey: 'key',
52
- },
53
- {
54
- viewType: 'string',
55
- sortable: false,
56
- propertyName: 'path',
57
- translationKey: 'path',
58
- },
59
- {
60
- viewType: 'string',
61
- sortable: false,
62
- propertyName: 'dataType',
63
- translationKey: 'dataType',
64
- },
65
- {
66
- viewType: 'string',
67
- sortable: false,
68
- propertyName: 'fieldType',
69
- translationKey: 'fieldType',
70
- },
71
- ];
72
- this.dropdownColumns$ = new BehaviorSubject([
73
- {
74
- labelTranslationKey: 'searchFieldsOverview.id',
75
- dataKey: 'key',
76
- },
77
- {
78
- labelTranslationKey: 'searchFieldsOverview.text',
79
- dataKey: 'value',
80
- },
81
- ]);
82
- this.DATA_TYPES = [
83
- 'text',
84
- 'number',
85
- 'date',
86
- 'datetime',
87
- 'boolean',
88
- ];
89
- this.dataTypeItems$ = this.translateService.stream('key').pipe(map(() => this.DATA_TYPES.map(dataType => ({
90
- id: dataType,
91
- text: this.translateService.instant(`searchFields.${dataType}`),
92
- }))));
93
- this.dataTypeIsBoolean$ = new BehaviorSubject(false);
94
- this.dataTypeIsText$ = new BehaviorSubject(false);
95
- this.ALL_FIELD_TYPES = [
96
- 'single',
97
- 'range',
98
- 'single-select-dropdown',
99
- 'multi-select-dropdown',
100
- ];
101
- this.NON_TEXT_FIELD_TYPES = ['single', 'range'];
102
- this.BOOLEAN_FIELD_TYPES = ['single'];
103
- this.fieldTypeItems$ = combineLatest([
104
- this.dataTypeIsBoolean$,
105
- this.dataTypeIsText$,
106
- this.translateService.stream('key'),
107
- ]).pipe(map(([dataTypeIsBoolean, dataTypeIsText]) => {
108
- if (dataTypeIsBoolean) {
109
- return this.BOOLEAN_FIELD_TYPES.map(fieldType => ({
110
- id: fieldType,
111
- text: this.translateService.instant(`searchFieldsOverview.${fieldType}`),
112
- }));
113
- }
114
- else if (!dataTypeIsText) {
115
- return this.NON_TEXT_FIELD_TYPES.map(fieldType => ({
116
- id: fieldType,
117
- text: this.translateService.instant(`searchFieldsOverview.${fieldType}`),
118
- }));
119
- }
120
- return this.ALL_FIELD_TYPES.map(fieldType => ({
121
- id: fieldType,
122
- text: this.translateService.instant(`searchFieldsOverview.${fieldType}`),
123
- }));
124
- }));
125
- this.MATCH_TYPES = ['exact', 'like'];
126
- this.matchTypeItems$ = this.translateService
127
- .stream('key')
128
- .pipe(map(() => this.MATCH_TYPES.map(matchType => ({
129
- id: matchType,
130
- text: this.translateService.instant(`searchFieldsOverview.${matchType}`),
131
- }))));
132
- this.fields$ = this.translateService.stream('key').pipe(map(() => this.COLUMNS.map(column => ({
133
- key: column.propertyName,
134
- label: this.translateService.instant(`searchFieldsOverview.${column.translationKey}`),
135
- sortable: column.sortable,
136
- ...(column.viewType && { viewType: column.viewType }),
137
- ...(column.enum && { enum: column.enum }),
138
- }))));
139
- this.documentDefinitionName$ = this.route.params.pipe(map(params => params.name || ''), filter(docDefName => !!docDefName));
140
- this.loadingSearchFields = true;
141
- this.showSearchFieldsForm = false;
142
- this.refreshSearchFields$ = new BehaviorSubject(null);
143
- this.searchFields$ = combineLatest([
144
- this.documentDefinitionName$,
145
- this.refreshSearchFields$,
146
- ]).pipe(switchMap(([documentDefinitionName]) => this.documentService.getDocumentSearchFields(documentDefinitionName)), tap(searchFields => {
147
- this.documentDefinitionName$.pipe(take(1)).subscribe(documentDefinitionName => {
148
- if (searchFields && Array.isArray(searchFields) && searchFields.length > 0) {
149
- this.setDownload(documentDefinitionName, searchFields);
150
- }
151
- });
152
- }), tap(searchFields => {
153
- this.cachedSearchFields = searchFields;
154
- this.loadingSearchFields = false;
155
- }));
156
- this.translatedSearchFields$ = combineLatest([
157
- this.searchFields$,
158
- this.translateService.stream('key'),
159
- ]).pipe(map(([searchFields]) => searchFields.map(searchField => ({
160
- ...searchField,
161
- title: searchField.title ? searchField.title : '',
162
- dataType: this.translateService.instant(`searchFields.${searchField.dataType}`),
163
- matchType: this.translateService.instant(`searchFieldsOverview.${searchField.matchType}`),
164
- fieldType: this.translateService.instant(`searchFieldsOverview.${searchField.fieldType}`),
165
- }))));
166
- this.fieldTypeIsDropdown$ = new BehaviorSubject(false);
167
- this.dropdownDataProviderNames$ = combineLatest([
168
- this.documentService.getDropdownDataProviders(),
169
- this.translateService.stream('key'),
170
- ]).pipe(map(([providers]) => providers.map(provider => ({
171
- id: provider,
172
- text: this.translateService.instant(`searchFieldsOverview.${provider}`),
173
- }))));
174
- this.modifiedDropdownValues$ = new BehaviorSubject([]);
175
- this.initialDropdownValues$ = combineLatest([
176
- this.documentDefinitionName$,
177
- this.formData$,
178
- ]).pipe(distinctUntilChanged(([prevDocumentDefinitionName, prevFormData], [currDocumentDefinitionName, currFormData]) => prevDocumentDefinitionName === currDocumentDefinitionName &&
179
- prevFormData?.dropdownDataProvider === currFormData?.dropdownDataProvider &&
180
- prevFormData?.key === currFormData?.key), switchMap(([documentDefinitionName, formData]) => {
181
- if (!formData || !formData.dropdownDataProvider) {
182
- return of([]);
183
- }
184
- return this.documentService
185
- .getDropdownData(formData.dropdownDataProvider, documentDefinitionName, formData.key)
186
- .pipe(map(dropdownData => {
187
- if (dropdownData) {
188
- return Object.keys(dropdownData).map(dropdownFieldKey => ({
189
- key: dropdownFieldKey,
190
- value: dropdownData[dropdownFieldKey],
191
- }));
192
- }
193
- return [];
194
- }));
195
- }));
196
- this.showMatchTypes$ = combineLatest([
197
- this.dataTypeIsText$,
198
- this.fieldTypeIsDropdown$,
199
- ]).pipe(map(([dataTypeIsText, fieldTypeIsDropdown]) => dataTypeIsText && !fieldTypeIsDropdown));
200
- this.showReadonlyDropdownTable$ = combineLatest([
201
- this.dataTypeIsText$,
202
- this.fieldTypeIsDropdown$,
203
- this.formData$,
204
- ]).pipe(map(([dataTypeIsText, fieldTypeIsDropdown, formData]) => dataTypeIsText &&
205
- fieldTypeIsDropdown &&
206
- formData?.dropdownDataProvider &&
207
- !this.dropdownDataProviderSupportsUpdates(formData?.dropdownDataProvider)));
208
- this.showInputDropdownTable$ = combineLatest([
209
- this.dataTypeIsText$,
210
- this.fieldTypeIsDropdown$,
211
- this.formData$,
212
- ]).pipe(map(([dataTypeIsText, fieldTypeIsDropdown, formData]) => dataTypeIsText &&
213
- fieldTypeIsDropdown &&
214
- formData?.dropdownDataProvider &&
215
- this.dropdownDataProviderSupportsUpdates(formData?.dropdownDataProvider)));
216
- }
217
- ngOnInit() {
218
- this.openSelectedSearchFieldSubscription();
219
- }
220
- ngAfterViewInit() {
221
- this.openModalShowingSubscription();
222
- }
223
- ngOnDestroy() {
224
- this.subscriptions.unsubscribe();
225
- }
226
- searchFieldClicked(searchField, searchFieldActionTypeIsAdd) {
227
- this.disableInput$.pipe(take(1)).subscribe(inputDisabled => {
228
- if (!inputDisabled) {
229
- this.searchFieldActionTypeIsAdd = searchFieldActionTypeIsAdd;
230
- const searchFieldToSelect = this.cachedSearchFields.find(field => field.key === searchField.key);
231
- this.selectedSearchField$.next(searchFieldToSelect);
232
- }
233
- });
234
- }
235
- formValueChange(data) {
236
- setTimeout(() => {
237
- this.nextIfChanged(this.dataTypeIsText$, data.dataType === 'text');
238
- this.nextIfChanged(this.dataTypeIsBoolean$, data.dataType === 'boolean');
239
- this.nextIfChanged(this.fieldTypeIsDropdown$, this.isFieldTypeDropdown(data.fieldType));
240
- this.nextIfChanged(this.formData$, data);
241
- this.nextIfChanged(this.valid$, this.isValid(data));
242
- }, 0);
243
- }
244
- dropdownDatalistChange(data) {
245
- this.modifiedDropdownValues$.next(data);
246
- }
247
- moveRow(searchFieldRowIndex, moveUp, clickEvent, documentDefinitionName) {
248
- const searchFields = [...this.cachedSearchFields];
249
- const searchFieldRow = searchFields[searchFieldRowIndex];
250
- clickEvent.stopPropagation();
251
- const searchFieldIndex = searchFields.findIndex(field => field.key === searchFieldRow.key);
252
- const foundSearchField = { ...searchFields[searchFieldIndex] };
253
- const filteredSearchFields = searchFields.filter(field => field.key !== searchFieldRow.key);
254
- const multipleSearchFields = searchFields.length > 1;
255
- if (multipleSearchFields && moveUp && searchFieldIndex > 0) {
256
- const searchFieldBeforeKey = `${searchFields[searchFieldIndex - 1].key}`;
257
- const searchFieldBeforeIndex = filteredSearchFields.findIndex(field => field.key === searchFieldBeforeKey);
258
- filteredSearchFields.splice(searchFieldBeforeIndex, 0, foundSearchField);
259
- this.updateSearchFields(documentDefinitionName, filteredSearchFields);
260
- }
261
- else if (multipleSearchFields && !moveUp && searchFieldIndex < searchFields.length) {
262
- const searchFieldAfterKey = `${searchFields[searchFieldIndex + 1].key}`;
263
- const searchFieldAfterIndex = filteredSearchFields.findIndex(field => field.key === searchFieldAfterKey);
264
- filteredSearchFields.splice(searchFieldAfterIndex + 1, 0, foundSearchField);
265
- this.updateSearchFields(documentDefinitionName, filteredSearchFields);
266
- }
267
- }
268
- deleteSelectedSearchField(documentDefinitionName, selectedSearchField) {
269
- this.disableInput();
270
- if (this.dropdownDataProviderSupportsUpdates(selectedSearchField?.dropdownDataProvider)) {
271
- this.documentService
272
- .deleteDropdownData(selectedSearchField.dropdownDataProvider, documentDefinitionName, selectedSearchField.key)
273
- .subscribe();
274
- }
275
- this.documentService
276
- .deleteDocumentSearch(documentDefinitionName, selectedSearchField.key)
277
- .subscribe(() => {
278
- this.enableInput();
279
- this.hideModal();
280
- this.refreshSearchFields();
281
- }, () => {
282
- this.enableInput();
283
- });
284
- }
285
- saveSearchField(documentDefinitionName) {
286
- this.disableInput();
287
- this.formData$.pipe(take(1)).subscribe(formData => {
288
- const mappedFormData = {
289
- ...formData,
290
- matchType: !this.isFieldTypeDropdown(formData.fieldType) && formData.dataType === 'text'
291
- ? formData.matchType
292
- : 'exact',
293
- fieldType: formData.dataType !== 'boolean' ? formData.fieldType : 'single',
294
- };
295
- const prevFormData = this.selectedSearchField$.value;
296
- if (this.dropdownDataProviderSupportsUpdates(prevFormData?.dropdownDataProvider) &&
297
- prevFormData.dropdownDataProvider !== mappedFormData?.dropdownDataProvider) {
298
- this.documentService
299
- .deleteDropdownData(prevFormData.dropdownDataProvider, documentDefinitionName, prevFormData.key)
300
- .subscribe();
301
- }
302
- if (this.dropdownDataProviderSupportsUpdates(mappedFormData.dropdownDataProvider)) {
303
- this.modifiedDropdownValues$.pipe(take(1)).subscribe(dropdownValues => {
304
- const request = dropdownValues.reduce((acc, keyValue) => ({ ...acc, [keyValue.key]: keyValue.value }), {});
305
- this.documentService
306
- .postDropdownData(mappedFormData.dropdownDataProvider, documentDefinitionName, mappedFormData.key, request)
307
- .subscribe();
308
- });
309
- }
310
- if (this.searchFieldActionTypeIsAdd) {
311
- this.documentService.postDocumentSearch(documentDefinitionName, mappedFormData).subscribe(() => {
312
- this.enableInput();
313
- this.hideModal();
314
- this.refreshSearchFields();
315
- }, () => {
316
- this.enableInput();
317
- });
318
- }
319
- else {
320
- const newFields = [...this.cachedSearchFields];
321
- const indexToReplace = newFields.findIndex(field => field.key === mappedFormData.key);
322
- const filteredFields = newFields.filter(field => field.key !== mappedFormData.key);
323
- filteredFields.splice(indexToReplace, 0, mappedFormData);
324
- this.updateSearchFields(documentDefinitionName, filteredFields);
325
- }
326
- });
327
- }
328
- updateSearchFields(documentDefinitionName, newSearchFields) {
329
- this.disableInput();
330
- this.documentService.putDocumentSearch(documentDefinitionName, newSearchFields).subscribe(() => {
331
- this.enableInput();
332
- this.hideModal();
333
- this.refreshSearchFields();
334
- }, () => {
335
- this.enableInput();
336
- });
337
- }
338
- nextIfChanged(behaviourSubject$, value) {
339
- if (JSON.stringify(behaviourSubject$.value) !== JSON.stringify(value)) {
340
- behaviourSubject$.next(value);
341
- }
342
- }
343
- isValid(data) {
344
- const validMatchType = data.dataType === 'text' && !this.isFieldTypeDropdown(data.fieldType) ? data.matchType : true;
345
- const validDropdownDataProvider = this.isFieldTypeDropdown(data.fieldType)
346
- ? data.dropdownDataProvider
347
- : true;
348
- const containsAllValues = !!(data.key &&
349
- data.dataType &&
350
- validMatchType &&
351
- validDropdownDataProvider &&
352
- data.path);
353
- const keyIsUnique = !this.searchFieldActionTypeIsAdd ||
354
- this.cachedSearchFields.findIndex(field => field.key === data.key) === -1;
355
- return containsAllValues && keyIsUnique;
356
- }
357
- isFieldTypeDropdown(fieldType) {
358
- return fieldType === 'single-select-dropdown' || fieldType === 'multi-select-dropdown';
359
- }
360
- dropdownDataProviderSupportsUpdates(dropdownDataProvider) {
361
- return dropdownDataProvider === 'dropdownDatabaseDataProvider';
362
- }
363
- openSelectedSearchFieldSubscription() {
364
- this.subscriptions.add(this.selectedSearchField$.subscribe(() => {
365
- this.showModal();
366
- }));
367
- }
368
- openModalShowingSubscription() {
369
- this.subscriptions.add(this.modal.modalShowing$.subscribe(modalShowing => {
370
- if (modalShowing) {
371
- setTimeout(() => {
372
- this.showSearchFieldsForm = true;
373
- }, 0);
374
- }
375
- else {
376
- setTimeout(() => {
377
- this.showSearchFieldsForm = false;
378
- }, 150);
379
- }
380
- }));
381
- }
382
- setDownload(documentDefinitionName, searchFields) {
383
- this.downloadName$.next(`${documentDefinitionName}.json`);
384
- this.downloadUrl$.next(this.sanitizer.bypassSecurityTrustUrl('data:text/json;charset=UTF-8,' +
385
- encodeURIComponent(JSON.stringify({ searchFields }, null, 2))));
386
- }
387
- disableInput() {
388
- this.disableInput$.next(true);
389
- }
390
- enableInput() {
391
- this.disableInput$.next(false);
392
- }
393
- showModal() {
394
- this.modal?.show();
395
- }
396
- hideModal() {
397
- this.modal?.hide();
398
- }
399
- refreshSearchFields() {
400
- this.refreshSearchFields$.next(null);
401
- }
402
- }
403
- DossierManagementSearchFieldsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DossierManagementSearchFieldsComponent, deps: [{ token: i1.DocumentService }, { token: i2.ActivatedRoute }, { token: i3.TranslateService }, { token: i4.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
404
- DossierManagementSearchFieldsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DossierManagementSearchFieldsComponent, selector: "valtimo-dossier-management-search-fields", outputs: { searchField: "searchField" }, viewQueries: [{ propertyName: "moveRowButtonsTemplateRef", first: true, predicate: ["moveRowButtons"], descendants: true }, { propertyName: "modal", first: true, predicate: ["searchFieldModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n searchFields: translatedSearchFields$ | async,\n fields: fields$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"modal; context: {obs: obs}\"></ng-container>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <div class=\"btn-group mt-m3px mb-3 pr-2 float-right\">\n <a\n class=\"btn btn-secondary btn-space\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [ngClass]=\"{\n disabled:\n !obs.downloadUrl || !obs.downloadName || obs.searchFields.length <= 0 || obs.disableInput\n }\"\n >\n <i class=\"icon mdi mdi-download mr-1\"></i>\n {{ 'searchFields.downloadButtonText' | translate }}\n </a>\n <button\n (click)=\"searchFieldClicked($event, true)\"\n class=\"btn btn-primary btn-space\"\n [ngClass]=\"{disabled: loadingSearchFields || obs.disableInput}\"\n >\n <i class=\"icon mdi mdi-plus mr-1\"></i>\n {{ 'searchFieldsOverview.addRow' | translate }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.searchFields\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n (rowClicked)=\"searchFieldClicked($event, false)\"\n *ngIf=\"obs.searchFields; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n documentDefinitionName: documentDefinitionName$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #modal let-obs=\"obs\">\n <valtimo-modal\n #searchFieldModal\n elementId=\"searchFieldModal\"\n [title]=\"\n searchFieldActionTypeIsAdd\n ? ('searchFieldsOverview.addRow' | translate)\n : ('searchFieldsOverview.edit' | translate)\n \"\n [showFooter]=\"true\"\n >\n <div body class=\"mt-2\">\n <v-form\n (valueChange)=\"formValueChange($event)\"\n *ngIf=\"showSearchFieldsForm && {searchField: selectedSearchField$ | async} as searchObs\"\n >\n <v-input\n name=\"title\"\n [title]=\"'searchFieldsOverview.title' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.title\"\n [disabled]=\"obs.disableInput\"\n [required]=\"false\"\n [fullWidth]=\"true\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input>\n <v-input\n name=\"key\"\n [title]=\"'searchFieldsOverview.key' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.key\"\n [disabled]=\"obs.disableInput || !searchFieldActionTypeIsAdd\"\n [required]=\"true\"\n [widthPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input>\n <v-input\n name=\"path\"\n [title]=\"'searchFieldsOverview.path' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.path\"\n [disabled]=\"obs.disableInput\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input>\n <v-select\n *ngIf=\"dataTypeItems$ | async as dataTypeItems\"\n [items]=\"dataTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"dataType\"\n [defaultSelectionId]=\"searchObs.searchField?.dataType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"(showMatchTypes$ | async) && (matchTypeItems$ | async) as matchTypeItems\"\n [items]=\"matchTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"matchType\"\n [defaultSelectionId]=\"searchObs.searchField?.matchType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"fieldTypeItems$ | async as fieldTypeItems\"\n [items]=\"fieldTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"fieldType\"\n [defaultSelectionId]=\"searchObs.searchField?.fieldType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"\n (fieldTypeIsDropdown$ | async) &&\n (dropdownDataProviderNames$ | async) as dropdownDataProviderNames\n \"\n [items]=\"dropdownDataProviderNames\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"false\"\n name=\"dropdownDataProvider\"\n [defaultSelectionId]=\"searchObs.searchField?.dropdownDataProvider\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n ></v-select>\n <v-multi-input\n *ngIf=\"\n (showInputDropdownTable$ | async) &&\n (initialDropdownValues$ | async) as initialDropdownValues\n \"\n name=\"dropdownValues\"\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n type=\"keyValue\"\n [disabled]=\"obs.disableInput\"\n [defaultValues]=\"initialDropdownValues\"\n [margin]=\"true\"\n [required]=\"false\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n (valueChange)=\"dropdownDatalistChange($event)\"\n >\n </v-multi-input>\n <v-table\n *ngIf=\"\n (showReadonlyDropdownTable$ | async) &&\n (initialDropdownValues$ | async) as initialDropdownValues\n \"\n [items]=\"initialDropdownValues\"\n [columns]=\"dropdownColumns$ | async\"\n [showEditButtons]=\"false\"\n [itemsTranslationKey]=\"'searchFieldsOverview'\"\n [showPagination]=\"false\"\n [mobileBreakpointPx]=\"200\"\n ></v-table>\n </v-form>\n </div>\n <div footer>\n <div class=\"col-12 p-0\">\n <ng-container *ngTemplateOutlet=\"buttonsFooterModal; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n </valtimo-modal>\n</ng-template>\n\n<ng-template #buttonsFooterModal let-obs=\"obs\">\n <div class=\"buttons-container\" *ngIf=\"{searchField: selectedSearchField$ | async} as searchObs\">\n <div class=\"right-buttons\">\n <button\n class=\"btn btn-space btn-secondary\"\n *ngIf=\"!searchFieldActionTypeIsAdd\"\n [disabled]=\"obs.disableInput\"\n (click)=\"deleteSelectedSearchField(obs.documentDefinitionName, searchObs.searchField)\"\n >\n {{ 'searchFieldsOverview.delete' | translate }}\n </button>\n <button\n (click)=\"saveSearchField(obs.documentDefinitionName)\"\n type=\"button\"\n class=\"btn btn-primary btn-space mr-0\"\n [disabled]=\"obs.disableInput || !obs.valid\"\n >\n {{ 'searchFieldsOverview.submit' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"mb-3\">\n <valtimo-spinner></valtimo-spinner>\n </div>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */valtimo-list::ng-deep table{border-top:1px solid rgba(0,0,0,.125)}.modal-header::ng-deep{background-color:#f3f4f7}::ng-deep .disabled-move-row-button{cursor:default!important;filter:grayscale(1);opacity:.5}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}::ng-deep .tab-container{min-height:unset!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i6.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState", "lastColumnTemplate"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i6.ModalComponent, selector: "valtimo-modal", inputs: ["elementId", "title", "subtitle", "templateBelowSubtitle", "showFooter"] }, { kind: "component", type: i7.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "clearable", "disabled", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin"], outputs: ["selectedChange", "clear"] }, { kind: "component", type: i6.SpinnerComponent, selector: "valtimo-spinner", inputs: ["useBootstrapSpinner", "name", "type", "size", "color", "bdColor", "fullScreen", "noMarginTop"] }, { kind: "component", type: i7.InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$"], outputs: ["valueChange"] }, { kind: "component", type: i7.FormComponent, selector: "v-form", inputs: ["className"], outputs: ["valueChange"] }, { kind: "component", type: i7.MultiInputComponent, selector: "v-multi-input", inputs: ["name", "title", "titleTranslationKey", "type", "initialAmountOfRows", "minimumAmountOfRows", "maxRows", "addRowText", "addRowTranslationKey", "deleteRowText", "deleteRowTranslationKey", "disabled", "defaultValues", "margin", "tooltip", "required"], outputs: ["valueChange"] }, { kind: "component", type: i7.TableComponent, selector: "v-table", inputs: ["items", "columns", "loading", "showEditButtons", "showPagination", "editButtonTranslationKey", "itemsTranslationKey", "noResultsTranslationKey", "mobileBreakpointPx", "amountOfLoadingRows", "collectionSize", "maxPaginationItemSize", "page", "size"], outputs: ["editButtonClicked", "paginationSizeSet", "paginationPageSet"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
405
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DossierManagementSearchFieldsComponent, decorators: [{
406
- type: Component,
407
- args: [{ selector: 'valtimo-dossier-management-search-fields', template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n searchFields: translatedSearchFields$ | async,\n fields: fields$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"modal; context: {obs: obs}\"></ng-container>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <div class=\"btn-group mt-m3px mb-3 pr-2 float-right\">\n <a\n class=\"btn btn-secondary btn-space\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [ngClass]=\"{\n disabled:\n !obs.downloadUrl || !obs.downloadName || obs.searchFields.length <= 0 || obs.disableInput\n }\"\n >\n <i class=\"icon mdi mdi-download mr-1\"></i>\n {{ 'searchFields.downloadButtonText' | translate }}\n </a>\n <button\n (click)=\"searchFieldClicked($event, true)\"\n class=\"btn btn-primary btn-space\"\n [ngClass]=\"{disabled: loadingSearchFields || obs.disableInput}\"\n >\n <i class=\"icon mdi mdi-plus mr-1\"></i>\n {{ 'searchFieldsOverview.addRow' | translate }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.searchFields\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n (rowClicked)=\"searchFieldClicked($event, false)\"\n *ngIf=\"obs.searchFields; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n documentDefinitionName: documentDefinitionName$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #modal let-obs=\"obs\">\n <valtimo-modal\n #searchFieldModal\n elementId=\"searchFieldModal\"\n [title]=\"\n searchFieldActionTypeIsAdd\n ? ('searchFieldsOverview.addRow' | translate)\n : ('searchFieldsOverview.edit' | translate)\n \"\n [showFooter]=\"true\"\n >\n <div body class=\"mt-2\">\n <v-form\n (valueChange)=\"formValueChange($event)\"\n *ngIf=\"showSearchFieldsForm && {searchField: selectedSearchField$ | async} as searchObs\"\n >\n <v-input\n name=\"title\"\n [title]=\"'searchFieldsOverview.title' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.title\"\n [disabled]=\"obs.disableInput\"\n [required]=\"false\"\n [fullWidth]=\"true\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input>\n <v-input\n name=\"key\"\n [title]=\"'searchFieldsOverview.key' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.key\"\n [disabled]=\"obs.disableInput || !searchFieldActionTypeIsAdd\"\n [required]=\"true\"\n [widthPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input>\n <v-input\n name=\"path\"\n [title]=\"'searchFieldsOverview.path' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.path\"\n [disabled]=\"obs.disableInput\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input>\n <v-select\n *ngIf=\"dataTypeItems$ | async as dataTypeItems\"\n [items]=\"dataTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"dataType\"\n [defaultSelectionId]=\"searchObs.searchField?.dataType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"(showMatchTypes$ | async) && (matchTypeItems$ | async) as matchTypeItems\"\n [items]=\"matchTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"matchType\"\n [defaultSelectionId]=\"searchObs.searchField?.matchType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"fieldTypeItems$ | async as fieldTypeItems\"\n [items]=\"fieldTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"fieldType\"\n [defaultSelectionId]=\"searchObs.searchField?.fieldType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"\n (fieldTypeIsDropdown$ | async) &&\n (dropdownDataProviderNames$ | async) as dropdownDataProviderNames\n \"\n [items]=\"dropdownDataProviderNames\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"false\"\n name=\"dropdownDataProvider\"\n [defaultSelectionId]=\"searchObs.searchField?.dropdownDataProvider\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n ></v-select>\n <v-multi-input\n *ngIf=\"\n (showInputDropdownTable$ | async) &&\n (initialDropdownValues$ | async) as initialDropdownValues\n \"\n name=\"dropdownValues\"\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n type=\"keyValue\"\n [disabled]=\"obs.disableInput\"\n [defaultValues]=\"initialDropdownValues\"\n [margin]=\"true\"\n [required]=\"false\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n (valueChange)=\"dropdownDatalistChange($event)\"\n >\n </v-multi-input>\n <v-table\n *ngIf=\"\n (showReadonlyDropdownTable$ | async) &&\n (initialDropdownValues$ | async) as initialDropdownValues\n \"\n [items]=\"initialDropdownValues\"\n [columns]=\"dropdownColumns$ | async\"\n [showEditButtons]=\"false\"\n [itemsTranslationKey]=\"'searchFieldsOverview'\"\n [showPagination]=\"false\"\n [mobileBreakpointPx]=\"200\"\n ></v-table>\n </v-form>\n </div>\n <div footer>\n <div class=\"col-12 p-0\">\n <ng-container *ngTemplateOutlet=\"buttonsFooterModal; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n </valtimo-modal>\n</ng-template>\n\n<ng-template #buttonsFooterModal let-obs=\"obs\">\n <div class=\"buttons-container\" *ngIf=\"{searchField: selectedSearchField$ | async} as searchObs\">\n <div class=\"right-buttons\">\n <button\n class=\"btn btn-space btn-secondary\"\n *ngIf=\"!searchFieldActionTypeIsAdd\"\n [disabled]=\"obs.disableInput\"\n (click)=\"deleteSelectedSearchField(obs.documentDefinitionName, searchObs.searchField)\"\n >\n {{ 'searchFieldsOverview.delete' | translate }}\n </button>\n <button\n (click)=\"saveSearchField(obs.documentDefinitionName)\"\n type=\"button\"\n class=\"btn btn-primary btn-space mr-0\"\n [disabled]=\"obs.disableInput || !obs.valid\"\n >\n {{ 'searchFieldsOverview.submit' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"mb-3\">\n <valtimo-spinner></valtimo-spinner>\n </div>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */valtimo-list::ng-deep table{border-top:1px solid rgba(0,0,0,.125)}.modal-header::ng-deep{background-color:#f3f4f7}::ng-deep .disabled-move-row-button{cursor:default!important;filter:grayscale(1);opacity:.5}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}::ng-deep .tab-container{min-height:unset!important}\n"] }]
408
- }], ctorParameters: function () { return [{ type: i1.DocumentService }, { type: i2.ActivatedRoute }, { type: i3.TranslateService }, { type: i4.DomSanitizer }]; }, propDecorators: { moveRowButtonsTemplateRef: [{
409
- type: ViewChild,
410
- args: ['moveRowButtons']
411
- }], modal: [{
412
- type: ViewChild,
413
- args: ['searchFieldModal']
414
- }], searchField: [{
415
- type: Output
416
- }] } });
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9kb3NzaWVyLW1hbmFnZW1lbnQvc3JjL2xpYi9kb3NzaWVyLW1hbmFnZW1lbnQtZGV0YWlsLWNvbnRhaW5lci90YWJzL2Rvc3NpZXItbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzL2Rvc3NpZXItbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci1tYW5hZ2VtZW50L3NyYy9saWIvZG9zc2llci1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9kb3NzaWVyLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy9kb3NzaWVyLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUdaLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBRUgsRUFBRSxFQUNGLFlBQVksRUFDWixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7O0FBbUJkLE1BQU0sT0FBTyxzQ0FBc0M7SUFzUWpELFlBQ21CLGVBQWdDLEVBQ2hDLEtBQXFCLEVBQ3JCLGdCQUFrQyxFQUNsQyxTQUF1QjtRQUh2QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFr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RCxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDSSxLQUFLO3NCQUFuQyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFFbkIsV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIzIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RvY3VtZW50U2VydmljZX0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0xpc3RGaWVsZCwgTW9kYWxDb21wb25lbnR9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gIERlZmluaXRpb25Db2x1bW4sXG4gIFNlYXJjaEZpZWxkLFxuICBTZWFyY2hGaWVsZERhdGFUeXBlLFxuICBTZWFyY2hGaWVsZEZpZWxkVHlwZSxcbiAgU2VhcmNoRmllbGRNYXRjaFR5cGUsXG59IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge0RvbVNhbml0aXplciwgU2FmZVVybH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQge011bHRpSW5wdXRPdXRwdXQsIE11bHRpSW5wdXRWYWx1ZXMsIFNlbGVjdEl0ZW0sIFRhYmxlQ29sdW1ufSBmcm9tICdAdmFsdGltby91c2VyLWludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tZG9zc2llci1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9zc2llci1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3NzaWVyLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEb3NzaWVyTWFuYWdlbWVudFNlYXJjaEZpZWxkc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgQFZpZXdDaGlsZCgnbW92ZVJvd0J1dHRvbnMnKSBwdWJsaWMgbW92ZVJvd0J1dHRvbnNUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgnc2VhcmNoRmllbGRNb2RhbCcpIG1vZGFsOiBNb2RhbENvbXBvbmVudDtcblxuICBAT3V0cHV0KCkgc2VhcmNoRmllbGQ6IEV2ZW50RW1pdHRlcjxTZWFyY2hGaWVsZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcmVhZG9ubHkgZG93bmxvYWROYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2FmZVVybD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZGlzYWJsZUlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzZWxlY3RlZFNlYXJjaEZpZWxkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VhcmNoRmllbGQgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZm9ybURhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWFyY2hGaWVsZD4obnVsbCk7XG4gIHJlYWRvbmx5IHZhbGlkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IENPTFVNTlM6IEFycmF5PERlZmluaXRpb25Db2x1bW4+ID0gW1xuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ3RpdGxlJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAndGl0bGUnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAna2V5JyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAna2V5JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ3BhdGgnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdwYXRoJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2RhdGFUeXBlJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAnZGF0YVR5cGUnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAnZmllbGRUeXBlJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAnZmllbGRUeXBlJyxcbiAgICB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IGRyb3Bkb3duQ29sdW1ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PFRhYmxlQ29sdW1uPj4oW1xuICAgIHtcbiAgICAgIGxhYmVsVHJhbnNsYXRpb25LZXk6ICdzZWFyY2hGaWVsZHNPdmVydmlldy5pZCcsXG4gICAgICBkYXRhS2V5OiAna2V5JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsVHJhbnNsYXRpb25LZXk6ICdzZWFyY2hGaWVsZHNPdmVydmlldy50ZXh0JyxcbiAgICAgIGRhdGFLZXk6ICd2YWx1ZScsXG4gICAgfSxcbiAgXSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX1RZUEVTOiBBcnJheTxTZWFyY2hGaWVsZERhdGFUeXBlPiA9IFtcbiAgICAndGV4dCcsXG4gICAgJ251bWJlcicsXG4gICAgJ2RhdGUnLFxuICAgICdkYXRldGltZScsXG4gICAgJ2Jvb2xlYW4nLFxuICBdO1xuICByZWFkb25seSBkYXRhVHlwZUl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxTZWxlY3RJdGVtPj4gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKS5waXBlKFxuICAgIG1hcCgoKSA9PlxuICAgICAgdGhpcy5EQVRBX1RZUEVTLm1hcChkYXRhVHlwZSA9PiAoe1xuICAgICAgICBpZDogZGF0YVR5cGUsXG4gICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZHMuJHtkYXRhVHlwZX1gKSxcbiAgICAgIH0pKVxuICAgIClcbiAgKTtcblxuICByZWFkb25seSBkYXRhVHlwZUlzQm9vbGVhbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhVHlwZUlzVGV4dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBBTExfRklFTERfVFlQRVM6IEFycmF5PFNlYXJjaEZpZWxkRmllbGRUeXBlPiA9IFtcbiAgICAnc2luZ2xlJyxcbiAgICAncmFuZ2UnLFxuICAgICdzaW5nbGUtc2VsZWN0LWRyb3Bkb3duJyxcbiAgICAnbXVsdGktc2VsZWN0LWRyb3Bkb3duJyxcbiAgXTtcbiAgcHJpdmF0ZSByZWFkb25seSBOT05fVEVYVF9GSUVMRF9UWVBFUzogQXJyYXk8U2VhcmNoRmllbGRGaWVsZFR5cGU+ID0gWydzaW5nbGUnLCAncmFuZ2UnXTtcbiAgcHJpdmF0ZSByZWFkb25seSBCT09MRUFOX0ZJRUxEX1RZUEVTOiBBcnJheTxTZWFyY2hGaWVsZEZpZWxkVHlwZT4gPSBbJ3NpbmdsZSddO1xuICByZWFkb25seSBmaWVsZFR5cGVJdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8U2VsZWN0SXRlbT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5kYXRhVHlwZUlzQm9vbGVhbiQsXG4gICAgdGhpcy5kYXRhVHlwZUlzVGV4dCQsXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbZGF0YVR5cGVJc0Jvb2xlYW4sIGRhdGFUeXBlSXNUZXh0XSkgPT4ge1xuICAgICAgaWYgKGRhdGFUeXBlSXNCb29sZWFuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJPT0xFQU5fRklFTERfVFlQRVMubWFwKGZpZWxkVHlwZSA9PiAoe1xuICAgICAgICAgIGlkOiBmaWVsZFR5cGUsXG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkc092ZXJ2aWV3LiR7ZmllbGRUeXBlfWApLFxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2UgaWYgKCFkYXRhVHlwZUlzVGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5OT05fVEVYVF9GSUVMRF9UWVBFUy5tYXAoZmllbGRUeXBlID0+ICh7XG4gICAgICAgICAgaWQ6IGZpZWxkVHlwZSxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgc2VhcmNoRmllbGRzT3ZlcnZpZXcuJHtmaWVsZFR5cGV9YCksXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuQUxMX0ZJRUxEX1RZUEVTLm1hcChmaWVsZFR5cGUgPT4gKHtcbiAgICAgICAgaWQ6IGZpZWxkVHlwZSxcbiAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkc092ZXJ2aWV3LiR7ZmllbGRUeXBlfWApLFxuICAgICAgfSkpO1xuICAgIH0pXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBNQVRDSF9UWVBFUzogQXJyYXk8U2VhcmNoRmllbGRNYXRjaFR5cGU+ID0gWydleGFjdCcsICdsaWtlJ107XG4gIHJlYWRvbmx5IG1hdGNoVHlwZUl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxTZWxlY3RJdGVtPj4gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VcbiAgICAuc3RyZWFtKCdrZXknKVxuICAgIC5waXBlKFxuICAgICAgbWFwKCgpID0+XG4gICAgICAgIHRoaXMuTUFUQ0hfVFlQRVMubWFwKG1hdGNoVHlwZSA9PiAoe1xuICAgICAgICAgIGlkOiBtYXRjaFR5cGUsXG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkc092ZXJ2aWV3LiR7bWF0Y2hUeXBlfWApLFxuICAgICAgICB9KSlcbiAgICAgIClcbiAgICApO1xuXG4gIHJlYWRvbmx5IGZpZWxkcyQ6IE9ic2VydmFibGU8QXJyYXk8TGlzdEZpZWxkPj4gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKS5waXBlKFxuICAgIG1hcCgoKSA9PlxuICAgICAgdGhpcy5DT0xVTU5TLm1hcChjb2x1bW4gPT4gKHtcbiAgICAgICAga2V5OiBjb2x1bW4ucHJvcGVydHlOYW1lLFxuICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkc092ZXJ2aWV3LiR7Y29sdW1uLnRyYW5zbGF0aW9uS2V5fWApLFxuICAgICAgICBzb3J0YWJsZTogY29sdW1uLnNvcnRhYmxlLFxuICAgICAgICAuLi4oY29sdW1uLnZpZXdUeXBlICYmIHt2aWV3VHlwZTogY29sdW1uLnZpZXdUeXBlfSksXG4gICAgICAgIC4uLihjb2x1bW4uZW51bSAmJiB7ZW51bTogY29sdW1uLmVudW19KSxcbiAgICAgIH0pKVxuICAgIClcbiAgKTtcblxuICByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5uYW1lIHx8ICcnKSxcbiAgICBmaWx0ZXIoZG9jRGVmTmFtZSA9PiAhIWRvY0RlZk5hbWUpXG4gICk7XG5cbiAgcHJpdmF0ZSBjYWNoZWRTZWFyY2hGaWVsZHMhOiBBcnJheTxTZWFyY2hGaWVsZD47XG4gIHNlYXJjaEZpZWxkQWN0aW9uVHlwZUlzQWRkOiBib29sZWFuO1xuICBsb2FkaW5nU2VhcmNoRmllbGRzID0gdHJ1ZTtcbiAgc2hvd1NlYXJjaEZpZWxkc0Zvcm0gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hTZWFyY2hGaWVsZHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudWxsPihudWxsKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNlYXJjaEZpZWxkcyQ6IE9ic2VydmFibGU8QXJyYXk8U2VhcmNoRmllbGQ+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQsXG4gICAgdGhpcy5yZWZyZXNoU2VhcmNoRmllbGRzJCxcbiAgXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFtkb2N1bWVudERlZmluaXRpb25OYW1lXSkgPT5cbiAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldERvY3VtZW50U2VhcmNoRmllbGRzKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXG4gICAgKSxcbiAgICB0YXAoc2VhcmNoRmllbGRzID0+IHtcbiAgICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PiB7XG4gICAgICAgIGlmIChzZWFyY2hGaWVsZHMgJiYgQXJyYXkuaXNBcnJheShzZWFyY2hGaWVsZHMpICYmIHNlYXJjaEZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXREb3dubG9hZChkb2N1bWVudERlZmluaXRpb25OYW1lLCBzZWFyY2hGaWVsZHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KSxcbiAgICB0YXAoc2VhcmNoRmllbGRzID0+IHtcbiAgICAgIHRoaXMuY2FjaGVkU2VhcmNoRmllbGRzID0gc2VhcmNoRmllbGRzO1xuICAgICAgdGhpcy5sb2FkaW5nU2VhcmNoRmllbGRzID0gZmFsc2U7XG4gICAgfSlcbiAgKTtcblxuICByZWFkb25seSB0cmFuc2xhdGVkU2VhcmNoRmllbGRzJDogT2JzZXJ2YWJsZTxBcnJheTxTZWFyY2hGaWVsZD4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5zZWFyY2hGaWVsZHMkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NlYXJjaEZpZWxkc10pID0+XG4gICAgICBzZWFyY2hGaWVsZHMubWFwKHNlYXJjaEZpZWxkID0+ICh7XG4gICAgICAgIC4uLnNlYXJjaEZpZWxkLFxuICAgICAgICB0aXRsZTogc2VhcmNoRmllbGQudGl0bGUgPyBzZWFyY2hGaWVsZC50aXRsZSA6ICcnLFxuICAgICAgICBkYXRhVHlwZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkcy4ke3NlYXJjaEZpZWxkLmRhdGFUeXBlfWApLFxuICAgICAgICBtYXRjaFR5cGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZHNPdmVydmlldy4ke3NlYXJjaEZpZWxkLm1hdGNoVHlwZX1gKSxcbiAgICAgICAgZmllbGRUeXBlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgc2VhcmNoRmllbGRzT3ZlcnZpZXcuJHtzZWFyY2hGaWVsZC5maWVsZFR5cGV9YCksXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgZmllbGRUeXBlSXNEcm9wZG93biQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBkcm9wZG93bkRhdGFQcm92aWRlck5hbWVzJDogT2JzZXJ2YWJsZTxBcnJheTxTZWxlY3RJdGVtPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRvY3VtZW50U2VydmljZS5nZXREcm9wZG93bkRhdGFQcm92aWRlcnMoKSxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtwcm92aWRlcnNdKSA9PlxuICAgICAgcHJvdmlkZXJzLm1hcChwcm92aWRlciA9PiAoe1xuICAgICAgICBpZDogcHJvdmlkZXIsXG4gICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZHNPdmVydmlldy4ke3Byb3ZpZGVyfWApLFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kaWZpZWREcm9wZG93blZhbHVlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE11bHRpSW5wdXRWYWx1ZXM+KFtdKTtcblxuICByZWFkb25seSBpbml0aWFsRHJvcGRvd25WYWx1ZXMkOiBPYnNlcnZhYmxlPE11bHRpSW5wdXRWYWx1ZXM+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJCxcbiAgICB0aGlzLmZvcm1EYXRhJCxcbiAgXSkucGlwZShcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChcbiAgICAgIChbcHJldkRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIHByZXZGb3JtRGF0YV0sIFtjdXJyRG9jdW1lbnREZWZpbml0aW9uTmFtZSwgY3VyckZvcm1EYXRhXSkgPT5cbiAgICAgICAgcHJldkRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT09IGN1cnJEb2N1bWVudERlZmluaXRpb25OYW1lICYmXG4gICAgICAgIHByZXZGb3JtRGF0YT8uZHJvcGRvd25EYXRhUHJvdmlkZXIgPT09IGN1cnJGb3JtRGF0YT8uZHJvcGRvd25EYXRhUHJvdmlkZXIgJiZcbiAgICAgICAgcHJldkZvcm1EYXRhPy5rZXkgPT09IGN1cnJGb3JtRGF0YT8ua2V5XG4gICAgKSxcbiAgICBzd2l0Y2hNYXAoKFtkb2N1bWVudERlZmluaXRpb25OYW1lLCBmb3JtRGF0YV0pID0+IHtcbiAgICAgIGlmICghZm9ybURhdGEgfHwgIWZvcm1EYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgICAuZ2V0RHJvcGRvd25EYXRhKGZvcm1EYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyLCBkb2N1bWVudERlZmluaXRpb25OYW1lLCBmb3JtRGF0YS5rZXkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcChkcm9wZG93bkRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKGRyb3Bkb3duRGF0YSkge1xuICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZHJvcGRvd25EYXRhKS5tYXAoZHJvcGRvd25GaWVsZEtleSA9PiAoe1xuICAgICAgICAgICAgICAgIGtleTogZHJvcGRvd25GaWVsZEtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZHJvcGRvd25EYXRhW2Ryb3Bkb3duRmllbGRLZXldLFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0pXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd01hdGNoVHlwZXMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5kYXRhVHlwZUlzVGV4dCQsXG4gICAgdGhpcy5maWVsZFR5cGVJc0Ryb3Bkb3duJCxcbiAgXSkucGlwZShtYXAoKFtkYXRhVHlwZUlzVGV4dCwgZmllbGRUeXBlSXNEcm9wZG93bl0pID0+IGRhdGFUeXBlSXNUZXh0ICYmICFmaWVsZFR5cGVJc0Ryb3Bkb3duKSk7XG5cbiAgcmVhZG9ubHkgc2hvd1JlYWRvbmx5RHJvcGRvd25UYWJsZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRhdGFUeXBlSXNUZXh0JCxcbiAgICB0aGlzLmZpZWxkVHlwZUlzRHJvcGRvd24kLFxuICAgIHRoaXMuZm9ybURhdGEkLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbZGF0YVR5cGVJc1RleHQsIGZpZWxkVHlwZUlzRHJvcGRvd24sIGZvcm1EYXRhXSkgPT5cbiAgICAgICAgZGF0YVR5cGVJc1RleHQgJiZcbiAgICAgICAgZmllbGRUeXBlSXNEcm9wZG93biAmJlxuICAgICAgICBmb3JtRGF0YT8uZHJvcGRvd25EYXRhUHJvdmlkZXIgJiZcbiAgICAgICAgIXRoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXJTdXBwb3J0c1VwZGF0ZXMoZm9ybURhdGE/LmRyb3Bkb3duRGF0YVByb3ZpZGVyKVxuICAgIClcbiAgKTtcblxuICByZWFkb25seSBzaG93SW5wdXREcm9wZG93blRhYmxlJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuZGF0YVR5cGVJc1RleHQkLFxuICAgIHRoaXMuZmllbGRUeXBlSXNEcm9wZG93biQsXG4gICAgdGhpcy5mb3JtRGF0YSQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFtkYXRhVHlwZUlzVGV4dCwgZmllbGRUeXBlSXNEcm9wZG93biwgZm9ybURhdGFdKSA9PlxuICAgICAgICBkYXRhVHlwZUlzVGV4dCAmJlxuICAgICAgICBmaWVsZFR5cGVJc0Ryb3Bkb3duICYmXG4gICAgICAgIGZvcm1EYXRhPy5kcm9wZG93bkRhdGFQcm92aWRlciAmJlxuICAgICAgICB0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyU3VwcG9ydHNVcGRhdGVzKGZvcm1EYXRhPy5kcm9wZG93bkRhdGFQcm92aWRlcilcbiAgICApXG4gICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzYW5pdGl6ZXI6IERvbVNhbml0aXplclxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuU2VsZWN0ZWRTZWFyY2hGaWVsZFN1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3Blbk1vZGFsU2hvd2luZ1N1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZWFyY2hGaWVsZENsaWNrZWQoc2VhcmNoRmllbGQ6IFNlYXJjaEZpZWxkLCBzZWFyY2hGaWVsZEFjdGlvblR5cGVJc0FkZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0JC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShpbnB1dERpc2FibGVkID0+IHtcbiAgICAgIGlmICghaW5wdXREaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnNlYXJjaEZpZWxkQWN0aW9uVHlwZUlzQWRkID0gc2VhcmNoRmllbGRBY3Rpb25UeXBlSXNBZGQ7XG4gICAgICAgIGNvbnN0IHNlYXJjaEZpZWxkVG9TZWxlY3QgPSB0aGlzLmNhY2hlZFNlYXJjaEZpZWxkcy5maW5kKFxuICAgICAgICAgIGZpZWxkID0+IGZpZWxkLmtleSA9PT0gc2VhcmNoRmllbGQua2V5XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWFyY2hGaWVsZCQubmV4dChzZWFyY2hGaWVsZFRvU2VsZWN0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZvcm1WYWx1ZUNoYW5nZShkYXRhOiBTZWFyY2hGaWVsZCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5uZXh0SWZDaGFuZ2VkKHRoaXMuZGF0YVR5cGVJc1RleHQkLCBkYXRhLmRhdGFUeXBlID09PSAndGV4dCcpO1xuICAgICAgdGhpcy5uZXh0SWZDaGFuZ2VkKHRoaXMuZGF0YVR5cGVJc0Jvb2xlYW4kLCBkYXRhLmRhdGFUeXBlID09PSAnYm9vbGVhbicpO1xuICAgICAgdGhpcy5uZXh0SWZDaGFuZ2VkKHRoaXMuZmllbGRUeXBlSXNEcm9wZG93biQsIHRoaXMuaXNGaWVsZFR5cGVEcm9wZG93bihkYXRhLmZpZWxkVHlwZSkpO1xuICAgICAgdGhpcy5uZXh0SWZDaGFuZ2VkKHRoaXMuZm9ybURhdGEkLCBkYXRhKTtcbiAgICAgIHRoaXMubmV4dElmQ2hhbmdlZCh0aGlzLnZhbGlkJCwgdGhpcy5pc1ZhbGlkKGRhdGEpKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGRyb3Bkb3duRGF0YWxpc3RDaGFuZ2UoZGF0YTogTXVsdGlJbnB1dE91dHB1dCk6IHZvaWQge1xuICAgIHRoaXMubW9kaWZpZWREcm9wZG93blZhbHVlcyQubmV4dChkYXRhIGFzIE11bHRpSW5wdXRWYWx1ZXMpO1xuICB9XG5cbiAgbW92ZVJvdyhcbiAgICBzZWFyY2hGaWVsZFJvd0luZGV4OiBudW1iZXIsXG4gICAgbW92ZVVwOiBib29sZWFuLFxuICAgIGNsaWNrRXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHNlYXJjaEZpZWxkcyA9IFsuLi50aGlzLmNhY2hlZFNlYXJjaEZpZWxkc107XG4gICAgY29uc3Qgc2VhcmNoRmllbGRSb3cgPSBzZWFyY2hGaWVsZHNbc2VhcmNoRmllbGRSb3dJbmRleF07XG5cbiAgICBjbGlja0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3Qgc2VhcmNoRmllbGRJbmRleCA9IHNlYXJjaEZpZWxkcy5maW5kSW5kZXgoZmllbGQgPT4gZmllbGQua2V5ID09PSBzZWFyY2hGaWVsZFJvdy5rZXkpO1xuICAgIGNvbnN0IGZvdW5kU2VhcmNoRmllbGQgPSB7Li4uc2VhcmNoRmllbGRzW3NlYXJjaEZpZWxkSW5kZXhdfTtcbiAgICBjb25zdCBmaWx0ZXJlZFNlYXJjaEZpZWxkcyA9IHNlYXJjaEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQua2V5ICE9PSBzZWFyY2hGaWVsZFJvdy5rZXkpO1xuICAgIGNvbnN0IG11bHRpcGxlU2VhcmNoRmllbGRzID0gc2VhcmNoRmllbGRzLmxlbmd0aCA+IDE7XG5cbiAgICBpZiAobXVsdGlwbGVTZWFyY2hGaWVsZHMgJiYgbW92ZVVwICYmIHNlYXJjaEZpZWxkSW5kZXggPiAwKSB7XG4gICAgICBjb25zdCBzZWFyY2hGaWVsZEJlZm9yZUtleSA9IGAke3NlYXJjaEZpZWxkc1tzZWFyY2hGaWVsZEluZGV4IC0gMV0ua2V5fWA7XG4gICAgICBjb25zdCBzZWFyY2hGaWVsZEJlZm9yZUluZGV4ID0gZmlsdGVyZWRTZWFyY2hGaWVsZHMuZmluZEluZGV4KFxuICAgICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IHNlYXJjaEZpZWxkQmVmb3JlS2V5XG4gICAgICApO1xuICAgICAgZmlsdGVyZWRTZWFyY2hGaWVsZHMuc3BsaWNlKHNlYXJjaEZpZWxkQmVmb3JlSW5kZXgsIDAsIGZvdW5kU2VhcmNoRmllbGQpO1xuICAgICAgdGhpcy51cGRhdGVTZWFyY2hGaWVsZHMoZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgZmlsdGVyZWRTZWFyY2hGaWVsZHMpO1xuICAgIH0gZWxzZSBpZiAobXVsdGlwbGVTZWFyY2hGaWVsZHMgJiYgIW1vdmVVcCAmJiBzZWFyY2hGaWVsZEluZGV4IDwgc2VhcmNoRmllbGRzLmxlbmd0aCkge1xuICAgICAgY29uc3Qgc2VhcmNoRmllbGRBZnRlcktleSA9IGAke3NlYXJjaEZpZWxkc1tzZWFyY2hGaWVsZEluZGV4ICsgMV0ua2V5fWA7XG4gICAgICBjb25zdCBzZWFyY2hGaWVsZEFmdGVySW5kZXggPSBmaWx0ZXJlZFNlYXJjaEZpZWxkcy5maW5kSW5kZXgoXG4gICAgICAgIGZpZWxkID0+IGZpZWxkLmtleSA9PT0gc2VhcmNoRmllbGRBZnRlcktleVxuICAgICAgKTtcbiAgICAgIGZpbHRlcmVkU2VhcmNoRmllbGRzLnNwbGljZShzZWFyY2hGaWVsZEFmdGVySW5kZXggKyAxLCAwLCBmb3VuZFNlYXJjaEZpZWxkKTtcbiAgICAgIHRoaXMudXBkYXRlU2VhcmNoRmllbGRzKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIGZpbHRlcmVkU2VhcmNoRmllbGRzKTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVTZWxlY3RlZFNlYXJjaEZpZWxkKFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZyxcbiAgICBzZWxlY3RlZFNlYXJjaEZpZWxkOiBTZWFyY2hGaWVsZFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgaWYgKHRoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXJTdXBwb3J0c1VwZGF0ZXMoc2VsZWN0ZWRTZWFyY2hGaWVsZD8uZHJvcGRvd25EYXRhUHJvdmlkZXIpKSB7XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgICAuZGVsZXRlRHJvcGRvd25EYXRhKFxuICAgICAgICAgIHNlbGVjdGVkU2VhcmNoRmllbGQuZHJvcGRvd25EYXRhUHJvdmlkZXIsXG4gICAgICAgICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZSxcbiAgICAgICAgICBzZWxlY3RlZFNlYXJjaEZpZWxkLmtleVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgLmRlbGV0ZURvY3VtZW50U2VhcmNoKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIHNlbGVjdGVkU2VhcmNoRmllbGQua2V5KVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgICB0aGlzLmhpZGVNb2RhbCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaEZpZWxkcygpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgc2F2ZVNlYXJjaEZpZWxkKGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICB0aGlzLmZvcm1EYXRhJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShmb3JtRGF0YSA9PiB7XG4gICAgICBjb25zdCBtYXBwZWRGb3JtRGF0YTogU2VhcmNoRmllbGQgPSB7XG4gICAgICAgIC4uLmZvcm1EYXRhLFxuICAgICAgICBtYXRjaFR5cGU6XG4gICAgICAgICAgIXRoaXMuaXNGaWVsZFR5cGVEcm9wZG93bihmb3JtRGF0YS5maWVsZFR5cGUpICYmIGZvcm1EYXRhLmRhdGFUeXBlID09PSAndGV4dCdcbiAgICAgICAgICAgID8gZm9ybURhdGEubWF0Y2hUeXBlXG4gICAgICAgICAgICA6ICdleGFjdCcsXG4gICAgICAgIGZpZWxkVHlwZTogZm9ybURhdGEuZGF0YVR5cGUgIT09ICdib29sZWFuJyA/IGZvcm1EYXRhLmZpZWxkVHlwZSA6ICdzaW5nbGUnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcHJldkZvcm1EYXRhID0gdGhpcy5zZWxlY3RlZFNlYXJjaEZpZWxkJC52YWx1ZTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5kcm9wZG93bkRhdGFQcm92aWRlclN1cHBvcnRzVXBkYXRlcyhwcmV2Rm9ybURhdGE/LmRyb3Bkb3duRGF0YVByb3ZpZGVyKSAmJlxuICAgICAgICBwcmV2Rm9ybURhdGEuZHJvcGRvd25EYXRhUHJvdmlkZXIgIT09IG1hcHBlZEZvcm1EYXRhPy5kcm9wZG93bkRhdGFQcm92aWRlclxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlXG4gICAgICAgICAgLmRlbGV0ZURyb3Bkb3duRGF0YShcbiAgICAgICAgICAgIHByZXZGb3JtRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlcixcbiAgICAgICAgICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsXG4gICAgICAgICAgICBwcmV2Rm9ybURhdGEua2V5XG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyU3VwcG9ydHNVcGRhdGVzKG1hcHBlZEZvcm1EYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyKSkge1xuICAgICAgICB0aGlzLm1vZGlmaWVkRHJvcGRvd25WYWx1ZXMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGRyb3Bkb3duVmFsdWVzID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gZHJvcGRvd25WYWx1ZXMucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywga2V5VmFsdWUpID0+ICh7Li4uYWNjLCBba2V5VmFsdWUua2V5XToga2V5VmFsdWUudmFsdWV9KSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgICAgICAgLnBvc3REcm9wZG93bkRhdGEoXG4gICAgICAgICAgICAgIG1hcHBlZEZvcm1EYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICAgICAgICAgICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgICAgICAgICBtYXBwZWRGb3JtRGF0YS5rZXksXG4gICAgICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNlYXJjaEZpZWxkQWN0aW9uVHlwZUlzQWRkKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLnBvc3REb2N1bWVudFNlYXJjaChkb2N1bWVudERlZmluaXRpb25OYW1lLCBtYXBwZWRGb3JtRGF0YSkuc3Vic2NyaWJlKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgICAgIHRoaXMuaGlkZU1vZGFsKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2hGaWVsZHMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdGaWVsZHMgPSBbLi4udGhpcy5jYWNoZWRTZWFyY2hGaWVsZHNdO1xuICAgICAgICBjb25zdCBpbmRleFRvUmVwbGFjZSA9IG5ld0ZpZWxkcy5maW5kSW5kZXgoZmllbGQgPT4gZmllbGQua2V5ID09PSBtYXBwZWRGb3JtRGF0YS5rZXkpO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEZpZWxkcyA9IG5ld0ZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQua2V5ICE9PSBtYXBwZWRGb3JtRGF0YS5rZXkpO1xuXG4gICAgICAgIGZpbHRlcmVkRmllbGRzLnNwbGljZShpbmRleFRvUmVwbGFjZSwgMCwgbWFwcGVkRm9ybURhdGEpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEZpZWxkcyhkb2N1bWVudERlZmluaXRpb25OYW1lLCBmaWx0ZXJlZEZpZWxkcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVTZWFyY2hGaWVsZHMoZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nLCBuZXdTZWFyY2hGaWVsZHM6IEFycmF5PFNlYXJjaEZpZWxkPik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICB0aGlzLmRvY3VtZW50U2VydmljZS5wdXREb2N1bWVudFNlYXJjaChkb2N1bWVudERlZmluaXRpb25OYW1lLCBuZXdTZWFyY2hGaWVsZHMpLnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgICB0aGlzLmhpZGVNb2RhbCgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2hGaWVsZHMoKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0SWZDaGFuZ2VkKGJlaGF2aW91clN1YmplY3QkOiBCZWhhdmlvclN1YmplY3Q8YW55PiwgdmFsdWU6IGFueSkge1xuICAgIGlmIChKU09OLnN0cmluZ2lmeShiZWhhdmlvdXJTdWJqZWN0JC52YWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkge1xuICAgICAgYmVoYXZpb3VyU3ViamVjdCQubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkKGRhdGE6IFNlYXJjaEZpZWxkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsaWRNYXRjaFR5cGUgPVxuICAgICAgZGF0YS5kYXRhVHlwZSA9PT0gJ3RleHQnICYmICF0aGlzLmlzRmllbGRUeXBlRHJvcGRvd24oZGF0YS5maWVsZFR5cGUpID8gZGF0YS5tYXRjaFR5cGUgOiB0cnVlO1xuICAgIGNvbnN0IHZhbGlkRHJvcGRvd25EYXRhUHJvdmlkZXIgPSB0aGlzLmlzRmllbGRUeXBlRHJvcGRvd24oZGF0YS5maWVsZFR5cGUpXG4gICAgICA/IGRhdGEuZHJvcGRvd25EYXRhUHJvdmlkZXJcbiAgICAgIDogdHJ1ZTtcbiAgICBjb25zdCBjb250YWluc0FsbFZhbHVlcyA9ICEhKFxuICAgICAgZGF0YS5rZXkgJiZcbiAgICAgIGRhdGEuZGF0YVR5cGUgJiZcbiAgICAgIHZhbGlkTWF0Y2hUeXBlICYmXG4gICAgICB2YWxpZERyb3Bkb3duRGF0YVByb3ZpZGVyICYmXG4gICAgICBkYXRhLnBhdGhcbiAgICApO1xuICAgIGNvbnN0IGtleUlzVW5pcXVlID1cbiAgICAgICF0aGlzLnNlYXJjaEZpZWxkQWN0aW9uVHlwZUlzQWRkIHx8XG4gICAgICB0aGlzLmNhY2hlZFNlYXJjaEZpZWxkcy5maW5kSW5kZXgoZmllbGQgPT4gZmllbGQua2V5ID09PSBkYXRhLmtleSkgPT09IC0xO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5zQWxsVmFsdWVzICYmIGtleUlzVW5pcXVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ZpZWxkVHlwZURyb3Bkb3duKGZpZWxkVHlwZT86IFNlYXJjaEZpZWxkRmllbGRUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZpZWxkVHlwZSA9PT0gJ3NpbmdsZS1zZWxlY3QtZHJvcGRvd24nIHx8IGZpZWxkVHlwZSA9PT0gJ211bHRpLXNlbGVjdC1kcm9wZG93bic7XG4gIH1cblxuICBwcml2YXRlIGRyb3Bkb3duRGF0YVByb3ZpZGVyU3VwcG9ydHNVcGRhdGVzKGRyb3Bkb3duRGF0YVByb3ZpZGVyPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRyb3Bkb3duRGF0YVByb3ZpZGVyID09PSAnZHJvcGRvd25EYXRhYmFzZURhdGFQcm92aWRlcic7XG4gIH1cblxuICBwcml2YXRlIG9wZW5TZWxlY3RlZFNlYXJjaEZpZWxkU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnNlbGVjdGVkU2VhcmNoRmllbGQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd01vZGFsKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Nb2RhbFNob3dpbmdTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMubW9kYWwubW9kYWxTaG93aW5nJC5zdWJzY3JpYmUobW9kYWxTaG93aW5nID0+IHtcbiAgICAgICAgaWYgKG1vZGFsU2hvd2luZykge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoRmllbGRzRm9ybSA9IHRydWU7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dTZWFyY2hGaWVsZHNGb3JtID0gZmFsc2U7XG4gICAgICAgICAgfSwgMTUwKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREb3dubG9hZChkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsIHNlYXJjaEZpZWxkczogQXJyYXk8U2VhcmNoRmllbGQ+KTogdm9pZCB7XG4gICAgdGhpcy5kb3dubG9hZE5hbWUkLm5leHQoYCR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX0uanNvbmApO1xuICAgIHRoaXMuZG93bmxvYWRVcmwkLm5leHQoXG4gICAgICB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKFxuICAgICAgICAnZGF0YTp0ZXh0L2pzb247Y2hhcnNldD1VVEYtOCwnICtcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe3NlYXJjaEZpZWxkc30sIG51bGwsIDIpKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVJbnB1dCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbD8uc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoaWRlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbD8uaGlkZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoU2VhcmNoRmllbGRzKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaFNlYXJjaEZpZWxkcyQubmV4dChudWxsKTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwie1xuICAgIHNlYXJjaEZpZWxkczogdHJhbnNsYXRlZFNlYXJjaEZpZWxkcyQgfCBhc3luYyxcbiAgICBmaWVsZHM6IGZpZWxkcyQgfCBhc3luYyxcbiAgICBkb3dubG9hZFVybDogZG93bmxvYWRVcmwkIHwgYXN5bmMsXG4gICAgZG93bmxvYWROYW1lOiBkb3dubG9hZE5hbWUkIHwgYXN5bmMsXG4gICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luYyxcbiAgICB2YWxpZDogdmFsaWQkIHwgYXN5bmMsXG4gICAgZGlzYWJsZUlucHV0OiBkaXNhYmxlSW5wdXQkIHwgYXN5bmNcbiAgfSBhcyBvYnNcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uczsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kYWw7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2J1dHRvbnMgbGV0LW9icz1cIm9ic1wiPlxuICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIG10LW0zcHggbWItMyBwci0yIGZsb2F0LXJpZ2h0XCI+XG4gICAgPGFcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNwYWNlXCJcbiAgICAgIFtocmVmXT1cIm9icy5kb3dubG9hZFVybFwiXG4gICAgICBbZG93bmxvYWRdPVwib2JzLmRvd25sb2FkTmFtZVwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgIGRpc2FibGVkOlxuICAgICAgICAgICFvYnMuZG93bmxvYWRVcmwgfHwgIW9icy5kb3dubG9hZE5hbWUgfHwgb2JzLnNlYXJjaEZpZWxkcy5sZW5ndGggPD0gMCB8fCBvYnMuZGlzYWJsZUlucHV0XG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8aSBjbGFzcz1cImljb24gbWRpIG1kaS1kb3dubG9hZCBtci0xXCI+PC9pPlxuICAgICAge3sgJ3NlYXJjaEZpZWxkcy5kb3dubG9hZEJ1dHRvblRleHQnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9hPlxuICAgIDxidXR0b25cbiAgICAgIChjbGljayk9XCJzZWFyY2hGaWVsZENsaWNrZWQoJGV2ZW50LCB0cnVlKVwiXG4gICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc3BhY2VcIlxuICAgICAgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiBsb2FkaW5nU2VhcmNoRmllbGRzIHx8IG9icy5kaXNhYmxlSW5wdXR9XCJcbiAgICA+XG4gICAgICA8aSBjbGFzcz1cImljb24gbWRpIG1kaS1wbHVzIG1yLTFcIj48L2k+XG4gICAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuYWRkUm93JyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGlzdCBsZXQtb2JzPVwib2JzXCI+XG4gIDx2YWx0aW1vLWxpc3RcbiAgICBbaXRlbXNdPVwib2JzLnNlYXJjaEZpZWxkc1wiXG4gICAgW2ZpZWxkc109XCJvYnMuZmllbGRzXCJcbiAgICBbdmlld01vZGVdPVwiZmFsc2VcIlxuICAgIFtoZWFkZXJdPVwiZmFsc2VcIlxuICAgIChyb3dDbGlja2VkKT1cInNlYXJjaEZpZWxkQ2xpY2tlZCgkZXZlbnQsIGZhbHNlKVwiXG4gICAgKm5nSWY9XCJvYnMuc2VhcmNoRmllbGRzOyBlbHNlIGxvYWRpbmdcIlxuICAgIFtsYXN0Q29sdW1uVGVtcGxhdGVdPVwibW92ZVJvd0J1dHRvbnNUZW1wbGF0ZVJlZlwiXG4gID5cbiAgPC92YWx0aW1vLWxpc3Q+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vdmVSb3dCdXR0b25zIGxldC1pbmRleD1cImluZGV4XCIgbGV0LWxlbmd0aD1cImxlbmd0aFwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtb3ZlLXJvdy1idXR0b25zXCJcbiAgICAqbmdJZj1cIntcbiAgICAgIGRpc2FibGVJbnB1dDogZGlzYWJsZUlucHV0JCB8IGFzeW5jLFxuICAgICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luY1xuICAgIH0gYXMgb2JzXCJcbiAgPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm1kaSBtZGktYXJyb3ctdXAtYm9sZCBidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBtci0xXCJcbiAgICAgIChjbGljayk9XCJtb3ZlUm93KGluZGV4LCB0cnVlLCAkZXZlbnQsIG9icy5kb2N1bWVudERlZmluaXRpb25OYW1lKVwiXG4gICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkIGRpc2FibGVkLW1vdmUtcm93LWJ1dHRvbic6IGluZGV4ID09PSAwIHx8IG9icy5kaXNhYmxlSW5wdXR9XCJcbiAgICA+PC9pPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm1kaSBtZGktYXJyb3ctZG93bi1ib2xkIGJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVSb3coaW5kZXgsIGZhbHNlLCAkZXZlbnQsIG9icy5kb2N1bWVudERlZmluaXRpb25OYW1lKVwiXG4gICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkIGRpc2FibGVkLW1vdmUtcm93LWJ1dHRvbic6IGluZGV4ID09PSBsZW5ndGggLSAxIHx8IG9icy5kaXNhYmxlSW5wdXR9XCJcbiAgICA+PC9pPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWwgbGV0LW9icz1cIm9ic1wiPlxuICA8dmFsdGltby1tb2RhbFxuICAgICNzZWFyY2hGaWVsZE1vZGFsXG4gICAgZWxlbWVudElkPVwic2VhcmNoRmllbGRNb2RhbFwiXG4gICAgW3RpdGxlXT1cIlxuICAgICAgc2VhcmNoRmllbGRBY3Rpb25UeXBlSXNBZGRcbiAgICAgICAgPyAoJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmFkZFJvdycgfCB0cmFuc2xhdGUpXG4gICAgICAgIDogKCdzZWFyY2hGaWVsZHNPdmVydmlldy5lZGl0JyB8IHRyYW5zbGF0ZSlcbiAgICBcIlxuICAgIFtzaG93Rm9vdGVyXT1cInRydWVcIlxuICA+XG4gICAgPGRpdiBib2R5IGNsYXNzPVwibXQtMlwiPlxuICAgICAgPHYtZm9ybVxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybVZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAqbmdJZj1cInNob3dTZWFyY2hGaWVsZHNGb3JtICYmIHtzZWFyY2hGaWVsZDogc2VsZWN0ZWRTZWFyY2hGaWVsZCQgfCBhc3luY30gYXMgc2VhcmNoT2JzXCJcbiAgICAgID5cbiAgICAgICAgPHYtaW5wdXRcbiAgICAgICAgICBuYW1lPVwidGl0bGVcIlxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcudGl0bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbbWFyZ2luXT1cInRydWVcIlxuICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwic2VhcmNoT2JzLnNlYXJjaEZpZWxkPy50aXRsZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJmYWxzZVwiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy50aXRsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgIDwvdi1pbnB1dD5cbiAgICAgICAgPHYtaW5wdXRcbiAgICAgICAgICBuYW1lPVwia2V5XCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmtleScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFttYXJnaW5dPVwidHJ1ZVwiXG4gICAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJzZWFyY2hPYnMuc2VhcmNoRmllbGQ/LmtleVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm9icy5kaXNhYmxlSW5wdXQgfHwgIXNlYXJjaEZpZWxkQWN0aW9uVHlwZUlzQWRkXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgW3dpZHRoUHhdPVwiMjAwXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5rZXknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICA8L3YtaW5wdXQ+XG4gICAgICAgIDx2LWlucHV0XG4gICAgICAgICAgbmFtZT1cInBhdGhcIlxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcucGF0aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFttYXJnaW5dPVwidHJ1ZVwiXG4gICAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJzZWFyY2hPYnMuc2VhcmNoRmllbGQ/LnBhdGhcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJvYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5wYXRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0PlxuICAgICAgICA8di1zZWxlY3RcbiAgICAgICAgICAqbmdJZj1cImRhdGFUeXBlSXRlbXMkIHwgYXN5bmMgYXMgZGF0YVR5cGVJdGVtc1wiXG4gICAgICAgICAgW2l0ZW1zXT1cImRhdGFUeXBlSXRlbXNcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuc2VhcmNoRmllbGRQbGFjZWhvbGRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuZGF0YVR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgW21hcmdpbl09XCJ0cnVlXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgbmFtZT1cImRhdGFUeXBlXCJcbiAgICAgICAgICBbZGVmYXVsdFNlbGVjdGlvbklkXT1cInNlYXJjaE9icy5zZWFyY2hGaWVsZD8uZGF0YVR5cGVcIlxuICAgICAgICAgIFt3aWR0aEluUHhdPVwiMjAwXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kYXRhVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+PC92LXNlbGVjdD5cbiAgICAgICAgPHYtc2VsZWN0XG4gICAgICAgICAgKm5nSWY9XCIoc2hvd01hdGNoVHlwZXMkIHwgYXN5bmMpICYmIChtYXRjaFR5cGVJdGVtcyQgfCBhc3luYykgYXMgbWF0Y2hUeXBlSXRlbXNcIlxuICAgICAgICAgIFtpdGVtc109XCJtYXRjaFR5cGVJdGVtc1wiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5zZWFyY2hGaWVsZFBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5tYXRjaFR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgW21hcmdpbl09XCJ0cnVlXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgbmFtZT1cIm1hdGNoVHlwZVwiXG4gICAgICAgICAgW2RlZmF1bHRTZWxlY3Rpb25JZF09XCJzZWFyY2hPYnMuc2VhcmNoRmllbGQ/Lm1hdGNoVHlwZVwiXG4gICAgICAgICAgW3dpZHRoSW5QeF09XCIyMDBcIlxuICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLm1hdGNoVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+PC92LXNlbGVjdD5cbiAgICAgICAgPHYtc2VsZWN0XG4gICAgICAgICAgKm5nSWY9XCJmaWVsZFR5cGVJdGVtcyQgfCBhc3luYyBhcyBmaWVsZFR5cGVJdGVtc1wiXG4gICAgICAgICAgW2l0ZW1zXT1cImZpZWxkVHlwZUl0ZW1zXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnNlYXJjaEZpZWxkUGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmZpZWxkVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJvYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICBbbWFyZ2luXT1cInRydWVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICBuYW1lPVwiZmllbGRUeXBlXCJcbiAgICAgICAgICBbZGVmYXVsdFNlbGVjdGlvbklkXT1cInNlYXJjaE9icy5zZWFyY2hGaWVsZD8uZmllbGRUeXBlXCJcbiAgICAgICAgICBbd2lkdGhJblB4XT1cIjIwMFwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZmllbGRUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID48L3Ytc2VsZWN0PlxuICAgICAgICA8di1zZWxlY3RcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKGZpZWxkVHlwZUlzRHJvcGRvd24kIHwgYXN5bmMpICYmXG4gICAgICAgICAgICAoZHJvcGRvd25EYXRhUHJvdmlkZXJOYW1lcyQgfCBhc3luYykgYXMgZHJvcGRvd25EYXRhUHJvdmlkZXJOYW1lc1xuICAgICAgICAgIFwiXG4gICAgICAgICAgW2l0ZW1zXT1cImRyb3Bkb3duRGF0YVByb3ZpZGVyTmFtZXNcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuc2VhcmNoRmllbGRQbGFjZWhvbGRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuZHJvcGRvd25EYXRhUHJvdmlkZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgW21hcmdpbl09XCJ0cnVlXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwiZmFsc2VcIlxuICAgICAgICAgIG5hbWU9XCJkcm9wZG93bkRhdGFQcm92aWRlclwiXG4gICAgICAgICAgW2RlZmF1bHRTZWxlY3Rpb25JZF09XCJzZWFyY2hPYnMuc2VhcmNoRmllbGQ/LmRyb3Bkb3duRGF0YVByb3ZpZGVyXCJcbiAgICAgICAgICBbd2lkdGhJblB4XT1cIjIwMFwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZHJvcGRvd25EYXRhUHJvdmlkZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPjwvdi1zZWxlY3Q+XG4gICAgICAgIDx2LW11bHRpLWlucHV0XG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIChzaG93SW5wdXREcm9wZG93blRhYmxlJCB8IGFzeW5jKSAmJlxuICAgICAgICAgICAgKGluaXRpYWxEcm9wZG93blZhbHVlcyQgfCBhc3luYykgYXMgaW5pdGlhbERyb3Bkb3duVmFsdWVzXG4gICAgICAgICAgXCJcbiAgICAgICAgICBuYW1lPVwiZHJvcGRvd25WYWx1ZXNcIlxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuZHJvcGRvd25MaXN0VmFsdWVzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgdHlwZT1cImtleVZhbHVlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgW2RlZmF1bHRWYWx1ZXNdPVwiaW5pdGlhbERyb3Bkb3duVmFsdWVzXCJcbiAgICAgICAgICBbbWFyZ2luXT1cInRydWVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJmYWxzZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZHJvcGRvd25MaXN0VmFsdWVzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRyb3Bkb3duRGF0YWxpc3RDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LW11bHRpLWlucHV0PlxuICAgICAgICA8di10YWJsZVxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAoc2hvd1JlYWRvbmx5RHJvcGRvd25UYWJsZSQgfCBhc3luYykgJiZcbiAgICAgICAgICAgIChpbml0aWFsRHJvcGRvd25WYWx1ZXMkIHwgYXN5bmMpIGFzIGluaXRpYWxEcm9wZG93blZhbHVlc1xuICAgICAgICAgIFwiXG4gICAgICAgICAgW2l0ZW1zXT1cImluaXRpYWxEcm9wZG93blZhbHVlc1wiXG4gICAgICAgICAgW2NvbHVtbnNdPVwiZHJvcGRvd25Db2x1bW5zJCB8IGFzeW5jXCJcbiAgICAgICAgICBbc2hvd0VkaXRCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICBbaXRlbXNUcmFuc2xhdGlvbktleV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcnXCJcbiAgICAgICAgICBbc2hvd1BhZ2luYXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgIFttb2JpbGVCcmVha3BvaW50UHhdPVwiMjAwXCJcbiAgICAgICAgPjwvdi10YWJsZT5cbiAgICAgIDwvdi1mb3JtPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgZm9vdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBwLTBcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNGb290ZXJNb2RhbDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvdmFsdGltby1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9uc0Zvb3Rlck1vZGFsIGxldC1vYnM9XCJvYnNcIj5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtY29udGFpbmVyXCIgKm5nSWY9XCJ7c2VhcmNoRmllbGQ6IHNlbGVjdGVkU2VhcmNoRmllbGQkIHwgYXN5bmN9IGFzIHNlYXJjaE9ic1wiPlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1idXR0b25zXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zcGFjZSBidG4tc2Vjb25kYXJ5XCJcbiAgICAgICAgKm5nSWY9XCIhc2VhcmNoRmllbGRBY3Rpb25UeXBlSXNBZGRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgIChjbGljayk9XCJkZWxldGVTZWxlY3RlZFNlYXJjaEZpZWxkKG9icy5kb2N1bWVudERlZmluaXRpb25OYW1lLCBzZWFyY2hPYnMuc2VhcmNoRmllbGQpXCJcbiAgICAgID5cbiAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAoY2xpY2spPVwic2F2ZVNlYXJjaEZpZWxkKG9icy5kb2N1bWVudERlZmluaXRpb25OYW1lKVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc3BhY2UgbXItMFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJvYnMuZGlzYWJsZUlucHV0IHx8ICFvYnMudmFsaWRcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuc3VibWl0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgIDx2YWx0aW1vLXNwaW5uZXI+PC92YWx0aW1vLXNwaW5uZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==