@alfresco/adf-process-services-cloud 8.1.0-16500060130 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/bundles/assets/adf-process-services-cloud/i18n/de.json +0 -3
  2. package/bundles/assets/adf-process-services-cloud/i18n/es.json +0 -3
  3. package/bundles/assets/adf-process-services-cloud/i18n/fr.json +0 -3
  4. package/bundles/assets/adf-process-services-cloud/i18n/it.json +0 -3
  5. package/bundles/assets/adf-process-services-cloud/i18n/pl.json +0 -3
  6. package/bundles/assets/adf-process-services-cloud/i18n/pt.json +0 -3
  7. package/fesm2022/adf-process-services-cloud.mjs +490 -410
  8. package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
  9. package/lib/app/services/apps-process-cloud.service.d.ts +2 -2
  10. package/lib/form/components/widgets/display-rich-text/display-rich-text.widget.scss +0 -1
  11. package/lib/process/start-process/components/start-process-cloud.component.d.ts +0 -1
  12. package/lib/process/start-process/components/start-process-cloud.component.scss +4 -0
  13. package/lib/process/start-process/services/start-process-cloud.service.d.ts +1 -0
  14. package/lib/process-services-cloud.module.d.ts +2 -1
  15. package/lib/screen/components/screen-cloud/screen-cloud.component.d.ts +1 -1
  16. package/lib/screen/public-api.d.ts +3 -1
  17. package/lib/screen/services/provide-screen.d.ts +37 -0
  18. package/lib/{services → screen/services}/screen-rendering.service.d.ts +29 -0
  19. package/lib/services/public-api.d.ts +0 -1
  20. package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
  21. package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
  22. package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
  23. package/package.json +4 -6
  24. package/esm2022/adf-process-services-cloud.mjs +0 -5
  25. package/esm2022/lib/app/app-list-cloud.module.mjs +0 -20
  26. package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +0 -67
  27. package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +0 -125
  28. package/esm2022/lib/app/models/application-instance.model.mjs +0 -24
  29. package/esm2022/lib/app/public-api.mjs +0 -22
  30. package/esm2022/lib/app/services/apps-process-cloud.service.mjs +0 -97
  31. package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +0 -163
  32. package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +0 -97
  33. package/esm2022/lib/common/index.mjs +0 -18
  34. package/esm2022/lib/common/interface/environment.interface.mjs +0 -18
  35. package/esm2022/lib/common/interface/index.mjs +0 -18
  36. package/esm2022/lib/common/interface/public-api.mjs +0 -18
  37. package/esm2022/lib/common/public-api.mjs +0 -19
  38. package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +0 -57
  39. package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +0 -31
  40. package/esm2022/lib/form/components/form-cloud.component.mjs +0 -420
  41. package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +0 -53
  42. package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +0 -35
  43. package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +0 -249
  44. package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +0 -136
  45. package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +0 -107
  46. package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +0 -120
  47. package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +0 -122
  48. package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +0 -189
  49. package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +0 -85
  50. package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +0 -80
  51. package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +0 -464
  52. package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +0 -29
  53. package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +0 -46
  54. package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +0 -82
  55. package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +0 -91
  56. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +0 -81
  57. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +0 -53
  58. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +0 -86
  59. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +0 -116
  60. package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +0 -187
  61. package/esm2022/lib/form/form-cloud.module.mjs +0 -99
  62. package/esm2022/lib/form/models/form-cloud-representation.model.mjs +0 -48
  63. package/esm2022/lib/form/models/task-variable-cloud.model.mjs +0 -28
  64. package/esm2022/lib/form/public-api.mjs +0 -44
  65. package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +0 -120
  66. package/esm2022/lib/form/services/display-mode.service.mjs +0 -146
  67. package/esm2022/lib/form/services/form-cloud.service.interface.mjs +0 -18
  68. package/esm2022/lib/form/services/form-cloud.service.mjs +0 -201
  69. package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +0 -18
  70. package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +0 -51
  71. package/esm2022/lib/form/services/form-utils.service.mjs +0 -37
  72. package/esm2022/lib/form/services/process-cloud-content.service.mjs +0 -71
  73. package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +0 -52
  74. package/esm2022/lib/group/components/group-cloud.component.mjs +0 -423
  75. package/esm2022/lib/group/group-cloud.module.mjs +0 -33
  76. package/esm2022/lib/group/models/identity-group.model.mjs +0 -18
  77. package/esm2022/lib/group/public-api.mjs +0 -21
  78. package/esm2022/lib/group/services/identity-group.service.mjs +0 -89
  79. package/esm2022/lib/models/application-version.model.mjs +0 -21
  80. package/esm2022/lib/models/constant-values.type.mjs +0 -18
  81. package/esm2022/lib/models/data-column-custom-data.mjs +0 -18
  82. package/esm2022/lib/models/date-cloud-filter.model.mjs +0 -31
  83. package/esm2022/lib/models/date-format-cloud.model.mjs +0 -18
  84. package/esm2022/lib/models/engine-event-cloud.model.mjs +0 -18
  85. package/esm2022/lib/models/filter-cloud-model.mjs +0 -128
  86. package/esm2022/lib/models/process-definition-cloud.model.mjs +0 -32
  87. package/esm2022/lib/models/process-instance-variable.model.mjs +0 -18
  88. package/esm2022/lib/models/process-variable-filter.model.mjs +0 -18
  89. package/esm2022/lib/models/task-cloud.model.mjs +0 -23
  90. package/esm2022/lib/models/task-list-sorting.model.mjs +0 -40
  91. package/esm2022/lib/models/variable-definition.mjs +0 -18
  92. package/esm2022/lib/people/components/people-cloud.component.mjs +0 -498
  93. package/esm2022/lib/people/models/identity-user.model.mjs +0 -18
  94. package/esm2022/lib/people/people-cloud.module.mjs +0 -33
  95. package/esm2022/lib/people/public-api.mjs +0 -21
  96. package/esm2022/lib/people/services/identity-user.service.mjs +0 -119
  97. package/esm2022/lib/process/process-cloud.module.mjs +0 -40
  98. package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +0 -801
  99. package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +0 -58
  100. package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +0 -292
  101. package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +0 -170
  102. package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +0 -44
  103. package/esm2022/lib/process/process-filters/public-api.mjs +0 -23
  104. package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +0 -408
  105. package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +0 -137
  106. package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +0 -33
  107. package/esm2022/lib/process/process-header/public-api.mjs +0 -19
  108. package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +0 -593
  109. package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +0 -31
  110. package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +0 -18
  111. package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +0 -24
  112. package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +0 -37
  113. package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +0 -107
  114. package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +0 -40
  115. package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +0 -45
  116. package/esm2022/lib/process/process-list/public-api.mjs +0 -25
  117. package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +0 -253
  118. package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +0 -109
  119. package/esm2022/lib/process/public-api.mjs +0 -23
  120. package/esm2022/lib/process/services/process-cloud.service.mjs +0 -105
  121. package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +0 -465
  122. package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +0 -18
  123. package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +0 -26
  124. package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +0 -26
  125. package/esm2022/lib/process/start-process/public-api.mjs +0 -21
  126. package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +0 -125
  127. package/esm2022/lib/process-services-cloud.module.mjs +0 -98
  128. package/esm2022/lib/providers.mjs +0 -45
  129. package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +0 -186
  130. package/esm2022/lib/screen/models/screen-cloud.model.mjs +0 -18
  131. package/esm2022/lib/screen/public-api.mjs +0 -18
  132. package/esm2022/lib/services/base-cloud.service.mjs +0 -83
  133. package/esm2022/lib/services/cloud-token.service.mjs +0 -23
  134. package/esm2022/lib/services/form-fields.interfaces.mjs +0 -55
  135. package/esm2022/lib/services/local-preference-cloud.service.mjs +0 -122
  136. package/esm2022/lib/services/notification-cloud.service.mjs +0 -45
  137. package/esm2022/lib/services/preference-cloud.interface.mjs +0 -18
  138. package/esm2022/lib/services/public-api.mjs +0 -28
  139. package/esm2022/lib/services/screen-rendering.service.mjs +0 -30
  140. package/esm2022/lib/services/task-list-cloud.service.interface.mjs +0 -18
  141. package/esm2022/lib/services/user-preference-cloud.service.mjs +0 -105
  142. package/esm2022/lib/services/variable-mapper.sevice.mjs +0 -77
  143. package/esm2022/lib/services/web-socket.service.mjs +0 -146
  144. package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +0 -32
  145. package/esm2022/lib/task/models/task-details-cloud.model.mjs +0 -26
  146. package/esm2022/lib/task/models/task.model.mjs +0 -23
  147. package/esm2022/lib/task/public-api.mjs +0 -26
  148. package/esm2022/lib/task/services/task-cloud.service.mjs +0 -272
  149. package/esm2022/lib/task/task-cloud.module.mjs +0 -45
  150. package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +0 -59
  151. package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +0 -467
  152. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +0 -205
  153. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +0 -317
  154. package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +0 -146
  155. package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +0 -142
  156. package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +0 -72
  157. package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +0 -255
  158. package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +0 -207
  159. package/esm2022/lib/task/task-filters/public-api.mjs +0 -27
  160. package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +0 -283
  161. package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +0 -392
  162. package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +0 -56
  163. package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +0 -231
  164. package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +0 -89
  165. package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +0 -309
  166. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +0 -101
  167. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +0 -87
  168. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +0 -85
  169. package/esm2022/lib/task/task-form/public-api.mjs +0 -21
  170. package/esm2022/lib/task/task-form/task-form.module.mjs +0 -36
  171. package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +0 -280
  172. package/esm2022/lib/task/task-header/public-api.mjs +0 -19
  173. package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +0 -33
  174. package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +0 -331
  175. package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +0 -115
  176. package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +0 -31
  177. package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +0 -389
  178. package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +0 -18
  179. package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +0 -18
  180. package/esm2022/lib/task/task-list/public-api.mjs +0 -23
  181. package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +0 -115
  182. package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +0 -178
  183. package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +0 -35
  184. package/esm2022/lib/types.mjs +0 -18
  185. package/esm2022/public-api.mjs +0 -40
  186. /package/lib/screen/{models → components/screen-cloud}/screen-cloud.model.d.ts +0 -0
@@ -1,801 +0,0 @@
1
- /*!
2
- * @license
3
- * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- */
17
- import { Component, DestroyRef, EventEmitter, inject, Input, Output, ViewEncapsulation } from '@angular/core';
18
- import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
19
- import { DateAdapter } from '@angular/material/core';
20
- import { MatDialog } from '@angular/material/dialog';
21
- import { debounceTime, filter, finalize, switchMap, tap } from 'rxjs/operators';
22
- import { AppsProcessCloudService } from '../../../../app/services/apps-process-cloud.service';
23
- import { ProcessFilterCloudModel } from '../../models/process-filter-cloud.model';
24
- import { DateFnsUtils, IconComponent, TranslationService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core';
25
- import { ProcessFilterCloudService } from '../../services/process-filter-cloud.service';
26
- import { ProcessFilterDialogCloudComponent } from '../process-filter-dialog/process-filter-dialog-cloud.component';
27
- import { ProcessCloudService } from '../../../services/process-cloud.service';
28
- import { DateCloudFilterType } from '../../../../models/date-cloud-filter.model';
29
- import { endOfDay, isValid, startOfDay } from 'date-fns';
30
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
31
- import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
32
- import { TranslatePipe } from '@ngx-translate/core';
33
- import { MatButtonModule } from '@angular/material/button';
34
- import { NgForOf, NgIf } from '@angular/common';
35
- import { MatExpansionModule } from '@angular/material/expansion';
36
- import { MatFormFieldModule } from '@angular/material/form-field';
37
- import { MatSelectModule } from '@angular/material/select';
38
- import { MatInputModule } from '@angular/material/input';
39
- import { MatDatepickerModule } from '@angular/material/datepicker';
40
- import { MatIconModule } from '@angular/material/icon';
41
- import { DateRangeFilterComponent } from '../../../../common/date-range-filter/date-range-filter.component';
42
- import { PeopleCloudComponent } from '../../../../people/components/people-cloud.component';
43
- import * as i0 from "@angular/core";
44
- import * as i1 from "@angular/forms";
45
- import * as i2 from "@angular/material/dialog";
46
- import * as i3 from "@angular/material/core";
47
- import * as i4 from "@alfresco/adf-core";
48
- import * as i5 from "../../services/process-filter-cloud.service";
49
- import * as i6 from "../../../../app/services/apps-process-cloud.service";
50
- import * as i7 from "../../../services/process-cloud.service";
51
- import * as i8 from "@angular/material/progress-spinner";
52
- import * as i9 from "@angular/material/button";
53
- import * as i10 from "@angular/material/expansion";
54
- import * as i11 from "@angular/material/form-field";
55
- import * as i12 from "@angular/material/select";
56
- import * as i13 from "@angular/material/input";
57
- import * as i14 from "@angular/material/datepicker";
58
- import * as i15 from "@angular/material/icon";
59
- export const PROCESS_FILTER_ACTION_SAVE = 'save';
60
- export const PROCESS_FILTER_ACTION_SAVE_AS = 'saveAs';
61
- export const PROCESS_FILTER_ACTION_DELETE = 'delete';
62
- export const PROCESS_FILTER_ACTION_SAVE_DEFAULT = 'saveDefaultFilter';
63
- export const PROCESS_FILTER_ACTION_RESTORE = 'restoreDefaultFilter';
64
- const DEFAULT_PROCESS_FILTER_PROPERTIES = ['status', 'sort', 'order', 'lastModified'];
65
- const DEFAULT_SORT_PROPERTIES = ['id', 'name', 'status', 'startDate'];
66
- const DEFAULT_ACTIONS = ['save', 'saveAs', 'delete'];
67
- export class EditProcessFilterCloudComponent {
68
- get processFilter() {
69
- return this._filter;
70
- }
71
- /** Process filter */
72
- set processFilter(value) {
73
- const isChanged = this.isFilterChanged(this._filter, value);
74
- this._filter = value;
75
- if (value?.appName) {
76
- this.appName = value.appName;
77
- }
78
- if (value?.id) {
79
- this.id = value.id;
80
- }
81
- if (value?.environmentId) {
82
- this.environmentId = value.environmentId;
83
- }
84
- this.processFilterProperties = this.createAndFilterProperties();
85
- this.processFilterActions = this.createAndFilterActions();
86
- this.buildForm(this.processFilterProperties);
87
- if (isChanged) {
88
- this.filterChange.emit(value);
89
- }
90
- }
91
- constructor(formBuilder, dialog, dateAdapter, userPreferencesService, translateService, processFilterCloudService, appsProcessCloudService, processCloudService) {
92
- this.formBuilder = formBuilder;
93
- this.dialog = dialog;
94
- this.dateAdapter = dateAdapter;
95
- this.userPreferencesService = userPreferencesService;
96
- this.translateService = translateService;
97
- this.processFilterCloudService = processFilterCloudService;
98
- this.appsProcessCloudService = appsProcessCloudService;
99
- this.processCloudService = processCloudService;
100
- /** The name of the application. */
101
- this.appName = '';
102
- /** roles to filter the apps */
103
- this.role = '';
104
- /** List of process filter properties to display */
105
- this.filterProperties = DEFAULT_PROCESS_FILTER_PROPERTIES;
106
- /** List of sort properties to display. */
107
- this.sortProperties = DEFAULT_SORT_PROPERTIES;
108
- /** List of sort actions. */
109
- this.actions = DEFAULT_ACTIONS;
110
- /** List of environments. */
111
- this.environmentList = [];
112
- /** Toggles editing of process filter actions. */
113
- this.showFilterActions = true;
114
- /** Toggles editing of the process filter title. */
115
- this.showTitle = true;
116
- /** Toggles the appearance of the process filter name . */
117
- this.showProcessFilterName = true;
118
- /** Emitted when a process instance filter property changes. */
119
- this.filterChange = new EventEmitter();
120
- /** Emitted when a filter action occurs i.e Save, SaveAs, Delete. */
121
- this.action = new EventEmitter();
122
- this.filterHasBeenChanged = false;
123
- this.status = [
124
- { value: '', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.ALL' },
125
- { value: 'RUNNING', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.RUNNING' },
126
- { value: 'SUSPENDED', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.SUSPENDED' },
127
- { value: 'CANCELLED', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.CANCELLED' },
128
- { value: 'COMPLETED', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.COMPLETED' }
129
- ];
130
- this.directions = [
131
- { value: 'ASC', label: 'ADF_CLOUD_PROCESS_FILTERS.DIRECTION.ASCENDING' },
132
- { value: 'DESC', label: 'ADF_CLOUD_PROCESS_FILTERS.DIRECTION.DESCENDING' }
133
- ];
134
- this.actionDisabledForDefault = [PROCESS_FILTER_ACTION_SAVE, PROCESS_FILTER_ACTION_DELETE];
135
- this.applicationNames = [];
136
- this.allProcessDefinitionNamesOption = {
137
- label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.ALL',
138
- value: ''
139
- };
140
- this.processDefinitionNames = [];
141
- this.processFilterProperties = [];
142
- this.processFilterActions = [];
143
- this.toggleFilterActions = false;
144
- this.appVersionOptions = [];
145
- this.initiatorOptions = [];
146
- this.isLoading = false;
147
- this.destroyRef = inject(DestroyRef);
148
- }
149
- ngOnInit() {
150
- this.userPreferencesService
151
- .select(UserPreferenceValues.Locale)
152
- .pipe(takeUntilDestroyed(this.destroyRef))
153
- .subscribe((locale) => this.dateAdapter.setLocale(locale));
154
- }
155
- ngOnChanges(changes) {
156
- const id = changes['id'];
157
- if (id && id.currentValue !== id.previousValue) {
158
- this.retrieveProcessFilterAndBuildForm();
159
- }
160
- }
161
- filterTracker(_index, item) {
162
- return item.key;
163
- }
164
- buildForm(processFilterProperties) {
165
- this.editProcessFilterForm = this.formBuilder.group(this.getFormControlsConfig(processFilterProperties));
166
- this.onFilterChange();
167
- }
168
- getFormControlsConfig(processFilterProperties) {
169
- const properties = processFilterProperties.map((property) => {
170
- if (property.attributes) {
171
- return this.getAttributesControlConfig(property);
172
- }
173
- else {
174
- return { [property.key]: property.value };
175
- }
176
- });
177
- return properties.reduce((result, current) => Object.assign(result, current), {});
178
- }
179
- get lastModifiedFrom() {
180
- return this.editProcessFilterForm.get('lastModifiedFrom');
181
- }
182
- get lastModifiedTo() {
183
- return this.editProcessFilterForm.get('lastModifiedTo');
184
- }
185
- get completedDateType() {
186
- return this.editProcessFilterForm.get('completedDateType');
187
- }
188
- getAttributesControlConfig(property) {
189
- return Object.values(property.attributes).reduce((result, key) => {
190
- result[key] = property.value[key];
191
- return result;
192
- }, {});
193
- }
194
- /**
195
- * Fetches process instance filter by application name and filter id and creates filter properties, build form
196
- */
197
- retrieveProcessFilterAndBuildForm() {
198
- this.isLoading = true;
199
- this.processFilterCloudService
200
- .getFilterById(this.appName, this.id)
201
- .pipe(finalize(() => (this.isLoading = false)))
202
- .subscribe((response) => {
203
- this.filterHasBeenChanged = false;
204
- this.processFilter = new ProcessFilterCloudModel(Object.assign({}, response || {}, this.processFilter || {}));
205
- });
206
- }
207
- /**
208
- * Check process instance filter changes
209
- */
210
- onFilterChange() {
211
- if (this.filterChangeSub) {
212
- this.filterChangeSub.unsubscribe();
213
- this.filterChangeSub = null;
214
- }
215
- this.filterChangeSub = this.editProcessFilterForm.valueChanges
216
- .pipe(debounceTime(500), filter(() => this.isFormValid()), takeUntilDestroyed(this.destroyRef))
217
- .subscribe((formValues) => {
218
- this.setLastModifiedFromFilter(formValues);
219
- this.setLastModifiedToFilter(formValues);
220
- const newValue = new ProcessFilterCloudModel(Object.assign({}, this.processFilter, formValues));
221
- const changed = !this.compareFilters(newValue, this.processFilter);
222
- this.filterHasBeenChanged = changed;
223
- if (changed) {
224
- this._filter = newValue;
225
- this.filterChange.emit(newValue);
226
- }
227
- });
228
- }
229
- createAndFilterProperties() {
230
- this.checkMandatoryFilterProperties();
231
- if (this.filterProperties.includes('appName')) {
232
- this.getDeployedApplications();
233
- }
234
- if (this.filterProperties.includes('processDefinitionName')) {
235
- this.getProcessDefinitions();
236
- }
237
- if (this.filterProperties.includes('appVersionMultiple')) {
238
- this.getAppVersionOptions();
239
- }
240
- if (this.filterProperties.includes('initiator')) {
241
- this.initiatorOptions = this.processFilter.initiator
242
- ? this.processFilter.initiator.split(',').map((username) => Object.assign({}, { username }))
243
- : [];
244
- }
245
- const defaultProperties = this.createProcessFilterProperties(this.processFilter);
246
- let filteredProperties = defaultProperties.filter((filterProperty) => this.isValidProperty(this.filterProperties, filterProperty.key));
247
- if (!this.filterProperties.includes('sort')) {
248
- filteredProperties = filteredProperties.filter((property) => property.key !== 'order');
249
- }
250
- if (this.filterProperties.includes('lastModified')) {
251
- filteredProperties = [...filteredProperties, ...this.createLastModifiedProperty(this.processFilter)];
252
- }
253
- return filteredProperties;
254
- }
255
- checkMandatoryFilterProperties() {
256
- if (this.filterProperties === undefined || this.filterProperties.length === 0) {
257
- this.filterProperties = DEFAULT_PROCESS_FILTER_PROPERTIES;
258
- }
259
- }
260
- isValidProperty(filterProperties, key) {
261
- return filterProperties ? filterProperties.indexOf(key) >= 0 : true;
262
- }
263
- get createSortProperties() {
264
- this.checkMandatorySortProperties();
265
- const defaultSortProperties = this.createProcessSortProperties();
266
- return defaultSortProperties.filter((sortProperty) => this.isValidProperty(this.sortProperties, sortProperty.key));
267
- }
268
- getAppVersionOptions() {
269
- this.processCloudService.getApplicationVersions(this.appName).subscribe((appVersions) => {
270
- this.appVersionOptions.length = 0;
271
- appVersions.forEach((appVersion) => {
272
- this.appVersionOptions.push({ label: appVersion.entry.version, value: appVersion.entry.version });
273
- });
274
- });
275
- }
276
- checkMandatorySortProperties() {
277
- if (this.sortProperties === undefined || this.sortProperties.length === 0) {
278
- this.sortProperties = DEFAULT_SORT_PROPERTIES;
279
- }
280
- }
281
- createAndFilterActions() {
282
- this.checkMandatoryActions();
283
- const actions = this.createFilterActions();
284
- return actions.filter((action) => this.isValidAction(this.actions, action));
285
- }
286
- checkMandatoryActions() {
287
- if (this.actions === undefined || this.actions.length === 0) {
288
- this.actions = DEFAULT_ACTIONS;
289
- }
290
- }
291
- isValidAction(actions, action) {
292
- return actions ? actions.indexOf(action.actionType) >= 0 : true;
293
- }
294
- isFormValid() {
295
- return this.editProcessFilterForm.valid;
296
- }
297
- getPropertyController(property) {
298
- return this.editProcessFilterForm.get(property.key);
299
- }
300
- onDateChanged(newDateValue, dateProperty) {
301
- if (newDateValue) {
302
- const controller = this.getPropertyController(dateProperty);
303
- let date = newDateValue;
304
- if (typeof newDateValue === 'string') {
305
- date = DateFnsUtils.parseDate(newDateValue, 'dd/MM/yyyy');
306
- }
307
- if (isValid(date)) {
308
- controller.setValue(date);
309
- controller.setErrors(null);
310
- }
311
- else {
312
- controller.setValue(date);
313
- controller.setErrors({ invalid: true });
314
- }
315
- }
316
- }
317
- onDateTypeChange(dateType, property) {
318
- this.editProcessFilterForm.get(property.attributes.dateType).setValue(dateType);
319
- }
320
- onDateRangeFilterChanged(dateRange, property) {
321
- this.editProcessFilterForm.get(property.attributes?.from).setValue(dateRange.startDate ? dateRange.startDate : null);
322
- this.editProcessFilterForm.get(property.attributes?.to).setValue(dateRange.endDate ? dateRange.endDate : null);
323
- this.editProcessFilterForm.get(property.attributes.dateType).setValue(DateCloudFilterType.RANGE);
324
- }
325
- onChangedUser(users, processProperty) {
326
- this.getPropertyController(processProperty).setValue(users.map((user) => user.username).join(','));
327
- }
328
- hasError(property) {
329
- const controller = this.getPropertyController(property);
330
- return !!controller.errors?.invalid;
331
- }
332
- compareFilters(editedQuery, currentQuery) {
333
- return JSON.stringify(editedQuery).toLowerCase() === JSON.stringify(currentQuery).toLowerCase();
334
- }
335
- getDeployedApplications() {
336
- this.appsProcessCloudService.getDeployedApplicationsByStatus('DEPLOYED', this.role).subscribe((applications) => {
337
- if (applications && applications.length > 0) {
338
- this.applicationNames.length = 0;
339
- applications.map((application) => {
340
- this.applicationNames.push({
341
- label: this.appsProcessCloudService.getApplicationLabel(application, this.environmentList),
342
- value: application.name
343
- });
344
- });
345
- }
346
- });
347
- }
348
- getProcessDefinitions() {
349
- this.processCloudService.getProcessDefinitions(this.appName).subscribe((processDefinitions) => {
350
- if (processDefinitions && processDefinitions.length > 0) {
351
- this.processDefinitionNames.length = 0;
352
- this.processDefinitionNames.push(this.allProcessDefinitionNamesOption);
353
- processDefinitions.map((processDefinition) => {
354
- this.processDefinitionNames.push({ label: processDefinition.name, value: processDefinition.name });
355
- });
356
- }
357
- });
358
- }
359
- executeFilterActions(event, action) {
360
- if (action.actionType === PROCESS_FILTER_ACTION_SAVE) {
361
- this.save(action);
362
- }
363
- else if (action.actionType === PROCESS_FILTER_ACTION_SAVE_AS) {
364
- this.saveAs(action);
365
- }
366
- else if (action.actionType === PROCESS_FILTER_ACTION_DELETE) {
367
- this.delete(action);
368
- }
369
- else if (action.actionType === PROCESS_FILTER_ACTION_SAVE_DEFAULT) {
370
- this.save(action);
371
- }
372
- else if (action.actionType === PROCESS_FILTER_ACTION_RESTORE) {
373
- this.reset(action);
374
- }
375
- event.stopPropagation();
376
- }
377
- save(saveAction) {
378
- this.processFilterCloudService.updateFilter(this.processFilter).subscribe(() => {
379
- saveAction.filter = this.processFilter;
380
- this.filterHasBeenChanged = false;
381
- this.action.emit(saveAction);
382
- });
383
- }
384
- /**
385
- * Delete a process instance filter
386
- *
387
- * @param deleteAction filter action
388
- */
389
- delete(deleteAction) {
390
- this.processFilterCloudService
391
- .deleteFilter(this.processFilter)
392
- .pipe(filter((filters) => {
393
- deleteAction.filter = this.processFilter;
394
- this.action.emit(deleteAction);
395
- return filters.length === 0;
396
- }), switchMap(() => this.restoreDefaultProcessFilters()))
397
- .subscribe(() => { });
398
- }
399
- /**
400
- * Save As a process instance filter
401
- *
402
- * @param saveAsAction filter action
403
- */
404
- saveAs(saveAsAction) {
405
- const dialogRef = this.dialog.open(ProcessFilterDialogCloudComponent, {
406
- data: {
407
- name: this.translateService.instant(this.processFilter.name)
408
- },
409
- height: 'auto',
410
- minWidth: '30%'
411
- });
412
- dialogRef.afterClosed().subscribe((result) => {
413
- if (result && result.action === ProcessFilterDialogCloudComponent.ACTION_SAVE) {
414
- const filterId = Math.random().toString(36).substring(2, 9);
415
- const filterKey = this.getSanitizeFilterName(result.name);
416
- const newFilter = {
417
- name: result.name,
418
- icon: result.icon,
419
- id: filterId,
420
- key: 'custom-' + filterKey
421
- };
422
- const resultFilter = Object.assign({}, this.processFilter, newFilter);
423
- this.processFilterCloudService.addFilter(resultFilter).subscribe(() => {
424
- saveAsAction.filter = resultFilter;
425
- this.filterHasBeenChanged = false;
426
- this.action.emit(saveAsAction);
427
- });
428
- }
429
- });
430
- }
431
- reset(resetAction) {
432
- this.processFilterCloudService
433
- .resetProcessFilterToDefaults(this.appName, this.processFilter)
434
- .pipe(tap((filters) => {
435
- resetAction.filter = filters.find((defaultFilter) => defaultFilter.name === this.processFilter.name) || this.processFilter;
436
- this.action.emit(resetAction);
437
- }), switchMap(() => this.restoreDefaultProcessFilters()))
438
- .subscribe(() => { });
439
- }
440
- /**
441
- * Get sanitized filter name
442
- *
443
- * @param filterName filter name
444
- * @returns sanitized filter name
445
- */
446
- getSanitizeFilterName(filterName) {
447
- const nameWithHyphen = this.replaceSpaceWithHyphen(filterName.trim());
448
- return nameWithHyphen.toLowerCase();
449
- }
450
- /**
451
- * Return name with hyphen
452
- *
453
- * @param name name
454
- * @returns updated value
455
- */
456
- replaceSpaceWithHyphen(name) {
457
- const regExt = new RegExp(' ', 'g');
458
- return name.replace(regExt, '-');
459
- }
460
- restoreDefaultProcessFilters() {
461
- return this.processFilterCloudService.getProcessFilters(this.appName);
462
- }
463
- onExpand() {
464
- this.toggleFilterActions = true;
465
- }
466
- onClose() {
467
- this.toggleFilterActions = false;
468
- }
469
- isDisabledAction(action) {
470
- return this.processFilterCloudService.isDefaultFilter(this.processFilter.name) && this.actionDisabledForDefault.includes(action.actionType)
471
- ? true
472
- : this.hasFilterChanged(action);
473
- }
474
- hasFilterChanged(action) {
475
- return action.actionType === PROCESS_FILTER_ACTION_SAVE || action.actionType === PROCESS_FILTER_ACTION_SAVE_AS
476
- ? !this.filterHasBeenChanged
477
- : false;
478
- }
479
- setLastModifiedToFilter(formValues) {
480
- if (isValid(formValues.lastModifiedTo)) {
481
- formValues.lastModifiedTo = endOfDay(formValues.lastModifiedTo);
482
- }
483
- }
484
- setLastModifiedFromFilter(formValues) {
485
- if (isValid(formValues.lastModifiedFrom)) {
486
- formValues.lastModifiedFrom = startOfDay(formValues.lastModifiedFrom);
487
- }
488
- }
489
- createFilterActions() {
490
- return [
491
- {
492
- actionType: PROCESS_FILTER_ACTION_SAVE,
493
- icon: 'adf:save',
494
- tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.SAVE'
495
- },
496
- {
497
- actionType: PROCESS_FILTER_ACTION_SAVE_AS,
498
- icon: 'adf:save-as',
499
- tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.SAVE_AS'
500
- },
501
- {
502
- actionType: PROCESS_FILTER_ACTION_DELETE,
503
- icon: 'delete',
504
- tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.DELETE'
505
- },
506
- {
507
- actionType: PROCESS_FILTER_ACTION_SAVE_DEFAULT,
508
- icon: 'adf:save',
509
- tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.SAVE'
510
- },
511
- {
512
- actionType: PROCESS_FILTER_ACTION_RESTORE,
513
- icon: 'settings_backup_restore',
514
- tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.RESTORE'
515
- }
516
- ];
517
- }
518
- createLastModifiedProperty(filterModel) {
519
- return [
520
- {
521
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.LAST_MODIFIED_DATE_FORM',
522
- type: 'date',
523
- key: 'lastModifiedFrom',
524
- value: filterModel.lastModifiedFrom
525
- },
526
- {
527
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.LAST_MODIFIED_TO',
528
- type: 'date',
529
- key: 'lastModifiedTo',
530
- value: filterModel.lastModifiedTo
531
- }
532
- ];
533
- }
534
- createProcessSortProperties() {
535
- return [
536
- {
537
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.ID',
538
- key: 'id',
539
- value: 'id'
540
- },
541
- {
542
- label: 'EnvironmentId',
543
- key: 'environmentId',
544
- value: 'environmentId'
545
- },
546
- {
547
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_NAME',
548
- key: 'name',
549
- value: 'name'
550
- },
551
- {
552
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.START_DATE',
553
- key: 'startDate',
554
- value: 'startDate'
555
- },
556
- {
557
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STATUS',
558
- key: 'status',
559
- value: 'status'
560
- },
561
- {
562
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STARTED_BY',
563
- key: 'initiator',
564
- value: 'initiator'
565
- },
566
- {
567
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_NAME',
568
- key: 'appName',
569
- value: 'appName'
570
- },
571
- {
572
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_VERSION',
573
- key: 'appVersion',
574
- value: 'appVersion'
575
- },
576
- {
577
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.MAIN_PROCESS_ID',
578
- key: 'parentId',
579
- value: 'parentId'
580
- },
581
- {
582
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_INS_ID',
583
- key: 'processInstanceId',
584
- value: 'processInstanceId'
585
- },
586
- {
587
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_ID',
588
- key: 'processDefinitionId',
589
- value: 'processDefinitionId'
590
- },
591
- {
592
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_NAME',
593
- key: 'processDefinitionName',
594
- value: 'processDefinitionName'
595
- },
596
- {
597
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_KEY',
598
- key: 'processDefinitionKey',
599
- value: 'processDefinitionKey'
600
- },
601
- {
602
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.LAST_MODIFIED',
603
- key: 'lastModified',
604
- value: 'lastModified'
605
- },
606
- {
607
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.BUSINESS_KEY',
608
- key: 'businessKey',
609
- value: 'businessKey'
610
- }
611
- ];
612
- }
613
- isFilterChanged(oldValue, newValue) {
614
- const oldJson = JSON.stringify(this.processFilterCloudService.writeQueryParams(oldValue || {}, this.filterProperties));
615
- const newJson = JSON.stringify(this.processFilterCloudService.writeQueryParams(newValue || {}, this.filterProperties));
616
- return oldJson !== newJson;
617
- }
618
- createProcessFilterProperties(filterModel) {
619
- const appVersionMultiple = [];
620
- if (filterModel.appVersion) {
621
- appVersionMultiple.push(Array.isArray(filterModel.appVersion) ? filterModel.appVersion.map((entry) => entry.toString()) : `${filterModel.appVersion}`);
622
- }
623
- return [
624
- {
625
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_NAME',
626
- type: 'select',
627
- key: 'appName',
628
- value: filterModel.appName || '',
629
- options: this.applicationNames
630
- },
631
- {
632
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_VERSION',
633
- type: 'number',
634
- key: 'appVersion',
635
- value: filterModel.appVersion
636
- },
637
- {
638
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_VERSION',
639
- type: 'multi-select',
640
- key: 'appVersionMultiple',
641
- value: appVersionMultiple,
642
- options: this.appVersionOptions
643
- },
644
- {
645
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_INS_ID',
646
- type: 'text',
647
- key: 'processInstanceId',
648
- value: filterModel.processInstanceId || ''
649
- },
650
- {
651
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.MAIN_PROCESS_ID',
652
- type: 'text',
653
- key: 'parentId',
654
- value: filterModel.parentId
655
- },
656
- {
657
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_NAME',
658
- type: 'text',
659
- key: 'processName',
660
- value: filterModel.processName || ''
661
- },
662
- {
663
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_NAME',
664
- type: 'select',
665
- key: 'processDefinitionName',
666
- value: filterModel.processDefinitionName || '',
667
- options: this.processDefinitionNames
668
- },
669
- {
670
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STATUS',
671
- type: 'select',
672
- key: 'status',
673
- value: filterModel.status || this.status[0].value,
674
- options: this.status
675
- },
676
- {
677
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_ID',
678
- type: 'text',
679
- key: 'processDefinitionId',
680
- value: filterModel.processDefinitionId || ''
681
- },
682
- {
683
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_KEY',
684
- type: 'text',
685
- key: 'processDefinitionKey',
686
- value: filterModel.processDefinitionKey || ''
687
- },
688
- {
689
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.SORT',
690
- type: 'select',
691
- key: 'sort',
692
- value: filterModel.sort || this.createSortProperties[0].value,
693
- options: this.createSortProperties
694
- },
695
- {
696
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.DIRECTION',
697
- type: 'select',
698
- key: 'order',
699
- value: filterModel.order || this.directions[0].value,
700
- options: this.directions
701
- },
702
- {
703
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.COMPLETED_DATE',
704
- type: 'date',
705
- key: 'completedDate',
706
- value: filterModel.completedDate || false
707
- },
708
- {
709
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STARTED_BY',
710
- type: 'people',
711
- key: 'initiator',
712
- value: filterModel.initiator,
713
- selectionMode: 'multiple'
714
- },
715
- {
716
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.COMPLETED_DATE',
717
- type: 'date-range',
718
- key: 'completedDateRange',
719
- attributes: { dateType: 'completedDateType', from: '_completedFrom', to: '_completedTo' },
720
- value: {
721
- completedDateType: filterModel.completedDateType || null,
722
- _completedFrom: filterModel.completedFrom || null,
723
- _completedTo: filterModel.completedTo || null
724
- }
725
- },
726
- {
727
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STARTED_DATE',
728
- type: 'date-range',
729
- key: 'startedDateRange',
730
- attributes: { dateType: 'startedDateType', from: '_startFrom', to: '_startTo' },
731
- value: {
732
- startedDateType: filterModel.startedDateType || null,
733
- _startFrom: filterModel.startFrom || null,
734
- _startTo: filterModel.startTo || null
735
- }
736
- },
737
- {
738
- label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.SUSPENDED_DATE',
739
- type: 'date-range',
740
- key: 'suspendedDateRange',
741
- attributes: { dateType: 'suspendedDateType', from: '_suspendedFrom', to: '_suspendedTo' },
742
- value: {
743
- suspendedDateType: filterModel.suspendedDateType || null,
744
- _suspendedFrom: filterModel.suspendedFrom || null,
745
- _suspendedTo: filterModel.suspendedTo || null
746
- }
747
- }
748
- ];
749
- }
750
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EditProcessFilterCloudComponent, deps: [{ token: i1.FormBuilder }, { token: i2.MatDialog }, { token: i3.DateAdapter }, { token: i4.UserPreferencesService }, { token: i4.TranslationService }, { token: i5.ProcessFilterCloudService }, { token: i6.AppsProcessCloudService }, { token: i7.ProcessCloudService }], target: i0.ɵɵFactoryTarget.Component }); }
751
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: EditProcessFilterCloudComponent, isStandalone: true, selector: "adf-cloud-edit-process-filter", inputs: { appName: "appName", role: "role", id: "id", filterProperties: "filterProperties", sortProperties: "sortProperties", actions: "actions", environmentId: "environmentId", environmentList: "environmentList", showFilterActions: "showFilterActions", showTitle: "showTitle", showProcessFilterName: "showProcessFilterName", processFilter: "processFilter" }, outputs: { filterChange: "filterChange", action: "action" }, usesOnChanges: true, ngImport: i0, template: "<mat-accordion [hideToggle]=\"isLoading\" class=\"adf-edit-process-filter\">\n <mat-expansion-panel (afterExpand)=\"onExpand()\" (closed)=\"onClose()\">\n <mat-expansion-panel-header *ngIf=\"processFilter\" id=\"adf-edit-process-filter-expansion-header\" class=\"adf-edit-process-filter-header\">\n <ng-container *ngIf=\"!isLoading; else loadingTemplate\">\n <mat-panel-title *ngIf=\"showProcessFilterName\" id=\"adf-edit-process-filter-title-id\" class=\"adf-edit-process-filter-header__title\">\n {{processFilter.name | translate}}</mat-panel-title>\n <mat-panel-description class=\"adf-edit-process-filter-header__description\" id=\"adf-edit-process-filter-sub-title-id\">\n <span *ngIf=\"showTitle\"> {{ 'ADF_CLOUD_EDIT_PROCESS_FILTER.TITLE' | translate}}</span>\n <div *ngIf=\"showFilterActions\" class=\"adf-cloud-edit-process-filter-actions\">\n <ng-container *ngIf=\"toggleFilterActions\">\n <button *ngFor=\"let filterAction of processFilterActions\"\n mat-icon-button\n [title]=\"filterAction.tooltip | translate\"\n [attr.data-automation-id]=\"'adf-filter-action-' + filterAction.actionType\"\n [disabled]=\"isDisabledAction(filterAction)\"\n (click)=\"executeFilterActions($event, filterAction)\">\n <adf-icon [value]=\"filterAction.icon\" />\n </button>\n </ng-container>\n </div>\n </mat-panel-description>\n </ng-container>\n <ng-template #loadingTemplate>\n <div class=\"adf-cloud-edit-process-filter-loading-margin\">\n <mat-spinner [diameter]=\"30\" />\n </div>\n </ng-template>\n </mat-expansion-panel-header>\n <ng-container *ngIf=\"!isLoading\">\n <form [formGroup]=\"editProcessFilterForm\" *ngIf=\"editProcessFilterForm\" class=\"adf-edit-process-filter-content\">\n <div class=\"adf-edit-process-filter-form\">\n <ng-container *ngFor=\"let processFilterProperty of processFilterProperties; trackBy: filterTracker\">\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'select'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__select-label\">{{processFilterProperty.label | translate}}</mat-label>\n <mat-select\n [formControlName]=\"processFilterProperty.key\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\">\n <mat-option\n *ngFor=\"let propertyOption of processFilterProperty.options\"\n [value]=\"propertyOption.value\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-options-' + processFilterProperty.key\"\n >{{ propertyOption.label | translate }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'multi-select'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__select-label\">{{processFilterProperty.label | translate}}</mat-label>\n <mat-select\n [formControlName]=\"processFilterProperty.key\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"\n [multiple]=\"true\">\n <mat-option *ngFor=\"let propertyOption of processFilterProperty.options\" [value]=\"propertyOption.value\" [attr.data-automation-id]=\"'adf-cloud-edit-process-property-options-' + processFilterProperty.key\">\n {{ propertyOption.label | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'text'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__text-label\">{{processFilterProperty.label | translate}}</mat-label>\n <input matInput\n [formControlName]=\"processFilterProperty.key\"\n type=\"text\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"/>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'number'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <input matInput\n [formControlName]=\"processFilterProperty.key\"\n type=\"number\" min=\"0\"\n placeholder=\"{{processFilterProperty.label | translate}}\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"/>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'date'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label>{{processFilterProperty.label | translate}}</mat-label>\n <input\n matInput\n [formControlName]=\"processFilterProperty.key\"\n (keyup)=\"onDateChanged($any($event).target.value, processFilterProperty)\"\n (dateChange)=\"onDateChanged($event.value, processFilterProperty)\"\n [matDatepicker]=\"dateController\"\n placeholder=\"{{processFilterProperty.label | translate}}\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\">\n <mat-datepicker-toggle\n matSuffix [for]=\"dateController\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-date-toggle-' + processFilterProperty.key\" />\n <mat-datepicker #dateController [attr.data-automation-id]=\"'adf-cloud-edit-process-property-date-picker-' + processFilterProperty.key\" />\n <div class=\"adf-edit-process-filter-date-error-container\">\n <div *ngIf=\"hasError(processFilterProperty)\">\n <div class=\"adf-error-text\">{{'ADF_CLOUD_EDIT_PROCESS_FILTER.ERROR.DATE' | translate}}</div>\n <mat-icon class=\"adf-error-icon\">warning</mat-icon>\n </div>\n </div>\n </mat-form-field>\n\n <adf-cloud-date-range-filter *ngIf=\"processFilterProperty.type === 'date-range'\"\n [processFilterProperty]=\"processFilterProperty\"\n [options]=\"processFilterProperty.dateFilterOptions\"\n (dateTypeChange)=\"onDateTypeChange($event, processFilterProperty)\"\n (dateChanged)=\"onDateRangeFilterChanged($event, processFilterProperty)\" />\n <adf-cloud-people\n *ngIf=\"processFilterProperty.type === 'people'\"\n [preSelectUsers]=\"initiatorOptions\"\n [title]=\"processFilterProperty.label\"\n [validate]=\"true\"\n [appName]=\"appName\"\n [mode]=\"processFilterProperty.selectionMode\"\n (changedUsers)=\"onChangedUser($event, processFilterProperty)\" />\n </ng-container>\n </div>\n </form>\n </ng-container>\n </mat-expansion-panel>\n</mat-accordion>\n", styles: [".adf-edit-process-filter-date-error-container{position:absolute;height:20px;margin-top:12px;width:100%}.adf-edit-process-filter-date-error-container>div{display:flex;flex-flow:row;justify-content:flex-start}.adf-edit-process-filter-date-error-container .adf-error-text{padding-right:8px;height:16px;font-size:var(--theme-caption-font-size);line-height:1.33;color:var(--theme-warn-color);width:auto}.adf-edit-process-filter-date-error-container .adf-error-icon{font-size:var(--theme-subheading-2-font-size);color:var(--theme-warn-color)}.adf-cloud-edit-process-filter-loading-margin{margin-left:calc((100% - 100px)/2);margin-right:calc((100% - 100px)/2)}.adf-edit-process-filter-form{flex-flow:row wrap;display:flex;max-width:100%;place-content:stretch flex-start;align-items:stretch}.adf-edit-process-filter-form :not(:last-child){margin-right:10px}.adf-edit-process-filter-form mat-form-field,.adf-edit-process-filter-form adf-cloud-people{flex:1 1 23%;max-width:23%}@media (max-width: 599.9px){.adf-edit-process-filter-form{flex-flow:column}.adf-edit-process-filter-form :not(:last-child){margin-bottom:10px;margin-right:0}}.adf-edit-process-filter-header{height:48px}.adf-edit-process-filter-header__title{color:var(--adf-theme-foreground-text-color)}.adf-edit-process-filter-header__description{color:var(--adf-theme-foreground-secondary-text-color);place-content:center space-between}.adf-edit-process-filter-content__text-label,.adf-edit-process-filter-content__select-label{color:var(--adf-theme-foreground-secondary-text-color)}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "adf-icon", inputs: ["color", "fontSet", "value"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i10.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i10.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i10.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i10.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i14.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i14.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i14.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: DateRangeFilterComponent, selector: "adf-cloud-date-range-filter", inputs: ["processFilterProperty", "options"], outputs: ["dateChanged", "dateTypeChange"] }, { kind: "component", type: PeopleCloudComponent, selector: "adf-cloud-people", inputs: ["label", "appName", "mode", "roles", "validate", "readOnly", "required", "preSelectUsers", "excludedUsers", "groupsRestriction", "userChipsCtrl", "searchUserCtrl", "title", "placeholder", "hideInputOnSingleSelection", "formFieldAppearance", "formFieldSubscriptSizing", "showErrors", "showFullNameOnHover"], outputs: ["selectUser", "removeUser", "changedUsers", "warning"] }], encapsulation: i0.ViewEncapsulation.None }); }
752
- }
753
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EditProcessFilterCloudComponent, decorators: [{
754
- type: Component,
755
- args: [{ selector: 'adf-cloud-edit-process-filter', standalone: true, imports: [
756
- IconComponent,
757
- MatProgressSpinnerModule,
758
- TranslatePipe,
759
- MatButtonModule,
760
- NgForOf,
761
- NgIf,
762
- MatExpansionModule,
763
- MatFormFieldModule,
764
- MatSelectModule,
765
- ReactiveFormsModule,
766
- MatInputModule,
767
- MatDatepickerModule,
768
- MatIconModule,
769
- DateRangeFilterComponent,
770
- PeopleCloudComponent
771
- ], encapsulation: ViewEncapsulation.None, template: "<mat-accordion [hideToggle]=\"isLoading\" class=\"adf-edit-process-filter\">\n <mat-expansion-panel (afterExpand)=\"onExpand()\" (closed)=\"onClose()\">\n <mat-expansion-panel-header *ngIf=\"processFilter\" id=\"adf-edit-process-filter-expansion-header\" class=\"adf-edit-process-filter-header\">\n <ng-container *ngIf=\"!isLoading; else loadingTemplate\">\n <mat-panel-title *ngIf=\"showProcessFilterName\" id=\"adf-edit-process-filter-title-id\" class=\"adf-edit-process-filter-header__title\">\n {{processFilter.name | translate}}</mat-panel-title>\n <mat-panel-description class=\"adf-edit-process-filter-header__description\" id=\"adf-edit-process-filter-sub-title-id\">\n <span *ngIf=\"showTitle\"> {{ 'ADF_CLOUD_EDIT_PROCESS_FILTER.TITLE' | translate}}</span>\n <div *ngIf=\"showFilterActions\" class=\"adf-cloud-edit-process-filter-actions\">\n <ng-container *ngIf=\"toggleFilterActions\">\n <button *ngFor=\"let filterAction of processFilterActions\"\n mat-icon-button\n [title]=\"filterAction.tooltip | translate\"\n [attr.data-automation-id]=\"'adf-filter-action-' + filterAction.actionType\"\n [disabled]=\"isDisabledAction(filterAction)\"\n (click)=\"executeFilterActions($event, filterAction)\">\n <adf-icon [value]=\"filterAction.icon\" />\n </button>\n </ng-container>\n </div>\n </mat-panel-description>\n </ng-container>\n <ng-template #loadingTemplate>\n <div class=\"adf-cloud-edit-process-filter-loading-margin\">\n <mat-spinner [diameter]=\"30\" />\n </div>\n </ng-template>\n </mat-expansion-panel-header>\n <ng-container *ngIf=\"!isLoading\">\n <form [formGroup]=\"editProcessFilterForm\" *ngIf=\"editProcessFilterForm\" class=\"adf-edit-process-filter-content\">\n <div class=\"adf-edit-process-filter-form\">\n <ng-container *ngFor=\"let processFilterProperty of processFilterProperties; trackBy: filterTracker\">\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'select'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__select-label\">{{processFilterProperty.label | translate}}</mat-label>\n <mat-select\n [formControlName]=\"processFilterProperty.key\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\">\n <mat-option\n *ngFor=\"let propertyOption of processFilterProperty.options\"\n [value]=\"propertyOption.value\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-options-' + processFilterProperty.key\"\n >{{ propertyOption.label | translate }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'multi-select'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__select-label\">{{processFilterProperty.label | translate}}</mat-label>\n <mat-select\n [formControlName]=\"processFilterProperty.key\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"\n [multiple]=\"true\">\n <mat-option *ngFor=\"let propertyOption of processFilterProperty.options\" [value]=\"propertyOption.value\" [attr.data-automation-id]=\"'adf-cloud-edit-process-property-options-' + processFilterProperty.key\">\n {{ propertyOption.label | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'text'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__text-label\">{{processFilterProperty.label | translate}}</mat-label>\n <input matInput\n [formControlName]=\"processFilterProperty.key\"\n type=\"text\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"/>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'number'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <input matInput\n [formControlName]=\"processFilterProperty.key\"\n type=\"number\" min=\"0\"\n placeholder=\"{{processFilterProperty.label | translate}}\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"/>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'date'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label>{{processFilterProperty.label | translate}}</mat-label>\n <input\n matInput\n [formControlName]=\"processFilterProperty.key\"\n (keyup)=\"onDateChanged($any($event).target.value, processFilterProperty)\"\n (dateChange)=\"onDateChanged($event.value, processFilterProperty)\"\n [matDatepicker]=\"dateController\"\n placeholder=\"{{processFilterProperty.label | translate}}\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\">\n <mat-datepicker-toggle\n matSuffix [for]=\"dateController\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-date-toggle-' + processFilterProperty.key\" />\n <mat-datepicker #dateController [attr.data-automation-id]=\"'adf-cloud-edit-process-property-date-picker-' + processFilterProperty.key\" />\n <div class=\"adf-edit-process-filter-date-error-container\">\n <div *ngIf=\"hasError(processFilterProperty)\">\n <div class=\"adf-error-text\">{{'ADF_CLOUD_EDIT_PROCESS_FILTER.ERROR.DATE' | translate}}</div>\n <mat-icon class=\"adf-error-icon\">warning</mat-icon>\n </div>\n </div>\n </mat-form-field>\n\n <adf-cloud-date-range-filter *ngIf=\"processFilterProperty.type === 'date-range'\"\n [processFilterProperty]=\"processFilterProperty\"\n [options]=\"processFilterProperty.dateFilterOptions\"\n (dateTypeChange)=\"onDateTypeChange($event, processFilterProperty)\"\n (dateChanged)=\"onDateRangeFilterChanged($event, processFilterProperty)\" />\n <adf-cloud-people\n *ngIf=\"processFilterProperty.type === 'people'\"\n [preSelectUsers]=\"initiatorOptions\"\n [title]=\"processFilterProperty.label\"\n [validate]=\"true\"\n [appName]=\"appName\"\n [mode]=\"processFilterProperty.selectionMode\"\n (changedUsers)=\"onChangedUser($event, processFilterProperty)\" />\n </ng-container>\n </div>\n </form>\n </ng-container>\n </mat-expansion-panel>\n</mat-accordion>\n", styles: [".adf-edit-process-filter-date-error-container{position:absolute;height:20px;margin-top:12px;width:100%}.adf-edit-process-filter-date-error-container>div{display:flex;flex-flow:row;justify-content:flex-start}.adf-edit-process-filter-date-error-container .adf-error-text{padding-right:8px;height:16px;font-size:var(--theme-caption-font-size);line-height:1.33;color:var(--theme-warn-color);width:auto}.adf-edit-process-filter-date-error-container .adf-error-icon{font-size:var(--theme-subheading-2-font-size);color:var(--theme-warn-color)}.adf-cloud-edit-process-filter-loading-margin{margin-left:calc((100% - 100px)/2);margin-right:calc((100% - 100px)/2)}.adf-edit-process-filter-form{flex-flow:row wrap;display:flex;max-width:100%;place-content:stretch flex-start;align-items:stretch}.adf-edit-process-filter-form :not(:last-child){margin-right:10px}.adf-edit-process-filter-form mat-form-field,.adf-edit-process-filter-form adf-cloud-people{flex:1 1 23%;max-width:23%}@media (max-width: 599.9px){.adf-edit-process-filter-form{flex-flow:column}.adf-edit-process-filter-form :not(:last-child){margin-bottom:10px;margin-right:0}}.adf-edit-process-filter-header{height:48px}.adf-edit-process-filter-header__title{color:var(--adf-theme-foreground-text-color)}.adf-edit-process-filter-header__description{color:var(--adf-theme-foreground-secondary-text-color);place-content:center space-between}.adf-edit-process-filter-content__text-label,.adf-edit-process-filter-content__select-label{color:var(--adf-theme-foreground-secondary-text-color)}\n"] }]
772
- }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.MatDialog }, { type: i3.DateAdapter }, { type: i4.UserPreferencesService }, { type: i4.TranslationService }, { type: i5.ProcessFilterCloudService }, { type: i6.AppsProcessCloudService }, { type: i7.ProcessCloudService }], propDecorators: { appName: [{
773
- type: Input
774
- }], role: [{
775
- type: Input
776
- }], id: [{
777
- type: Input
778
- }], filterProperties: [{
779
- type: Input
780
- }], sortProperties: [{
781
- type: Input
782
- }], actions: [{
783
- type: Input
784
- }], environmentId: [{
785
- type: Input
786
- }], environmentList: [{
787
- type: Input
788
- }], showFilterActions: [{
789
- type: Input
790
- }], showTitle: [{
791
- type: Input
792
- }], showProcessFilterName: [{
793
- type: Input
794
- }], filterChange: [{
795
- type: Output
796
- }], action: [{
797
- type: Output
798
- }], processFilter: [{
799
- type: Input
800
- }] } });
801
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1wcm9jZXNzLWZpbHRlci1jbG91ZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvcHJvY2Vzcy1zZXJ2aWNlcy1jbG91ZC9zcmMvbGliL3Byb2Nlc3MvcHJvY2Vzcy1maWx0ZXJzL2NvbXBvbmVudHMvZWRpdC1wcm9jZXNzLWZpbHRlci9lZGl0LXByb2Nlc3MtZmlsdGVyLWNsb3VkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzLWNsb3VkL3NyYy9saWIvcHJvY2Vzcy9wcm9jZXNzLWZpbHRlcnMvY29tcG9uZW50cy9lZGl0LXByb2Nlc3MtZmlsdGVyL2VkaXQtcHJvY2Vzcy1maWx0ZXItY2xvdWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEosT0FBTyxFQUFtQixXQUFXLEVBQTBCLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzlGLE9BQU8sRUFFSCx1QkFBdUIsRUFJMUIsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFF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QkFERCxLQUFLO2dCQUtOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUtOLGNBQWM7c0JBRGIsS0FBSztnQkFLTixPQUFPO3NCQUROLEtBQUs7Z0JBS04sYUFBYTtzQkFEWixLQUFLO2dCQUtOLGVBQWU7c0JBRGQsS0FBSztnQkFLTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBS04sU0FBUztzQkFEUixLQUFLO2dCQUtOLHFCQUFxQjtzQkFEcEIsS0FBSztnQkFLTixZQUFZO3NCQURYLE1BQU07Z0JBS1AsTUFBTTtzQkFETCxNQUFNO2dCQVlILGFBQWE7c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRGVzdHJveVJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpbmFsaXplLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9hcHAvc2VydmljZXMvYXBwcy1wcm9jZXNzLWNsb3VkLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBQcm9jZXNzRmlsdGVyQWN0aW9uLFxuICAgIFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsLFxuICAgIFByb2Nlc3NGaWx0ZXJPcHRpb25zLFxuICAgIFByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzLFxuICAgIFByb2Nlc3NTb3J0RmlsdGVyUHJvcGVydHlcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3Byb2Nlc3MtZmlsdGVyLWNsb3VkLm1vZGVsJztcbmltcG9ydCB7IERhdGVGbnNVdGlscywgSWNvbkNvbXBvbmVudCwgVHJhbnNsYXRpb25TZXJ2aWNlLCBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlLCBVc2VyUHJlZmVyZW5jZVZhbHVlcyB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBQcm9jZXNzRmlsdGVyQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJvY2Vzcy1maWx0ZXItY2xvdWQuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9jZXNzRmlsdGVyRGlhbG9nQ2xvdWRDb21wb25lbnQgfSBmcm9tICcuLi9wcm9jZXNzLWZpbHRlci1kaWFsb2cvcHJvY2Vzcy1maWx0ZXItZGlhbG9nLWNsb3VkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9jZXNzQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcHJvY2Vzcy1jbG91ZC5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVDbG91ZEZpbHRlclR5cGUsIERhdGVSYW5nZUZpbHRlciB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9kYXRlLWNsb3VkLWZpbHRlci5tb2RlbCc7XG5pbXBvcnQgeyBJZGVudGl0eVVzZXJNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3Blb3BsZS9tb2RlbHMvaWRlbnRpdHktdXNlci5tb2RlbCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi9pbnRlcmZhY2UvZW52aXJvbm1lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGVuZE9mRGF5LCBpc1ZhbGlkLCBzdGFydE9mRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTmdGb3JPZiwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRFeHBhbnNpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBEYXRlUmFuZ2VGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vZGF0ZS1yYW5nZS1maWx0ZXIvZGF0ZS1yYW5nZS1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBlb3BsZUNsb3VkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcGVvcGxlL2NvbXBvbmVudHMvcGVvcGxlLWNsb3VkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjb25zdCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRSA9ICdzYXZlJztcbmV4cG9ydCBjb25zdCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9BUyA9ICdzYXZlQXMnO1xuZXhwb3J0IGNvbnN0IFBST0NFU1NfRklMVEVSX0FDVElPTl9ERUxFVEUgPSAnZGVsZXRlJztcbmV4cG9ydCBjb25zdCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9ERUZBVUxUID0gJ3NhdmVEZWZhdWx0RmlsdGVyJztcbmV4cG9ydCBjb25zdCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fUkVTVE9SRSA9ICdyZXN0b3JlRGVmYXVsdEZpbHRlcic7XG5jb25zdCBERUZBVUxUX1BST0NFU1NfRklMVEVSX1BST1BFUlRJRVMgPSBbJ3N0YXR1cycsICdzb3J0JywgJ29yZGVyJywgJ2xhc3RNb2RpZmllZCddO1xuY29uc3QgREVGQVVMVF9TT1JUX1BST1BFUlRJRVMgPSBbJ2lkJywgJ25hbWUnLCAnc3RhdHVzJywgJ3N0YXJ0RGF0ZSddO1xuY29uc3QgREVGQVVMVF9BQ1RJT05TID0gWydzYXZlJywgJ3NhdmVBcycsICdkZWxldGUnXTtcblxuZXhwb3J0IGludGVyZmFjZSBEcm9wZG93bk9wdGlvbiB7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBsYWJlbDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUHJvY2Vzc0ZpbHRlckZvcm1Qcm9wcyB7XG4gICAgYXBwTmFtZT86IEZvcm1Db250cm9sPHN0cmluZz47XG4gICAgYXBwVmVyc2lvbj86IEZvcm1Db250cm9sPG51bWJlciB8IG51bWJlcltdPjtcbiAgICBwcm9jZXNzRGVmaW5pdGlvbk5hbWU/OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgIGxhc3RNb2RpZmllZEZyb20/OiBGb3JtQ29udHJvbDxEYXRlPjtcbiAgICBsYXN0TW9kaWZpZWRUbz86IEZvcm1Db250cm9sPERhdGU+O1xuICAgIHN0YXR1cz86IEZvcm1Db250cm9sPHN0cmluZz47XG4gICAgb3JkZXI/OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgIHNvcnQ/OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgIGNvbXBsZXRlZERhdGVUeXBlPzogRm9ybUNvbnRyb2w8RGF0ZUNsb3VkRmlsdGVyVHlwZT47XG4gICAgW3g6IHN0cmluZ106IEZvcm1Db250cm9sPHVua25vd24+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1jbG91ZC1lZGl0LXByb2Nlc3MtZmlsdGVyJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgSWNvbkNvbXBvbmVudCxcbiAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVQaXBlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE5nRm9yT2YsXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE1hdEV4cGFuc2lvbk1vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxuICAgICAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBEYXRlUmFuZ2VGaWx0ZXJDb21wb25lbnQsXG4gICAgICAgIFBlb3BsZUNsb3VkQ29tcG9uZW50XG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZWRpdC1wcm9jZXNzLWZpbHRlci1jbG91ZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZWRpdC1wcm9jZXNzLWZpbHRlci1jbG91ZC5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRWRpdFByb2Nlc3NGaWx0ZXJDbG91ZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXBwTmFtZTogc3RyaW5nID0gJyc7XG5cbiAgICAvKiogcm9sZXMgdG8gZmlsdGVyIHRoZSBhcHBzICovXG4gICAgQElucHV0KClcbiAgICByb2xlOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBJZCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXIuICovXG4gICAgQElucHV0KClcbiAgICBpZDogc3RyaW5nO1xuXG4gICAgLyoqIExpc3Qgb2YgcHJvY2VzcyBmaWx0ZXIgcHJvcGVydGllcyB0byBkaXNwbGF5ICovXG4gICAgQElucHV0KClcbiAgICBmaWx0ZXJQcm9wZXJ0aWVzID0gREVGQVVMVF9QUk9DRVNTX0ZJTFRFUl9QUk9QRVJUSUVTO1xuXG4gICAgLyoqIExpc3Qgb2Ygc29ydCBwcm9wZXJ0aWVzIHRvIGRpc3BsYXkuICovXG4gICAgQElucHV0KClcbiAgICBzb3J0UHJvcGVydGllcyA9IERFRkFVTFRfU09SVF9QUk9QRVJUSUVTO1xuXG4gICAgLyoqIExpc3Qgb2Ygc29ydCBhY3Rpb25zLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWN0aW9ucyA9IERFRkFVTFRfQUNUSU9OUztcblxuICAgIC8qKiBFbnZpcm9ubWVudCBJRCBvZiB0aGUgYXBwbGljYXRpb24uICovXG4gICAgQElucHV0KClcbiAgICBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG5cbiAgICAvKiogTGlzdCBvZiBlbnZpcm9ubWVudHMuICovXG4gICAgQElucHV0KClcbiAgICBlbnZpcm9ubWVudExpc3Q6IEVudmlyb25tZW50W10gPSBbXTtcblxuICAgIC8qKiBUb2dnbGVzIGVkaXRpbmcgb2YgcHJvY2VzcyBmaWx0ZXIgYWN0aW9ucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dGaWx0ZXJBY3Rpb25zID0gdHJ1ZTtcblxuICAgIC8qKiBUb2dnbGVzIGVkaXRpbmcgb2YgdGhlIHByb2Nlc3MgZmlsdGVyIHRpdGxlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1RpdGxlID0gdHJ1ZTtcblxuICAgIC8qKiBUb2dnbGVzIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9jZXNzIGZpbHRlciBuYW1lIC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dQcm9jZXNzRmlsdGVyTmFtZSA9IHRydWU7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXIgcHJvcGVydHkgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIGZpbHRlciBhY3Rpb24gb2NjdXJzIGkuZSBTYXZlLCBTYXZlQXMsIERlbGV0ZS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFByb2Nlc3NGaWx0ZXJBY3Rpb24+KCk7XG5cbiAgICBwcml2YXRlIF9maWx0ZXI6IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsO1xuICAgIHByb3RlY3RlZCBmaWx0ZXJIYXNCZWVuQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgZ2V0IHByb2Nlc3NGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqIFByb2Nlc3MgZmlsdGVyICovXG4gICAgQElucHV0KClcbiAgICBzZXQgcHJvY2Vzc0ZpbHRlcih2YWx1ZTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwpIHtcbiAgICAgICAgY29uc3QgaXNDaGFuZ2VkID0gdGhpcy5pc0ZpbHRlckNoYW5nZWQodGhpcy5fZmlsdGVyLCB2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5fZmlsdGVyID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHZhbHVlPy5hcHBOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcE5hbWUgPSB2YWx1ZS5hcHBOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlPy5pZCkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IHZhbHVlLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlPy5lbnZpcm9ubWVudElkKSB7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50SWQgPSB2YWx1ZS5lbnZpcm9ubWVudElkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyUHJvcGVydGllcyA9IHRoaXMuY3JlYXRlQW5kRmlsdGVyUHJvcGVydGllcygpO1xuICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXJBY3Rpb25zID0gdGhpcy5jcmVhdGVBbmRGaWx0ZXJBY3Rpb25zKCk7XG4gICAgICAgIHRoaXMuYnVpbGRGb3JtKHRoaXMucHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpO1xuXG4gICAgICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdHVzOiBBcnJheTxEcm9wZG93bk9wdGlvbj4gPSBbXG4gICAgICAgIHsgdmFsdWU6ICcnLCBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0ZJTFRFUlMuU1RBVFVTLkFMTCcgfSxcbiAgICAgICAgeyB2YWx1ZTogJ1JVTk5JTkcnLCBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0ZJTFRFUlMuU1RBVFVTLlJVTk5JTkcnIH0sXG4gICAgICAgIHsgdmFsdWU6ICdTVVNQRU5ERUQnLCBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0ZJTFRFUlMuU1RBVFVTLlNVU1BFTkRFRCcgfSxcbiAgICAgICAgeyB2YWx1ZTogJ0NBTkNFTExFRCcsIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfRklMVEVSUy5TVEFUVVMuQ0FOQ0VMTEVEJyB9LFxuICAgICAgICB7IHZhbHVlOiAnQ09NUExFVEVEJywgbGFiZWw6ICdBREZfQ0xPVURfUFJPQ0VTU19GSUxURVJTLlNUQVRVUy5DT01QTEVURUQnIH1cbiAgICBdO1xuICAgIGRpcmVjdGlvbnM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IFtcbiAgICAgICAgeyB2YWx1ZTogJ0FTQycsIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfRklMVEVSUy5ESVJFQ1RJT04uQVNDRU5ESU5HJyB9LFxuICAgICAgICB7IHZhbHVlOiAnREVTQycsIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfRklMVEVSUy5ESVJFQ1RJT04uREVTQ0VORElORycgfVxuICAgIF07XG4gICAgYWN0aW9uRGlzYWJsZWRGb3JEZWZhdWx0ID0gW1BST0NFU1NfRklMVEVSX0FDVElPTl9TQVZFLCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fREVMRVRFXTtcbiAgICBhcHBsaWNhdGlvbk5hbWVzOiBhbnlbXSA9IFtdO1xuICAgIGFsbFByb2Nlc3NEZWZpbml0aW9uTmFtZXNPcHRpb246IERyb3Bkb3duT3B0aW9uID0ge1xuICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0ZJTFRFUlMuU1RBVFVTLkFMTCcsXG4gICAgICAgIHZhbHVlOiAnJ1xuICAgIH07XG4gICAgcHJvY2Vzc0RlZmluaXRpb25OYW1lczogYW55W10gPSBbXTtcbiAgICBlZGl0UHJvY2Vzc0ZpbHRlckZvcm06IEZvcm1Hcm91cDxQcm9jZXNzRmlsdGVyRm9ybVByb3BzPjtcbiAgICBwcm9jZXNzRmlsdGVyUHJvcGVydGllczogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXNbXSA9IFtdO1xuICAgIHByb2Nlc3NGaWx0ZXJBY3Rpb25zOiBQcm9jZXNzRmlsdGVyQWN0aW9uW10gPSBbXTtcbiAgICB0b2dnbGVGaWx0ZXJBY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XG4gICAgYXBwVmVyc2lvbk9wdGlvbnM6IFByb2Nlc3NGaWx0ZXJPcHRpb25zW10gPSBbXTtcbiAgICBpbml0aWF0b3JPcHRpb25zOiBJZGVudGl0eVVzZXJNb2RlbFtdID0gW107XG5cbiAgICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGZpbHRlckNoYW5nZVN1YjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgIHByaXZhdGUgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxuICAgICAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHByb2Nlc3NGaWx0ZXJDbG91ZFNlcnZpY2U6IFByb2Nlc3NGaWx0ZXJDbG91ZFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2U6IEFwcHNQcm9jZXNzQ2xvdWRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHByb2Nlc3NDbG91ZFNlcnZpY2U6IFByb2Nlc3NDbG91ZFNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlXG4gICAgICAgICAgICAuc2VsZWN0KFVzZXJQcmVmZXJlbmNlVmFsdWVzLkxvY2FsZSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobG9jYWxlKSA9PiB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZShsb2NhbGUpKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IGlkID0gY2hhbmdlc1snaWQnXTtcbiAgICAgICAgaWYgKGlkICYmIGlkLmN1cnJlbnRWYWx1ZSAhPT0gaWQucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5yZXRyaWV2ZVByb2Nlc3NGaWx0ZXJBbmRCdWlsZEZvcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaWx0ZXJUcmFja2VyKF9pbmRleDogbnVtYmVyLCBpdGVtOiBQcm9jZXNzRmlsdGVyUHJvcGVydGllcykge1xuICAgICAgICByZXR1cm4gaXRlbS5rZXk7XG4gICAgfVxuXG4gICAgYnVpbGRGb3JtKHByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzOiBQcm9jZXNzRmlsdGVyUHJvcGVydGllc1tdKSB7XG4gICAgICAgIHRoaXMuZWRpdFByb2Nlc3NGaWx0ZXJGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh0aGlzLmdldEZvcm1Db250cm9sc0NvbmZpZyhwcm9jZXNzRmlsdGVyUHJvcGVydGllcykpO1xuICAgICAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgZ2V0Rm9ybUNvbnRyb2xzQ29uZmlnKHByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzOiBQcm9jZXNzRmlsdGVyUHJvcGVydGllc1tdKTogYW55IHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlc0NvbnRyb2xDb25maWcocHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbcHJvcGVydHkua2V5XTogcHJvcGVydHkudmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLnJlZHVjZSgocmVzdWx0LCBjdXJyZW50KSA9PiBPYmplY3QuYXNzaWduKHJlc3VsdCwgY3VycmVudCksIHt9KTtcbiAgICB9XG5cbiAgICBnZXQgbGFzdE1vZGlmaWVkRnJvbSgpOiBBYnN0cmFjdENvbnRyb2w8RGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0uZ2V0KCdsYXN0TW9kaWZpZWRGcm9tJyk7XG4gICAgfVxuXG4gICAgZ2V0IGxhc3RNb2RpZmllZFRvKCk6IEFic3RyYWN0Q29udHJvbDxEYXRlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRQcm9jZXNzRmlsdGVyRm9ybS5nZXQoJ2xhc3RNb2RpZmllZFRvJyk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbXBsZXRlZERhdGVUeXBlKCk6IEFic3RyYWN0Q29udHJvbDxEYXRlQ2xvdWRGaWx0ZXJUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRQcm9jZXNzRmlsdGVyRm9ybS5nZXQoJ2NvbXBsZXRlZERhdGVUeXBlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBdHRyaWJ1dGVzQ29udHJvbENvbmZpZyhwcm9wZXJ0eTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocHJvcGVydHkuYXR0cmlidXRlcykucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwcm9wZXJ0eS52YWx1ZVtrZXldO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXIgYnkgYXBwbGljYXRpb24gbmFtZSBhbmQgZmlsdGVyIGlkIGFuZCBjcmVhdGVzIGZpbHRlciBwcm9wZXJ0aWVzLCBidWlsZCBmb3JtXG4gICAgICovXG4gICAgcmV0cmlldmVQcm9jZXNzRmlsdGVyQW5kQnVpbGRGb3JtKCkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNsb3VkU2VydmljZVxuICAgICAgICAgICAgLmdldEZpbHRlckJ5SWQodGhpcy5hcHBOYW1lLCB0aGlzLmlkKVxuICAgICAgICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gKHRoaXMuaXNMb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJIYXNCZWVuQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlciA9IG5ldyBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbChPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSB8fCB7fSwgdGhpcy5wcm9jZXNzRmlsdGVyIHx8IHt9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBwcm9jZXNzIGluc3RhbmNlIGZpbHRlciBjaGFuZ2VzXG4gICAgICovXG4gICAgb25GaWx0ZXJDaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckNoYW5nZVN1Yikge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJDaGFuZ2VTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyQ2hhbmdlU3ViID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyQ2hhbmdlU3ViID0gdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5pc0Zvcm1WYWxpZCgpKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZm9ybVZhbHVlczogUGFydGlhbDxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldExhc3RNb2RpZmllZEZyb21GaWx0ZXIoZm9ybVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMYXN0TW9kaWZpZWRUb0ZpbHRlcihmb3JtVmFsdWVzKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvY2Vzc0ZpbHRlciwgZm9ybVZhbHVlcykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWQgPSAhdGhpcy5jb21wYXJlRmlsdGVycyhuZXdWYWx1ZSwgdGhpcy5wcm9jZXNzRmlsdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckhhc0JlZW5DaGFuZ2VkID0gY2hhbmdlZDtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlciA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVBbmRGaWx0ZXJQcm9wZXJ0aWVzKCk6IFByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzW10ge1xuICAgICAgICB0aGlzLmNoZWNrTWFuZGF0b3J5RmlsdGVyUHJvcGVydGllcygpO1xuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlclByb3BlcnRpZXMuaW5jbHVkZXMoJ2FwcE5hbWUnKSkge1xuICAgICAgICAgICAgdGhpcy5nZXREZXBsb3llZEFwcGxpY2F0aW9ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyUHJvcGVydGllcy5pbmNsdWRlcygncHJvY2Vzc0RlZmluaXRpb25OYW1lJykpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb25zKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJQcm9wZXJ0aWVzLmluY2x1ZGVzKCdhcHBWZXJzaW9uTXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgdGhpcy5nZXRBcHBWZXJzaW9uT3B0aW9ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyUHJvcGVydGllcy5pbmNsdWRlcygnaW5pdGlhdG9yJykpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhdG9yT3B0aW9ucyA9IHRoaXMucHJvY2Vzc0ZpbHRlci5pbml0aWF0b3JcbiAgICAgICAgICAgICAgICA/IHRoaXMucHJvY2Vzc0ZpbHRlci5pbml0aWF0b3Iuc3BsaXQoJywnKS5tYXAoKHVzZXJuYW1lKSA9PiBPYmplY3QuYXNzaWduKHt9LCB7IHVzZXJuYW1lIH0pKVxuICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0UHJvcGVydGllcyA9IHRoaXMuY3JlYXRlUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXModGhpcy5wcm9jZXNzRmlsdGVyKTtcbiAgICAgICAgbGV0IGZpbHRlcmVkUHJvcGVydGllcyA9IGRlZmF1bHRQcm9wZXJ0aWVzLmZpbHRlcigoZmlsdGVyUHJvcGVydHkpID0+IHRoaXMuaXNWYWxpZFByb3BlcnR5KHRoaXMuZmlsdGVyUHJvcGVydGllcywgZmlsdGVyUHJvcGVydHkua2V5KSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlclByb3BlcnRpZXMuaW5jbHVkZXMoJ3NvcnQnKSkge1xuICAgICAgICAgICAgZmlsdGVyZWRQcm9wZXJ0aWVzID0gZmlsdGVyZWRQcm9wZXJ0aWVzLmZpbHRlcigocHJvcGVydHkpID0+IHByb3BlcnR5LmtleSAhPT0gJ29yZGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJQcm9wZXJ0aWVzLmluY2x1ZGVzKCdsYXN0TW9kaWZpZWQnKSkge1xuICAgICAgICAgICAgZmlsdGVyZWRQcm9wZXJ0aWVzID0gWy4uLmZpbHRlcmVkUHJvcGVydGllcywgLi4udGhpcy5jcmVhdGVMYXN0TW9kaWZpZWRQcm9wZXJ0eSh0aGlzLnByb2Nlc3NGaWx0ZXIpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgY2hlY2tNYW5kYXRvcnlGaWx0ZXJQcm9wZXJ0aWVzKCkge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgfHwgdGhpcy5maWx0ZXJQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJQcm9wZXJ0aWVzID0gREVGQVVMVF9QUk9DRVNTX0ZJTFRFUl9QUk9QRVJUSUVTO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkUHJvcGVydHkoZmlsdGVyUHJvcGVydGllczogc3RyaW5nW10sIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJQcm9wZXJ0aWVzID8gZmlsdGVyUHJvcGVydGllcy5pbmRleE9mKGtleSkgPj0gMCA6IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0IGNyZWF0ZVNvcnRQcm9wZXJ0aWVzKCk6IFByb2Nlc3NGaWx0ZXJPcHRpb25zW10ge1xuICAgICAgICB0aGlzLmNoZWNrTWFuZGF0b3J5U29ydFByb3BlcnRpZXMoKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFNvcnRQcm9wZXJ0aWVzID0gdGhpcy5jcmVhdGVQcm9jZXNzU29ydFByb3BlcnRpZXMoKTtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRTb3J0UHJvcGVydGllcy5maWx0ZXIoKHNvcnRQcm9wZXJ0eSkgPT4gdGhpcy5pc1ZhbGlkUHJvcGVydHkodGhpcy5zb3J0UHJvcGVydGllcywgc29ydFByb3BlcnR5LmtleSkpO1xuICAgIH1cblxuICAgIGdldEFwcFZlcnNpb25PcHRpb25zKCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NDbG91ZFNlcnZpY2UuZ2V0QXBwbGljYXRpb25WZXJzaW9ucyh0aGlzLmFwcE5hbWUpLnN1YnNjcmliZSgoYXBwVmVyc2lvbnMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBwVmVyc2lvbk9wdGlvbnMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGFwcFZlcnNpb25zLmZvckVhY2goKGFwcFZlcnNpb24pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcFZlcnNpb25PcHRpb25zLnB1c2goeyBsYWJlbDogYXBwVmVyc2lvbi5lbnRyeS52ZXJzaW9uLCB2YWx1ZTogYXBwVmVyc2lvbi5lbnRyeS52ZXJzaW9uIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoZWNrTWFuZGF0b3J5U29ydFByb3BlcnRpZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnNvcnRQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgfHwgdGhpcy5zb3J0UHJvcGVydGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc29ydFByb3BlcnRpZXMgPSBERUZBVUxUX1NPUlRfUFJPUEVSVElFUztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUFuZEZpbHRlckFjdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tNYW5kYXRvcnlBY3Rpb25zKCk7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmNyZWF0ZUZpbHRlckFjdGlvbnMoKTtcbiAgICAgICAgcmV0dXJuIGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IHRoaXMuaXNWYWxpZEFjdGlvbih0aGlzLmFjdGlvbnMsIGFjdGlvbikpO1xuICAgIH1cblxuICAgIGNoZWNrTWFuZGF0b3J5QWN0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuYWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IERFRkFVTFRfQUNUSU9OUztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZEFjdGlvbihhY3Rpb25zOiBzdHJpbmdbXSwgYWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhY3Rpb25zID8gYWN0aW9ucy5pbmRleE9mKGFjdGlvbi5hY3Rpb25UeXBlKSA+PSAwIDogdHJ1ZTtcbiAgICB9XG5cbiAgICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdFByb2Nlc3NGaWx0ZXJGb3JtLnZhbGlkO1xuICAgIH1cblxuICAgIGdldFByb3BlcnR5Q29udHJvbGxlcihwcm9wZXJ0eTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0uZ2V0KHByb3BlcnR5LmtleSk7XG4gICAgfVxuXG4gICAgb25EYXRlQ2hhbmdlZChuZXdEYXRlVmFsdWU6IERhdGUgfCBzdHJpbmcsIGRhdGVQcm9wZXJ0eTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKG5ld0RhdGVWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuZ2V0UHJvcGVydHlDb250cm9sbGVyKGRhdGVQcm9wZXJ0eSk7XG5cbiAgICAgICAgICAgIGxldCBkYXRlID0gbmV3RGF0ZVZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG5ld0RhdGVWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBkYXRlID0gRGF0ZUZuc1V0aWxzLnBhcnNlRGF0ZShuZXdEYXRlVmFsdWUsICdkZC9NTS95eXl5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRWYWx1ZShkYXRlKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnNldEVycm9ycyhudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRWYWx1ZShkYXRlKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRhdGVUeXBlQ2hhbmdlKGRhdGVUeXBlOiBEYXRlQ2xvdWRGaWx0ZXJUeXBlLCBwcm9wZXJ0eTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0uZ2V0KHByb3BlcnR5LmF0dHJpYnV0ZXMuZGF0ZVR5cGUpLnNldFZhbHVlKGRhdGVUeXBlKTtcbiAgICB9XG5cbiAgICBvbkRhdGVSYW5nZUZpbHRlckNoYW5nZWQoZGF0ZVJhbmdlOiBEYXRlUmFuZ2VGaWx0ZXIsIHByb3BlcnR5OiBQcm9jZXNzRmlsdGVyUHJvcGVydGllcykge1xuICAgICAgICB0aGlzLmVkaXRQcm9jZXNzRmlsdGVyRm9ybS5nZXQocHJvcGVydHkuYXR0cmlidXRlcz8uZnJvbSkuc2V0VmFsdWUoZGF0ZVJhbmdlLnN0YXJ0RGF0ZSA/IGRhdGVSYW5nZS5zdGFydERhdGUgOiBudWxsKTtcbiAgICAgICAgdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0uZ2V0KHByb3BlcnR5LmF0dHJpYnV0ZXM/LnRvKS5zZXRWYWx1ZShkYXRlUmFuZ2UuZW5kRGF0ZSA/IGRhdGVSYW5nZS5lbmREYXRlIDogbnVsbCk7XG4gICAgICAgIHRoaXMuZWRpdFByb2Nlc3NGaWx0ZXJGb3JtLmdldChwcm9wZXJ0eS5hdHRyaWJ1dGVzLmRhdGVUeXBlKS5zZXRWYWx1ZShEYXRlQ2xvdWRGaWx0ZXJUeXBlLlJBTkdFKTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZWRVc2VyKHVzZXJzOiBJZGVudGl0eVVzZXJNb2RlbFtdLCBwcm9jZXNzUHJvcGVydHk6IFByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMuZ2V0UHJvcGVydHlDb250cm9sbGVyKHByb2Nlc3NQcm9wZXJ0eSkuc2V0VmFsdWUodXNlcnMubWFwKCh1c2VyKSA9PiB1c2VyLnVzZXJuYW1lKS5qb2luKCcsJykpO1xuICAgIH1cblxuICAgIGhhc0Vycm9yKHByb3BlcnR5OiBQcm9jZXNzRmlsdGVyUHJvcGVydGllcyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRQcm9wZXJ0eUNvbnRyb2xsZXIocHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gISFjb250cm9sbGVyLmVycm9ycz8uaW52YWxpZDtcbiAgICB9XG5cbiAgICBjb21wYXJlRmlsdGVycyhlZGl0ZWRRdWVyeTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwsIGN1cnJlbnRRdWVyeTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVkaXRlZFF1ZXJ5KS50b0xvd2VyQ2FzZSgpID09PSBKU09OLnN0cmluZ2lmeShjdXJyZW50UXVlcnkpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0RGVwbG95ZWRBcHBsaWNhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuYXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2UuZ2V0RGVwbG95ZWRBcHBsaWNhdGlvbnNCeVN0YXR1cygnREVQTE9ZRUQnLCB0aGlzLnJvbGUpLnN1YnNjcmliZSgoYXBwbGljYXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXBwbGljYXRpb25zICYmIGFwcGxpY2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk5hbWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLm1hcCgoYXBwbGljYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk5hbWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuYXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2UuZ2V0QXBwbGljYXRpb25MYWJlbChhcHBsaWNhdGlvbiwgdGhpcy5lbnZpcm9ubWVudExpc3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFwcGxpY2F0aW9uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFByb2Nlc3NEZWZpbml0aW9ucygpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzQ2xvdWRTZXJ2aWNlLmdldFByb2Nlc3NEZWZpbml0aW9ucyh0aGlzLmFwcE5hbWUpLnN1YnNjcmliZSgocHJvY2Vzc0RlZmluaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzc0RlZmluaXRpb25zICYmIHByb2Nlc3NEZWZpbml0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWVzLnB1c2godGhpcy5hbGxQcm9jZXNzRGVmaW5pdGlvbk5hbWVzT3B0aW9uKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbnMubWFwKChwcm9jZXNzRGVmaW5pdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZXMucHVzaCh7IGxhYmVsOiBwcm9jZXNzRGVmaW5pdGlvbi5uYW1lLCB2YWx1ZTogcHJvY2Vzc0RlZmluaXRpb24ubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhlY3V0ZUZpbHRlckFjdGlvbnMoZXZlbnQ6IEV2ZW50LCBhY3Rpb246IFByb2Nlc3NGaWx0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKGFjdGlvbi5hY3Rpb25UeXBlID09PSBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlKGFjdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmFjdGlvblR5cGUgPT09IFBST0NFU1NfRklMVEVSX0FDVElPTl9TQVZFX0FTKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBcyhhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5hY3Rpb25UeXBlID09PSBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fREVMRVRFKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5hY3Rpb25UeXBlID09PSBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9ERUZBVUxUKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmUoYWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uYWN0aW9uVHlwZSA9PT0gUFJPQ0VTU19GSUxURVJfQUNUSU9OX1JFU1RPUkUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBzYXZlKHNhdmVBY3Rpb246IFByb2Nlc3NGaWx0ZXJBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyQ2xvdWRTZXJ2aWNlLnVwZGF0ZUZpbHRlcih0aGlzLnByb2Nlc3NGaWx0ZXIpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBzYXZlQWN0aW9uLmZpbHRlciA9IHRoaXMucHJvY2Vzc0ZpbHRlcjtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySGFzQmVlbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uLmVtaXQoc2F2ZUFjdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVsZXRlQWN0aW9uIGZpbHRlciBhY3Rpb25cbiAgICAgKi9cbiAgICBkZWxldGUoZGVsZXRlQWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNsb3VkU2VydmljZVxuICAgICAgICAgICAgLmRlbGV0ZUZpbHRlcih0aGlzLnByb2Nlc3NGaWx0ZXIpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGZpbHRlcnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlQWN0aW9uLmZpbHRlciA9IHRoaXMucHJvY2Vzc0ZpbHRlcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb24uZW1pdChkZWxldGVBY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVycy5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucmVzdG9yZURlZmF1bHRQcm9jZXNzRmlsdGVycygpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZSBBcyBhIHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2F2ZUFzQWN0aW9uIGZpbHRlciBhY3Rpb25cbiAgICAgKi9cbiAgICBzYXZlQXMoc2F2ZUFzQWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUHJvY2Vzc0ZpbHRlckRpYWxvZ0Nsb3VkQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5wcm9jZXNzRmlsdGVyLm5hbWUpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgICBtaW5XaWR0aDogJzMwJSdcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5hY3Rpb24gPT09IFByb2Nlc3NGaWx0ZXJEaWFsb2dDbG91ZENvbXBvbmVudC5BQ1RJT05fU0FWRSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcklkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcktleSA9IHRoaXMuZ2V0U2FuaXRpemVGaWx0ZXJOYW1lKHJlc3VsdC5uYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdGaWx0ZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiByZXN1bHQuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGZpbHRlcklkLFxuICAgICAgICAgICAgICAgICAgICBrZXk6ICdjdXN0b20tJyArIGZpbHRlcktleVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0RmlsdGVyOiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvY2Vzc0ZpbHRlciwgbmV3RmlsdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXJDbG91ZFNlcnZpY2UuYWRkRmlsdGVyKHJlc3VsdEZpbHRlcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUFzQWN0aW9uLmZpbHRlciA9IHJlc3VsdEZpbHRlcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJIYXNCZWVuQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbi5lbWl0KHNhdmVBc0FjdGlvbik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlc2V0KHJlc2V0QWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNsb3VkU2VydmljZVxuICAgICAgICAgICAgLnJlc2V0UHJvY2Vzc0ZpbHRlclRvRGVmYXVsdHModGhpcy5hcHBOYW1lLCB0aGlzLnByb2Nlc3NGaWx0ZXIpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKGZpbHRlcnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzZXRBY3Rpb24uZmlsdGVyID0gZmlsdGVycy5maW5kKChkZWZhdWx0RmlsdGVyKSA9PiBkZWZhdWx0RmlsdGVyLm5hbWUgPT09IHRoaXMucHJvY2Vzc0ZpbHRlci5uYW1lKSB8fCB0aGlzLnByb2Nlc3NGaWx0ZXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uLmVtaXQocmVzZXRBY3Rpb24pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlc3RvcmVEZWZhdWx0UHJvY2Vzc0ZpbHRlcnMoKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzYW5pdGl6ZWQgZmlsdGVyIG5hbWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIGZpbHRlciBuYW1lXG4gICAgICogQHJldHVybnMgc2FuaXRpemVkIGZpbHRlciBuYW1lXG4gICAgICovXG4gICAgZ2V0U2FuaXRpemVGaWx0ZXJOYW1lKGZpbHRlck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG5hbWVXaXRoSHlwaGVuID0gdGhpcy5yZXBsYWNlU3BhY2VXaXRoSHlwaGVuKGZpbHRlck5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIG5hbWVXaXRoSHlwaGVuLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIG5hbWUgd2l0aCBoeXBoZW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIG5hbWVcbiAgICAgKiBAcmV0dXJucyB1cGRhdGVkIHZhbHVlXG4gICAgICovXG4gICAgcmVwbGFjZVNwYWNlV2l0aEh5cGhlbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZWdFeHQgPSBuZXcgUmVnRXhwKCcgJywgJ2cnKTtcbiAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZShyZWdFeHQsICctJyk7XG4gICAgfVxuXG4gICAgcmVzdG9yZURlZmF1bHRQcm9jZXNzRmlsdGVycygpOiBPYnNlcnZhYmxlPFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0ZpbHRlckNsb3VkU2VydmljZS5nZXRQcm9jZXNzRmlsdGVycyh0aGlzLmFwcE5hbWUpO1xuICAgIH1cblxuICAgIG9uRXhwYW5kKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZUZpbHRlckFjdGlvbnMgPSB0cnVlO1xuICAgIH1cblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlRmlsdGVyQWN0aW9ucyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlzRGlzYWJsZWRBY3Rpb24oYWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGaWx0ZXJDbG91ZFNlcnZpY2UuaXNEZWZhdWx0RmlsdGVyKHRoaXMucHJvY2Vzc0ZpbHRlci5uYW1lKSAmJiB0aGlzLmFjdGlvbkRpc2FibGVkRm9yRGVmYXVsdC5pbmNsdWRlcyhhY3Rpb24uYWN0aW9uVHlwZSlcbiAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgOiB0aGlzLmhhc0ZpbHRlckNoYW5nZWQoYWN0aW9uKTtcbiAgICB9XG5cbiAgICBoYXNGaWx0ZXJDaGFuZ2VkKGFjdGlvbjogUHJvY2Vzc0ZpbHRlckFjdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmFjdGlvblR5cGUgPT09IFBST0NFU1NfRklMVEVSX0FDVElPTl9TQVZFIHx8IGFjdGlvbi5hY3Rpb25UeXBlID09PSBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9BU1xuICAgICAgICAgICAgPyAhdGhpcy5maWx0ZXJIYXNCZWVuQ2hhbmdlZFxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExhc3RNb2RpZmllZFRvRmlsdGVyKGZvcm1WYWx1ZXM6IFBhcnRpYWw8UHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWw+KSB7XG4gICAgICAgIGlmIChpc1ZhbGlkKGZvcm1WYWx1ZXMubGFzdE1vZGlmaWVkVG8pKSB7XG4gICAgICAgICAgICBmb3JtVmFsdWVzLmxhc3RNb2RpZmllZFRvID0gZW5kT2ZEYXkoZm9ybVZhbHVlcy5sYXN0TW9kaWZpZWRUbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExhc3RNb2RpZmllZEZyb21GaWx0ZXIoZm9ybVZhbHVlczogUGFydGlhbDxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbD4pIHtcbiAgICAgICAgaWYgKGlzVmFsaWQoZm9ybVZhbHVlcy5sYXN0TW9kaWZpZWRGcm9tKSkge1xuICAgICAgICAgICAgZm9ybVZhbHVlcy5sYXN0TW9kaWZpZWRGcm9tID0gc3RhcnRPZkRheShmb3JtVmFsdWVzLmxhc3RNb2RpZmllZEZyb20pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJBY3Rpb25zKCk6IFByb2Nlc3NGaWx0ZXJBY3Rpb25bXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVHlwZTogUFJPQ0VTU19GSUxURVJfQUNUSU9OX1NBVkUsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2FkZjpzYXZlJyxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuVE9PTF9USVAuU0FWRSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVHlwZTogUFJPQ0VTU19GSUxURVJfQUNUSU9OX1NBVkVfQVMsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2FkZjpzYXZlLWFzJyxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuVE9PTF9USVAuU0FWRV9BUydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVHlwZTogUFJPQ0VTU19GSUxURVJfQUNUSU9OX0RFTEVURSxcbiAgICAgICAgICAgICAgICBpY29uOiAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuVE9PTF9USVAuREVMRVRFJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25UeXBlOiBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9ERUZBVUxULFxuICAgICAgICAgICAgICAgIGljb246ICdhZGY6c2F2ZScsXG4gICAgICAgICAgICAgICAgdG9vbHRpcDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLlRPT0xfVElQLlNBVkUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvblR5cGU6IFBST0NFU1NfRklMVEVSX0FDVElPTl9SRVNUT1JFLFxuICAgICAgICAgICAgICAgIGljb246ICdzZXR0aW5nc19iYWNrdXBfcmVzdG9yZScsXG4gICAgICAgICAgICAgICAgdG9vbHRpcDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLlRPT0xfVElQLlJFU1RPUkUnXG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVMYXN0TW9kaWZpZWRQcm9wZXJ0eShmaWx0ZXJNb2RlbDogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwpOiBQcm9jZXNzRmlsdGVyUHJvcGVydGllc1tdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLkxBU1RfTU9ESUZJRURfREFURV9GT1JNJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgICAgICAga2V5OiAnbGFzdE1vZGlmaWVkRnJvbScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlck1vZGVsLmxhc3RNb2RpZmllZEZyb21cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5MQVNUX01PRElGSUVEX1RPJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgICAgICAga2V5OiAnbGFzdE1vZGlmaWVkVG8nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5sYXN0TW9kaWZpZWRUb1xuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUHJvY2Vzc1NvcnRQcm9wZXJ0aWVzKCk6IFByb2Nlc3NTb3J0RmlsdGVyUHJvcGVydHlbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5JRCcsXG4gICAgICAgICAgICAgICAga2V5OiAnaWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnaWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnRW52aXJvbm1lbnRJZCcsXG4gICAgICAgICAgICAgICAga2V5OiAnZW52aXJvbm1lbnRJZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdlbnZpcm9ubWVudElkJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlBST0NFU1NfTkFNRScsXG4gICAgICAgICAgICAgICAga2V5OiAnbmFtZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICduYW1lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlNUQVJUX0RBVEUnLFxuICAgICAgICAgICAgICAgIGtleTogJ3N0YXJ0RGF0ZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdzdGFydERhdGUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuU1RBVFVTJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdzdGF0dXMnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnc3RhdHVzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlNUQVJURURfQlknLFxuICAgICAgICAgICAgICAgIGtleTogJ2luaXRpYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdpbml0aWF0b3InXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQVBQX05BTUUnLFxuICAgICAgICAgICAgICAgIGtleTogJ2FwcE5hbWUnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnYXBwTmFtZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5BUFBfVkVSU0lPTicsXG4gICAgICAgICAgICAgICAga2V5OiAnYXBwVmVyc2lvbicsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdhcHBWZXJzaW9uJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLk1BSU5fUFJPQ0VTU19JRCcsXG4gICAgICAgICAgICAgICAga2V5OiAncGFyZW50SWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAncGFyZW50SWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuUFJPQ0VTU19JTlNfSUQnLFxuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NJbnN0YW5jZUlkJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3Byb2Nlc3NJbnN0YW5jZUlkJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlBST0NFU1NfREVGX0lEJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdwcm9jZXNzRGVmaW5pdGlvbklkJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3Byb2Nlc3NEZWZpbml0aW9uSWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuUFJPQ0VTU19ERUZfTkFNRScsXG4gICAgICAgICAgICAgICAga2V5OiAncHJvY2Vzc0RlZmluaXRpb25OYW1lJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3Byb2Nlc3NEZWZpbml0aW9uTmFtZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5QUk9DRVNTX0RFRl9LRVknLFxuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NEZWZpbml0aW9uS2V5JyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3Byb2Nlc3NEZWZpbml0aW9uS2V5J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLkxBU1RfTU9ESUZJRUQnLFxuICAgICAgICAgICAgICAgIGtleTogJ2xhc3RNb2RpZmllZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdsYXN0TW9kaWZpZWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQlVTSU5FU1NfS0VZJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdidXNpbmVzc0tleScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdidXNpbmVzc0tleSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRmlsdGVyQ2hhbmdlZChvbGRWYWx1ZTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwsIG5ld1ZhbHVlOiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBvbGRKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5wcm9jZXNzRmlsdGVyQ2xvdWRTZXJ2aWNlLndyaXRlUXVlcnlQYXJhbXMob2xkVmFsdWUgfHwge30sIHRoaXMuZmlsdGVyUHJvcGVydGllcykpO1xuICAgICAgICBjb25zdCBuZXdKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5wcm9jZXNzRmlsdGVyQ2xvdWRTZXJ2aWNlLndyaXRlUXVlcnlQYXJhbXMobmV3VmFsdWUgfHwge30sIHRoaXMuZmlsdGVyUHJvcGVydGllcykpO1xuXG4gICAgICAgIHJldHVybiBvbGRKc29uICE9PSBuZXdKc29uO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMoZmlsdGVyTW9kZWw6IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsKTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXNbXSB7XG4gICAgICAgIGNvbnN0IGFwcFZlcnNpb25NdWx0aXBsZSA9IFtdO1xuXG4gICAgICAgIGlmIChmaWx0ZXJNb2RlbC5hcHBWZXJzaW9uKSB7XG4gICAgICAgICAgICBhcHBWZXJzaW9uTXVsdGlwbGUucHVzaChcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGZpbHRlck1vZGVsLmFwcFZlcnNpb24pID8gZmlsdGVyTW9kZWwuYXBwVmVyc2lvbi5tYXAoKGVudHJ5KSA9PiBlbnRyeS50b1N0cmluZygpKSA6IGAke2ZpbHRlck1vZGVsLmFwcFZlcnNpb259YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5BUFBfTkFNRScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAga2V5OiAnYXBwTmFtZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlck1vZGVsLmFwcE5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5hcHBsaWNhdGlvbk5hbWVzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQVBQX1ZFUlNJT04nLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIGtleTogJ2FwcFZlcnNpb24nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5hcHBWZXJzaW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQVBQX1ZFUlNJT04nLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdtdWx0aS1zZWxlY3QnLFxuICAgICAgICAgICAgICAgIGtleTogJ2FwcFZlcnNpb25NdWx0aXBsZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGFwcFZlcnNpb25NdWx0aXBsZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLmFwcFZlcnNpb25PcHRpb25zXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuUFJPQ0VTU19JTlNfSUQnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdwcm9jZXNzSW5zdGFuY2VJZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlck1vZGVsLnByb2Nlc3NJbnN0YW5jZUlkIHx8ICcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuTUFJTl9QUk9DRVNTX0lEJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAga2V5OiAncGFyZW50SWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5wYXJlbnRJZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlBST0NFU1NfTkFNRScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NOYW1lJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyTW9kZWwucHJvY2Vzc05hbWUgfHwgJydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5QUk9DRVNTX0RFRl9OQU1FJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdwcm9jZXNzRGVmaW5pdGlvbk5hbWUnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5wcm9jZXNzRGVmaW5pdGlvbk5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWVzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuU1RBVFVTJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdzdGF0dXMnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5zdGF0dXMgfHwgdGhpcy5zdGF0dXNbMF0udmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5zdGF0dXNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5QUk9DRVNTX0RFRl9JRCcsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NEZWZpbml0aW9uSWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5wcm9jZXNzRGVmaW5pdGlvbklkIHx8ICcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuUFJPQ0VTU19ERUZfS0VZJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAga2V5OiAncHJvY2Vzc0RlZmluaXRpb25LZXknLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5wcm9jZXNzRGVmaW5pdGlvbktleSB8fCAnJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlNPUlQnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgIGtleTogJ3NvcnQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5zb3J0IHx8IHRoaXMuY3JlYXRlU29ydFByb3BlcnRpZXNbMF0udmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5jcmVhdGVTb3J0UHJvcGVydGllc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLkRJUkVDVElPTicsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAga2V5OiAnb3JkZXInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5vcmRlciB8fCB0aGlzLmRpcmVjdGlvbnNbMF0udmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5kaXJlY3Rpb25zXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQ09NUExFVEVEX0RBVEUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdjb21wbGV0ZWREYXRlJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyTW9kZWwuY29tcGxldGVkRGF0ZSB8fCBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlNUQVJURURfQlknLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwZW9wbGUnLFxuICAgICAgICAgICAgICAgIGtleTogJ2luaXRpYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlck1vZGVsLmluaXRpYXRvcixcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlOiAnbXVsdGlwbGUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQ09NUExFVEVEX0RBVEUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdkYXRlLXJhbmdlJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdjb21wbGV0ZWREYXRlUmFuZ2UnLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZGF0ZVR5cGU6ICdjb21wbGV0ZWREYXRlVHlwZScsIGZyb206ICdfY29tcGxldGVkRnJvbScsIHRvOiAnX2NvbXBsZXRlZFRvJyB9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZERhdGVUeXBlOiBmaWx0ZXJNb2RlbC5jb21wbGV0ZWREYXRlVHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICBfY29tcGxldGVkRnJvbTogZmlsdGVyTW9kZWwuY29tcGxldGVkRnJvbSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICBfY29tcGxldGVkVG86IGZpbHRlck1vZGVsLmNvbXBsZXRlZFRvIHx8IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuU1RBUlRFRF9EQVRFJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGF0ZS1yYW5nZScsXG4gICAgICAgICAgICAgICAga2V5OiAnc3RhcnRlZERhdGVSYW5nZScsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBkYXRlVHlwZTogJ3N0YXJ0ZWREYXRlVHlwZScsIGZyb206ICdfc3RhcnRGcm9tJywgdG86ICdfc3RhcnRUbycgfSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBzdGFydGVkRGF0ZVR5cGU6IGZpbHRlck1vZGVsLnN0YXJ0ZWREYXRlVHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICBfc3RhcnRGcm9tOiBmaWx0ZXJNb2RlbC5zdGFydEZyb20gfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgX3N0YXJ0VG86IGZpbHRlck1vZGVsLnN0YXJ0VG8gfHwgbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5TVVNQRU5ERURfREFURScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhdGUtcmFuZ2UnLFxuICAgICAgICAgICAgICAgIGtleTogJ3N1c3BlbmRlZERhdGVSYW5nZScsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBkYXRlVHlwZTogJ3N1c3BlbmRlZERhdGVUeXBlJywgZnJvbTogJ19zdXNwZW5kZWRGcm9tJywgdG86ICdfc3VzcGVuZGVkVG8nIH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkRGF0ZVR5cGU6IGZpbHRlck1vZGVsLnN1c3BlbmRlZERhdGVUeXBlIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIF9zdXNwZW5kZWRGcm9tOiBmaWx0ZXJNb2RlbC5zdXNwZW5kZWRGcm9tIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIF9zdXNwZW5kZWRUbzogZmlsdGVyTW9kZWwuc3VzcGVuZGVkVG8gfHwgbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG59XG4iLCI8bWF0LWFjY29yZGlvbiBbaGlkZVRvZ2dsZV09XCJpc0xvYWRpbmdcIiBjbGFzcz1cImFkZi1lZGl0LXByb2Nlc3MtZmlsdGVyXCI+XG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKGFmdGVyRXhwYW5kKT1cIm9uRXhwYW5kKClcIiAoY2xvc2VkKT1cIm9uQ2xvc2UoKVwiPlxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgKm5nSWY9XCJwcm9jZXNzRmlsdGVyXCIgaWQ9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1leHBhbnNpb24taGVhZGVyXCIgY2xhc3M9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nOyBlbHNlIGxvYWRpbmdUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGUgKm5nSWY9XCJzaG93UHJvY2Vzc0ZpbHRlck5hbWVcIiBpZD1cImFkZi1lZGl0LXByb2Nlc3MtZmlsdGVyLXRpdGxlLWlkXCIgY2xhc3M9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1oZWFkZXJfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7cHJvY2Vzc0ZpbHRlci5uYW1lIHwgdHJhbnNsYXRlfX08L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLWRlc2NyaXB0aW9uICBjbGFzcz1cImFkZi1lZGl0LXByb2Nlc3MtZmlsdGVyLWhlYWRlcl9fZGVzY3JpcHRpb25cIiBpZD1cImFkZi1lZGl0LXByb2Nlc3MtZmlsdGVyLXN1Yi10aXRsZS1pZFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dUaXRsZVwiPiB7eyAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuVElUTEUnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RmlsdGVyQWN0aW9uc1wiIGNsYXNzPVwiYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1maWx0ZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRvZ2dsZUZpbHRlckFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBmaWx0ZXJBY3Rpb24gb2YgcHJvY2Vzc0ZpbHRlckFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZmlsdGVyQWN0aW9uLnRvb2x0aXAgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cIidhZGYtZmlsdGVyLWFjdGlvbi0nICsgZmlsdGVyQWN0aW9uLmFjdGlvblR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRBY3Rpb24oZmlsdGVyQWN0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0ZUZpbHRlckFjdGlvbnMoJGV2ZW50LCBmaWx0ZXJBY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGYtaWNvbiBbdmFsdWVdPVwiZmlsdGVyQWN0aW9uLmljb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLWRlc2NyaXB0aW9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvYWRpbmdUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1maWx0ZXItbG9hZGluZy1tYXJnaW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCIzMFwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJlZGl0UHJvY2Vzc0ZpbHRlckZvcm1cIiAqbmdJZj1cImVkaXRQcm9jZXNzRmlsdGVyRm9ybVwiIGNsYXNzPVwiYWRmLWVkaXQtcHJvY2Vzcy1maWx0ZXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1mb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eSBvZiBwcm9jZXNzRmlsdGVyUHJvcGVydGllczsgdHJhY2tCeTogZmlsdGVyVHJhY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtmbG9hdExhYmVsXT1cIidhdXRvJ1wiICpuZ0lmPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LnR5cGUgPT09ICdzZWxlY3QnXCIgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiYWRmLWVkaXQtcHJvY2Vzcy1maWx0ZXItY29udGVudF9fc2VsZWN0LWxhYmVsXCI+e3twcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWwgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByb3BlcnR5T3B0aW9uIG9mIHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwcm9wZXJ0eU9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwiJ2FkZi1jbG91ZC1lZGl0LXByb2Nlc3MtcHJvcGVydHktb3B0aW9ucy0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBwcm9wZXJ0eU9wdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtmbG9hdExhYmVsXT1cIidhdXRvJ1wiICpuZ0lmPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LnR5cGUgPT09ICdtdWx0aS1zZWxlY3QnXCIgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiYWRmLWVkaXQtcHJvY2Vzcy1maWx0ZXItY29udGVudF9fc2VsZWN0LWxhYmVsXCI+e3twcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWwgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBwcm9wZXJ0eU9wdGlvbiBvZiBwcm9jZXNzRmlsdGVyUHJvcGVydHkub3B0aW9uc1wiIFt2YWx1ZV09XCJwcm9wZXJ0eU9wdGlvbi52YWx1ZVwiIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS1vcHRpb25zLScgKyBwcm9jZXNzRmlsdGVyUHJvcGVydHkua2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwcm9wZXJ0eU9wdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBbZmxvYXRMYWJlbF09XCInYXV0bydcIiAqbmdJZj1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS50eXBlID09PSAndGV4dCdcIiBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1jb250ZW50X190ZXh0LWxhYmVsXCI+e3twcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWwgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgW2Zsb2F0TGFiZWxdPVwiJ2F1dG8nXCIgKm5nSWY9XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkudHlwZSA9PT0gJ251bWJlcidcIiBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3twcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWwgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgW2Zsb2F0TGFiZWxdPVwiJ2F1dG8nXCIgKm5nSWY9XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkudHlwZSA9PT0gJ2RhdGUnXCIgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7cHJvY2Vzc0ZpbHRlclByb3BlcnR5LmxhYmVsIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cIm9uRGF0ZUNoYW5nZWQoJGFueSgkZXZlbnQpLnRhcmdldC52YWx1ZSwgcHJvY2Vzc0ZpbHRlclByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uRGF0ZUNoYW5nZWQoJGV2ZW50LnZhbHVlLCBwcm9jZXNzRmlsdGVyUHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiZGF0ZUNvbnRyb2xsZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7cHJvY2Vzc0ZpbHRlclByb3BlcnR5LmxhYmVsIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwiJ2FkZi1jbG91ZC1lZGl0LXByb2Nlc3MtcHJvcGVydHktJyArIHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFN1ZmZpeCBbZm9yXT1cImRhdGVDb250cm9sbGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwiJ2FkZi1jbG91ZC1lZGl0LXByb2Nlc3MtcHJvcGVydHktZGF0ZS10b2dnbGUtJyArIHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjZGF0ZUNvbnRyb2xsZXIgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cIidhZGYtY2xvdWQtZWRpdC1wcm9jZXNzLXByb3BlcnR5LWRhdGUtcGlja2VyLScgKyBwcm9jZXNzRmlsdGVyUHJvcGVydHkua2V5XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWVkaXQtcHJvY2Vzcy1maWx0ZXItZGF0ZS1lcnJvci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc0Vycm9yKHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZXJyb3ItdGV4dFwiPnt7J0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkVSUk9SLkRBVEUnIHwgdHJhbnNsYXRlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi1lcnJvci1pY29uXCI+d2FybmluZzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGFkZi1jbG91ZC1kYXRlLXJhbmdlLWZpbHRlciAqbmdJZj1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS50eXBlID09PSAnZGF0ZS1yYW5nZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9jZXNzRmlsdGVyUHJvcGVydHldPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkuZGF0ZUZpbHRlck9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlVHlwZUNoYW5nZSk9XCJvbkRhdGVUeXBlQ2hhbmdlKCRldmVudCwgcHJvY2Vzc0ZpbHRlclByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVDaGFuZ2VkKT1cIm9uRGF0ZVJhbmdlRmlsdGVyQ2hhbmdlZCgkZXZlbnQsIHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFkZi1jbG91ZC1wZW9wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS50eXBlID09PSAncGVvcGxlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZVNlbGVjdFVzZXJzXT1cImluaXRpYXRvck9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwTmFtZV09XCJhcHBOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZV09XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkuc2VsZWN0aW9uTW9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZWRVc2Vycyk9XCJvbkNoYW5nZWRVc2VyKCRldmVudCwgcHJvY2Vzc0ZpbHRlclByb3BlcnR5KVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG48L21hdC1hY2NvcmRpb24+XG4iXX0=