@valtimo/dossier 11.0.0 → 11.1.2

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 (166) hide show
  1. package/esm2022/lib/components/dossier-assign-user/dossier-assign-user.component.mjs +98 -0
  2. package/esm2022/lib/{dossier-bulk-assign-modal → components/dossier-bulk-assign-modal}/dossier-bulk-assign-modal.component.mjs +2 -2
  3. package/esm2022/lib/components/dossier-detail/dossier-detail.component.mjs +194 -0
  4. package/esm2022/lib/components/dossier-detail/tab/audit/audit.component.mjs +76 -0
  5. package/esm2022/lib/{dossier-detail → components/dossier-detail}/tab/contact-moments/contact-moments.component.mjs +1 -1
  6. package/esm2022/lib/components/dossier-detail/tab/documenten-api-documents/documenten-api-documents.component.mjs +146 -0
  7. package/esm2022/lib/{dossier-detail → components/dossier-detail}/tab/documents/documents.component.mjs +1 -1
  8. package/esm2022/lib/components/dossier-detail/tab/formio/formio.component.mjs +61 -0
  9. package/esm2022/lib/components/dossier-detail/tab/notes/notes.component.mjs +166 -0
  10. package/esm2022/lib/components/dossier-detail/tab/object-type/object-type.component.mjs +121 -0
  11. package/esm2022/lib/{dossier-detail → components/dossier-detail}/tab/progress/progress.component.mjs +1 -1
  12. package/esm2022/lib/components/dossier-detail/tab/s3-documents/s3-documents.component.mjs +136 -0
  13. package/esm2022/lib/components/dossier-detail/tab/summary/summary.component.mjs +134 -0
  14. package/esm2022/lib/components/dossier-detail/tab/zaakobjecten/zaakobjecten.component.mjs +112 -0
  15. package/esm2022/lib/components/dossier-list/dossier-list.component.mjs +370 -0
  16. package/esm2022/lib/components/dossier-list-actions/dossier-list-actions.component.mjs +84 -0
  17. package/esm2022/lib/{dossier-process-start-modal → components/dossier-process-start-modal}/dossier-process-start-modal.component.mjs +2 -3
  18. package/esm2022/lib/components/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.mjs +123 -0
  19. package/esm2022/lib/components/dossier-update/dossier-update.component.mjs +113 -0
  20. package/esm2022/lib/constants/case-tab-token.mjs +19 -0
  21. package/esm2022/lib/constants/index.mjs +3 -0
  22. package/esm2022/lib/constants/tab.mjs +42 -0
  23. package/esm2022/lib/dossier-routing.module.mjs +14 -4
  24. package/esm2022/lib/dossier.module.mjs +33 -27
  25. package/esm2022/lib/models/dossier-detail-tab.model.mjs +27 -0
  26. package/esm2022/lib/models/index.mjs +3 -1
  27. package/esm2022/lib/models/tab-api.model.mjs +23 -0
  28. package/esm2022/lib/models/tabs.model.mjs +32 -28
  29. package/esm2022/lib/permissions/dossier-detail.permissions.mjs +55 -0
  30. package/esm2022/lib/permissions/index.mjs +2 -2
  31. package/esm2022/lib/pipes/index.mjs +17 -0
  32. package/esm2022/lib/pipes/tab-translate/index.mjs +18 -0
  33. package/esm2022/lib/pipes/tab-translate/tab-translate-pipe.module.mjs +33 -0
  34. package/esm2022/lib/pipes/tab-translate/tab-translate.pipe.mjs +41 -0
  35. package/esm2022/lib/services/dossier-list-pagination.service.mjs +2 -2
  36. package/esm2022/lib/services/dossier-tab-api.service.mjs +23 -0
  37. package/esm2022/lib/services/dossier-tab.service.mjs +130 -0
  38. package/esm2022/lib/services/dossier.service.mjs +58 -0
  39. package/esm2022/lib/services/index.mjs +4 -2
  40. package/esm2022/public_api.mjs +13 -15
  41. package/fesm2022/valtimo-dossier.mjs +1345 -1036
  42. package/fesm2022/valtimo-dossier.mjs.map +1 -1
  43. package/lib/components/dossier-assign-user/dossier-assign-user.component.d.ts.map +1 -0
  44. package/lib/{dossier-bulk-assign-modal → components/dossier-bulk-assign-modal}/dossier-bulk-assign-modal.component.d.ts +1 -1
  45. package/lib/components/dossier-bulk-assign-modal/dossier-bulk-assign-modal.component.d.ts.map +1 -0
  46. package/lib/{dossier-detail → components/dossier-detail}/dossier-detail.component.d.ts +11 -10
  47. package/lib/components/dossier-detail/dossier-detail.component.d.ts.map +1 -0
  48. package/lib/components/dossier-detail/tab/audit/audit.component.d.ts.map +1 -0
  49. package/lib/components/dossier-detail/tab/contact-moments/contact-moments.component.d.ts.map +1 -0
  50. package/lib/{dossier-detail → components/dossier-detail}/tab/documenten-api-documents/documenten-api-documents.component.d.ts +1 -1
  51. package/lib/components/dossier-detail/tab/documenten-api-documents/documenten-api-documents.component.d.ts.map +1 -0
  52. package/lib/components/dossier-detail/tab/documents/documents.component.d.ts.map +1 -0
  53. package/lib/components/dossier-detail/tab/formio/formio.component.d.ts +20 -0
  54. package/lib/components/dossier-detail/tab/formio/formio.component.d.ts.map +1 -0
  55. package/lib/{dossier-detail → components/dossier-detail}/tab/notes/notes.component.d.ts +3 -3
  56. package/lib/components/dossier-detail/tab/notes/notes.component.d.ts.map +1 -0
  57. package/lib/{dossier-detail → components/dossier-detail}/tab/object-type/object-type.component.d.ts +2 -2
  58. package/lib/components/dossier-detail/tab/object-type/object-type.component.d.ts.map +1 -0
  59. package/lib/components/dossier-detail/tab/progress/progress.component.d.ts.map +1 -0
  60. package/lib/{dossier-detail → components/dossier-detail}/tab/s3-documents/s3-documents.component.d.ts +1 -1
  61. package/lib/components/dossier-detail/tab/s3-documents/s3-documents.component.d.ts.map +1 -0
  62. package/lib/components/dossier-detail/tab/summary/summary.component.d.ts.map +1 -0
  63. package/lib/{dossier-detail → components/dossier-detail}/tab/zaakobjecten/zaakobjecten.component.d.ts +2 -2
  64. package/lib/components/dossier-detail/tab/zaakobjecten/zaakobjecten.component.d.ts.map +1 -0
  65. package/lib/{dossier-list → components/dossier-list}/dossier-list.component.d.ts +1 -1
  66. package/lib/components/dossier-list/dossier-list.component.d.ts.map +1 -0
  67. package/lib/{dossier-list-actions → components/dossier-list-actions}/dossier-list-actions.component.d.ts +1 -1
  68. package/lib/components/dossier-list-actions/dossier-list-actions.component.d.ts.map +1 -0
  69. package/lib/components/dossier-process-start-modal/dossier-process-start-modal.component.d.ts.map +1 -0
  70. package/lib/{dossier-supporting-process-start-modal → components/dossier-supporting-process-start-modal}/dossier-supporting-process-start-modal.component.d.ts +21 -26
  71. package/lib/components/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.d.ts.map +1 -0
  72. package/lib/{dossier-update → components/dossier-update}/dossier-update.component.d.ts +1 -1
  73. package/lib/components/dossier-update/dossier-update.component.d.ts.map +1 -0
  74. package/lib/constants/case-tab-token.d.ts +5 -0
  75. package/lib/constants/case-tab-token.d.ts.map +1 -0
  76. package/lib/constants/index.d.ts +3 -0
  77. package/lib/constants/index.d.ts.map +1 -0
  78. package/lib/constants/tab.d.ts +7 -0
  79. package/lib/constants/tab.d.ts.map +1 -0
  80. package/lib/dossier-routing.module.d.ts.map +1 -1
  81. package/lib/dossier.module.d.ts +33 -31
  82. package/lib/dossier.module.d.ts.map +1 -1
  83. package/lib/models/dossier-detail-tab.model.d.ts +18 -0
  84. package/lib/models/dossier-detail-tab.model.d.ts.map +1 -0
  85. package/lib/models/index.d.ts +2 -0
  86. package/lib/models/index.d.ts.map +1 -1
  87. package/lib/models/tab-api.model.d.ts +13 -0
  88. package/lib/models/tab-api.model.d.ts.map +1 -0
  89. package/lib/models/tabs.model.d.ts +11 -10
  90. package/lib/models/tabs.model.d.ts.map +1 -1
  91. package/lib/permissions/{dossier.permissions.d.ts → dossier-detail.permissions.d.ts} +1 -1
  92. package/lib/permissions/dossier-detail.permissions.d.ts.map +1 -0
  93. package/lib/permissions/index.d.ts +1 -1
  94. package/lib/permissions/index.d.ts.map +1 -1
  95. package/lib/pipes/index.d.ts +2 -0
  96. package/lib/pipes/index.d.ts.map +1 -0
  97. package/lib/pipes/tab-translate/index.d.ts +3 -0
  98. package/lib/pipes/tab-translate/index.d.ts.map +1 -0
  99. package/lib/pipes/tab-translate/tab-translate-pipe.module.d.ts +9 -0
  100. package/lib/pipes/tab-translate/tab-translate-pipe.module.d.ts.map +1 -0
  101. package/lib/pipes/tab-translate/tab-translate.pipe.d.ts +13 -0
  102. package/lib/pipes/tab-translate/tab-translate.pipe.d.ts.map +1 -0
  103. package/lib/services/dossier-list-pagination.service.d.ts +1 -1
  104. package/lib/services/dossier-list-pagination.service.d.ts.map +1 -1
  105. package/lib/services/dossier-tab-api.service.d.ts +15 -0
  106. package/lib/services/dossier-tab-api.service.d.ts.map +1 -0
  107. package/lib/services/dossier-tab.service.d.ts +31 -0
  108. package/lib/services/dossier-tab.service.d.ts.map +1 -0
  109. package/lib/{dossier.service.d.ts → services/dossier.service.d.ts} +1 -1
  110. package/lib/services/dossier.service.d.ts.map +1 -0
  111. package/lib/services/index.d.ts +3 -1
  112. package/lib/services/index.d.ts.map +1 -1
  113. package/package.json +1 -1
  114. package/public_api.d.ts +12 -14
  115. package/public_api.d.ts.map +1 -1
  116. package/esm2022/lib/dossier-assign-user/dossier-assign-user.component.mjs +0 -98
  117. package/esm2022/lib/dossier-detail/dossier-detail.component.mjs +0 -175
  118. package/esm2022/lib/dossier-detail/tab/audit/audit.component.mjs +0 -76
  119. package/esm2022/lib/dossier-detail/tab/documenten-api-documents/documenten-api-documents.component.mjs +0 -146
  120. package/esm2022/lib/dossier-detail/tab/notes/notes.component.mjs +0 -166
  121. package/esm2022/lib/dossier-detail/tab/object-type/object-type.component.mjs +0 -121
  122. package/esm2022/lib/dossier-detail/tab/s3-documents/s3-documents.component.mjs +0 -136
  123. package/esm2022/lib/dossier-detail/tab/summary/summary.component.mjs +0 -130
  124. package/esm2022/lib/dossier-detail/tab/zaakobjecten/zaakobjecten.component.mjs +0 -112
  125. package/esm2022/lib/dossier-detail-tab-enum.mjs +0 -26
  126. package/esm2022/lib/dossier-list/dossier-list.component.mjs +0 -371
  127. package/esm2022/lib/dossier-list-actions/dossier-list-actions.component.mjs +0 -84
  128. package/esm2022/lib/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.mjs +0 -116
  129. package/esm2022/lib/dossier-update/dossier-update.component.mjs +0 -113
  130. package/esm2022/lib/dossier.config.mjs +0 -29
  131. package/esm2022/lib/dossier.service.mjs +0 -58
  132. package/esm2022/lib/permissions/dossier.permissions.mjs +0 -55
  133. package/esm2022/lib/tab.service.mjs +0 -80
  134. package/lib/dossier-assign-user/dossier-assign-user.component.d.ts.map +0 -1
  135. package/lib/dossier-bulk-assign-modal/dossier-bulk-assign-modal.component.d.ts.map +0 -1
  136. package/lib/dossier-detail/dossier-detail.component.d.ts.map +0 -1
  137. package/lib/dossier-detail/tab/audit/audit.component.d.ts.map +0 -1
  138. package/lib/dossier-detail/tab/contact-moments/contact-moments.component.d.ts.map +0 -1
  139. package/lib/dossier-detail/tab/documenten-api-documents/documenten-api-documents.component.d.ts.map +0 -1
  140. package/lib/dossier-detail/tab/documents/documents.component.d.ts.map +0 -1
  141. package/lib/dossier-detail/tab/notes/notes.component.d.ts.map +0 -1
  142. package/lib/dossier-detail/tab/object-type/object-type.component.d.ts.map +0 -1
  143. package/lib/dossier-detail/tab/progress/progress.component.d.ts.map +0 -1
  144. package/lib/dossier-detail/tab/s3-documents/s3-documents.component.d.ts.map +0 -1
  145. package/lib/dossier-detail/tab/summary/summary.component.d.ts.map +0 -1
  146. package/lib/dossier-detail/tab/zaakobjecten/zaakobjecten.component.d.ts.map +0 -1
  147. package/lib/dossier-detail-tab-enum.d.ts +0 -10
  148. package/lib/dossier-detail-tab-enum.d.ts.map +0 -1
  149. package/lib/dossier-list/dossier-list.component.d.ts.map +0 -1
  150. package/lib/dossier-list-actions/dossier-list-actions.component.d.ts.map +0 -1
  151. package/lib/dossier-process-start-modal/dossier-process-start-modal.component.d.ts.map +0 -1
  152. package/lib/dossier-supporting-process-start-modal/dossier-supporting-process-start-modal.component.d.ts.map +0 -1
  153. package/lib/dossier-update/dossier-update.component.d.ts.map +0 -1
  154. package/lib/dossier.config.d.ts +0 -4
  155. package/lib/dossier.config.d.ts.map +0 -1
  156. package/lib/dossier.service.d.ts.map +0 -1
  157. package/lib/permissions/dossier.permissions.d.ts.map +0 -1
  158. package/lib/tab.service.d.ts +0 -21
  159. package/lib/tab.service.d.ts.map +0 -1
  160. /package/lib/{dossier-assign-user → components/dossier-assign-user}/dossier-assign-user.component.d.ts +0 -0
  161. /package/lib/{dossier-detail → components/dossier-detail}/tab/audit/audit.component.d.ts +0 -0
  162. /package/lib/{dossier-detail → components/dossier-detail}/tab/contact-moments/contact-moments.component.d.ts +0 -0
  163. /package/lib/{dossier-detail → components/dossier-detail}/tab/documents/documents.component.d.ts +0 -0
  164. /package/lib/{dossier-detail → components/dossier-detail}/tab/progress/progress.component.d.ts +0 -0
  165. /package/lib/{dossier-detail → components/dossier-detail}/tab/summary/summary.component.d.ts +0 -0
  166. /package/lib/{dossier-process-start-modal → components/dossier-process-start-modal}/dossier-process-start-modal.component.d.ts +0 -0
@@ -1,371 +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, ViewChild } from '@angular/core';
17
- import { CarbonListComponent, } from '@valtimo/components';
18
- import { DossierListTab, } from '@valtimo/config';
19
- import { AdvancedDocumentSearchRequestImpl, } from '@valtimo/document';
20
- import { Tabs } from 'carbon-components-angular';
21
- import { isEqual } from 'lodash';
22
- import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, forkJoin, map, of, switchMap, take, tap, } from 'rxjs';
23
- import { DefaultTabs } from '../dossier-detail-tab-enum';
24
- import { DossierListActionsComponent } from '../dossier-list-actions/dossier-list-actions.component';
25
- import { CAN_CREATE_CASE_PERMISSION, DOSSIER_DETAIL_PERMISSION_RESOURCE } from '../permissions';
26
- import { DossierColumnService, DossierListAssigneeService, DossierListPaginationService, DossierListSearchService, DossierListService, DossierParameterService, } from '../services';
27
- import * as i0 from "@angular/core";
28
- import * as i1 from "../services";
29
- import * as i2 from "@valtimo/components";
30
- import * as i3 from "@valtimo/config";
31
- import * as i4 from "@valtimo/document";
32
- import * as i5 from "@angular/router";
33
- import * as i6 from "@ngx-translate/core";
34
- import * as i7 from "@valtimo/access-control";
35
- import * as i8 from "@angular/common";
36
- import * as i9 from "carbon-components-angular";
37
- import * as i10 from "../dossier-bulk-assign-modal/dossier-bulk-assign-modal.component";
38
- import * as i11 from "../dossier-list-actions/dossier-list-actions.component";
39
- export class DossierListComponent {
40
- constructor(assigneeService, breadcrumbService, bulkAssignService, columnService, configService, documentService, listService, pageTitleService, paginationService, parameterService, route, router, searchService, translateService, permissionService) {
41
- this.assigneeService = assigneeService;
42
- this.breadcrumbService = breadcrumbService;
43
- this.bulkAssignService = bulkAssignService;
44
- this.columnService = columnService;
45
- this.configService = configService;
46
- this.documentService = documentService;
47
- this.listService = listService;
48
- this.pageTitleService = pageTitleService;
49
- this.paginationService = paginationService;
50
- this.parameterService = parameterService;
51
- this.route = route;
52
- this.router = router;
53
- this.searchService = searchService;
54
- this.translateService = translateService;
55
- this.permissionService = permissionService;
56
- this.activeTab = null;
57
- this.loadingFields = true;
58
- this.loadingPagination = true;
59
- this.loadingSearchFields = true;
60
- this.loadingAssigneeFilter = true;
61
- this.loadingDocumentItems = true;
62
- this.visibleDossierTabs = null;
63
- this.defaultTabs = [
64
- DossierListTab.ALL,
65
- DossierListTab.MINE,
66
- DossierListTab.OPEN,
67
- ];
68
- this.tableTranslations = {
69
- select: {
70
- single: 'dossier.select.single',
71
- multiple: 'dossier.select.multiple',
72
- },
73
- pagination: {
74
- itemsPerPage: 'dossier.pagination.itemsPerPage',
75
- totalItem: 'dossier.pagination.totalItem',
76
- totalItems: 'dossier.pagination.totalItems',
77
- },
78
- };
79
- this.noResultsMessage$ = new BehaviorSubject({
80
- description: 'dossier.noResults.ALL.description',
81
- isSearchResult: false,
82
- title: 'dossier.noResults.ALL.title',
83
- });
84
- this.showAssignModal$ = new BehaviorSubject(false);
85
- this.showChangePageModal$ = new BehaviorSubject(false);
86
- this.showChangeTabModal$ = new BehaviorSubject(false);
87
- this.searchFields$ = this.searchService.documentSearchFields$.pipe(tap(() => {
88
- this.loadingSearchFields = false;
89
- }));
90
- this.documentDefinitionName$ = this.listService.documentDefinitionName$;
91
- this.canCreateDocument$ = this.documentDefinitionName$.pipe(switchMap(documentDefinitionName => this.permissionService.requestPermission(CAN_CREATE_CASE_PERMISSION, {
92
- resource: DOSSIER_DETAIL_PERMISSION_RESOURCE.jsonSchemaDocumentDefinition,
93
- identifier: documentDefinitionName,
94
- })));
95
- this.selectedDocumentIds$ = new BehaviorSubject([]);
96
- this.schema$ = this.listService.documentDefinitionName$.pipe(switchMap(documentDefinitionName => this.documentService.getDocumentDefinition(documentDefinitionName)), map(documentDefinition => documentDefinition?.schema), tap(schema => {
97
- if (schema?.title) {
98
- this.pageTitleService.setCustomPageTitle(schema?.title, true);
99
- }
100
- }));
101
- this.searchFieldValues$ = this.parameterService.searchFieldValues$;
102
- this.assigneeFilter$ = this.assigneeService.assigneeFilter$.pipe(tap(assigneeFilter => (this.activeTab = assigneeFilter)));
103
- this.paginationChange$ = new BehaviorSubject(null);
104
- this.tabChange$ = new BehaviorSubject(null);
105
- this._pagination$ = this.paginationService.pagination$.pipe(tap(pagination => {
106
- this.pagination = pagination;
107
- this.loadingPagination = false;
108
- }));
109
- this._hasEnvColumnConfig$ = this.listService.hasEnvColumnConfig$;
110
- this._hasApiColumnConfig$ = new BehaviorSubject(false);
111
- this._canHaveAssignee$ = this.assigneeService.canHaveAssignee$;
112
- this._columns$ = this.listService.documentDefinitionName$.pipe(switchMap(documentDefinitionName => this.columnService.getDefinitionColumns(documentDefinitionName)), map(res => {
113
- this._hasApiColumnConfig$.next(res.hasApiConfig);
114
- return res.columns;
115
- }), tap(columns => {
116
- this.listService.documentDefinitionName$.pipe(take(1)).subscribe(_ => {
117
- this.paginationService.setPagination(columns);
118
- });
119
- }));
120
- this.fields$ = combineLatest([
121
- this._canHaveAssignee$,
122
- this._columns$,
123
- this._hasEnvColumnConfig$,
124
- this._hasApiColumnConfig$,
125
- this.translateService.stream('key'),
126
- ]).pipe(tap(([canHaveAssignee]) => {
127
- this.canHaveAssignee = canHaveAssignee;
128
- }), map(([canHaveAssignee, columns, hasEnvConfig, hasApiConfig]) => {
129
- const filteredAssigneeColumns = this.assigneeService.filterAssigneeColumns(columns, canHaveAssignee);
130
- const listFields = this.columnService.mapDefinitionColumnsToListFields(filteredAssigneeColumns, hasEnvConfig, hasApiConfig);
131
- const fieldsToReturn = this.assigneeService.addAssigneeListField(columns, listFields, canHaveAssignee);
132
- return fieldsToReturn;
133
- }), tap(listFields => {
134
- const defaultListField = listFields.find(field => field.default);
135
- // set default sort state if no pagination query parameters for sorting are available
136
- this.parameterService.queryPaginationParams$
137
- .pipe(take(1))
138
- .subscribe(queryPaginationParams => {
139
- if (defaultListField && !queryPaginationParams?.sort?.isSorting) {
140
- const sortDirection = typeof defaultListField.default === 'string' ? defaultListField.default : 'DESC';
141
- this.paginationService.sortChanged({
142
- isSorting: true,
143
- state: { name: defaultListField.key, direction: sortDirection },
144
- });
145
- }
146
- });
147
- }), tap(() => {
148
- this.loadingFields = false;
149
- }));
150
- this._documentSearchRequest$ = combineLatest([this._pagination$, this.listService.documentDefinitionName$]).pipe(filter(([pagination]) => !!pagination), map(([pagination, documentDefinitionName]) => {
151
- const page = pagination.page - 1;
152
- return new AdvancedDocumentSearchRequestImpl(documentDefinitionName, page >= 0 ? page : 0, pagination.size, pagination.sort);
153
- }));
154
- this.documentItems$ = this.listService.checkRefresh$.pipe(switchMap(() => combineLatest([
155
- this._documentSearchRequest$,
156
- this.assigneeFilter$,
157
- this.searchFieldValues$,
158
- this.listService.forceRefresh$,
159
- this._hasEnvColumnConfig$,
160
- this._hasApiColumnConfig$,
161
- ])), distinctUntilChanged(([prevSearchRequest, prevAssigneeFilter, prevSearchFieldValues, prevForceRefresh], [currSearchRequest, currAssigneeFilter, currSearchFieldValues, currForceRefresh]) => isEqual({
162
- ...prevSearchRequest,
163
- assignee: prevAssigneeFilter,
164
- ...prevSearchFieldValues,
165
- forceRefresh: prevForceRefresh,
166
- }, {
167
- ...currSearchRequest,
168
- assignee: currAssigneeFilter,
169
- ...currSearchFieldValues,
170
- forceRefresh: currForceRefresh,
171
- })), switchMap(([documentSearchRequest, assigneeFilter, searchValues, _, hasEnvColumnConfig, hasApiColumnConfig,]) => {
172
- const obsEnv = of(hasEnvColumnConfig);
173
- const obsApi = of(hasApiColumnConfig);
174
- if ((Object.keys(searchValues) || []).length > 0) {
175
- return forkJoin({
176
- documents: hasEnvColumnConfig || !hasApiColumnConfig
177
- ? this.documentService.getDocumentsSearch(documentSearchRequest, 'AND', assigneeFilter, this.searchService.mapSearchValuesToFilters(searchValues))
178
- : this.documentService.getSpecifiedDocumentsSearch(documentSearchRequest, 'AND', assigneeFilter, this.searchService.mapSearchValuesToFilters(searchValues)),
179
- hasEnvColumnConfig: obsEnv,
180
- hasApiColumnConfig: obsApi,
181
- isSearchResult: of(true),
182
- });
183
- }
184
- return forkJoin({
185
- documents: hasEnvColumnConfig || !hasApiColumnConfig
186
- ? this.documentService.getDocumentsSearch(documentSearchRequest, 'AND', assigneeFilter)
187
- : this.documentService.getSpecifiedDocumentsSearch(documentSearchRequest, 'AND', assigneeFilter),
188
- hasEnvColumnConfig: obsEnv,
189
- hasApiColumnConfig: obsApi,
190
- isSearchResult: of(false),
191
- });
192
- }), map((res) => {
193
- this.paginationService.setCollectionSize(res.documents);
194
- this.paginationService.checkPage(res.documents);
195
- this.updateNoResultsMessage(res.isSearchResult);
196
- return this.listService.mapDocuments(res.documents, res.hasEnvColumnConfig, res.hasApiColumnConfig);
197
- }), tap(() => {
198
- this.loadingAssigneeFilter = false;
199
- this.loadingDocumentItems = false;
200
- }));
201
- }
202
- ngOnInit() {
203
- this.setVisibleTabs();
204
- this.openDocumentDefinitionNameSubscription();
205
- }
206
- ngOnDestroy() {
207
- this._documentDefinitionNameSubscription?.unsubscribe();
208
- this.pageTitleService.enableReset();
209
- }
210
- trackByIndex(index) {
211
- return index;
212
- }
213
- search(searchFieldValues) {
214
- this.searchService.search(searchFieldValues);
215
- }
216
- rowClick(document) {
217
- this.listService.documentDefinitionName$.pipe(take(1)).subscribe(documentDefinitionName => {
218
- this.breadcrumbService.cacheQueryParams(`/dossiers/${documentDefinitionName}`, this.route.snapshot.queryParams);
219
- this.router.navigate([
220
- `/dossiers/${documentDefinitionName}/document/${document.id}/${DefaultTabs.summary}`,
221
- ]);
222
- });
223
- }
224
- tabChange(tab) {
225
- if (!this.activeTab) {
226
- this.activeTab = tab;
227
- this.updateNoResultsMessage(false);
228
- return;
229
- }
230
- if (this.activeTab.toLowerCase() === tab.toLowerCase()) {
231
- return;
232
- }
233
- if (this.carbonList.model.selectedRowsCount()) {
234
- this.showChangeTabModal$.next(true);
235
- this.tabChange$.next(tab);
236
- return;
237
- }
238
- this.onChangeTabConfirm(tab);
239
- }
240
- onChangeTabCancel() {
241
- if (!this.tabsComponent) {
242
- return;
243
- }
244
- const prevTab = this.tabsComponent.tabs.find((tab) => tab.id === this.activeTab);
245
- if (!prevTab) {
246
- return;
247
- }
248
- this.tabsComponent.tabs.find((tab) => tab.active).active = false;
249
- prevTab.active = true;
250
- }
251
- pageChange(page) {
252
- if (this.carbonList?.model.selectedRowsCount()) {
253
- this.showChangePageModal$.next(true);
254
- this.paginationChange$.next({ page, size: this.pagination.size });
255
- return;
256
- }
257
- this.paginationService.pageChange(page);
258
- }
259
- pageSizeChange(size) {
260
- if (this.carbonList?.model.selectedRowsCount()) {
261
- this.showChangePageModal$.next(true);
262
- this.paginationChange$.next({ page: this.pagination.page, size });
263
- return;
264
- }
265
- this.paginationService.pageSizeChange(size);
266
- }
267
- sortChanged(newSortState) {
268
- this.paginationService.sortChanged(newSortState);
269
- }
270
- onChangeTabConfirm(tab) {
271
- this.loadingAssigneeFilter = true;
272
- this.activeTab = tab;
273
- this.updateNoResultsMessage(false);
274
- this.paginationService.setPage(1);
275
- this.assigneeService.setAssigneeFilter(tab);
276
- }
277
- showAssignModal() {
278
- this.selectedDocumentIds$.next(this.carbonList.selectedItems.map((document) => document.id));
279
- this.showAssignModal$.next(true);
280
- }
281
- onCloseEvent(assigneeId, documentIds) {
282
- this.showAssignModal$.next(false);
283
- if (!assigneeId) {
284
- return;
285
- }
286
- this.bulkAssignService.bulkAssign(assigneeId, documentIds).subscribe(() => {
287
- this.forceRefresh();
288
- });
289
- }
290
- onChangePageConfirm(pagination) {
291
- if (pagination.size !== this.pagination.size) {
292
- this.paginationService.pageSizeChange(pagination.size);
293
- return;
294
- }
295
- this.paginationService.pageChange(pagination.page);
296
- }
297
- startDossier() {
298
- this.listActionsComponent.startDossier();
299
- }
300
- forceRefresh() {
301
- this.listService.forceRefresh();
302
- }
303
- openDocumentDefinitionNameSubscription() {
304
- this._documentDefinitionNameSubscription = this.route.params
305
- .pipe(map((params) => params?.documentDefinitionName), filter(docDefName => !!docDefName), distinctUntilChanged())
306
- .subscribe(documentDefinitonName => {
307
- if (this._previousDocumentDefinitionName) {
308
- this.parameterService.clearParameters();
309
- this.parameterService.clearSearchFieldValues();
310
- }
311
- this._previousDocumentDefinitionName = documentDefinitonName;
312
- this.setLoading();
313
- this.paginationService.clearPagination();
314
- this.assigneeService.resetAssigneeFilter();
315
- this.listService.setDocumentDefinitionName(documentDefinitonName);
316
- });
317
- }
318
- setLoading() {
319
- this.loadingFields = true;
320
- this.loadingPagination = true;
321
- this.loadingSearchFields = true;
322
- this.loadingAssigneeFilter = true;
323
- this.loadingDocumentItems = true;
324
- }
325
- setVisibleTabs() {
326
- this.visibleDossierTabs = this.configService.config?.visibleDossierListTabs || null;
327
- }
328
- updateNoResultsMessage(isSearchResult) {
329
- this.noResultsMessage$.next(isSearchResult
330
- ? {
331
- description: 'dossier.noResults.search.description',
332
- isSearchResult,
333
- title: 'dossier.noResults.search.title',
334
- }
335
- : {
336
- description: `dossier.noResults.${this.activeTab ?? 'ALL'}.description`,
337
- isSearchResult,
338
- title: `dossier.noResults.${this.activeTab ?? 'ALL'}.title`,
339
- });
340
- }
341
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DossierListComponent, deps: [{ token: i1.DossierListAssigneeService }, { token: i2.BreadcrumbService }, { token: i1.DossierBulkAssignService }, { token: i1.DossierColumnService }, { token: i3.ConfigService }, { token: i4.DocumentService }, { token: i1.DossierListService }, { token: i2.PageTitleService }, { token: i1.DossierListPaginationService }, { token: i1.DossierParameterService }, { token: i5.ActivatedRoute }, { token: i5.Router }, { token: i1.DossierListSearchService }, { token: i6.TranslateService }, { token: i7.PermissionService }], target: i0.ɵɵFactoryTarget.Component }); }
342
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DossierListComponent, selector: "valtimo-dossier-list", providers: [
343
- DossierListService,
344
- DossierColumnService,
345
- DossierListAssigneeService,
346
- DossierParameterService,
347
- DossierListPaginationService,
348
- DossierListSearchService,
349
- ], viewQueries: [{ propertyName: "carbonList", first: true, predicate: CarbonListComponent, descendants: true }, { propertyName: "listActionsComponent", first: true, predicate: DossierListActionsComponent, descendants: true }, { propertyName: "tabsComponent", first: true, predicate: Tabs, 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 fields: fields$ | async,\n documentItems: documentItems$ | async,\n noResultsMessage: noResultsMessage$ | async,\n searchFields: searchFields$ | async,\n schema: schema$ | async,\n showAssignModal: showAssignModal$ | async,\n selectedDocumentIds: selectedDocumentIds$ | async,\n loaded:\n !loadingFields &&\n !loadingPagination &&\n !loadingSearchFields &&\n !loadingAssigneeFilter &&\n !loadingDocumentItems\n } as obs\"\n>\n <div class=\"main-content pt-0\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <valtimo-dossier-list-actions\n [loading]=\"!obs.loaded\"\n (formFlowComplete)=\"forceRefresh()\"\n ></valtimo-dossier-list-actions>\n <ng-container *ngTemplateOutlet=\"searchFields; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngIf=\"obs.loaded; else loading\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"bulkAssignModal; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"changePageModal\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"changeTabModal\"></ng-container>\n</ng-container>\n\n<ng-template #searchFields let-obs=\"obs\">\n <div class=\"mb-3\">\n <valtimo-search-fields\n [searchFields]=\"obs.searchFields\"\n (doSearch)=\"search($event)\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [defaultValues]=\"searchFieldValues$ | async\"\n [inputDisabled]=\"!obs.loaded\"\n ></valtimo-search-fields>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-carbon-list\n [fields]=\"obs.fields\"\n [header]=\"false\"\n [initialSortState]=\"pagination.sort\"\n [items]=\"obs.documentItems\"\n [pagination]=\"pagination\"\n paginationIdentifier=\"dossierList\"\n [showSelectionColumn]=\"canHaveAssignee\"\n [tableTranslations]=\"tableTranslations\"\n (paginationClicked)=\"pageChange($event)\"\n (paginationSet)=\"pageSizeChange($event)\"\n (rowClicked)=\"rowClick($event)\"\n (sortChanged)=\"sortChanged($event)\"\n >\n <ng-container carbonToolbarActions>\n <button cdsButton=\"primary\" (click)=\"showAssignModal()\">\n {{ 'dossier.bulkAssign.assign' | translate }}\n </button>\n </ng-container>\n\n <div carbonToolbarContent>\n <ng-container *ngTemplateOutlet=\"dossierListActions\"></ng-container>\n </div>\n\n <valtimo-no-results\n [action]=\"obs.noResultsMessage.isSearchResult ? null : dossierListActions\"\n [description]=\"obs.noResultsMessage.description | translate\"\n [title]=\"obs.noResultsMessage.title | translate\"\n ></valtimo-no-results>\n\n <div tabs *ngIf=\"canHaveAssignee\">\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n </div>\n </valtimo-carbon-list>\n</ng-template>\n\n<ng-template #tabs>\n <ng-container *ngIf=\"assigneeFilter$ | async as assigneeFilter\">\n <cds-tabs\n *ngIf=\"!visibleDossierTabs; else configuredTabs\"\n type=\"contained\"\n data-carbon-theme=\"g10\"\n class=\"dossier-list-tabs\"\n >\n <cds-tab\n *ngFor=\"let tab of defaultTabs; trackBy: trackByIndex\"\n [active]=\"assigneeFilter === tab\"\n heading=\"{{ 'dossier.tabs.' + tab | translate }}\"\n [id]=\"tab\"\n (selected)=\"tabChange(tab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n</ng-template>\n\n<ng-template #configuredTabs>\n <ng-container *ngIf=\"assigneeFilter$ | async as assigneeFilter\">\n <cds-tabs type=\"contained\" class=\"dossier-list-tabs\">\n <cds-tab\n *ngFor=\"let tab of visibleDossierTabs; trackBy: trackByIndex\"\n [active]=\"assigneeFilter === tab\"\n heading=\"{{ 'dossier.tabs.' + tab | translate }}\"\n [id]=\"tab\"\n (selected)=\"tabChange(tab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n</ng-template>\n\n<ng-template #loading\n ><valtimo-carbon-list [loading]=\"true\">\n <div tabs *ngIf=\"canHaveAssignee\">\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n </div> </valtimo-carbon-list\n></ng-template>\n\n<ng-template #bulkAssignModal let-obs=\"obs\">\n <valtimo-dossier-bulk-assign-modal\n [documentIds]=\"obs.selectedDocumentIds\"\n [open]=\"obs.showAssignModal\"\n (closeEvent)=\"onCloseEvent($event, obs.selectedDocumentIds)\"\n ></valtimo-dossier-bulk-assign-modal>\n</ng-template>\n\n<ng-template #changePageModal>\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.changePageModal.confirm\"\n contentTranslationKey=\"dossier.changePageModal.content\"\n [outputOnConfirm]=\"paginationChange$ | async\"\n [showModalSubject$]=\"showChangePageModal$\"\n titleTranslationKey=\"dossier.changePageModal.title\"\n (confirmEvent)=\"onChangePageConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #changeTabModal>\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.changeTabModal.confirm\"\n contentTranslationKey=\"dossier.changeTabModal.content\"\n [outputOnConfirm]=\"tabChange$ | async\"\n [showModalSubject$]=\"showChangeTabModal$\"\n titleTranslationKey=\"dossier.changeTabModal.title\"\n (cancelEvent)=\"onChangeTabCancel()\"\n (confirmEvent)=\"onChangeTabConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #dossierListActions>\n <button\n *ngIf=\"canCreateDocument$ | async\"\n cdsButton=\"primary\"\n [disabled]=\"listActionsComponent?.disableStartDossierButton$ | async\"\n (click)=\"startDossier()\"\n >\n {{ 'Start Dossier' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n</ng-template>\n", styles: [".dossier-list-tabs cds-tab{display:none}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.SearchFieldsComponent, selector: "valtimo-search-fields", inputs: ["loading", "searchFields", "documentDefinitionName", "setValuesSubject$", "defaultValues", "inputDisabled"], outputs: ["doSearch"] }, { kind: "directive", type: i9.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i9.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i2.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm"], outputs: ["confirmEvent", "cancelEvent"] }, { kind: "component", type: i9.Tabs, selector: "cds-tabs, ibm-tabs", inputs: ["position", "cacheActive", "followFocus", "isNavigation", "ariaLabel", "ariaLabelledby", "type", "theme", "skeleton"] }, { kind: "component", type: i9.Tab, selector: "cds-tab, ibm-tab", inputs: ["heading", "title", "context", "active", "disabled", "tabIndex", "id", "cacheActive"], outputs: ["selected"] }, { kind: "component", type: i2.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "header", "initialSortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i2.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title"] }, { kind: "component", type: i10.DossierBulkAssignModalComponent, selector: "valtimo-dossier-bulk-assign-modal", inputs: ["documentIds", "open"], outputs: ["closeEvent"] }, { kind: "component", type: i11.DossierListActionsComponent, selector: "valtimo-dossier-list-actions", inputs: ["loading"], outputs: ["formFlowComplete"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] }); }
350
- }
351
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DossierListComponent, decorators: [{
352
- type: Component,
353
- args: [{ selector: 'valtimo-dossier-list', providers: [
354
- DossierListService,
355
- DossierColumnService,
356
- DossierListAssigneeService,
357
- DossierParameterService,
358
- DossierListPaginationService,
359
- DossierListSearchService,
360
- ], 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 fields: fields$ | async,\n documentItems: documentItems$ | async,\n noResultsMessage: noResultsMessage$ | async,\n searchFields: searchFields$ | async,\n schema: schema$ | async,\n showAssignModal: showAssignModal$ | async,\n selectedDocumentIds: selectedDocumentIds$ | async,\n loaded:\n !loadingFields &&\n !loadingPagination &&\n !loadingSearchFields &&\n !loadingAssigneeFilter &&\n !loadingDocumentItems\n } as obs\"\n>\n <div class=\"main-content pt-0\">\n <div class=\"container-fluid\">\n <div class=\"col-12 px-0 mb-5\">\n <valtimo-dossier-list-actions\n [loading]=\"!obs.loaded\"\n (formFlowComplete)=\"forceRefresh()\"\n ></valtimo-dossier-list-actions>\n <ng-container *ngTemplateOutlet=\"searchFields; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngIf=\"obs.loaded; else loading\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"bulkAssignModal; context: {obs: obs}\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"changePageModal\"></ng-container>\n\n <ng-container *ngTemplateOutlet=\"changeTabModal\"></ng-container>\n</ng-container>\n\n<ng-template #searchFields let-obs=\"obs\">\n <div class=\"mb-3\">\n <valtimo-search-fields\n [searchFields]=\"obs.searchFields\"\n (doSearch)=\"search($event)\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [defaultValues]=\"searchFieldValues$ | async\"\n [inputDisabled]=\"!obs.loaded\"\n ></valtimo-search-fields>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-carbon-list\n [fields]=\"obs.fields\"\n [header]=\"false\"\n [initialSortState]=\"pagination.sort\"\n [items]=\"obs.documentItems\"\n [pagination]=\"pagination\"\n paginationIdentifier=\"dossierList\"\n [showSelectionColumn]=\"canHaveAssignee\"\n [tableTranslations]=\"tableTranslations\"\n (paginationClicked)=\"pageChange($event)\"\n (paginationSet)=\"pageSizeChange($event)\"\n (rowClicked)=\"rowClick($event)\"\n (sortChanged)=\"sortChanged($event)\"\n >\n <ng-container carbonToolbarActions>\n <button cdsButton=\"primary\" (click)=\"showAssignModal()\">\n {{ 'dossier.bulkAssign.assign' | translate }}\n </button>\n </ng-container>\n\n <div carbonToolbarContent>\n <ng-container *ngTemplateOutlet=\"dossierListActions\"></ng-container>\n </div>\n\n <valtimo-no-results\n [action]=\"obs.noResultsMessage.isSearchResult ? null : dossierListActions\"\n [description]=\"obs.noResultsMessage.description | translate\"\n [title]=\"obs.noResultsMessage.title | translate\"\n ></valtimo-no-results>\n\n <div tabs *ngIf=\"canHaveAssignee\">\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n </div>\n </valtimo-carbon-list>\n</ng-template>\n\n<ng-template #tabs>\n <ng-container *ngIf=\"assigneeFilter$ | async as assigneeFilter\">\n <cds-tabs\n *ngIf=\"!visibleDossierTabs; else configuredTabs\"\n type=\"contained\"\n data-carbon-theme=\"g10\"\n class=\"dossier-list-tabs\"\n >\n <cds-tab\n *ngFor=\"let tab of defaultTabs; trackBy: trackByIndex\"\n [active]=\"assigneeFilter === tab\"\n heading=\"{{ 'dossier.tabs.' + tab | translate }}\"\n [id]=\"tab\"\n (selected)=\"tabChange(tab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n</ng-template>\n\n<ng-template #configuredTabs>\n <ng-container *ngIf=\"assigneeFilter$ | async as assigneeFilter\">\n <cds-tabs type=\"contained\" class=\"dossier-list-tabs\">\n <cds-tab\n *ngFor=\"let tab of visibleDossierTabs; trackBy: trackByIndex\"\n [active]=\"assigneeFilter === tab\"\n heading=\"{{ 'dossier.tabs.' + tab | translate }}\"\n [id]=\"tab\"\n (selected)=\"tabChange(tab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n</ng-template>\n\n<ng-template #loading\n ><valtimo-carbon-list [loading]=\"true\">\n <div tabs *ngIf=\"canHaveAssignee\">\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n </div> </valtimo-carbon-list\n></ng-template>\n\n<ng-template #bulkAssignModal let-obs=\"obs\">\n <valtimo-dossier-bulk-assign-modal\n [documentIds]=\"obs.selectedDocumentIds\"\n [open]=\"obs.showAssignModal\"\n (closeEvent)=\"onCloseEvent($event, obs.selectedDocumentIds)\"\n ></valtimo-dossier-bulk-assign-modal>\n</ng-template>\n\n<ng-template #changePageModal>\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.changePageModal.confirm\"\n contentTranslationKey=\"dossier.changePageModal.content\"\n [outputOnConfirm]=\"paginationChange$ | async\"\n [showModalSubject$]=\"showChangePageModal$\"\n titleTranslationKey=\"dossier.changePageModal.title\"\n (confirmEvent)=\"onChangePageConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #changeTabModal>\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.changeTabModal.confirm\"\n contentTranslationKey=\"dossier.changeTabModal.content\"\n [outputOnConfirm]=\"tabChange$ | async\"\n [showModalSubject$]=\"showChangeTabModal$\"\n titleTranslationKey=\"dossier.changeTabModal.title\"\n (cancelEvent)=\"onChangeTabCancel()\"\n (confirmEvent)=\"onChangeTabConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #dossierListActions>\n <button\n *ngIf=\"canCreateDocument$ | async\"\n cdsButton=\"primary\"\n [disabled]=\"listActionsComponent?.disableStartDossierButton$ | async\"\n (click)=\"startDossier()\"\n >\n {{ 'Start Dossier' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n</ng-template>\n", styles: [".dossier-list-tabs cds-tab{display:none}\n"] }]
361
- }], ctorParameters: function () { return [{ type: i1.DossierListAssigneeService }, { type: i2.BreadcrumbService }, { type: i1.DossierBulkAssignService }, { type: i1.DossierColumnService }, { type: i3.ConfigService }, { type: i4.DocumentService }, { type: i1.DossierListService }, { type: i2.PageTitleService }, { type: i1.DossierListPaginationService }, { type: i1.DossierParameterService }, { type: i5.ActivatedRoute }, { type: i5.Router }, { type: i1.DossierListSearchService }, { type: i6.TranslateService }, { type: i7.PermissionService }]; }, propDecorators: { carbonList: [{
362
- type: ViewChild,
363
- args: [CarbonListComponent]
364
- }], listActionsComponent: [{
365
- type: ViewChild,
366
- args: [DossierListActionsComponent]
367
- }], tabsComponent: [{
368
- type: ViewChild,
369
- args: [Tabs]
370
- }] } });
371
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci9zcmMvbGliL2Rvc3NpZXItbGlzdC9kb3NzaWVyLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9kb3NzaWVyL3NyYy9saWIvZG9zc2llci1saXN0L2Rvc3NpZXItbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBQyxTQUFTLEVBQXFCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUl0RSxPQUFPLEVBRUwsbUJBQW1CLEdBTXBCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUtMLGNBQWMsR0FJZixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFFTCxpQ0FBaUMsR0FLbEMsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQU0sSUFBSSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLFFBQVEsRUFDUixHQUFHLEVBRUgsRUFBRSxFQUVGLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBQ25HLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxrQ0FBa0MsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlGLE9BQU8sRUFFTCxvQkFBb0IsRUFDcEIsMEJBQTBCLEVBQzFCLDRCQUE0QixFQUM1Qix3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLHVCQUF1QixHQUN4QixNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7Ozs7OztBQWVyQixNQUFNLE9BQU8sb0JBQW9CO0lBNFIvQixZQUNtQixlQUEyQyxFQUMzQyxpQkFBb0MsRUFDcEMsaUJBQTJDLEVBQzNDLGFBQW1DLEVBQ25DLGFBQTRCLEVBQzVCLGVBQWdDLEVBQ2hDLFdBQStCLEVBQy9CLGdCQUFrQyxFQUNsQyxpQkFBK0MsRUFDL0MsZ0JBQXlDLEVBQ3pDLEtBQXFCLEVBQ3JCLE1BQWMsRUFDZCxhQUF1QyxFQUN2QyxnQkFBa0MsRUFDbEMsaUJBQW9DO1FBZHBDLG9CQUFlLEdBQWYsZUFBZSxDQUE0QjtRQUMzQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBMEI7UUFDM0Msa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBQ25DLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQThCO1FBQy9DLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBeUI7UUFDekMsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGtCQUFhLEdBQWIsYUFBYSxDQUEwQjtRQUN2QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUF0U2hELGNBQVMsR0FBbUIsSUFBSSxDQUFDO1FBQ2pDLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLHNCQUFpQixHQUFHLElBQUksQ0FBQztRQUN6Qix3QkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDM0IsMEJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUc1Qix1QkFBa0IsR0FBaUMsSUFBSSxDQUFDO1FBRS9DLGdCQUFXLEdBQXFCO1lBQzlDLGNBQWMsQ0FBQyxHQUFHO1lBQ2xCLGNBQWMsQ0FBQyxJQUFJO1lBQ25CLGNBQWMsQ0FBQyxJQUFJO1NBQ3BCLENBQUM7UUFFYyxzQkFBaUIsR0FBMkI7WUFDMUQsTUFBTSxFQUFFO2dCQUNOLE1BQU0sRUFBRSx1QkFBdUI7Z0JBQy9CLFFBQVEsRUFBRSx5QkFBeUI7YUFDcEM7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsWUFBWSxFQUFFLGlDQUFpQztnQkFDL0MsU0FBUyxFQUFFLDhCQUE4QjtnQkFDekMsVUFBVSxFQUFFLCtCQUErQjthQUM1QztTQUNGLENBQUM7UUFFYyxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FJcEQ7WUFDRCxXQUFXLEVBQUUsbUNBQW1DO1lBQ2hELGNBQWMsRUFBRSxLQUFLO1lBQ3JCLEtBQUssRUFBRSw2QkFBNkI7U0FDckMsQ0FBQyxDQUFDO1FBQ2EscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdkQseUJBQW9CLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDM0Qsd0JBQW1CLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFMUQsa0JBQWEsR0FDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQzNDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFWSw0QkFBdUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDO1FBRW5FLHVCQUFrQixHQUF3QixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUN6RixTQUFTLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsMEJBQTBCLEVBQUU7WUFDbkUsUUFBUSxFQUFFLGtDQUFrQyxDQUFDLDRCQUE0QjtZQUN6RSxVQUFVLEVBQUUsc0JBQXNCO1NBQ25DLENBQUMsQ0FDSCxDQUNGLENBQUM7UUFDYyx5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBVyxFQUFFLENBQUMsQ0FBQztRQUV6RCxZQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQ3JFLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLENBQUMsQ0FDbkUsRUFDRCxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxFQUNyRCxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDWCxJQUFJLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQy9EO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVjLHVCQUFrQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQztRQUM5RCxvQkFBZSxHQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQ3ZDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFnQyxDQUFDLENBQUMsQ0FDM0UsQ0FBQztRQUNZLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFtQyxJQUFJLENBQUMsQ0FBQztRQUNoRixlQUFVLEdBQUcsSUFBSSxlQUFlLENBQXdCLElBQUksQ0FBQyxDQUFDO1FBQzdELGlCQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ3JFLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNmLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNlLHlCQUFvQixHQUF3QixJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDO1FBQ2pGLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzNELHNCQUFpQixHQUF3QixJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1FBQy9FLGNBQVMsR0FDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQzNDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsQ0FDaEUsRUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDckIsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1osSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNuRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVZLFlBQU8sR0FBaUMsYUFBYSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxpQkFBaUI7WUFDdEIsSUFBSSxDQUFDLFNBQVM7WUFDZCxJQUFJLENBQUMsb0JBQW9CO1lBQ3pCLElBQUksQ0FBQyxvQkFBb0I7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDcEMsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDekMsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsRUFBRSxFQUFFO1lBQzdELE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FDeEUsT0FBTyxFQUNQLGVBQWUsQ0FDaEIsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQ3BFLHVCQUF1QixFQUN2QixZQUFZLEVBQ1osWUFBWSxDQUNiLENBQUM7WUFDRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUM5RCxPQUFPLEVBQ1AsVUFBVSxFQUNWLGVBQWUsQ0FDaEIsQ0FBQztZQUVGLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNmLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRSxxRkFBcUY7WUFDckYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQjtpQkFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDYixTQUFTLENBQUMscUJBQXFCLENBQUMsRUFBRTtnQkFDakMsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7b0JBQy9ELE1BQU0sYUFBYSxHQUNqQixPQUFPLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNuRixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO3dCQUNqQyxTQUFTLEVBQUUsSUFBSTt3QkFDZixLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxhQUEwQixFQUFDO3FCQUMzRSxDQUFDLENBQUM7aUJBQ0o7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRWUsNEJBQXVCLEdBQ3RDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMvRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQ3RDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLEVBQUUsRUFBRTtZQUMzQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUVqQyxPQUFPLElBQUksaUNBQWlDLENBQzFDLHNCQUFzQixFQUN0QixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLElBQUksRUFDZixVQUFVLENBQUMsSUFBSSxDQUNoQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVZLG1CQUFjLEdBQXNCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckYsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUNiLGFBQWEsQ0FBQztZQUNaLElBQUksQ0FBQyx1QkFBdUI7WUFDNUIsSUFBSSxDQUFDLGVBQWU7WUFDcEIsSUFBSSxDQUFDLGtCQUFrQjtZQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWE7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQjtZQUN6QixJQUFJLENBQUMsb0JBQW9CO1NBQzFCLENBQUMsQ0FDSCxFQUNELG9CQUFvQixDQUNsQixDQUNFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsRUFDaEYsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsQ0FBQyxFQUNoRixFQUFFLENBQ0YsT0FBTyxDQUNMO1lBQ0UsR0FBRyxpQkFBaUI7WUFDcEIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixHQUFHLHFCQUFxQjtZQUN4QixZQUFZLEVBQUUsZ0JBQWdCO1NBQy9CLEVBQ0Q7WUFDRSxHQUFHLGlCQUFpQjtZQUNwQixRQUFRLEVBQUUsa0JBQWtCO1lBQzVCLEdBQUcscUJBQXFCO1lBQ3hCLFlBQVksRUFBRSxnQkFBZ0I7U0FDL0IsQ0FDRixDQUNKLEVBQ0QsU0FBUyxDQUNQLENBQUMsQ0FDQyxxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixDQUFDLEVBQ0Qsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNuQixFQUFFLEVBQUU7WUFDSCxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDM0QsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRTNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2hELE9BQU8sUUFBUSxDQUFDO29CQUNkLFNBQVMsRUFDUCxrQkFBa0IsSUFBSSxDQUFDLGtCQUFrQjt3QkFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQ3JDLHFCQUFxQixFQUNyQixLQUFLLEVBQ0wsY0FBYyxFQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsWUFBWSxDQUFDLENBQzFEO3dCQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLDJCQUEyQixDQUM5QyxxQkFBcUIsRUFDckIsS0FBSyxFQUNMLGNBQWMsRUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxDQUMxRDtvQkFDUCxrQkFBa0IsRUFBRSxNQUFNO29CQUMxQixrQkFBa0IsRUFBRSxNQUFNO29CQUMxQixjQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztpQkFDekIsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxPQUFPLFFBQVEsQ0FBQztnQkFDZCxTQUFTLEVBQ1Asa0JBQWtCLElBQUksQ0FBQyxrQkFBa0I7b0JBQ3ZDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUNyQyxxQkFBcUIsRUFDckIsS0FBSyxFQUNMLGNBQWMsQ0FDZjtvQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsQ0FDOUMscUJBQXFCLEVBQ3JCLEtBQUssRUFDTCxjQUFjLENBQ2Y7Z0JBQ1Asa0JBQWtCLEVBQUUsTUFBTTtnQkFDMUIsa0JBQWtCLEVBQUUsTUFBTTtnQkFDMUIsY0FBYyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7YUFDMUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUNGLEVBQ0QsR0FBRyxDQUNELENBQUMsR0FLQSxFQUFFLEVBQUU7WUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFaEQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FDbEMsR0FBRyxDQUFDLFNBQVMsRUFDYixHQUFHLENBQUMsa0JBQWtCLEVBQ3RCLEdBQUcsQ0FBQyxrQkFBa0IsQ0FDdkIsQ0FBQztRQUNKLENBQUMsQ0FDRixFQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1lBQ25DLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQXFCQyxDQUFDO0lBRUcsUUFBUTtRQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsc0NBQXNDLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsbUNBQW1DLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFTSxZQUFZLENBQUMsS0FBYTtRQUMvQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxNQUFNLENBQUMsaUJBQW9DO1FBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLFFBQVEsQ0FBQyxRQUFhO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ3hGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FDckMsYUFBYSxzQkFBc0IsRUFBRSxFQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQ2hDLENBQUM7WUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDbkIsYUFBYSxzQkFBc0IsYUFBYSxRQUFRLENBQUMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUU7YUFDckYsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sU0FBUyxDQUFDLEdBQW1CO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3RELE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLE9BQU87U0FDUjtRQUVELE1BQU0sT0FBTyxHQUFvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQzNELENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQ3hDLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUN0RSxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRU0sVUFBVSxDQUFDLElBQVk7UUFDNUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFZO1FBQ2hDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUM5QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztZQUNoRSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxXQUFXLENBQUMsWUFBdUI7UUFDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsR0FBbUI7UUFDNUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWtCLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FDdkUsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLFlBQVksQ0FBQyxVQUF5QixFQUFFLFdBQXFCO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDeEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLG1CQUFtQixDQUFDLFVBQXFDO1FBQzlELElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUM1QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sc0NBQXNDO1FBQzVDLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDekQsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLEVBQ3ZELE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFDbEMsb0JBQW9CLEVBQUUsQ0FDdkI7YUFDQSxTQUFTLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUNqQyxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUNoRDtZQUNELElBQUksQ0FBQywrQkFBK0IsR0FBRyxxQkFBcUIsQ0FBQztZQUM3RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsSUFBSSxJQUFJLENBQUM7SUFDdEYsQ0FBQztJQUVPLHNCQUFzQixDQUFDLGNBQXVCO1FBQ3BELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQ3pCLGNBQWM7WUFDWixDQUFDLENBQUM7Z0JBQ0UsV0FBVyxFQUFFLHNDQUFzQztnQkFDbkQsY0FBYztnQkFDZCxLQUFLLEVBQUUsZ0NBQWdDO2FBQ3hDO1lBQ0gsQ0FBQyxDQUFDO2dCQUNFLFdBQVcsRUFBRSxxQkFBcUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLLGNBQWM7Z0JBQ3ZFLGNBQWM7Z0JBQ2QsS0FBSyxFQUFFLHFCQUFxQixJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssUUFBUTthQUM1RCxDQUNOLENBQUM7SUFDSixDQUFDOytHQWhlVSxvQkFBb0I7bUdBQXBCLG9CQUFvQiwrQ0FUcEI7WUFDVCxrQkFBa0I7WUFDbEIsb0JBQW9CO1lBQ3BCLDBCQUEwQjtZQUMxQix1QkFBdUI7WUFDdkIsNEJBQTRCO1lBQzVCLHdCQUF3QjtTQUN6QixzRUFHVSxtQkFBbUIsdUZBQ25CLDJCQUEyQixnRkFDM0IsSUFBSSxnREMzRmpCLCsrTUE0TEE7OzRGRHBHYSxvQkFBb0I7a0JBYmhDLFNBQVM7K0JBQ0Usc0JBQXNCLGFBR3JCO3dCQUNULGtCQUFrQjt3QkFDbEIsb0JBQW9CO3dCQUNwQiwwQkFBMEI7d0JBQzFCLHVCQUF1Qjt3QkFDdkIsNEJBQTRCO3dCQUM1Qix3QkFBd0I7cUJBQ3pCOzhqQkFHK0IsVUFBVTtzQkFBekMsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ1Usb0JBQW9CO3NCQUEzRCxTQUFTO3VCQUFDLDJCQUEyQjtnQkFDckIsYUFBYTtzQkFBN0IsU0FBUzt1QkFBQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7Q29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7UGVybWlzc2lvblNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL2FjY2Vzcy1jb250cm9sJztcbmltcG9ydCB7XG4gIEJyZWFkY3J1bWJTZXJ2aWNlLFxuICBDYXJib25MaXN0Q29tcG9uZW50LFxuICBDYXJib25MaXN0VHJhbnNsYXRpb25zLFxuICBDYXJib25QYWdpbmF0aW9uU2VsZWN0aW9uLFxuICBMaXN0RmllbGQsXG4gIFBhZ2VUaXRsZVNlcnZpY2UsXG4gIFBhZ2luYXRpb24sXG59IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgQXNzaWduZWVGaWx0ZXIsXG4gIENvbmZpZ1NlcnZpY2UsXG4gIERlZmluaXRpb25Db2x1bW4sXG4gIERpcmVjdGlvbixcbiAgRG9zc2llckxpc3RUYWIsXG4gIFNlYXJjaEZpZWxkLFxuICBTZWFyY2hGaWVsZFZhbHVlcyxcbiAgU29ydFN0YXRlLFxufSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuaW1wb3J0IHtcbiAgQWR2YW5jZWREb2N1bWVudFNlYXJjaFJlcXVlc3QsXG4gIEFkdmFuY2VkRG9jdW1lbnRTZWFyY2hSZXF1ZXN0SW1wbCxcbiAgRG9jdW1lbnQsXG4gIERvY3VtZW50cyxcbiAgRG9jdW1lbnRTZXJ2aWNlLFxuICBTcGVjaWZpZWREb2N1bWVudHMsXG59IGZyb20gJ0B2YWx0aW1vL2RvY3VtZW50JztcbmltcG9ydCB7VGFiLCBUYWJzfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbmltcG9ydCB7aXNFcXVhbH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgZm9ya0pvaW4sXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFN1YnNjcmlwdGlvbixcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtEZWZhdWx0VGFic30gZnJvbSAnLi4vZG9zc2llci1kZXRhaWwtdGFiLWVudW0nO1xuaW1wb3J0IHtEb3NzaWVyTGlzdEFjdGlvbnNDb21wb25lbnR9IGZyb20gJy4uL2Rvc3NpZXItbGlzdC1hY3Rpb25zL2Rvc3NpZXItbGlzdC1hY3Rpb25zLmNvbXBvbmVudCc7XG5pbXBvcnQge0NBTl9DUkVBVEVfQ0FTRV9QRVJNSVNTSU9OLCBET1NTSUVSX0RFVEFJTF9QRVJNSVNTSU9OX1JFU09VUkNFfSBmcm9tICcuLi9wZXJtaXNzaW9ucyc7XG5pbXBvcnQge1xuICBEb3NzaWVyQnVsa0Fzc2lnblNlcnZpY2UsXG4gIERvc3NpZXJDb2x1bW5TZXJ2aWNlLFxuICBEb3NzaWVyTGlzdEFzc2lnbmVlU2VydmljZSxcbiAgRG9zc2llckxpc3RQYWdpbmF0aW9uU2VydmljZSxcbiAgRG9zc2llckxpc3RTZWFyY2hTZXJ2aWNlLFxuICBEb3NzaWVyTGlzdFNlcnZpY2UsXG4gIERvc3NpZXJQYXJhbWV0ZXJTZXJ2aWNlLFxufSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tZG9zc2llci1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rvc3NpZXItbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rvc3NpZXItbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICBEb3NzaWVyTGlzdFNlcnZpY2UsXG4gICAgRG9zc2llckNvbHVtblNlcnZpY2UsXG4gICAgRG9zc2llckxpc3RBc3NpZ25lZVNlcnZpY2UsXG4gICAgRG9zc2llclBhcmFtZXRlclNlcnZpY2UsXG4gICAgRG9zc2llckxpc3RQYWdpbmF0aW9uU2VydmljZSxcbiAgICBEb3NzaWVyTGlzdFNlYXJjaFNlcnZpY2UsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERvc3NpZXJMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKENhcmJvbkxpc3RDb21wb25lbnQpIGNhcmJvbkxpc3Q6IENhcmJvbkxpc3RDb21wb25lbnQ8RG9jdW1lbnQ+O1xuICBAVmlld0NoaWxkKERvc3NpZXJMaXN0QWN0aW9uc0NvbXBvbmVudCkgbGlzdEFjdGlvbnNDb21wb25lbnQ6IERvc3NpZXJMaXN0QWN0aW9uc0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZChUYWJzKSB0YWJzQ29tcG9uZW50OiBUYWJzO1xuXG4gIHB1YmxpYyBhY3RpdmVUYWI6IERvc3NpZXJMaXN0VGFiID0gbnVsbDtcbiAgcHVibGljIGxvYWRpbmdGaWVsZHMgPSB0cnVlO1xuICBwdWJsaWMgbG9hZGluZ1BhZ2luYXRpb24gPSB0cnVlO1xuICBwdWJsaWMgbG9hZGluZ1NlYXJjaEZpZWxkcyA9IHRydWU7XG4gIHB1YmxpYyBsb2FkaW5nQXNzaWduZWVGaWx0ZXIgPSB0cnVlO1xuICBwdWJsaWMgbG9hZGluZ0RvY3VtZW50SXRlbXMgPSB0cnVlO1xuICBwdWJsaWMgcGFnaW5hdGlvbiE6IFBhZ2luYXRpb247XG4gIHB1YmxpYyBjYW5IYXZlQXNzaWduZWUhOiBib29sZWFuO1xuICBwdWJsaWMgdmlzaWJsZURvc3NpZXJUYWJzOiBBcnJheTxEb3NzaWVyTGlzdFRhYj4gfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFRhYnM6IERvc3NpZXJMaXN0VGFiW10gPSBbXG4gICAgRG9zc2llckxpc3RUYWIuQUxMLFxuICAgIERvc3NpZXJMaXN0VGFiLk1JTkUsXG4gICAgRG9zc2llckxpc3RUYWIuT1BFTixcbiAgXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVUcmFuc2xhdGlvbnM6IENhcmJvbkxpc3RUcmFuc2xhdGlvbnMgPSB7XG4gICAgc2VsZWN0OiB7XG4gICAgICBzaW5nbGU6ICdkb3NzaWVyLnNlbGVjdC5zaW5nbGUnLFxuICAgICAgbXVsdGlwbGU6ICdkb3NzaWVyLnNlbGVjdC5tdWx0aXBsZScsXG4gICAgfSxcbiAgICBwYWdpbmF0aW9uOiB7XG4gICAgICBpdGVtc1BlclBhZ2U6ICdkb3NzaWVyLnBhZ2luYXRpb24uaXRlbXNQZXJQYWdlJyxcbiAgICAgIHRvdGFsSXRlbTogJ2Rvc3NpZXIucGFnaW5hdGlvbi50b3RhbEl0ZW0nLFxuICAgICAgdG90YWxJdGVtczogJ2Rvc3NpZXIucGFnaW5hdGlvbi50b3RhbEl0ZW1zJyxcbiAgICB9LFxuICB9O1xuXG4gIHB1YmxpYyByZWFkb25seSBub1Jlc3VsdHNNZXNzYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgaXNTZWFyY2hSZXN1bHQ6IGJvb2xlYW47XG4gICAgdGl0bGU6IHN0cmluZztcbiAgfT4oe1xuICAgIGRlc2NyaXB0aW9uOiAnZG9zc2llci5ub1Jlc3VsdHMuQUxMLmRlc2NyaXB0aW9uJyxcbiAgICBpc1NlYXJjaFJlc3VsdDogZmFsc2UsXG4gICAgdGl0bGU6ICdkb3NzaWVyLm5vUmVzdWx0cy5BTEwudGl0bGUnLFxuICB9KTtcbiAgcHVibGljIHJlYWRvbmx5IHNob3dBc3NpZ25Nb2RhbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IHNob3dDaGFuZ2VQYWdlTW9kYWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBzaG93Q2hhbmdlVGFiTW9kYWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaEZpZWxkcyQ6IE9ic2VydmFibGU8QXJyYXk8U2VhcmNoRmllbGQ+IHwgbnVsbD4gPVxuICAgIHRoaXMuc2VhcmNoU2VydmljZS5kb2N1bWVudFNlYXJjaEZpZWxkcyQucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ1NlYXJjaEZpZWxkcyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJCA9IHRoaXMubGlzdFNlcnZpY2UuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhbkNyZWF0ZURvY3VtZW50JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZShcbiAgICBzd2l0Y2hNYXAoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PlxuICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5yZXF1ZXN0UGVybWlzc2lvbihDQU5fQ1JFQVRFX0NBU0VfUEVSTUlTU0lPTiwge1xuICAgICAgICByZXNvdXJjZTogRE9TU0lFUl9ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRS5qc29uU2NoZW1hRG9jdW1lbnREZWZpbml0aW9uLFxuICAgICAgICBpZGVudGlmaWVyOiBkb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgfSlcbiAgICApXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZERvY3VtZW50SWRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hJCA9IHRoaXMubGlzdFNlcnZpY2UuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZShcbiAgICBzd2l0Y2hNYXAoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PlxuICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0RG9jdW1lbnREZWZpbml0aW9uKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXG4gICAgKSxcbiAgICBtYXAoZG9jdW1lbnREZWZpbml0aW9uID0+IGRvY3VtZW50RGVmaW5pdGlvbj8uc2NoZW1hKSxcbiAgICB0YXAoc2NoZW1hID0+IHtcbiAgICAgIGlmIChzY2hlbWE/LnRpdGxlKSB7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlU2VydmljZS5zZXRDdXN0b21QYWdlVGl0bGUoc2NoZW1hPy50aXRsZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc2VhcmNoRmllbGRWYWx1ZXMkID0gdGhpcy5wYXJhbWV0ZXJTZXJ2aWNlLnNlYXJjaEZpZWxkVmFsdWVzJDtcbiAgcHVibGljIHJlYWRvbmx5IGFzc2lnbmVlRmlsdGVyJDogT2JzZXJ2YWJsZTxBc3NpZ25lZUZpbHRlcj4gPVxuICAgIHRoaXMuYXNzaWduZWVTZXJ2aWNlLmFzc2lnbmVlRmlsdGVyJC5waXBlKFxuICAgICAgdGFwKGFzc2lnbmVlRmlsdGVyID0+ICh0aGlzLmFjdGl2ZVRhYiA9IGFzc2lnbmVlRmlsdGVyIGFzIERvc3NpZXJMaXN0VGFiKSlcbiAgICApO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnaW5hdGlvbkNoYW5nZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhcmJvblBhZ2luYXRpb25TZWxlY3Rpb24gfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHRhYkNoYW5nZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERvc3NpZXJMaXN0VGFiIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhZ2luYXRpb24kID0gdGhpcy5wYWdpbmF0aW9uU2VydmljZS5wYWdpbmF0aW9uJC5waXBlKFxuICAgIHRhcChwYWdpbmF0aW9uID0+IHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHBhZ2luYXRpb247XG4gICAgICB0aGlzLmxvYWRpbmdQYWdpbmF0aW9uID0gZmFsc2U7XG4gICAgfSlcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzRW52Q29sdW1uQ29uZmlnJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMubGlzdFNlcnZpY2UuaGFzRW52Q29sdW1uQ29uZmlnJDtcbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzQXBpQ29sdW1uQ29uZmlnJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jYW5IYXZlQXNzaWduZWUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5hc3NpZ25lZVNlcnZpY2UuY2FuSGF2ZUFzc2lnbmVlJDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29sdW1ucyQ6IE9ic2VydmFibGU8QXJyYXk8RGVmaW5pdGlvbkNvbHVtbj4+ID1cbiAgICB0aGlzLmxpc3RTZXJ2aWNlLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PlxuICAgICAgICB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0RGVmaW5pdGlvbkNvbHVtbnMoZG9jdW1lbnREZWZpbml0aW9uTmFtZSlcbiAgICAgICksXG4gICAgICBtYXAocmVzID0+IHtcbiAgICAgICAgdGhpcy5faGFzQXBpQ29sdW1uQ29uZmlnJC5uZXh0KHJlcy5oYXNBcGlDb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzLmNvbHVtbnM7XG4gICAgICB9KSxcbiAgICAgIHRhcChjb2x1bW5zID0+IHtcbiAgICAgICAgdGhpcy5saXN0U2VydmljZS5kb2N1bWVudERlZmluaXRpb25OYW1lJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShfID0+IHtcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnNldFBhZ2luYXRpb24oY29sdW1ucyk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBmaWVsZHMkOiBPYnNlcnZhYmxlPEFycmF5PExpc3RGaWVsZD4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fY2FuSGF2ZUFzc2lnbmVlJCxcbiAgICB0aGlzLl9jb2x1bW5zJCxcbiAgICB0aGlzLl9oYXNFbnZDb2x1bW5Db25maWckLFxuICAgIHRoaXMuX2hhc0FwaUNvbHVtbkNvbmZpZyQsXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gIF0pLnBpcGUoXG4gICAgdGFwKChbY2FuSGF2ZUFzc2lnbmVlXSkgPT4ge1xuICAgICAgdGhpcy5jYW5IYXZlQXNzaWduZWUgPSBjYW5IYXZlQXNzaWduZWU7XG4gICAgfSksXG4gICAgbWFwKChbY2FuSGF2ZUFzc2lnbmVlLCBjb2x1bW5zLCBoYXNFbnZDb25maWcsIGhhc0FwaUNvbmZpZ10pID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkQXNzaWduZWVDb2x1bW5zID0gdGhpcy5hc3NpZ25lZVNlcnZpY2UuZmlsdGVyQXNzaWduZWVDb2x1bW5zKFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBjYW5IYXZlQXNzaWduZWVcbiAgICAgICk7XG4gICAgICBjb25zdCBsaXN0RmllbGRzID0gdGhpcy5jb2x1bW5TZXJ2aWNlLm1hcERlZmluaXRpb25Db2x1bW5zVG9MaXN0RmllbGRzKFxuICAgICAgICBmaWx0ZXJlZEFzc2lnbmVlQ29sdW1ucyxcbiAgICAgICAgaGFzRW52Q29uZmlnLFxuICAgICAgICBoYXNBcGlDb25maWdcbiAgICAgICk7XG4gICAgICBjb25zdCBmaWVsZHNUb1JldHVybiA9IHRoaXMuYXNzaWduZWVTZXJ2aWNlLmFkZEFzc2lnbmVlTGlzdEZpZWxkKFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBsaXN0RmllbGRzLFxuICAgICAgICBjYW5IYXZlQXNzaWduZWVcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBmaWVsZHNUb1JldHVybjtcbiAgICB9KSxcbiAgICB0YXAobGlzdEZpZWxkcyA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0TGlzdEZpZWxkID0gbGlzdEZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmRlZmF1bHQpO1xuICAgICAgLy8gc2V0IGRlZmF1bHQgc29ydCBzdGF0ZSBpZiBubyBwYWdpbmF0aW9uIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHNvcnRpbmcgYXJlIGF2YWlsYWJsZVxuICAgICAgdGhpcy5wYXJhbWV0ZXJTZXJ2aWNlLnF1ZXJ5UGFnaW5hdGlvblBhcmFtcyRcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZShxdWVyeVBhZ2luYXRpb25QYXJhbXMgPT4ge1xuICAgICAgICAgIGlmIChkZWZhdWx0TGlzdEZpZWxkICYmICFxdWVyeVBhZ2luYXRpb25QYXJhbXM/LnNvcnQ/LmlzU29ydGluZykge1xuICAgICAgICAgICAgY29uc3Qgc29ydERpcmVjdGlvbiA9XG4gICAgICAgICAgICAgIHR5cGVvZiBkZWZhdWx0TGlzdEZpZWxkLmRlZmF1bHQgPT09ICdzdHJpbmcnID8gZGVmYXVsdExpc3RGaWVsZC5kZWZhdWx0IDogJ0RFU0MnO1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5zb3J0Q2hhbmdlZCh7XG4gICAgICAgICAgICAgIGlzU29ydGluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgc3RhdGU6IHtuYW1lOiBkZWZhdWx0TGlzdEZpZWxkLmtleSwgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uIGFzIERpcmVjdGlvbn0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pLFxuICAgIHRhcCgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmdGaWVsZHMgPSBmYWxzZTtcbiAgICB9KVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RvY3VtZW50U2VhcmNoUmVxdWVzdCQ6IE9ic2VydmFibGU8QWR2YW5jZWREb2N1bWVudFNlYXJjaFJlcXVlc3Q+ID1cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLl9wYWdpbmF0aW9uJCwgdGhpcy5saXN0U2VydmljZS5kb2N1bWVudERlZmluaXRpb25OYW1lJF0pLnBpcGUoXG4gICAgICBmaWx0ZXIoKFtwYWdpbmF0aW9uXSkgPT4gISFwYWdpbmF0aW9uKSxcbiAgICAgIG1hcCgoW3BhZ2luYXRpb24sIGRvY3VtZW50RGVmaW5pdGlvbk5hbWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBwYWdpbmF0aW9uLnBhZ2UgLSAxO1xuXG4gICAgICAgIHJldHVybiBuZXcgQWR2YW5jZWREb2N1bWVudFNlYXJjaFJlcXVlc3RJbXBsKFxuICAgICAgICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsXG4gICAgICAgICAgcGFnZSA+PSAwID8gcGFnZSA6IDAsXG4gICAgICAgICAgcGFnaW5hdGlvbi5zaXplLFxuICAgICAgICAgIHBhZ2luYXRpb24uc29ydFxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudEl0ZW1zJDogT2JzZXJ2YWJsZTxhbnlbXT4gPSB0aGlzLmxpc3RTZXJ2aWNlLmNoZWNrUmVmcmVzaCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLl9kb2N1bWVudFNlYXJjaFJlcXVlc3QkLFxuICAgICAgICB0aGlzLmFzc2lnbmVlRmlsdGVyJCxcbiAgICAgICAgdGhpcy5zZWFyY2hGaWVsZFZhbHVlcyQsXG4gICAgICAgIHRoaXMubGlzdFNlcnZpY2UuZm9yY2VSZWZyZXNoJCxcbiAgICAgICAgdGhpcy5faGFzRW52Q29sdW1uQ29uZmlnJCxcbiAgICAgICAgdGhpcy5faGFzQXBpQ29sdW1uQ29uZmlnJCxcbiAgICAgIF0pXG4gICAgKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChcbiAgICAgIChcbiAgICAgICAgW3ByZXZTZWFyY2hSZXF1ZXN0LCBwcmV2QXNzaWduZWVGaWx0ZXIsIHByZXZTZWFyY2hGaWVsZFZhbHVlcywgcHJldkZvcmNlUmVmcmVzaF0sXG4gICAgICAgIFtjdXJyU2VhcmNoUmVxdWVzdCwgY3VyckFzc2lnbmVlRmlsdGVyLCBjdXJyU2VhcmNoRmllbGRWYWx1ZXMsIGN1cnJGb3JjZVJlZnJlc2hdXG4gICAgICApID0+XG4gICAgICAgIGlzRXF1YWwoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucHJldlNlYXJjaFJlcXVlc3QsXG4gICAgICAgICAgICBhc3NpZ25lZTogcHJldkFzc2lnbmVlRmlsdGVyLFxuICAgICAgICAgICAgLi4ucHJldlNlYXJjaEZpZWxkVmFsdWVzLFxuICAgICAgICAgICAgZm9yY2VSZWZyZXNoOiBwcmV2Rm9yY2VSZWZyZXNoLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY3VyclNlYXJjaFJlcXVlc3QsXG4gICAgICAgICAgICBhc3NpZ25lZTogY3VyckFzc2lnbmVlRmlsdGVyLFxuICAgICAgICAgICAgLi4uY3VyclNlYXJjaEZpZWxkVmFsdWVzLFxuICAgICAgICAgICAgZm9yY2VSZWZyZXNoOiBjdXJyRm9yY2VSZWZyZXNoLFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICksXG4gICAgc3dpdGNoTWFwKFxuICAgICAgKFtcbiAgICAgICAgZG9jdW1lbnRTZWFyY2hSZXF1ZXN0LFxuICAgICAgICBhc3NpZ25lZUZpbHRlcixcbiAgICAgICAgc2VhcmNoVmFsdWVzLFxuICAgICAgICBfLFxuICAgICAgICBoYXNFbnZDb2x1bW5Db25maWcsXG4gICAgICAgIGhhc0FwaUNvbHVtbkNvbmZpZyxcbiAgICAgIF0pID0+IHtcbiAgICAgICAgY29uc3Qgb2JzRW52OiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gb2YoaGFzRW52Q29sdW1uQ29uZmlnKTtcbiAgICAgICAgY29uc3Qgb2JzQXBpOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gb2YoaGFzQXBpQ29sdW1uQ29uZmlnKTtcblxuICAgICAgICBpZiAoKE9iamVjdC5rZXlzKHNlYXJjaFZhbHVlcykgfHwgW10pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oe1xuICAgICAgICAgICAgZG9jdW1lbnRzOlxuICAgICAgICAgICAgICBoYXNFbnZDb2x1bW5Db25maWcgfHwgIWhhc0FwaUNvbHVtbkNvbmZpZ1xuICAgICAgICAgICAgICAgID8gdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0RG9jdW1lbnRzU2VhcmNoKFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFNlYXJjaFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICdBTkQnLFxuICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLm1hcFNlYXJjaFZhbHVlc1RvRmlsdGVycyhzZWFyY2hWYWx1ZXMpXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiB0aGlzLmRvY3VtZW50U2VydmljZS5nZXRTcGVjaWZpZWREb2N1bWVudHNTZWFyY2goXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50U2VhcmNoUmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgICAgJ0FORCcsXG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbmVlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2UubWFwU2VhcmNoVmFsdWVzVG9GaWx0ZXJzKHNlYXJjaFZhbHVlcylcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBoYXNFbnZDb2x1bW5Db25maWc6IG9ic0VudixcbiAgICAgICAgICAgIGhhc0FwaUNvbHVtbkNvbmZpZzogb2JzQXBpLFxuICAgICAgICAgICAgaXNTZWFyY2hSZXN1bHQ6IG9mKHRydWUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKHtcbiAgICAgICAgICBkb2N1bWVudHM6XG4gICAgICAgICAgICBoYXNFbnZDb2x1bW5Db25maWcgfHwgIWhhc0FwaUNvbHVtbkNvbmZpZ1xuICAgICAgICAgICAgICA/IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldERvY3VtZW50c1NlYXJjaChcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50U2VhcmNoUmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgICdBTkQnLFxuICAgICAgICAgICAgICAgICAgYXNzaWduZWVGaWx0ZXJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0U3BlY2lmaWVkRG9jdW1lbnRzU2VhcmNoKFxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnRTZWFyY2hSZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgJ0FORCcsXG4gICAgICAgICAgICAgICAgICBhc3NpZ25lZUZpbHRlclxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgaGFzRW52Q29sdW1uQ29uZmlnOiBvYnNFbnYsXG4gICAgICAgICAgaGFzQXBpQ29sdW1uQ29uZmlnOiBvYnNBcGksXG4gICAgICAgICAgaXNTZWFyY2hSZXN1bHQ6IG9mKGZhbHNlKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKSxcbiAgICBtYXAoXG4gICAgICAocmVzOiB7XG4gICAgICAgIGRvY3VtZW50czogRG9jdW1lbnRzIHwgU3BlY2lmaWVkRG9jdW1lbnRzO1xuICAgICAgICBoYXNFbnZDb2x1bW5Db25maWc6IGJvb2xlYW47XG4gICAgICAgIGhhc0FwaUNvbHVtbkNvbmZpZzogYm9vbGVhbjtcbiAgICAgICAgaXNTZWFyY2hSZXN1bHQ6IGJvb2xlYW47XG4gICAgICB9KSA9PiB7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2Uuc2V0Q29sbGVjdGlvblNpemUocmVzLmRvY3VtZW50cyk7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuY2hlY2tQYWdlKHJlcy5kb2N1bWVudHMpO1xuICAgICAgICB0aGlzLnVwZGF0ZU5vUmVzdWx0c01lc3NhZ2UocmVzLmlzU2VhcmNoUmVzdWx0KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5saXN0U2VydmljZS5tYXBEb2N1bWVudHMoXG4gICAgICAgICAgcmVzLmRvY3VtZW50cyxcbiAgICAgICAgICByZXMuaGFzRW52Q29sdW1uQ29uZmlnLFxuICAgICAgICAgIHJlcy5oYXNBcGlDb2x1bW5Db25maWdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApLFxuICAgIHRhcCgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmdBc3NpZ25lZUZpbHRlciA9IGZhbHNlO1xuICAgICAgdGhpcy5sb2FkaW5nRG9jdW1lbnRJdGVtcyA9IGZhbHNlO1xuICAgIH0pXG4gICk7XG5cbiAgcHJpdmF0ZSBfcHJldmlvdXNEb2N1bWVudERlZmluaXRpb25OYW1lITogc3RyaW5nO1xuICBwcml2YXRlIF9kb2N1bWVudERlZmluaXRpb25OYW1lU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXNzaWduZWVTZXJ2aWNlOiBEb3NzaWVyTGlzdEFzc2lnbmVlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJyZWFkY3J1bWJTZXJ2aWNlOiBCcmVhZGNydW1iU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1bGtBc3NpZ25TZXJ2aWNlOiBEb3NzaWVyQnVsa0Fzc2lnblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb2x1bW5TZXJ2aWNlOiBEb3NzaWVyQ29sdW1uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RTZXJ2aWNlOiBEb3NzaWVyTGlzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGVTZXJ2aWNlOiBQYWdlVGl0bGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnaW5hdGlvblNlcnZpY2U6IERvc3NpZXJMaXN0UGFnaW5hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJhbWV0ZXJTZXJ2aWNlOiBEb3NzaWVyUGFyYW1ldGVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VhcmNoU2VydmljZTogRG9zc2llckxpc3RTZWFyY2hTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25TZXJ2aWNlOiBQZXJtaXNzaW9uU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0VmlzaWJsZVRhYnMoKTtcbiAgICB0aGlzLm9wZW5Eb2N1bWVudERlZmluaXRpb25OYW1lU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnBhZ2VUaXRsZVNlcnZpY2UuZW5hYmxlUmVzZXQoKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgcHVibGljIHNlYXJjaChzZWFyY2hGaWVsZFZhbHVlczogU2VhcmNoRmllbGRWYWx1ZXMpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoKHNlYXJjaEZpZWxkVmFsdWVzKTtcbiAgfVxuXG4gIHB1YmxpYyByb3dDbGljayhkb2N1bWVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5saXN0U2VydmljZS5kb2N1bWVudERlZmluaXRpb25OYW1lJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShkb2N1bWVudERlZmluaXRpb25OYW1lID0+IHtcbiAgICAgIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2UuY2FjaGVRdWVyeVBhcmFtcyhcbiAgICAgICAgYC9kb3NzaWVycy8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9YCxcbiAgICAgICAgdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1xuICAgICAgKTtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcbiAgICAgICAgYC9kb3NzaWVycy8ke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9L2RvY3VtZW50LyR7ZG9jdW1lbnQuaWR9LyR7RGVmYXVsdFRhYnMuc3VtbWFyeX1gLFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdGFiQ2hhbmdlKHRhYjogRG9zc2llckxpc3RUYWIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlVGFiKSB7XG4gICAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcbiAgICAgIHRoaXMudXBkYXRlTm9SZXN1bHRzTWVzc2FnZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiLnRvTG93ZXJDYXNlKCkgPT09IHRhYi50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FyYm9uTGlzdC5tb2RlbC5zZWxlY3RlZFJvd3NDb3VudCgpKSB7XG4gICAgICB0aGlzLnNob3dDaGFuZ2VUYWJNb2RhbCQubmV4dCh0cnVlKTtcbiAgICAgIHRoaXMudGFiQ2hhbmdlJC5uZXh0KHRhYik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZVRhYkNvbmZpcm0odGFiKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNoYW5nZVRhYkNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFic0NvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZUYWI6IFRhYiB8IHVuZGVmaW5lZCA9IHRoaXMudGFic0NvbXBvbmVudC50YWJzLmZpbmQoXG4gICAgICAodGFiOiBUYWIpID0+IHRhYi5pZCA9PT0gdGhpcy5hY3RpdmVUYWJcbiAgICApO1xuXG4gICAgaWYgKCFwcmV2VGFiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50YWJzQ29tcG9uZW50LnRhYnMuZmluZCgodGFiOiBUYWIpID0+IHRhYi5hY3RpdmUpLmFjdGl2ZSA9IGZhbHNlO1xuICAgIHByZXZUYWIuYWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhcmJvbkxpc3Q/Lm1vZGVsLnNlbGVjdGVkUm93c0NvdW50KCkpIHtcbiAgICAgIHRoaXMuc2hvd0NoYW5nZVBhZ2VNb2RhbCQubmV4dCh0cnVlKTtcbiAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZSQubmV4dCh7cGFnZSwgc2l6ZTogdGhpcy5wYWdpbmF0aW9uLnNpemV9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5wYWdlQ2hhbmdlKHBhZ2UpO1xuICB9XG5cbiAgcHVibGljIHBhZ2VTaXplQ2hhbmdlKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhcmJvbkxpc3Q/Lm1vZGVsLnNlbGVjdGVkUm93c0NvdW50KCkpIHtcbiAgICAgIHRoaXMuc2hvd0NoYW5nZVBhZ2VNb2RhbCQubmV4dCh0cnVlKTtcbiAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZSQubmV4dCh7cGFnZTogdGhpcy5wYWdpbmF0aW9uLnBhZ2UsIHNpemV9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5wYWdlU2l6ZUNoYW5nZShzaXplKTtcbiAgfVxuXG4gIHB1YmxpYyBzb3J0Q2hhbmdlZChuZXdTb3J0U3RhdGU6IFNvcnRTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2Uuc29ydENoYW5nZWQobmV3U29ydFN0YXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgb25DaGFuZ2VUYWJDb25maXJtKHRhYjogRG9zc2llckxpc3RUYWIpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmdBc3NpZ25lZUZpbHRlciA9IHRydWU7XG4gICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG4gICAgdGhpcy51cGRhdGVOb1Jlc3VsdHNNZXNzYWdlKGZhbHNlKTtcbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnNldFBhZ2UoMSk7XG4gICAgdGhpcy5hc3NpZ25lZVNlcnZpY2Uuc2V0QXNzaWduZWVGaWx0ZXIodGFiKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93QXNzaWduTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZERvY3VtZW50SWRzJC5uZXh0KFxuICAgICAgdGhpcy5jYXJib25MaXN0LnNlbGVjdGVkSXRlbXMubWFwKChkb2N1bWVudDogRG9jdW1lbnQpID0+IGRvY3VtZW50LmlkKVxuICAgICk7XG4gICAgdGhpcy5zaG93QXNzaWduTW9kYWwkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25DbG9zZUV2ZW50KGFzc2lnbmVlSWQ6IG51bGwgfCBzdHJpbmcsIGRvY3VtZW50SWRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0Fzc2lnbk1vZGFsJC5uZXh0KGZhbHNlKTtcbiAgICBpZiAoIWFzc2lnbmVlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1bGtBc3NpZ25TZXJ2aWNlLmJ1bGtBc3NpZ24oYXNzaWduZWVJZCwgZG9jdW1lbnRJZHMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmZvcmNlUmVmcmVzaCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlUGFnZUNvbmZpcm0ocGFnaW5hdGlvbjogQ2FyYm9uUGFnaW5hdGlvblNlbGVjdGlvbik6IHZvaWQge1xuICAgIGlmIChwYWdpbmF0aW9uLnNpemUgIT09IHRoaXMucGFnaW5hdGlvbi5zaXplKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnBhZ2VTaXplQ2hhbmdlKHBhZ2luYXRpb24uc2l6ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5wYWdlQ2hhbmdlKHBhZ2luYXRpb24ucGFnZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhcnREb3NzaWVyKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdEFjdGlvbnNDb21wb25lbnQuc3RhcnREb3NzaWVyKCk7XG4gIH1cblxuICBwdWJsaWMgZm9yY2VSZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdFNlcnZpY2UuZm9yY2VSZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Eb2N1bWVudERlZmluaXRpb25OYW1lU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX2RvY3VtZW50RGVmaW5pdGlvbk5hbWVTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLnBhcmFtc1xuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocGFyYW1zOiBQYXJhbXMpID0+IHBhcmFtcz8uZG9jdW1lbnREZWZpbml0aW9uTmFtZSksXG4gICAgICAgIGZpbHRlcihkb2NEZWZOYW1lID0+ICEhZG9jRGVmTmFtZSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZG9jdW1lbnREZWZpbml0b25OYW1lID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzRG9jdW1lbnREZWZpbml0aW9uTmFtZSkge1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVyU2VydmljZS5jbGVhclBhcmFtZXRlcnMoKTtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlclNlcnZpY2UuY2xlYXJTZWFyY2hGaWVsZFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzRG9jdW1lbnREZWZpbml0aW9uTmFtZSA9IGRvY3VtZW50RGVmaW5pdG9uTmFtZTtcbiAgICAgICAgdGhpcy5zZXRMb2FkaW5nKCk7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuY2xlYXJQYWdpbmF0aW9uKCk7XG4gICAgICAgIHRoaXMuYXNzaWduZWVTZXJ2aWNlLnJlc2V0QXNzaWduZWVGaWx0ZXIoKTtcbiAgICAgICAgdGhpcy5saXN0U2VydmljZS5zZXREb2N1bWVudERlZmluaXRpb25OYW1lKGRvY3VtZW50RGVmaW5pdG9uTmFtZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TG9hZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmdGaWVsZHMgPSB0cnVlO1xuICAgIHRoaXMubG9hZGluZ1BhZ2luYXRpb24gPSB0cnVlO1xuICAgIHRoaXMubG9hZGluZ1NlYXJjaEZpZWxkcyA9IHRydWU7XG4gICAgdGhpcy5sb2FkaW5nQXNzaWduZWVGaWx0ZXIgPSB0cnVlO1xuICAgIHRoaXMubG9hZGluZ0RvY3VtZW50SXRlbXMgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWaXNpYmxlVGFicygpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVEb3NzaWVyVGFicyA9IHRoaXMuY29uZmlnU2VydmljZS5jb25maWc/LnZpc2libGVEb3NzaWVyTGlzdFRhYnMgfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTm9SZXN1bHRzTWVzc2FnZShpc1NlYXJjaFJlc3VsdDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubm9SZXN1bHRzTWVzc2FnZSQubmV4dChcbiAgICAgIGlzU2VhcmNoUmVzdWx0XG4gICAgICAgID8ge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdkb3NzaWVyLm5vUmVzdWx0cy5zZWFyY2guZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgaXNTZWFyY2hSZXN1bHQsXG4gICAgICAgICAgICB0aXRsZTogJ2Rvc3NpZXIubm9SZXN1bHRzLnNlYXJjaC50aXRsZScsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgZG9zc2llci5ub1Jlc3VsdHMuJHt0aGlzLmFjdGl2ZVRhYiA/PyAnQUxMJ30uZGVzY3JpcHRpb25gLFxuICAgICAgICAgICAgaXNTZWFyY2hSZXN1bHQsXG4gICAgICAgICAgICB0aXRsZTogYGRvc3NpZXIubm9SZXN1bHRzLiR7dGhpcy5hY3RpdmVUYWIgPz8gJ0FMTCd9LnRpdGxlYCxcbiAgICAgICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwie1xuICAgIGZpZWxkczogZmllbGRzJCB8IGFzeW5jLFxuICAgIGRvY3VtZW50SXRlbXM6IGRvY3VtZW50SXRlbXMkIHwgYXN5bmMsXG4gICAgbm9SZXN1bHRzTWVzc2FnZTogbm9SZXN1bHRzTWVzc2FnZSQgfCBhc3luYyxcbiAgICBzZWFyY2hGaWVsZHM6IHNlYXJjaEZpZWxkcyQgfCBhc3luYyxcbiAgICBzY2hlbWE6IHNjaGVtYSQgfCBhc3luYyxcbiAgICBzaG93QXNzaWduTW9kYWw6IHNob3dBc3NpZ25Nb2RhbCQgfCBhc3luYyxcbiAgICBzZWxlY3RlZERvY3VtZW50SWRzOiBzZWxlY3RlZERvY3VtZW50SWRzJCB8IGFzeW5jLFxuICAgIGxvYWRlZDpcbiAgICAgICFsb2FkaW5nRmllbGRzICYmXG4gICAgICAhbG9hZGluZ1BhZ2luYXRpb24gJiZcbiAgICAgICFsb2FkaW5nU2VhcmNoRmllbGRzICYmXG4gICAgICAhbG9hZGluZ0Fzc2lnbmVlRmlsdGVyICYmXG4gICAgICAhbG9hZGluZ0RvY3VtZW50SXRlbXNcbiAgfSBhcyBvYnNcIlxuPlxuICA8ZGl2IGNsYXNzPVwibWFpbi1jb250ZW50IHB0LTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIHB4LTAgbWItNVwiPlxuICAgICAgICA8dmFsdGltby1kb3NzaWVyLWxpc3QtYWN0aW9uc1xuICAgICAgICAgIFtsb2FkaW5nXT1cIiFvYnMubG9hZGVkXCJcbiAgICAgICAgICAoZm9ybUZsb3dDb21wbGV0ZSk9XCJmb3JjZVJlZnJlc2goKVwiXG4gICAgICAgID48L3ZhbHRpbW8tZG9zc2llci1saXN0LWFjdGlvbnM+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWFyY2hGaWVsZHM7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib2JzLmxvYWRlZDsgZWxzZSBsb2FkaW5nXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3Q7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1bGtBc3NpZ25Nb2RhbDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGFuZ2VQYWdlTW9kYWxcIj48L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hhbmdlVGFiTW9kYWxcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3NlYXJjaEZpZWxkcyBsZXQtb2JzPVwib2JzXCI+XG4gIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgPHZhbHRpbW8tc2VhcmNoLWZpZWxkc1xuICAgICAgW3NlYXJjaEZpZWxkc109XCJvYnMuc2VhcmNoRmllbGRzXCJcbiAgICAgIChkb1NlYXJjaCk9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICBbZG9jdW1lbnREZWZpbml0aW9uTmFtZV09XCJkb2N1bWVudERlZmluaXRpb25OYW1lJCB8IGFzeW5jXCJcbiAgICAgIFtkZWZhdWx0VmFsdWVzXT1cInNlYXJjaEZpZWxkVmFsdWVzJCB8IGFzeW5jXCJcbiAgICAgIFtpbnB1dERpc2FibGVkXT1cIiFvYnMubG9hZGVkXCJcbiAgICA+PC92YWx0aW1vLXNlYXJjaC1maWVsZHM+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0IGxldC1vYnM9XCJvYnNcIj5cbiAgPHZhbHRpbW8tY2FyYm9uLWxpc3RcbiAgICBbZmllbGRzXT1cIm9icy5maWVsZHNcIlxuICAgIFtoZWFkZXJdPVwiZmFsc2VcIlxuICAgIFtpbml0aWFsU29ydFN0YXRlXT1cInBhZ2luYXRpb24uc29ydFwiXG4gICAgW2l0ZW1zXT1cIm9icy5kb2N1bWVudEl0ZW1zXCJcbiAgICBbcGFnaW5hdGlvbl09XCJwYWdpbmF0aW9uXCJcbiAgICBwYWdpbmF0aW9uSWRlbnRpZmllcj1cImRvc3NpZXJMaXN0XCJcbiAgICBbc2hvd1NlbGVjdGlvbkNvbHVtbl09XCJjYW5IYXZlQXNzaWduZWVcIlxuICAgIFt0YWJsZVRyYW5zbGF0aW9uc109XCJ0YWJsZVRyYW5zbGF0aW9uc1wiXG4gICAgKHBhZ2luYXRpb25DbGlja2VkKT1cInBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKHBhZ2luYXRpb25TZXQpPVwicGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKHJvd0NsaWNrZWQpPVwicm93Q2xpY2soJGV2ZW50KVwiXG4gICAgKHNvcnRDaGFuZ2VkKT1cInNvcnRDaGFuZ2VkKCRldmVudClcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciBjYXJib25Ub29sYmFyQWN0aW9ucz5cbiAgICAgIDxidXR0b24gY2RzQnV0dG9uPVwicHJpbWFyeVwiIChjbGljayk9XCJzaG93QXNzaWduTW9kYWwoKVwiPlxuICAgICAgICB7eyAnZG9zc2llci5idWxrQXNzaWduLmFzc2lnbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjYXJib25Ub29sYmFyQ29udGVudD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkb3NzaWVyTGlzdEFjdGlvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDx2YWx0aW1vLW5vLXJlc3VsdHNcbiAgICAgIFthY3Rpb25dPVwib2JzLm5vUmVzdWx0c01lc3NhZ2UuaXNTZWFyY2hSZXN1bHQgPyBudWxsIDogZG9zc2llckxpc3RBY3Rpb25zXCJcbiAgICAgIFtkZXNjcmlwdGlvbl09XCJvYnMubm9SZXN1bHRzTWVzc2FnZS5kZXNjcmlwdGlvbiB8IHRyYW5zbGF0ZVwiXG4gICAgICBbdGl0bGVdPVwib2JzLm5vUmVzdWx0c01lc3NhZ2UudGl0bGUgfCB0cmFuc2xhdGVcIlxuICAgID48L3ZhbHRpbW8tbm8tcmVzdWx0cz5cblxuICAgIDxkaXYgdGFicyAqbmdJZj1cImNhbkhhdmVBc3NpZ25lZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC92YWx0aW1vLWNhcmJvbi1saXN0PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0YWJzPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWduZWVGaWx0ZXIkIHwgYXN5bmMgYXMgYXNzaWduZWVGaWx0ZXJcIj5cbiAgICA8Y2RzLXRhYnNcbiAgICAgICpuZ0lmPVwiIXZpc2libGVEb3NzaWVyVGFiczsgZWxzZSBjb25maWd1cmVkVGFic1wiXG4gICAgICB0eXBlPVwiY29udGFpbmVkXCJcbiAgICAgIGRhdGEtY2FyYm9uLXRoZW1lPVwiZzEwXCJcbiAgICAgIGNsYXNzPVwiZG9zc2llci1saXN0LXRhYnNcIlxuICAgID5cbiAgICAgIDxjZHMtdGFiXG4gICAgICAgICpuZ0Zvcj1cImxldCB0YWIgb2YgZGVmYXVsdFRhYnM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgIFthY3RpdmVdPVwiYXNzaWduZWVGaWx0ZXIgPT09IHRhYlwiXG4gICAgICAgIGhlYWRpbmc9XCJ7eyAnZG9zc2llci50YWJzLicgKyB0YWIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBbaWRdPVwidGFiXCJcbiAgICAgICAgKHNlbGVjdGVkKT1cInRhYkNoYW5nZSh0YWIpXCJcbiAgICAgID48L2Nkcy10YWI+XG4gICAgPC9jZHMtdGFicz5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbmZpZ3VyZWRUYWJzPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWduZWVGaWx0ZXIkIHwgYXN5bmMgYXMgYXNzaWduZWVGaWx0ZXJcIj5cbiAgICA8Y2RzLXRhYnMgdHlwZT1cImNvbnRhaW5lZFwiIGNsYXNzPVwiZG9zc2llci1saXN0LXRhYnNcIj5cbiAgICAgIDxjZHMtdGFiXG4gICAgICAgICpuZ0Zvcj1cImxldCB0YWIgb2YgdmlzaWJsZURvc3NpZXJUYWJzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIlxuICAgICAgICBbYWN0aXZlXT1cImFzc2lnbmVlRmlsdGVyID09PSB0YWJcIlxuICAgICAgICBoZWFkaW5nPVwie3sgJ2Rvc3NpZXIudGFicy4nICsgdGFiIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgW2lkXT1cInRhYlwiXG4gICAgICAgIChzZWxlY3RlZCk9XCJ0YWJDaGFuZ2UodGFiKVwiXG4gICAgICA+PC9jZHMtdGFiPlxuICAgIDwvY2RzLXRhYnM+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nXG4gID48dmFsdGltby1jYXJib24tbGlzdCBbbG9hZGluZ109XCJ0cnVlXCI+XG4gICAgPGRpdiB0YWJzICpuZ0lmPVwiY2FuSGF2ZUFzc2lnbmVlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFic1wiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PiA8L3ZhbHRpbW8tY2FyYm9uLWxpc3Rcbj48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2J1bGtBc3NpZ25Nb2RhbCBsZXQtb2JzPVwib2JzXCI+XG4gIDx2YWx0aW1vLWRvc3NpZXItYnVsay1hc3NpZ24tbW9kYWxcbiAgICBbZG9jdW1lbnRJZHNdPVwib2JzLnNlbGVjdGVkRG9jdW1lbnRJZHNcIlxuICAgIFtvcGVuXT1cIm9icy5zaG93QXNzaWduTW9kYWxcIlxuICAgIChjbG9zZUV2ZW50KT1cIm9uQ2xvc2VFdmVudCgkZXZlbnQsIG9icy5zZWxlY3RlZERvY3VtZW50SWRzKVwiXG4gID48L3ZhbHRpbW8tZG9zc2llci1idWxrLWFzc2lnbi1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY2hhbmdlUGFnZU1vZGFsPlxuICA8dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgICBjb25maXJtQnV0dG9uVGV4dFRyYW5zbGF0aW9uS2V5PVwiZG9zc2llci5jaGFuZ2VQYWdlTW9kYWwuY29uZmlybVwiXG4gICAgY29udGVudFRyYW5zbGF0aW9uS2V5PVwiZG9zc2llci5jaGFuZ2VQYWdlTW9kYWwuY29udGVudFwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJwYWdpbmF0aW9uQ2hhbmdlJCB8IGFzeW5jXCJcbiAgICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0NoYW5nZVBhZ2VNb2RhbCRcIlxuICAgIHRpdGxlVHJhbnNsYXRpb25LZXk9XCJkb3NzaWVyLmNoYW5nZVBhZ2VNb2RhbC50aXRsZVwiXG4gICAgKGNvbmZpcm1FdmVudCk9XCJvbkNoYW5nZVBhZ2VDb25maXJtKCRldmVudClcIlxuICA+PC92YWx0aW1vLWNvbmZpcm1hdGlvbi1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY2hhbmdlVGFiTW9kYWw+XG4gIDx2YWx0aW1vLWNvbmZpcm1hdGlvbi1tb2RhbFxuICAgIGNvbmZpcm1CdXR0b25UZXh0VHJhbnNsYXRpb25LZXk9XCJkb3NzaWVyLmNoYW5nZVRhYk1vZGFsLmNvbmZpcm1cIlxuICAgIGNvbnRlbnRUcmFuc2xhdGlvbktleT1cImRvc3NpZXIuY2hhbmdlVGFiTW9kYWwuY29udGVudFwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJ0YWJDaGFuZ2UkIHwgYXN5bmNcIlxuICAgIFtzaG93TW9kYWxTdWJqZWN0JF09XCJzaG93Q2hhbmdlVGFiTW9kYWwkXCJcbiAgICB0aXRsZVRyYW5zbGF0aW9uS2V5PVwiZG9zc2llci5jaGFuZ2VUYWJNb2RhbC50aXRsZVwiXG4gICAgKGNhbmNlbEV2ZW50KT1cIm9uQ2hhbmdlVGFiQ2FuY2VsKClcIlxuICAgIChjb25maXJtRXZlbnQpPVwib25DaGFuZ2VUYWJDb25maXJtKCRldmVudClcIlxuICA+PC92YWx0aW1vLWNvbmZpcm1hdGlvbi1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZG9zc2llckxpc3RBY3Rpb25zPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCJjYW5DcmVhdGVEb2N1bWVudCQgfCBhc3luY1wiXG4gICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgW2Rpc2FibGVkXT1cImxpc3RBY3Rpb25zQ29tcG9uZW50Py5kaXNhYmxlU3RhcnREb3NzaWVyQnV0dG9uJCB8IGFzeW5jXCJcbiAgICAoY2xpY2spPVwic3RhcnREb3NzaWVyKClcIlxuICA+XG4gICAge3sgJ1N0YXJ0IERvc3NpZXInIHwgdHJhbnNsYXRlIH19XG5cbiAgICA8c3ZnIGNkc0ljb249XCJhZGRcIiBzaXplPVwiMTZcIiBjbGFzcz1cImNkcy0tYnRuX19pY29uXCI+PC9zdmc+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==