@valtimo/dossier 5.3.0 → 5.7.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 (48) hide show
  1. package/esm2020/lib/dossier-detail/dossier-detail.component.mjs +4 -4
  2. package/esm2020/lib/dossier-detail/tab/audit/audit.component.mjs +4 -4
  3. package/esm2020/lib/dossier-detail/tab/contact-moments/contact-moments.component.mjs +4 -4
  4. package/esm2020/lib/dossier-detail/tab/documents/documents.component.mjs +4 -4
  5. package/esm2020/lib/dossier-detail/tab/progress/progress.component.mjs +4 -4
  6. package/esm2020/lib/dossier-detail/tab/summary/summary.component.mjs +4 -4
  7. package/esm2020/lib/dossier-detail/tab/zaakobjecten/zaakobjecten.component.mjs +65 -0
  8. package/esm2020/lib/dossier-detail-tab-enum.mjs +2 -1
  9. package/esm2020/lib/dossier-list/dossier-list.component.mjs +144 -142
  10. package/esm2020/lib/dossier-process-start-modal/dossier-process-start-modal.component.mjs +4 -4
  11. package/esm2020/lib/dossier-routing.module.mjs +5 -5
  12. package/esm2020/lib/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.mjs +16 -11
  13. package/esm2020/lib/dossier-update/dossier-update.component.mjs +4 -4
  14. package/esm2020/lib/dossier.module.mjs +22 -6
  15. package/esm2020/lib/dossier.service.mjs +10 -6
  16. package/esm2020/lib/models/index.mjs +13 -14
  17. package/esm2020/lib/models/zaakobjecten.model.mjs +17 -0
  18. package/esm2020/lib/services/zaakobjecten.service.mjs +41 -0
  19. package/esm2020/lib/tab.service.mjs +4 -4
  20. package/esm2020/public_api.mjs +2 -1
  21. package/fesm2015/valtimo-dossier.mjs +331 -219
  22. package/fesm2015/valtimo-dossier.mjs.map +1 -1
  23. package/fesm2020/valtimo-dossier.mjs +360 -224
  24. package/fesm2020/valtimo-dossier.mjs.map +1 -1
  25. package/lib/dossier-detail/tab/summary/summary.component.d.ts +3 -3
  26. package/lib/dossier-detail/tab/summary/summary.component.d.ts.map +1 -1
  27. package/lib/dossier-detail/tab/zaakobjecten/zaakobjecten.component.d.ts +21 -0
  28. package/lib/dossier-detail/tab/zaakobjecten/zaakobjecten.component.d.ts.map +1 -0
  29. package/lib/dossier-detail-tab-enum.d.ts +2 -1
  30. package/lib/dossier-detail-tab-enum.d.ts.map +1 -1
  31. package/lib/dossier-list/dossier-list.component.d.ts +50 -51
  32. package/lib/dossier-list/dossier-list.component.d.ts.map +1 -1
  33. package/lib/dossier-process-start-modal/dossier-process-start-modal.component.d.ts +3 -3
  34. package/lib/dossier-process-start-modal/dossier-process-start-modal.component.d.ts.map +1 -1
  35. package/lib/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.d.ts +6 -2
  36. package/lib/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.d.ts.map +1 -1
  37. package/lib/dossier.module.d.ts +16 -14
  38. package/lib/dossier.module.d.ts.map +1 -1
  39. package/lib/dossier.service.d.ts.map +1 -1
  40. package/lib/models/index.d.ts +1 -0
  41. package/lib/models/index.d.ts.map +1 -1
  42. package/lib/models/zaakobjecten.model.d.ts +12 -0
  43. package/lib/models/zaakobjecten.model.d.ts.map +1 -0
  44. package/lib/services/zaakobjecten.service.d.ts +16 -0
  45. package/lib/services/zaakobjecten.service.d.ts.map +1 -0
  46. package/package.json +2 -2
  47. package/public_api.d.ts +1 -0
  48. package/public_api.d.ts.map +1 -1
@@ -14,161 +14,140 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { Component, ViewChild } from '@angular/core';
17
- import { NavigationEnd } from '@angular/router';
18
17
  import { DocumentSearchRequestImpl, } from '@valtimo/document';
19
18
  import moment from 'moment';
20
- import { combineLatest } from 'rxjs';
19
+ import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, of, switchMap, take, tap, } from 'rxjs';
21
20
  import { DefaultTabs } from '../dossier-detail-tab-enum';
22
21
  import * as i0 from "@angular/core";
23
22
  import * as i1 from "@angular/router";
24
23
  import * as i2 from "@valtimo/document";
25
24
  import * as i3 from "@ngx-translate/core";
26
25
  import * as i4 from "../dossier.service";
27
- import * as i5 from "@valtimo/components";
28
- import * as i6 from "../dossier-process-start-modal/dossier-process-start-modal.component";
29
- import * as i7 from "@angular/common";
30
- import * as i8 from "@ng-bootstrap/ng-bootstrap";
31
- import * as i9 from "@angular/forms";
26
+ import * as i5 from "ngx-logger";
27
+ import * as i6 from "@valtimo/components";
28
+ import * as i7 from "../dossier-process-start-modal/dossier-process-start-modal.component";
29
+ import * as i8 from "@angular/common";
30
+ import * as i9 from "@ng-bootstrap/ng-bootstrap";
31
+ import * as i10 from "@angular/forms";
32
32
  moment.locale(localStorage.getItem('langKey') || '');
33
33
  export class DossierListComponent {
34
- constructor(route, router, documentService, translateService, dossierService) {
34
+ constructor(route, router, documentService, translateService, dossierService, logger) {
35
35
  this.route = route;
36
36
  this.router = router;
37
37
  this.documentService = documentService;
38
38
  this.translateService = translateService;
39
39
  this.dossierService = dossierService;
40
- this.documentDefinitionName = '';
41
- this.showCreateDocument = false;
42
- this.items = [];
43
- this.fields = [];
44
- this.processDefinitionListFields = [];
45
- this.processDocumentDefinitions = [];
46
- this.pagination = {
40
+ this.logger = logger;
41
+ this.selectedProcessDocumentDefinition = null;
42
+ this.modalListenerAdded = false;
43
+ this.settingPaginationForDocName$ = new BehaviorSubject(undefined);
44
+ this.documentDefinitionName$ = this.route.params.pipe(map(params => params.documentDefinitionName || ''), tap(documentDefinitionName => {
45
+ this.resetPagination(documentDefinitionName);
46
+ }));
47
+ this.associatedProcessDocumentDefinitions$ = this.documentDefinitionName$.pipe(switchMap(documentDefinitionName => documentDefinitionName
48
+ ? this.documentService.findProcessDocumentDefinitions(documentDefinitionName)
49
+ : of([])), map(processDocumentDefinitions => processDocumentDefinitions.filter(definition => definition.canInitializeDocument)));
50
+ this.schema$ = this.documentDefinitionName$.pipe(switchMap(documentDefinitionName => this.documentService.getDocumentDefinition(documentDefinitionName)), map(documentDefinition => documentDefinition?.schema));
51
+ this.storedSearchRequestKey$ = this.documentDefinitionName$.pipe(map(documentDefinitionName => `list-search-${documentDefinitionName}`));
52
+ this.hasStoredSearchRequest$ = this.storedSearchRequestKey$.pipe(map(storedSearchRequestKey => localStorage.getItem(storedSearchRequestKey) !== null));
53
+ this.columns$ = this.documentDefinitionName$.pipe(map(documentDefinitionName => this.dossierService.getDefinitionColumns(documentDefinitionName)));
54
+ this.fields$ = combineLatest([
55
+ this.columns$,
56
+ this.translateService.stream('key'),
57
+ ]).pipe(map(([columns]) => columns.map((column, index) => ({
58
+ key: column.propertyName,
59
+ label: this.translateService.instant(`fieldLabels.${column.translationKey}`),
60
+ sortable: column.sortable,
61
+ ...(column.viewType && { viewType: column.viewType }),
62
+ }))));
63
+ this.DEFAULT_PAGINATION = {
47
64
  collectionSize: 0,
48
65
  page: 1,
49
66
  size: 10,
50
67
  maxPaginationItemSize: 5,
51
68
  sort: undefined,
52
69
  };
53
- this.selectedProcessDocumentDefinition = null;
54
- this.modalListenerAdded = false;
70
+ this.pagination$ = new BehaviorSubject(undefined);
71
+ this.paginationCopy$ = this.pagination$.pipe(map(pagination => pagination && JSON.parse(JSON.stringify(pagination))));
72
+ this.sequence$ = new BehaviorSubject(undefined);
73
+ this.globalSearchFilter$ = new BehaviorSubject(undefined);
74
+ this.createdBy$ = new BehaviorSubject(undefined);
75
+ this.documentSearchRequest$ = combineLatest([
76
+ this.pagination$,
77
+ this.documentDefinitionName$,
78
+ this.sequence$,
79
+ this.createdBy$,
80
+ this.globalSearchFilter$,
81
+ ]).pipe(filter(([pagination]) => !!pagination), map(([pagination, documentDefinitionName, sequence, createdBy, globalSearchFilter]) => new DocumentSearchRequestImpl(documentDefinitionName, pagination.page - 1, pagination.size, sequence, createdBy, globalSearchFilter, pagination.sort)));
82
+ this.documentsRequest$ = this.documentSearchRequest$.pipe(distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), tap(request => {
83
+ this.storedSearchRequestKey$.pipe(take(1)).subscribe(storedSearchRequestKey => {
84
+ this.logger.log(`store request in local storage: ${JSON.stringify(request)}`);
85
+ localStorage.setItem(storedSearchRequestKey, JSON.stringify(request));
86
+ });
87
+ }), switchMap(documentSearchRequest => this.documentService.getDocuments(documentSearchRequest)), tap(documents => {
88
+ this.setCollectionSize(documents);
89
+ }));
90
+ this.documentItems$ = this.documentsRequest$.pipe(map(documents => documents.content.map(document => {
91
+ const { content, ...others } = document;
92
+ return { ...content, ...others };
93
+ })));
55
94
  }
56
95
  ngOnInit() {
57
- this.doInit();
58
- this.routeEvent(this.router);
59
96
  this.modalListenerAdded = false;
60
97
  }
61
- ngOnDestroy() {
62
- this.routerSubscription.unsubscribe();
63
- this.translationSubscription.unsubscribe();
98
+ globalSearchFilterChange(searchFilter) {
99
+ this.globalSearchFilter$.next(searchFilter);
100
+ this.pageChange(1);
64
101
  }
65
- paginationSet() {
66
- this.getData();
102
+ sequenceChange(sequence) {
103
+ this.sequence$.next(Number(sequence));
104
+ this.pageChange(1);
67
105
  }
68
- routeEvent(router) {
69
- this.routerSubscription = router.events.subscribe(e => {
70
- if (e instanceof NavigationEnd) {
71
- this.doInit();
72
- this.getData();
106
+ pageChange(newPage) {
107
+ this.pagination$.pipe(take(1)).subscribe(pagination => {
108
+ if (pagination && pagination.page !== newPage) {
109
+ this.logger.log(`Page change: ${newPage}`);
110
+ this.pagination$.next({ ...pagination, page: newPage });
73
111
  }
74
112
  });
75
113
  }
76
- doInit() {
77
- const documentDefinitionName = this.route.snapshot.paramMap.get('documentDefinitionName') || '';
78
- const columns = this.dossierService.getDefinitionColumns(documentDefinitionName);
79
- this.documentDefinitionName = documentDefinitionName;
80
- this.initialSortState = this.dossierService.getInitialSortState(columns);
81
- this.openTranslationSubscription(columns);
82
- }
83
- openTranslationSubscription(columns) {
84
- this.translationSubscription = combineLatest(columns.map(column => this.translateService.stream(`fieldLabels.${column.translationKey}`))).subscribe(labels => {
85
- this.fields = columns.map((column, index) => ({
86
- key: column.propertyName,
87
- label: labels[index],
88
- sortable: column.sortable,
89
- ...(column.viewType && { viewType: column.viewType }),
90
- }));
91
- });
92
- }
93
- getData() {
94
- this.findDocumentDefinition(this.documentDefinitionName);
95
- if (this.hasCachedSearchRequest()) {
96
- const documentSearchRequest = this.getCachedSearch();
97
- this.globalSearchFilter = documentSearchRequest.globalSearchFilter;
98
- this.sequence = documentSearchRequest.sequence;
99
- this.createdBy = documentSearchRequest.createdBy;
100
- this.findDocuments(documentSearchRequest);
101
- }
102
- else {
103
- this.doSearch();
104
- }
105
- this.getAllAssociatedProcessDefinitions();
106
- }
107
- doSearch() {
108
- const documentSearchRequest = this.buildDocumentSearchRequest();
109
- this.findDocuments(documentSearchRequest);
110
- }
111
- findDocuments(documentSearchRequest) {
112
- return this.documentService.getDocuments(documentSearchRequest).subscribe(documents => {
113
- this.documents = documents;
114
- this.transformDocuments(this.documents.content);
115
- this.pagination.collectionSize = this.documents.totalElements;
116
- this.storeSearch(documentSearchRequest);
114
+ pageSizeChange(newPageSize) {
115
+ this.pagination$.pipe(take(1)).subscribe(pagination => {
116
+ if (pagination && pagination.size !== newPageSize) {
117
+ const amountOfAvailablePages = Math.ceil(pagination.collectionSize / newPageSize);
118
+ const newPage = amountOfAvailablePages < pagination.page ? amountOfAvailablePages : pagination.page;
119
+ this.logger.log(`Page size change. New Page: ${newPage} New page size: ${newPageSize}`);
120
+ this.pagination$.next({ ...pagination, size: newPageSize, page: newPage });
121
+ }
117
122
  });
118
123
  }
119
- getAllAssociatedProcessDefinitions() {
120
- this.documentService
121
- .findProcessDocumentDefinitions(this.documentDefinitionName)
122
- .subscribe(processDocumentDefinitions => {
123
- this.processDocumentDefinitions = processDocumentDefinitions.filter(processDocumentDefinition => processDocumentDefinition.canInitializeDocument);
124
- this.processDefinitionListFields = [
125
- {
126
- key: 'processName',
127
- label: 'Proces',
128
- },
129
- ];
124
+ sortChanged(newSortState) {
125
+ this.pagination$.pipe(take(1)).subscribe(pagination => {
126
+ if (pagination && JSON.stringify(pagination.sort) !== JSON.stringify(newSortState)) {
127
+ this.logger.log(`Sort state change: ${JSON.stringify(newSortState)}`);
128
+ this.pagination$.next({ ...pagination, sort: newSortState });
129
+ }
130
130
  });
131
131
  }
132
- getCachedSearch() {
133
- const json = JSON.parse(this.getCachedDocumentSearchRequest());
134
- return new DocumentSearchRequestImpl(json.definitionName, this.pagination.page - 1, this.pagination.size, json.sequence, json.createdBy, json.globalSearchFilter, json.sort);
135
- }
136
- buildDocumentSearchRequest() {
137
- return new DocumentSearchRequestImpl(this.documentDefinitionName, this.pagination.page - 1, this.pagination.size, this.sequence, this.createdBy, this.globalSearchFilter, this.pagination.sort && this.pagination.sort.isSorting
138
- ? this.pagination.sort
139
- : this.initialSortState);
140
- }
141
- storeSearch(documentSearchRequest) {
142
- localStorage.setItem(this.getCachedKey(), JSON.stringify(documentSearchRequest));
143
- }
144
- getCachedDocumentSearchRequest() {
145
- return localStorage.getItem(this.getCachedKey()) || '';
146
- }
147
- hasCachedSearchRequest() {
148
- return localStorage.getItem(this.getCachedKey()) !== null;
149
- }
150
- getCachedKey() {
151
- return 'list-search-' + this.documentDefinitionName;
152
- }
153
132
  rowClick(document) {
154
- this.router.navigate([
155
- `/dossiers/${this.documentDefinitionName}/document/${document.id}/${DefaultTabs.summary}`,
156
- ]);
133
+ this.documentDefinitionName$.pipe(take(1)).subscribe(documentDefinitionName => {
134
+ this.router.navigate([
135
+ `/dossiers/${documentDefinitionName}/document/${document.id}/${DefaultTabs.summary}`,
136
+ ]);
137
+ });
157
138
  }
158
139
  startDossier() {
159
- if (this.processDocumentDefinitions.length > 1) {
160
- $('#startProcess').modal('show');
161
- }
162
- else {
163
- this.selectedProcessDocumentDefinition = this.processDocumentDefinitions[0];
164
- this.showStartProcessModal();
165
- }
166
- }
167
- showStartProcessModal() {
168
- if (this.selectedProcessDocumentDefinition !== null) {
169
- this.processStart.openModal(this.selectedProcessDocumentDefinition);
170
- this.selectedProcessDocumentDefinition = null;
171
- }
140
+ this.associatedProcessDocumentDefinitions$
141
+ .pipe(take(1))
142
+ .subscribe(associatedProcessDocumentDefinitions => {
143
+ if (associatedProcessDocumentDefinitions.length > 1) {
144
+ $('#startProcess').modal('show');
145
+ }
146
+ else {
147
+ this.selectedProcessDocumentDefinition = associatedProcessDocumentDefinitions[0];
148
+ this.showStartProcessModal();
149
+ }
150
+ });
172
151
  }
173
152
  selectProcess(processDocumentDefinition) {
174
153
  const modal = $('#startProcess');
@@ -179,40 +158,63 @@ export class DossierListComponent {
179
158
  this.selectedProcessDocumentDefinition = processDocumentDefinition;
180
159
  modal.modal('hide');
181
160
  }
182
- findDocumentDefinition(documentDefinitionName) {
183
- this.documentService.getDocumentDefinition(documentDefinitionName).subscribe(definition => {
184
- this.schema = definition.schema;
161
+ resetPagination(documentDefinitionName) {
162
+ this.settingPaginationForDocName$.pipe(take(1)).subscribe(settingPaginationForDocName => {
163
+ if (documentDefinitionName !== settingPaginationForDocName) {
164
+ this.pagination$.next(undefined);
165
+ this.logger.log('clear pagination');
166
+ this.settingPaginationForDocName$.next(documentDefinitionName);
167
+ this.setPagination(documentDefinitionName);
168
+ }
185
169
  });
186
170
  }
187
- transformDocuments(documentsContent) {
188
- this.items = documentsContent.map(document => {
189
- const { content, ...others } = document;
190
- return { ...content, ...others };
171
+ setPagination(documentDefinitionName) {
172
+ combineLatest([this.hasStoredSearchRequest$, this.storedSearchRequestKey$, this.columns$])
173
+ .pipe(take(1))
174
+ .subscribe(([hasStoredSearchRequest, storedSearchRequestKey, columns]) => {
175
+ const defaultPagination = this.getDefaultPagination(columns);
176
+ const storedPagination = this.getStoredPagination(hasStoredSearchRequest, storedSearchRequestKey);
177
+ this.logger.log(`Set pagination: ${JSON.stringify(storedPagination || defaultPagination)}`);
178
+ this.pagination$.next(storedPagination || defaultPagination);
191
179
  });
192
180
  }
193
- paginationClicked(page) {
194
- this.pagination.page = page;
195
- this.doSearch();
181
+ getDefaultPagination(columns) {
182
+ const defaultSortState = this.dossierService.getInitialSortState(columns);
183
+ return {
184
+ ...this.DEFAULT_PAGINATION,
185
+ sort: defaultSortState,
186
+ };
196
187
  }
197
- sortChanged(sortState) {
198
- this.pagination.sort = sortState;
199
- this.doSearch();
188
+ getStoredPagination(hasStoredSearchRequest, storedSearchRequestKey) {
189
+ const storedSearchRequest = hasStoredSearchRequest && JSON.parse(localStorage.getItem(storedSearchRequestKey));
190
+ return (storedSearchRequest && {
191
+ ...this.DEFAULT_PAGINATION,
192
+ sort: storedSearchRequest.sort,
193
+ page: storedSearchRequest.page + 1,
194
+ size: storedSearchRequest.size,
195
+ });
196
+ }
197
+ setCollectionSize(documents) {
198
+ this.pagination$.pipe(take(1)).subscribe(pagination => {
199
+ if (pagination.collectionSize !== documents.totalElements) {
200
+ this.pagination$.next({ ...pagination, collectionSize: documents.totalElements });
201
+ }
202
+ });
200
203
  }
201
- getInitialSortState() {
202
- if (this.hasCachedSearchRequest()) {
203
- const cachedRequest = JSON.parse(this.getCachedDocumentSearchRequest());
204
- return cachedRequest.sort ? cachedRequest.sort : this.initialSortState;
204
+ showStartProcessModal() {
205
+ if (this.selectedProcessDocumentDefinition !== null) {
206
+ this.processStart.openModal(this.selectedProcessDocumentDefinition);
207
+ this.selectedProcessDocumentDefinition = null;
205
208
  }
206
- return this.initialSortState;
207
209
  }
208
210
  }
209
- DossierListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: DossierListComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.DocumentService }, { token: i3.TranslateService }, { token: i4.DossierService }], target: i0.ɵɵFactoryTarget.Component });
210
- DossierListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: DossierListComponent, selector: "valtimo-dossier-list", viewQueries: [{ propertyName: "processStart", first: true, predicate: ["processStartModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 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 *ngTemplateOutlet=\"sidebar\"></ng-container>\n\n<div class=\"main-content pt-0\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <div>\n <div class=\"text-right mt-m3px mb-3\">\n <button\n type=\"button\"\n class=\"btn btn-space btn-primary mr-0\"\n (click)=\"startDossier()\"\n [ngbTooltip]=\"processDocumentDefinitions.length === 0 ? 'No action' : null\"\n placement=\"bottom\"\n [disabled]=\"processDocumentDefinitions.length === 0\"\n >\n <i class=\"icon mdi mdi-plus mr-1\"></i>\n {{ 'Start Dossier' | translate }}\n </button>\n </div>\n\n <div\n class=\"modal fade\"\n id=\"startProcess\"\n tabindex=\"-1\"\n role=\"dialog\"\n aria-labelledby=\"startProcessLabel\"\n aria-hidden=\"true\"\n >\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"startProcessLabel\">\n {{ 'dashboard.startProcess.title' | translate }}\n </h3>\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"table-responsive\">\n <table class=\"table m-0\">\n <tr\n *ngFor=\"let processDocumentDefinition of processDocumentDefinitions\"\n (click)=\"selectProcess(processDocumentDefinition)\"\n style=\"cursor: pointer\"\n >\n <td>{{ processDocumentDefinition.processName }}</td>\n </tr>\n </table>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">\n {{ 'cta.close' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <valtimo-widget>\n <valtimo-list\n [items]=\"items\"\n [fields]=\"fields\"\n (rowClicked)=\"rowClick($event)\"\n [pagination]=\"pagination\"\n [viewMode]=\"true\"\n [header]=\"true\"\n paginationIdentifier=\"dossierList\"\n (paginationClicked)=\"paginationClicked($event)\"\n (paginationSet)=\"paginationSet()\"\n [initialSortState]=\"getInitialSortState()\"\n (sortChanged)=\"sortChanged($event)\"\n >\n <div header>\n <h3 class=\"list-header-title\">\n {{ schema?.title }}\n <sup class=\"ml-1 badge badge-pill badge-primary\">{{\n documents?.content.length || 0\n }}</sup>\n </h3>\n </div>\n </valtimo-list>\n </valtimo-widget>\n </div>\n </div>\n <valtimo-dossier-process-start-modal #processStartModal></valtimo-dossier-process-start-modal>\n</div>\n\n<ng-template #sidebar>\n <valtimo-filter-sidebar>\n <h4 class=\"title\">Search</h4>\n <div class=\"mb-4\">\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'dossier.forms.globalSearchPlaceHolder' | translate }}\"\n [(ngModel)]=\"globalSearchFilter\"\n (blur)=\"doSearch()\"\n (keyup.enter)=\"doSearch()\"\n />\n </div>\n\n <div class=\"mb-4\">\n <input\n type=\"number\"\n class=\"form-control\"\n placeholder=\"{{ 'dossier.forms.referenceNumberPlaceHolder' | translate }}\"\n [(ngModel)]=\"sequence\"\n (blur)=\"doSearch()\"\n (keyup.enter)=\"doSearch()\"\n />\n </div>\n </valtimo-filter-sidebar>\n</ng-template>\n", styles: [""], components: [{ type: i5.WidgetComponent, selector: "valtimo-widget", inputs: ["type", "name", "icon", "contrast", "divider", "title", "subtitle", "collapseAble", "collapse", "additionalClasses"] }, { type: i5.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { type: i6.DossierProcessStartModalComponent, selector: "valtimo-dossier-process-start-modal" }, { type: i5.FilterSidebarComponent, selector: "valtimo-filter-sidebar" }], directives: [{ type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], pipes: { "translate": i3.TranslatePipe } });
211
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: DossierListComponent, decorators: [{
211
+ DossierListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DossierListComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.DocumentService }, { token: i3.TranslateService }, { token: i4.DossierService }, { token: i5.NGXLogger }], target: i0.ɵɵFactoryTarget.Component });
212
+ DossierListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: DossierListComponent, selector: "valtimo-dossier-list", viewQueries: [{ propertyName: "processStart", first: true, predicate: ["processStartModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 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 *ngTemplateOutlet=\"sidebar\"></ng-container>\n\n<div class=\"main-content pt-0\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <div\n *ngIf=\"\n associatedProcessDocumentDefinitions$ | async as associatedProcessDocumentDefinitions\n \"\n >\n <div class=\"text-right mt-m3px mb-3\">\n <button\n type=\"button\"\n class=\"btn btn-space btn-primary mr-0\"\n (click)=\"startDossier()\"\n [ngbTooltip]=\"associatedProcessDocumentDefinitions.length === 0 ? 'No action' : null\"\n placement=\"bottom\"\n [disabled]=\"associatedProcessDocumentDefinitions.length === 0\"\n >\n <i class=\"icon mdi mdi-plus mr-1\"></i>\n {{ 'Start Dossier' | translate }}\n </button>\n </div>\n\n <div\n class=\"modal fade\"\n id=\"startProcess\"\n tabindex=\"-1\"\n role=\"dialog\"\n aria-labelledby=\"startProcessLabel\"\n aria-hidden=\"true\"\n >\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"startProcessLabel\">\n {{ 'dashboard.startProcess.title' | translate }}\n </h3>\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"table-responsive\">\n <table class=\"table m-0\">\n <tr\n *ngFor=\"let processDocumentDefinition of associatedProcessDocumentDefinitions\"\n (click)=\"selectProcess(processDocumentDefinition)\"\n style=\"cursor: pointer\"\n >\n <td>{{ processDocumentDefinition.processName }}</td>\n </tr>\n </table>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">\n {{ 'cta.close' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <valtimo-widget>\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n </valtimo-widget>\n </div>\n </div>\n <valtimo-dossier-process-start-modal #processStartModal></valtimo-dossier-process-start-modal>\n</div>\n\n<ng-template #list>\n <ng-container *ngIf=\"paginationCopy$ | async as pagination\">\n <ng-container *ngIf=\"fields$ | async as fields\">\n <valtimo-list\n *ngIf=\"documentItems$ | async as documentItems\"\n [items]=\"documentItems\"\n [fields]=\"fields\"\n (rowClicked)=\"rowClick($event)\"\n [pagination]=\"pagination\"\n [viewMode]=\"true\"\n [header]=\"true\"\n paginationIdentifier=\"dossierList\"\n (paginationClicked)=\"pageChange($event)\"\n (paginationSet)=\"pageSizeChange($event)\"\n [initialSortState]=\"pagination.sort\"\n (sortChanged)=\"sortChanged($event)\"\n >\n <div header>\n <h3 class=\"list-header-title\">\n {{ (schema$ | async)?.title }}\n <sup class=\"ml-1 badge badge-pill badge-primary\">{{ documentItems?.length || 0 }}</sup>\n </h3>\n </div>\n </valtimo-list>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #sidebar>\n <valtimo-filter-sidebar>\n <h4 class=\"title\">Search</h4>\n <div class=\"mb-4\">\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'dossier.forms.globalSearchPlaceHolder' | translate }}\"\n [ngModel]=\"globalSearchFilter$ | async\"\n (ngModelChange)=\"globalSearchFilterChange($event)\"\n />\n </div>\n\n <div class=\"mb-4\">\n <input\n type=\"number\"\n class=\"form-control\"\n placeholder=\"{{ 'dossier.forms.referenceNumberPlaceHolder' | translate }}\"\n [ngModel]=\"sequence$ | async\"\n (ngModelChange)=\"sequenceChange($event)\"\n />\n </div>\n </valtimo-filter-sidebar>\n</ng-template>\n", styles: [""], components: [{ type: i6.WidgetComponent, selector: "valtimo-widget", inputs: ["type", "name", "icon", "contrast", "divider", "title", "subtitle", "collapseAble", "collapse", "additionalClasses"] }, { type: i7.DossierProcessStartModalComponent, selector: "valtimo-dossier-process-start-modal" }, { type: i6.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { type: i6.FilterSidebarComponent, selector: "valtimo-filter-sidebar" }], directives: [{ type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], pipes: { "async": i8.AsyncPipe, "translate": i3.TranslatePipe } });
213
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DossierListComponent, decorators: [{
212
214
  type: Component,
213
- args: [{ selector: 'valtimo-dossier-list', template: "<!--\n ~ Copyright 2015-2020 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 *ngTemplateOutlet=\"sidebar\"></ng-container>\n\n<div class=\"main-content pt-0\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <div>\n <div class=\"text-right mt-m3px mb-3\">\n <button\n type=\"button\"\n class=\"btn btn-space btn-primary mr-0\"\n (click)=\"startDossier()\"\n [ngbTooltip]=\"processDocumentDefinitions.length === 0 ? 'No action' : null\"\n placement=\"bottom\"\n [disabled]=\"processDocumentDefinitions.length === 0\"\n >\n <i class=\"icon mdi mdi-plus mr-1\"></i>\n {{ 'Start Dossier' | translate }}\n </button>\n </div>\n\n <div\n class=\"modal fade\"\n id=\"startProcess\"\n tabindex=\"-1\"\n role=\"dialog\"\n aria-labelledby=\"startProcessLabel\"\n aria-hidden=\"true\"\n >\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"startProcessLabel\">\n {{ 'dashboard.startProcess.title' | translate }}\n </h3>\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"table-responsive\">\n <table class=\"table m-0\">\n <tr\n *ngFor=\"let processDocumentDefinition of processDocumentDefinitions\"\n (click)=\"selectProcess(processDocumentDefinition)\"\n style=\"cursor: pointer\"\n >\n <td>{{ processDocumentDefinition.processName }}</td>\n </tr>\n </table>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">\n {{ 'cta.close' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <valtimo-widget>\n <valtimo-list\n [items]=\"items\"\n [fields]=\"fields\"\n (rowClicked)=\"rowClick($event)\"\n [pagination]=\"pagination\"\n [viewMode]=\"true\"\n [header]=\"true\"\n paginationIdentifier=\"dossierList\"\n (paginationClicked)=\"paginationClicked($event)\"\n (paginationSet)=\"paginationSet()\"\n [initialSortState]=\"getInitialSortState()\"\n (sortChanged)=\"sortChanged($event)\"\n >\n <div header>\n <h3 class=\"list-header-title\">\n {{ schema?.title }}\n <sup class=\"ml-1 badge badge-pill badge-primary\">{{\n documents?.content.length || 0\n }}</sup>\n </h3>\n </div>\n </valtimo-list>\n </valtimo-widget>\n </div>\n </div>\n <valtimo-dossier-process-start-modal #processStartModal></valtimo-dossier-process-start-modal>\n</div>\n\n<ng-template #sidebar>\n <valtimo-filter-sidebar>\n <h4 class=\"title\">Search</h4>\n <div class=\"mb-4\">\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'dossier.forms.globalSearchPlaceHolder' | translate }}\"\n [(ngModel)]=\"globalSearchFilter\"\n (blur)=\"doSearch()\"\n (keyup.enter)=\"doSearch()\"\n />\n </div>\n\n <div class=\"mb-4\">\n <input\n type=\"number\"\n class=\"form-control\"\n placeholder=\"{{ 'dossier.forms.referenceNumberPlaceHolder' | translate }}\"\n [(ngModel)]=\"sequence\"\n (blur)=\"doSearch()\"\n (keyup.enter)=\"doSearch()\"\n />\n </div>\n </valtimo-filter-sidebar>\n</ng-template>\n", styles: [""] }]
214
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.DocumentService }, { type: i3.TranslateService }, { type: i4.DossierService }]; }, propDecorators: { processStart: [{
215
+ args: [{ selector: 'valtimo-dossier-list', template: "<!--\n ~ Copyright 2015-2020 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 *ngTemplateOutlet=\"sidebar\"></ng-container>\n\n<div class=\"main-content pt-0\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <div\n *ngIf=\"\n associatedProcessDocumentDefinitions$ | async as associatedProcessDocumentDefinitions\n \"\n >\n <div class=\"text-right mt-m3px mb-3\">\n <button\n type=\"button\"\n class=\"btn btn-space btn-primary mr-0\"\n (click)=\"startDossier()\"\n [ngbTooltip]=\"associatedProcessDocumentDefinitions.length === 0 ? 'No action' : null\"\n placement=\"bottom\"\n [disabled]=\"associatedProcessDocumentDefinitions.length === 0\"\n >\n <i class=\"icon mdi mdi-plus mr-1\"></i>\n {{ 'Start Dossier' | translate }}\n </button>\n </div>\n\n <div\n class=\"modal fade\"\n id=\"startProcess\"\n tabindex=\"-1\"\n role=\"dialog\"\n aria-labelledby=\"startProcessLabel\"\n aria-hidden=\"true\"\n >\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"startProcessLabel\">\n {{ 'dashboard.startProcess.title' | translate }}\n </h3>\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"table-responsive\">\n <table class=\"table m-0\">\n <tr\n *ngFor=\"let processDocumentDefinition of associatedProcessDocumentDefinitions\"\n (click)=\"selectProcess(processDocumentDefinition)\"\n style=\"cursor: pointer\"\n >\n <td>{{ processDocumentDefinition.processName }}</td>\n </tr>\n </table>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">\n {{ 'cta.close' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <valtimo-widget>\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n </valtimo-widget>\n </div>\n </div>\n <valtimo-dossier-process-start-modal #processStartModal></valtimo-dossier-process-start-modal>\n</div>\n\n<ng-template #list>\n <ng-container *ngIf=\"paginationCopy$ | async as pagination\">\n <ng-container *ngIf=\"fields$ | async as fields\">\n <valtimo-list\n *ngIf=\"documentItems$ | async as documentItems\"\n [items]=\"documentItems\"\n [fields]=\"fields\"\n (rowClicked)=\"rowClick($event)\"\n [pagination]=\"pagination\"\n [viewMode]=\"true\"\n [header]=\"true\"\n paginationIdentifier=\"dossierList\"\n (paginationClicked)=\"pageChange($event)\"\n (paginationSet)=\"pageSizeChange($event)\"\n [initialSortState]=\"pagination.sort\"\n (sortChanged)=\"sortChanged($event)\"\n >\n <div header>\n <h3 class=\"list-header-title\">\n {{ (schema$ | async)?.title }}\n <sup class=\"ml-1 badge badge-pill badge-primary\">{{ documentItems?.length || 0 }}</sup>\n </h3>\n </div>\n </valtimo-list>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #sidebar>\n <valtimo-filter-sidebar>\n <h4 class=\"title\">Search</h4>\n <div class=\"mb-4\">\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'dossier.forms.globalSearchPlaceHolder' | translate }}\"\n [ngModel]=\"globalSearchFilter$ | async\"\n (ngModelChange)=\"globalSearchFilterChange($event)\"\n />\n </div>\n\n <div class=\"mb-4\">\n <input\n type=\"number\"\n class=\"form-control\"\n placeholder=\"{{ 'dossier.forms.referenceNumberPlaceHolder' | translate }}\"\n [ngModel]=\"sequence$ | async\"\n (ngModelChange)=\"sequenceChange($event)\"\n />\n </div>\n </valtimo-filter-sidebar>\n</ng-template>\n", styles: [""] }]
216
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.DocumentService }, { type: i3.TranslateService }, { type: i4.DossierService }, { type: i5.NGXLogger }]; }, propDecorators: { processStart: [{
215
217
  type: ViewChild,
216
218
  args: ['processStartModal']
217
219
  }] } });
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci9zcmMvbGliL2Rvc3NpZXItbGlzdC9kb3NzaWVyLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9kb3NzaWVyL3NyYy9saWIvZG9zc2llci1saXN0L2Rvc3NpZXItbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBQyxTQUFTLEVBQXFCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQWlCLGFBQWEsRUFBUyxNQUFNLGlCQUFpQixDQUFDO0FBR3RFLE9BQU8sRUFFTCx5QkFBeUIsR0FJMUIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLGFBQWEsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBT3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQU9yRCxNQUFNLE9BQU8sb0JBQW9CO0lBOEIvQixZQUNVLEtBQXFCLEVBQ3JCLE1BQWMsRUFDZCxlQUFnQyxFQUN2QixnQkFBa0MsRUFDbEMsY0FBOEI7UUFKdkMsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUN2QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQWxDMUMsMkJBQXNCLEdBQUcsRUFB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bEIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxTQUFvQjtRQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRTtZQUNqQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLENBQUM7WUFDeEUsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7U0FDeEU7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDOztpSEE1T1Usb0JBQW9CO3FHQUFwQixvQkFBb0IsK0tDM0NqQyxrcUpBbUlBOzJGRHhGYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usc0JBQXNCO29OQTBCQSxZQUFZO3NCQUEzQyxTQUFTO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0RlZmluaXRpb25Db2x1bW59IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge1xuICBEb2N1bWVudFNlYXJjaFJlcXVlc3QsXG4gIERvY3VtZW50U2VhcmNoUmVxdWVzdEltcGwsXG4gIERvY3VtZW50U2VydmljZSxcbiAgU29ydFN0YXRlLFxuICBQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uLFxufSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge2NvbWJpbmVMYXRlc3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0RlZmF1bHRUYWJzfSBmcm9tICcuLi9kb3NzaWVyLWRldGFpbC10YWItZW51bSc7XG5pbXBvcnQge0Rvc3NpZXJQcm9jZXNzU3RhcnRNb2RhbENvbXBvbmVudH0gZnJvbSAnLi4vZG9zc2llci1wcm9jZXNzLXN0YXJ0LW1vZGFsL2Rvc3NpZXItcHJvY2Vzcy1zdGFydC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHtEb3NzaWVyU2VydmljZX0gZnJvbSAnLi4vZG9zc2llci5zZXJ2aWNlJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZhclxuZGVjbGFyZSB2YXIgJDtcblxubW9tZW50LmxvY2FsZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFuZ0tleScpIHx8ICcnKTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsdGltby1kb3NzaWVyLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9zc2llci1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZG9zc2llci1saXN0LmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRG9zc2llckxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBkb2N1bWVudERlZmluaXRpb25OYW1lID0gJyc7XG4gIHB1YmxpYyBpbXBsZW1lbnRhdGlvbkRlZmluaXRpb25zOiBhbnk7XG4gIHB1YmxpYyBzaG93Q3JlYXRlRG9jdW1lbnQgPSBmYWxzZTtcbiAgcHVibGljIHNjaGVtYTogYW55O1xuICBwdWJsaWMgZG9jdW1lbnRzOiBhbnk7XG4gIHB1YmxpYyBpdGVtczogQXJyYXk8YW55PiA9IFtdO1xuICBwdWJsaWMgZmllbGRzOiBBcnJheTxhbnk+ID0gW107XG4gIHB1YmxpYyBwcm9jZXNzRGVmaW5pdGlvbkxpc3RGaWVsZHM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHVibGljIHByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zOiBQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uW10gPSBbXTtcbiAgcHVibGljIHBhZ2luYXRpb24gPSB7XG4gICAgY29sbGVjdGlvblNpemU6IDAsXG4gICAgcGFnZTogMSxcbiAgICBzaXplOiAxMCxcbiAgICBtYXhQYWdpbmF0aW9uSXRlbVNpemU6IDUsXG4gICAgc29ydDogdW5kZWZpbmVkLFxuICB9O1xuICBwdWJsaWMgZ2xvYmFsU2VhcmNoRmlsdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzZXF1ZW5jZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgY3JlYXRlZEJ5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2VsZWN0ZWRQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uOiBQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbW9kYWxMaXN0ZW5lckFkZGVkID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ3Byb2Nlc3NTdGFydE1vZGFsJykgcHJvY2Vzc1N0YXJ0OiBEb3NzaWVyUHJvY2Vzc1N0YXJ0TW9kYWxDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSByb3V0ZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIHRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgaW5pdGlhbFNvcnRTdGF0ZTogU29ydFN0YXRlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb3NzaWVyU2VydmljZTogRG9zc2llclNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZG9Jbml0KCk7XG4gICAgdGhpcy5yb3V0ZUV2ZW50KHRoaXMucm91dGVyKTtcbiAgICB0aGlzLm1vZGFsTGlzdGVuZXJBZGRlZCA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwYWdpbmF0aW9uU2V0KCkge1xuICAgIHRoaXMuZ2V0RGF0YSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByb3V0ZUV2ZW50KHJvdXRlcjogUm91dGVyKSB7XG4gICAgdGhpcy5yb3V0ZXJTdWJzY3JpcHRpb24gPSByb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShlID0+IHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICB0aGlzLmRvSW5pdCgpO1xuICAgICAgICB0aGlzLmdldERhdGEoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkb0luaXQoKSB7XG4gICAgY29uc3QgZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdkb2N1bWVudERlZmluaXRpb25OYW1lJykgfHwgJyc7XG4gICAgY29uc3QgY29sdW1uczogQXJyYXk8RGVmaW5pdGlvbkNvbHVtbj4gPVxuICAgICAgdGhpcy5kb3NzaWVyU2VydmljZS5nZXREZWZpbml0aW9uQ29sdW1ucyhkb2N1bWVudERlZmluaXRpb25OYW1lKTtcblxuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9IGRvY3VtZW50RGVmaW5pdGlvbk5hbWU7XG4gICAgdGhpcy5pbml0aWFsU29ydFN0YXRlID0gdGhpcy5kb3NzaWVyU2VydmljZS5nZXRJbml0aWFsU29ydFN0YXRlKGNvbHVtbnMpO1xuXG4gICAgdGhpcy5vcGVuVHJhbnNsYXRpb25TdWJzY3JpcHRpb24oY29sdW1ucyk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5UcmFuc2xhdGlvblN1YnNjcmlwdGlvbihjb2x1bW5zOiBBcnJheTxEZWZpbml0aW9uQ29sdW1uPik6IHZvaWQge1xuICAgIHRoaXMudHJhbnNsYXRpb25TdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFxuICAgICAgY29sdW1ucy5tYXAoY29sdW1uID0+IHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oYGZpZWxkTGFiZWxzLiR7Y29sdW1uLnRyYW5zbGF0aW9uS2V5fWApKVxuICAgICkuc3Vic2NyaWJlKGxhYmVscyA9PiB7XG4gICAgICB0aGlzLmZpZWxkcyA9IGNvbHVtbnMubWFwKChjb2x1bW4sIGluZGV4KSA9PiAoe1xuICAgICAgICBrZXk6IGNvbHVtbi5wcm9wZXJ0eU5hbWUsXG4gICAgICAgIGxhYmVsOiBsYWJlbHNbaW5kZXhdLFxuICAgICAgICBzb3J0YWJsZTogY29sdW1uLnNvcnRhYmxlLFxuICAgICAgICAuLi4oY29sdW1uLnZpZXdUeXBlICYmIHt2aWV3VHlwZTogY29sdW1uLnZpZXdUeXBlfSksXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YSgpIHtcbiAgICB0aGlzLmZpbmREb2N1bWVudERlZmluaXRpb24odGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lKTtcblxuICAgIGlmICh0aGlzLmhhc0NhY2hlZFNlYXJjaFJlcXVlc3QoKSkge1xuICAgICAgY29uc3QgZG9jdW1lbnRTZWFyY2hSZXF1ZXN0ID0gdGhpcy5nZXRDYWNoZWRTZWFyY2goKTtcbiAgICAgIHRoaXMuZ2xvYmFsU2VhcmNoRmlsdGVyID0gZG9jdW1lbnRTZWFyY2hSZXF1ZXN0Lmdsb2JhbFNlYXJjaEZpbHRlcjtcbiAgICAgIHRoaXMuc2VxdWVuY2UgPSBkb2N1bWVudFNlYXJjaFJlcXVlc3Quc2VxdWVuY2U7XG4gICAgICB0aGlzLmNyZWF0ZWRCeSA9IGRvY3VtZW50U2VhcmNoUmVxdWVzdC5jcmVhdGVkQnk7XG4gICAgICB0aGlzLmZpbmREb2N1bWVudHMoZG9jdW1lbnRTZWFyY2hSZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb1NlYXJjaCgpO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0QWxsQXNzb2NpYXRlZFByb2Nlc3NEZWZpbml0aW9ucygpO1xuICB9XG5cbiAgcHVibGljIGRvU2VhcmNoKCkge1xuICAgIGNvbnN0IGRvY3VtZW50U2VhcmNoUmVxdWVzdCA9IHRoaXMuYnVpbGREb2N1bWVudFNlYXJjaFJlcXVlc3QoKTtcbiAgICB0aGlzLmZpbmREb2N1bWVudHMoZG9jdW1lbnRTZWFyY2hSZXF1ZXN0KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERvY3VtZW50cyhkb2N1bWVudFNlYXJjaFJlcXVlc3Q6IERvY3VtZW50U2VhcmNoUmVxdWVzdCkge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50U2VydmljZS5nZXREb2N1bWVudHMoZG9jdW1lbnRTZWFyY2hSZXF1ZXN0KS5zdWJzY3JpYmUoZG9jdW1lbnRzID0+IHtcbiAgICAgIHRoaXMuZG9jdW1lbnRzID0gZG9jdW1lbnRzO1xuICAgICAgdGhpcy50cmFuc2Zvcm1Eb2N1bWVudHModGhpcy5kb2N1bWVudHMuY29udGVudCk7XG4gICAgICB0aGlzLnBhZ2luYXRpb24uY29sbGVjdGlvblNpemUgPSB0aGlzLmRvY3VtZW50cy50b3RhbEVsZW1lbnRzO1xuICAgICAgdGhpcy5zdG9yZVNlYXJjaChkb2N1bWVudFNlYXJjaFJlcXVlc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFsbEFzc29jaWF0ZWRQcm9jZXNzRGVmaW5pdGlvbnMoKSB7XG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgIC5maW5kUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnModGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lKVxuICAgICAgLnN1YnNjcmliZShwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucyA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMgPSBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbiA9PiBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uLmNhbkluaXRpYWxpemVEb2N1bWVudFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdEZpZWxkcyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdwcm9jZXNzTmFtZScsXG4gICAgICAgICAgICBsYWJlbDogJ1Byb2NlcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENhY2hlZFNlYXJjaCgpOiBEb2N1bWVudFNlYXJjaFJlcXVlc3Qge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHRoaXMuZ2V0Q2FjaGVkRG9jdW1lbnRTZWFyY2hSZXF1ZXN0KCkpO1xuICAgIHJldHVybiBuZXcgRG9jdW1lbnRTZWFyY2hSZXF1ZXN0SW1wbChcbiAgICAgIGpzb24uZGVmaW5pdGlvbk5hbWUsXG4gICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSAtIDEsXG4gICAgICB0aGlzLnBhZ2luYXRpb24uc2l6ZSxcbiAgICAgIGpzb24uc2VxdWVuY2UsXG4gICAgICBqc29uLmNyZWF0ZWRCeSxcbiAgICAgIGpzb24uZ2xvYmFsU2VhcmNoRmlsdGVyLFxuICAgICAganNvbi5zb3J0XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREb2N1bWVudFNlYXJjaFJlcXVlc3QoKTogRG9jdW1lbnRTZWFyY2hSZXF1ZXN0IHtcbiAgICByZXR1cm4gbmV3IERvY3VtZW50U2VhcmNoUmVxdWVzdEltcGwoXG4gICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUsXG4gICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSAtIDEsXG4gICAgICB0aGlzLnBhZ2luYXRpb24uc2l6ZSxcbiAgICAgIHRoaXMuc2VxdWVuY2UsXG4gICAgICB0aGlzLmNyZWF0ZWRCeSxcbiAgICAgIHRoaXMuZ2xvYmFsU2VhcmNoRmlsdGVyLFxuICAgICAgdGhpcy5wYWdpbmF0aW9uLnNvcnQgJiYgdGhpcy5wYWdpbmF0aW9uLnNvcnQuaXNTb3J0aW5nXG4gICAgICAgID8gdGhpcy5wYWdpbmF0aW9uLnNvcnRcbiAgICAgICAgOiB0aGlzLmluaXRpYWxTb3J0U3RhdGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9yZVNlYXJjaChkb2N1bWVudFNlYXJjaFJlcXVlc3Q6IERvY3VtZW50U2VhcmNoUmVxdWVzdCkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0Q2FjaGVkS2V5KCksIEpTT04uc3RyaW5naWZ5KGRvY3VtZW50U2VhcmNoUmVxdWVzdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWNoZWREb2N1bWVudFNlYXJjaFJlcXVlc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRDYWNoZWRLZXkoKSkgfHwgJyc7XG4gIH1cblxuICBwcml2YXRlIGhhc0NhY2hlZFNlYXJjaFJlcXVlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0Q2FjaGVkS2V5KCkpICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWNoZWRLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2xpc3Qtc2VhcmNoLScgKyB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWU7XG4gIH1cblxuICBwdWJsaWMgcm93Q2xpY2soZG9jdW1lbnQ6IGFueSkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcbiAgICAgIGAvZG9zc2llcnMvJHt0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWV9L2RvY3VtZW50LyR7ZG9jdW1lbnQuaWR9LyR7RGVmYXVsdFRhYnMuc3VtbWFyeX1gLFxuICAgIF0pO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0RG9zc2llcigpIHtcbiAgICBpZiAodGhpcy5wcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAkKCcjc3RhcnRQcm9jZXNzJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gPSB0aGlzLnByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zWzBdO1xuICAgICAgdGhpcy5zaG93U3RhcnRQcm9jZXNzTW9kYWwoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dTdGFydFByb2Nlc3NNb2RhbCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gIT09IG51bGwpIHtcbiAgICAgIHRoaXMucHJvY2Vzc1N0YXJ0Lm9wZW5Nb2RhbCh0aGlzLnNlbGVjdGVkUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbik7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdFByb2Nlc3MocHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbjogUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbikge1xuICAgIGNvbnN0IG1vZGFsID0gJCgnI3N0YXJ0UHJvY2VzcycpO1xuICAgIGlmICghdGhpcy5tb2RhbExpc3RlbmVyQWRkZWQpIHtcbiAgICAgIG1vZGFsLm9uKCdoaWRkZW4uYnMubW9kYWwnLCB0aGlzLnNob3dTdGFydFByb2Nlc3NNb2RhbC5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMubW9kYWxMaXN0ZW5lckFkZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gPSBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uO1xuICAgIG1vZGFsLm1vZGFsKCdoaWRlJyk7XG4gIH1cblxuICBwcml2YXRlIGZpbmREb2N1bWVudERlZmluaXRpb24oZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0RG9jdW1lbnREZWZpbml0aW9uKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpLnN1YnNjcmliZShkZWZpbml0aW9uID0+IHtcbiAgICAgIHRoaXMuc2NoZW1hID0gZGVmaW5pdGlvbi5zY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybURvY3VtZW50cyhkb2N1bWVudHNDb250ZW50OiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5pdGVtcyA9IGRvY3VtZW50c0NvbnRlbnQubWFwKGRvY3VtZW50ID0+IHtcbiAgICAgIGNvbnN0IHtjb250ZW50LCAuLi5vdGhlcnN9ID0gZG9jdW1lbnQ7XG4gICAgICByZXR1cm4gey4uLmNvbnRlbnQsIC4uLm90aGVyc307XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcGFnaW5hdGlvbkNsaWNrZWQocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSBwYWdlO1xuICAgIHRoaXMuZG9TZWFyY2goKTtcbiAgfVxuXG4gIHB1YmxpYyBzb3J0Q2hhbmdlZChzb3J0U3RhdGU6IFNvcnRTdGF0ZSkge1xuICAgIHRoaXMucGFnaW5hdGlvbi5zb3J0ID0gc29ydFN0YXRlO1xuICAgIHRoaXMuZG9TZWFyY2goKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJbml0aWFsU29ydFN0YXRlKCk6IFNvcnRTdGF0ZSB7XG4gICAgaWYgKHRoaXMuaGFzQ2FjaGVkU2VhcmNoUmVxdWVzdCgpKSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXF1ZXN0ID0gSlNPTi5wYXJzZSh0aGlzLmdldENhY2hlZERvY3VtZW50U2VhcmNoUmVxdWVzdCgpKTtcbiAgICAgIHJldHVybiBjYWNoZWRSZXF1ZXN0LnNvcnQgPyBjYWNoZWRSZXF1ZXN0LnNvcnQgOiB0aGlzLmluaXRpYWxTb3J0U3RhdGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluaXRpYWxTb3J0U3RhdGU7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNpZGViYXJcIj48L25nLWNvbnRhaW5lcj5cblxuPGRpdiBjbGFzcz1cIm1haW4tY29udGVudCBwdC0wXCI+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIHB4LTAgbWItNVwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHQgbXQtbTNweCBtYi0zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc3BhY2UgYnRuLXByaW1hcnkgbXItMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhcnREb3NzaWVyKClcIlxuICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwicHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMubGVuZ3RoID09PSAwID8gJ05vIGFjdGlvbicgOiBudWxsXCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImljb24gbWRpIG1kaS1wbHVzIG1yLTFcIj48L2k+XG4gICAgICAgICAgICB7eyAnU3RhcnQgRG9zc2llcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibW9kYWwgZmFkZVwiXG4gICAgICAgICAgaWQ9XCJzdGFydFByb2Nlc3NcIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT1cInN0YXJ0UHJvY2Vzc0xhYmVsXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIiByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwic3RhcnRQcm9jZXNzTGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdkYXNoYm9hcmQuc3RhcnRQcm9jZXNzLnRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgbS0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uIG9mIHByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UHJvY2Vzcyhwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHByb2Nlc3NEb2N1bWVudERlZmluaXRpb24ucHJvY2Vzc05hbWUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdjdGEuY2xvc2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8dmFsdGltby13aWRnZXQ+XG4gICAgICAgIDx2YWx0aW1vLWxpc3RcbiAgICAgICAgICBbaXRlbXNdPVwiaXRlbXNcIlxuICAgICAgICAgIFtmaWVsZHNdPVwiZmllbGRzXCJcbiAgICAgICAgICAocm93Q2xpY2tlZCk9XCJyb3dDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICBbcGFnaW5hdGlvbl09XCJwYWdpbmF0aW9uXCJcbiAgICAgICAgICBbdmlld01vZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgW2hlYWRlcl09XCJ0cnVlXCJcbiAgICAgICAgICBwYWdpbmF0aW9uSWRlbnRpZmllcj1cImRvc3NpZXJMaXN0XCJcbiAgICAgICAgICAocGFnaW5hdGlvbkNsaWNrZWQpPVwicGFnaW5hdGlvbkNsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgKHBhZ2luYXRpb25TZXQpPVwicGFnaW5hdGlvblNldCgpXCJcbiAgICAgICAgICBbaW5pdGlhbFNvcnRTdGF0ZV09XCJnZXRJbml0aWFsU29ydFN0YXRlKClcIlxuICAgICAgICAgIChzb3J0Q2hhbmdlZCk9XCJzb3J0Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgaGVhZGVyPlxuICAgICAgICAgICAgPGgzIGNsYXNzPVwibGlzdC1oZWFkZXItdGl0bGVcIj5cbiAgICAgICAgICAgICAge3sgc2NoZW1hPy50aXRsZSB9fVxuICAgICAgICAgICAgICA8c3VwIGNsYXNzPVwibWwtMSBiYWRnZSBiYWRnZS1waWxsIGJhZGdlLXByaW1hcnlcIj57e1xuICAgICAgICAgICAgICAgIGRvY3VtZW50cz8uY29udGVudC5sZW5ndGggfHwgMFxuICAgICAgICAgICAgICB9fTwvc3VwPlxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC92YWx0aW1vLWxpc3Q+XG4gICAgICA8L3ZhbHRpbW8td2lkZ2V0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPHZhbHRpbW8tZG9zc2llci1wcm9jZXNzLXN0YXJ0LW1vZGFsICNwcm9jZXNzU3RhcnRNb2RhbD48L3ZhbHRpbW8tZG9zc2llci1wcm9jZXNzLXN0YXJ0LW1vZGFsPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjc2lkZWJhcj5cbiAgPHZhbHRpbW8tZmlsdGVyLXNpZGViYXI+XG4gICAgPGg0IGNsYXNzPVwidGl0bGVcIj5TZWFyY2g8L2g0PlxuICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2Rvc3NpZXIuZm9ybXMuZ2xvYmFsU2VhcmNoUGxhY2VIb2xkZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxTZWFyY2hGaWx0ZXJcIlxuICAgICAgICAoYmx1cik9XCJkb1NlYXJjaCgpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cImRvU2VhcmNoKClcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZG9zc2llci5mb3Jtcy5yZWZlcmVuY2VOdW1iZXJQbGFjZUhvbGRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInNlcXVlbmNlXCJcbiAgICAgICAgKGJsdXIpPVwiZG9TZWFyY2goKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJkb1NlYXJjaCgpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvdmFsdGltby1maWx0ZXItc2lkZWJhcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci9zcmMvbGliL2Rvc3NpZXItbGlzdC9kb3NzaWVyLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9kb3NzaWVyL3NyYy9saWIvZG9zc2llci1saXN0L2Rvc3NpZXItbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBQyxTQUFTLEVBQXFCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUl0RSxPQUFPLEVBRUwseUJBQXlCLEdBTTFCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUViLG9CQUFvQixFQUNwQixNQUFNLEVBRU4sR0FBRyxFQUVILEVBQUUsRUFHRixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBU3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQU9yRCxNQUFNLE9BQU8sb0JBQW9CO0lBa0kvQixZQUNtQixLQUFxQixFQUNyQixNQUFjLEVBQ2QsZUFBZ0MsRUFDaEMsZ0JBQWtDLEVBQ2xDLGNBQThCLEVBQzlCLE1BQWlCO1FBTGpCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFr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WSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsaUNBQWlDLEdBQUcsSUFBSSxDQUFDO1NBQy9DO0lBQ0gsQ0FBQzs7a0hBeFJVLG9CQUFvQjtzR0FBcEIsb0JBQW9CLCtLQzlEakMsb2tLQTRJQTs0RkQ5RWEsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLHNCQUFzQjs0T0FLQSxZQUFZO3NCQUEzQyxTQUFTO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0RlZmluaXRpb25Db2x1bW59IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge1xuICBEb2N1bWVudFNlYXJjaFJlcXVlc3QsXG4gIERvY3VtZW50U2VhcmNoUmVxdWVzdEltcGwsXG4gIERvY3VtZW50U2VydmljZSxcbiAgU29ydFN0YXRlLFxuICBQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uLFxuICBEb2N1bWVudHMsXG4gIERvY3VtZW50RGVmaW5pdGlvbixcbn0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3RhcnRXaXRoLFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RGVmYXVsdFRhYnN9IGZyb20gJy4uL2Rvc3NpZXItZGV0YWlsLXRhYi1lbnVtJztcbmltcG9ydCB7RG9zc2llclByb2Nlc3NTdGFydE1vZGFsQ29tcG9uZW50fSBmcm9tICcuLi9kb3NzaWVyLXByb2Nlc3Mtc3RhcnQtbW9kYWwvZG9zc2llci1wcm9jZXNzLXN0YXJ0LW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQge0Rvc3NpZXJTZXJ2aWNlfSBmcm9tICcuLi9kb3NzaWVyLnNlcnZpY2UnO1xuaW1wb3J0IHtQYWdpbmF0aW9uLCBMaXN0RmllbGR9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtOR1hMb2dnZXJ9IGZyb20gJ25neC1sb2dnZXInO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdmFyXG5kZWNsYXJlIHZhciAkO1xuXG5tb21lbnQubG9jYWxlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYW5nS2V5JykgfHwgJycpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWRvc3NpZXItbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb3NzaWVyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3NzaWVyLWxpc3QuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEb3NzaWVyTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3Byb2Nlc3NTdGFydE1vZGFsJykgcHJvY2Vzc1N0YXJ0OiBEb3NzaWVyUHJvY2Vzc1N0YXJ0TW9kYWxDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSBzZWxlY3RlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb246IFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtb2RhbExpc3RlbmVyQWRkZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdQYWdpbmF0aW9uRm9yRG9jTmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5kb2N1bWVudERlZmluaXRpb25OYW1lIHx8ICcnKSxcbiAgICB0YXAoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PiB7XG4gICAgICB0aGlzLnJlc2V0UGFnaW5hdGlvbihkb2N1bWVudERlZmluaXRpb25OYW1lKTtcbiAgICB9KVxuICApO1xuXG4gIHJlYWRvbmx5IGFzc29jaWF0ZWRQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucyQ6IE9ic2VydmFibGU8QXJyYXk8UHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbj4+ID1cbiAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PlxuICAgICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lXG4gICAgICAgICAgPyB0aGlzLmRvY3VtZW50U2VydmljZS5maW5kUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMoZG9jdW1lbnREZWZpbml0aW9uTmFtZSlcbiAgICAgICAgICA6IG9mKFtdKVxuICAgICAgKSxcbiAgICAgIG1hcChwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucyA9PlxuICAgICAgICBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucy5maWx0ZXIoZGVmaW5pdGlvbiA9PiBkZWZpbml0aW9uLmNhbkluaXRpYWxpemVEb2N1bWVudClcbiAgICAgIClcbiAgICApO1xuXG4gIHJlYWRvbmx5IHNjaGVtYSQgPSB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgc3dpdGNoTWFwKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT5cbiAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldERvY3VtZW50RGVmaW5pdGlvbihkb2N1bWVudERlZmluaXRpb25OYW1lKVxuICAgICksXG4gICAgbWFwKGRvY3VtZW50RGVmaW5pdGlvbiA9PiBkb2N1bWVudERlZmluaXRpb24/LnNjaGVtYSlcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlZFNlYXJjaFJlcXVlc3RLZXkkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgbWFwKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT4gYGxpc3Qtc2VhcmNoLSR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX1gKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFzU3RvcmVkU2VhcmNoUmVxdWVzdCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnN0b3JlZFNlYXJjaFJlcXVlc3RLZXkkLnBpcGUoXG4gICAgbWFwKHN0b3JlZFNlYXJjaFJlcXVlc3RLZXkgPT4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVkU2VhcmNoUmVxdWVzdEtleSkgIT09IG51bGwpXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb2x1bW5zJDogT2JzZXJ2YWJsZTxBcnJheTxEZWZpbml0aW9uQ29sdW1uPj4gPVxuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZShcbiAgICAgIG1hcChkb2N1bWVudERlZmluaXRpb25OYW1lID0+XG4gICAgICAgIHRoaXMuZG9zc2llclNlcnZpY2UuZ2V0RGVmaW5pdGlvbkNvbHVtbnMoZG9jdW1lbnREZWZpbml0aW9uTmFtZSlcbiAgICAgIClcbiAgICApO1xuXG4gIHJlYWRvbmx5IGZpZWxkcyQ6IE9ic2VydmFibGU8QXJyYXk8TGlzdEZpZWxkPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNvbHVtbnMkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2NvbHVtbnNdKSA9PlxuICAgICAgY29sdW1ucy5tYXAoKGNvbHVtbiwgaW5kZXgpID0+ICh7XG4gICAgICAgIGtleTogY29sdW1uLnByb3BlcnR5TmFtZSxcbiAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBmaWVsZExhYmVscy4ke2NvbHVtbi50cmFuc2xhdGlvbktleX1gKSxcbiAgICAgICAgc29ydGFibGU6IGNvbHVtbi5zb3J0YWJsZSxcbiAgICAgICAgLi4uKGNvbHVtbi52aWV3VHlwZSAmJiB7dmlld1R5cGU6IGNvbHVtbi52aWV3VHlwZX0pLFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9QQUdJTkFUSU9OOiBQYWdpbmF0aW9uID0ge1xuICAgIGNvbGxlY3Rpb25TaXplOiAwLFxuICAgIHBhZ2U6IDEsXG4gICAgc2l6ZTogMTAsXG4gICAgbWF4UGFnaW5hdGlvbkl0ZW1TaXplOiA1LFxuICAgIHNvcnQ6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2luYXRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IHBhZ2luYXRpb25Db3B5JCA9IHRoaXMucGFnaW5hdGlvbiQucGlwZShcbiAgICBtYXAocGFnaW5hdGlvbiA9PiBwYWdpbmF0aW9uICYmIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGFnaW5hdGlvbikpKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlcXVlbmNlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IGdsb2JhbFNlYXJjaEZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZWRCeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50U2VhcmNoUmVxdWVzdCQ6IE9ic2VydmFibGU8RG9jdW1lbnRTZWFyY2hSZXF1ZXN0PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMucGFnaW5hdGlvbiQsXG4gICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJCxcbiAgICB0aGlzLnNlcXVlbmNlJCxcbiAgICB0aGlzLmNyZWF0ZWRCeSQsXG4gICAgdGhpcy5nbG9iYWxTZWFyY2hGaWx0ZXIkLFxuICBdKS5waXBlKFxuICAgIGZpbHRlcigoW3BhZ2luYXRpb25dKSA9PiAhIXBhZ2luYXRpb24pLFxuICAgIG1hcChcbiAgICAgIChbcGFnaW5hdGlvbiwgZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgc2VxdWVuY2UsIGNyZWF0ZWRCeSwgZ2xvYmFsU2VhcmNoRmlsdGVyXSkgPT5cbiAgICAgICAgbmV3IERvY3VtZW50U2VhcmNoUmVxdWVzdEltcGwoXG4gICAgICAgICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZSxcbiAgICAgICAgICBwYWdpbmF0aW9uLnBhZ2UgLSAxLFxuICAgICAgICAgIHBhZ2luYXRpb24uc2l6ZSxcbiAgICAgICAgICBzZXF1ZW5jZSxcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgZ2xvYmFsU2VhcmNoRmlsdGVyLFxuICAgICAgICAgIHBhZ2luYXRpb24uc29ydFxuICAgICAgICApXG4gICAgKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRzUmVxdWVzdCQ6IE9ic2VydmFibGU8RG9jdW1lbnRzPiA9IHRoaXMuZG9jdW1lbnRTZWFyY2hSZXF1ZXN0JC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyKSA9PiBKU09OLnN0cmluZ2lmeShwcmV2KSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycikpLFxuICAgIHRhcChyZXF1ZXN0ID0+IHtcbiAgICAgIHRoaXMuc3RvcmVkU2VhcmNoUmVxdWVzdEtleSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoc3RvcmVkU2VhcmNoUmVxdWVzdEtleSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgc3RvcmUgcmVxdWVzdCBpbiBsb2NhbCBzdG9yYWdlOiAke0pTT04uc3RyaW5naWZ5KHJlcXVlc3QpfWApO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzdG9yZWRTZWFyY2hSZXF1ZXN0S2V5LCBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSk7XG4gICAgICB9KTtcbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoZG9jdW1lbnRTZWFyY2hSZXF1ZXN0ID0+IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldERvY3VtZW50cyhkb2N1bWVudFNlYXJjaFJlcXVlc3QpKSxcbiAgICB0YXAoZG9jdW1lbnRzID0+IHtcbiAgICAgIHRoaXMuc2V0Q29sbGVjdGlvblNpemUoZG9jdW1lbnRzKTtcbiAgICB9KVxuICApO1xuXG4gIHJlYWRvbmx5IGRvY3VtZW50SXRlbXMkID0gdGhpcy5kb2N1bWVudHNSZXF1ZXN0JC5waXBlKFxuICAgIG1hcChkb2N1bWVudHMgPT5cbiAgICAgIGRvY3VtZW50cy5jb250ZW50Lm1hcChkb2N1bWVudCA9PiB7XG4gICAgICAgIGNvbnN0IHtjb250ZW50LCAuLi5vdGhlcnN9ID0gZG9jdW1lbnQ7XG4gICAgICAgIHJldHVybiB7Li4uY29udGVudCwgLi4ub3RoZXJzfTtcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb3NzaWVyU2VydmljZTogRG9zc2llclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IE5HWExvZ2dlclxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbExpc3RlbmVyQWRkZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGdsb2JhbFNlYXJjaEZpbHRlckNoYW5nZShzZWFyY2hGaWx0ZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZ2xvYmFsU2VhcmNoRmlsdGVyJC5uZXh0KHNlYXJjaEZpbHRlcik7XG4gICAgdGhpcy5wYWdlQ2hhbmdlKDEpO1xuICB9XG5cbiAgc2VxdWVuY2VDaGFuZ2Uoc2VxdWVuY2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VxdWVuY2UkLm5leHQoTnVtYmVyKHNlcXVlbmNlKSk7XG4gICAgdGhpcy5wYWdlQ2hhbmdlKDEpO1xuICB9XG5cbiAgcGFnZUNoYW5nZShuZXdQYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb24kLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHBhZ2luYXRpb24gPT4ge1xuICAgICAgaWYgKHBhZ2luYXRpb24gJiYgcGFnaW5hdGlvbi5wYWdlICE9PSBuZXdQYWdlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgUGFnZSBjaGFuZ2U6ICR7bmV3UGFnZX1gKTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uJC5uZXh0KHsuLi5wYWdpbmF0aW9uLCBwYWdlOiBuZXdQYWdlfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwYWdlU2l6ZUNoYW5nZShuZXdQYWdlU2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShwYWdpbmF0aW9uID0+IHtcbiAgICAgIGlmIChwYWdpbmF0aW9uICYmIHBhZ2luYXRpb24uc2l6ZSAhPT0gbmV3UGFnZVNpemUpIHtcbiAgICAgICAgY29uc3QgYW1vdW50T2ZBdmFpbGFibGVQYWdlcyA9IE1hdGguY2VpbChwYWdpbmF0aW9uLmNvbGxlY3Rpb25TaXplIC8gbmV3UGFnZVNpemUpO1xuICAgICAgICBjb25zdCBuZXdQYWdlID1cbiAgICAgICAgICBhbW91bnRPZkF2YWlsYWJsZVBhZ2VzIDwgcGFnaW5hdGlvbi5wYWdlID8gYW1vdW50T2ZBdmFpbGFibGVQYWdlcyA6IHBhZ2luYXRpb24ucGFnZTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYFBhZ2Ugc2l6ZSBjaGFuZ2UuIE5ldyBQYWdlOiAke25ld1BhZ2V9IE5ldyBwYWdlIHNpemU6ICR7bmV3UGFnZVNpemV9YCk7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvbiQubmV4dCh7Li4ucGFnaW5hdGlvbiwgc2l6ZTogbmV3UGFnZVNpemUsIHBhZ2U6IG5ld1BhZ2V9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNvcnRDaGFuZ2VkKG5ld1NvcnRTdGF0ZTogU29ydFN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShwYWdpbmF0aW9uID0+IHtcbiAgICAgIGlmIChwYWdpbmF0aW9uICYmIEpTT04uc3RyaW5naWZ5KHBhZ2luYXRpb24uc29ydCkgIT09IEpTT04uc3RyaW5naWZ5KG5ld1NvcnRTdGF0ZSkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBTb3J0IHN0YXRlIGNoYW5nZTogJHtKU09OLnN0cmluZ2lmeShuZXdTb3J0U3RhdGUpfWApO1xuICAgICAgICB0aGlzLnBhZ2luYXRpb24kLm5leHQoey4uLnBhZ2luYXRpb24sIHNvcnQ6IG5ld1NvcnRTdGF0ZX0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcm93Q2xpY2soZG9jdW1lbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PiB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXG4gICAgICAgIGAvZG9zc2llcnMvJHtkb2N1bWVudERlZmluaXRpb25OYW1lfS9kb2N1bWVudC8ke2RvY3VtZW50LmlkfS8ke0RlZmF1bHRUYWJzLnN1bW1hcnl9YCxcbiAgICAgIF0pO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhcnREb3NzaWVyKCk6IHZvaWQge1xuICAgIHRoaXMuYXNzb2NpYXRlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zJFxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoYXNzb2NpYXRlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zID0+IHtcbiAgICAgICAgaWYgKGFzc29jaWF0ZWRQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgJCgnI3N0YXJ0UHJvY2VzcycpLm1vZGFsKCdzaG93Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gPSBhc3NvY2lhdGVkUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnNbMF07XG4gICAgICAgICAgdGhpcy5zaG93U3RhcnRQcm9jZXNzTW9kYWwoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBzZWxlY3RQcm9jZXNzKHByb2Nlc3NEb2N1bWVudERlZmluaXRpb246IFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBtb2RhbCA9ICQoJyNzdGFydFByb2Nlc3MnKTtcbiAgICBpZiAoIXRoaXMubW9kYWxMaXN0ZW5lckFkZGVkKSB7XG4gICAgICBtb2RhbC5vbignaGlkZGVuLmJzLm1vZGFsJywgdGhpcy5zaG93U3RhcnRQcm9jZXNzTW9kYWwuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLm1vZGFsTGlzdGVuZXJBZGRlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uID0gcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbjtcbiAgICBtb2RhbC5tb2RhbCgnaGlkZScpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFBhZ2luYXRpb24oZG9jdW1lbnREZWZpbml0aW9uTmFtZSk6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ1BhZ2luYXRpb25Gb3JEb2NOYW1lJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShzZXR0aW5nUGFnaW5hdGlvbkZvckRvY05hbWUgPT4ge1xuICAgICAgaWYgKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgIT09IHNldHRpbmdQYWdpbmF0aW9uRm9yRG9jTmFtZSkge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb24kLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKCdjbGVhciBwYWdpbmF0aW9uJyk7XG4gICAgICAgIHRoaXMuc2V0dGluZ1BhZ2luYXRpb25Gb3JEb2NOYW1lJC5uZXh0KGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICB0aGlzLnNldFBhZ2luYXRpb24oZG9jdW1lbnREZWZpbml0aW9uTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBhZ2luYXRpb24oZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5oYXNTdG9yZWRTZWFyY2hSZXF1ZXN0JCwgdGhpcy5zdG9yZWRTZWFyY2hSZXF1ZXN0S2V5JCwgdGhpcy5jb2x1bW5zJF0pXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoW2hhc1N0b3JlZFNlYXJjaFJlcXVlc3QsIHN0b3JlZFNlYXJjaFJlcXVlc3RLZXksIGNvbHVtbnNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQYWdpbmF0aW9uOiBQYWdpbmF0aW9uID0gdGhpcy5nZXREZWZhdWx0UGFnaW5hdGlvbihjb2x1bW5zKTtcbiAgICAgICAgY29uc3Qgc3RvcmVkUGFnaW5hdGlvbjogUGFnaW5hdGlvbiA9IHRoaXMuZ2V0U3RvcmVkUGFnaW5hdGlvbihcbiAgICAgICAgICBoYXNTdG9yZWRTZWFyY2hSZXF1ZXN0LFxuICAgICAgICAgIHN0b3JlZFNlYXJjaFJlcXVlc3RLZXlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYFNldCBwYWdpbmF0aW9uOiAke0pTT04uc3RyaW5naWZ5KHN0b3JlZFBhZ2luYXRpb24gfHwgZGVmYXVsdFBhZ2luYXRpb24pfWApO1xuICAgICAgICB0aGlzLnBhZ2luYXRpb24kLm5leHQoc3RvcmVkUGFnaW5hdGlvbiB8fCBkZWZhdWx0UGFnaW5hdGlvbik7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFBhZ2luYXRpb24oY29sdW1uczogQXJyYXk8RGVmaW5pdGlvbkNvbHVtbj4pOiBQYWdpbmF0aW9uIHtcbiAgICBjb25zdCBkZWZhdWx0U29ydFN0YXRlID0gdGhpcy5kb3NzaWVyU2VydmljZS5nZXRJbml0aWFsU29ydFN0YXRlKGNvbHVtbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuREVGQVVMVF9QQUdJTkFUSU9OLFxuICAgICAgc29ydDogZGVmYXVsdFNvcnRTdGF0ZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdG9yZWRQYWdpbmF0aW9uKFxuICAgIGhhc1N0b3JlZFNlYXJjaFJlcXVlc3Q6IGJvb2xlYW4sXG4gICAgc3RvcmVkU2VhcmNoUmVxdWVzdEtleTogc3RyaW5nXG4gICk6IFBhZ2luYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0b3JlZFNlYXJjaFJlcXVlc3QgPVxuICAgICAgaGFzU3RvcmVkU2VhcmNoUmVxdWVzdCAmJiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHN0b3JlZFNlYXJjaFJlcXVlc3RLZXkpKTtcblxuICAgIHJldHVybiAoXG4gICAgICBzdG9yZWRTZWFyY2hSZXF1ZXN0ICYmIHtcbiAgICAgICAgLi4udGhpcy5ERUZBVUxUX1BBR0lOQVRJT04sXG4gICAgICAgIHNvcnQ6IHN0b3JlZFNlYXJjaFJlcXVlc3Quc29ydCxcbiAgICAgICAgcGFnZTogc3RvcmVkU2VhcmNoUmVxdWVzdC5wYWdlICsgMSxcbiAgICAgICAgc2l6ZTogc3RvcmVkU2VhcmNoUmVxdWVzdC5zaXplLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbGxlY3Rpb25TaXplKGRvY3VtZW50czogRG9jdW1lbnRzKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShwYWdpbmF0aW9uID0+IHtcbiAgICAgIGlmIChwYWdpbmF0aW9uLmNvbGxlY3Rpb25TaXplICE9PSBkb2N1bWVudHMudG90YWxFbGVtZW50cykge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb24kLm5leHQoey4uLnBhZ2luYXRpb24sIGNvbGxlY3Rpb25TaXplOiBkb2N1bWVudHMudG90YWxFbGVtZW50c30pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93U3RhcnRQcm9jZXNzTW9kYWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnByb2Nlc3NTdGFydC5vcGVuTW9kYWwodGhpcy5zZWxlY3RlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24pO1xuICAgICAgdGhpcy5zZWxlY3RlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjAgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2lkZWJhclwiPjwvbmctY29udGFpbmVyPlxuXG48ZGl2IGNsYXNzPVwibWFpbi1jb250ZW50IHB0LTBcIj5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgcHgtMCBtYi01XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgYXNzb2NpYXRlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zJCB8IGFzeW5jIGFzIGFzc29jaWF0ZWRQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uc1xuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1yaWdodCBtdC1tM3B4IG1iLTNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zcGFjZSBidG4tcHJpbWFyeSBtci0wXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzdGFydERvc3NpZXIoKVwiXG4gICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJhc3NvY2lhdGVkUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMubGVuZ3RoID09PSAwID8gJ05vIGFjdGlvbicgOiBudWxsXCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYXNzb2NpYXRlZFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uIG1kaSBtZGktcGx1cyBtci0xXCI+PC9pPlxuICAgICAgICAgICAge3sgJ1N0YXJ0IERvc3NpZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cIm1vZGFsIGZhZGVcIlxuICAgICAgICAgIGlkPVwic3RhcnRQcm9jZXNzXCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJzdGFydFByb2Nlc3NMYWJlbFwiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkXCIgcm9sZT1cImRvY3VtZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInN0YXJ0UHJvY2Vzc0xhYmVsXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnZGFzaGJvYXJkLnN0YXJ0UHJvY2Vzcy50aXRsZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cbiAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIG0tMFwiPlxuICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbiBvZiBhc3NvY2lhdGVkUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQcm9jZXNzKHByb2Nlc3NEb2N1bWVudERlZmluaXRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbi5wcm9jZXNzTmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxuICAgICAgICAgICAgICAgICAge3sgJ2N0YS5jbG9zZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx2YWx0aW1vLXdpZGdldD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3RcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdmFsdGltby13aWRnZXQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8dmFsdGltby1kb3NzaWVyLXByb2Nlc3Mtc3RhcnQtbW9kYWwgI3Byb2Nlc3NTdGFydE1vZGFsPjwvdmFsdGltby1kb3NzaWVyLXByb2Nlc3Mtc3RhcnQtbW9kYWw+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNsaXN0PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFnaW5hdGlvbkNvcHkkIHwgYXN5bmMgYXMgcGFnaW5hdGlvblwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZHMkIHwgYXN5bmMgYXMgZmllbGRzXCI+XG4gICAgICA8dmFsdGltby1saXN0XG4gICAgICAgICpuZ0lmPVwiZG9jdW1lbnRJdGVtcyQgfCBhc3luYyBhcyBkb2N1bWVudEl0ZW1zXCJcbiAgICAgICAgW2l0ZW1zXT1cImRvY3VtZW50SXRlbXNcIlxuICAgICAgICBbZmllbGRzXT1cImZpZWxkc1wiXG4gICAgICAgIChyb3dDbGlja2VkKT1cInJvd0NsaWNrKCRldmVudClcIlxuICAgICAgICBbcGFnaW5hdGlvbl09XCJwYWdpbmF0aW9uXCJcbiAgICAgICAgW3ZpZXdNb2RlXT1cInRydWVcIlxuICAgICAgICBbaGVhZGVyXT1cInRydWVcIlxuICAgICAgICBwYWdpbmF0aW9uSWRlbnRpZmllcj1cImRvc3NpZXJMaXN0XCJcbiAgICAgICAgKHBhZ2luYXRpb25DbGlja2VkKT1cInBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChwYWdpbmF0aW9uU2V0KT1cInBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbaW5pdGlhbFNvcnRTdGF0ZV09XCJwYWdpbmF0aW9uLnNvcnRcIlxuICAgICAgICAoc29ydENoYW5nZWQpPVwic29ydENoYW5nZWQoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgaGVhZGVyPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImxpc3QtaGVhZGVyLXRpdGxlXCI+XG4gICAgICAgICAgICB7eyAoc2NoZW1hJCB8IGFzeW5jKT8udGl0bGUgfX1cbiAgICAgICAgICAgIDxzdXAgY2xhc3M9XCJtbC0xIGJhZGdlIGJhZGdlLXBpbGwgYmFkZ2UtcHJpbWFyeVwiPnt7IGRvY3VtZW50SXRlbXM/Lmxlbmd0aCB8fCAwIH19PC9zdXA+XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3ZhbHRpbW8tbGlzdD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NpZGViYXI+XG4gIDx2YWx0aW1vLWZpbHRlci1zaWRlYmFyPlxuICAgIDxoNCBjbGFzcz1cInRpdGxlXCI+U2VhcmNoPC9oND5cbiAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdkb3NzaWVyLmZvcm1zLmdsb2JhbFNlYXJjaFBsYWNlSG9sZGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIFtuZ01vZGVsXT1cImdsb2JhbFNlYXJjaEZpbHRlciQgfCBhc3luY1wiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImdsb2JhbFNlYXJjaEZpbHRlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2Rvc3NpZXIuZm9ybXMucmVmZXJlbmNlTnVtYmVyUGxhY2VIb2xkZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VxdWVuY2UkIHwgYXN5bmNcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXF1ZW5jZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvdmFsdGltby1maWx0ZXItc2lkZWJhcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=