@alfresco/adf-process-services-cloud 8.1.0-16120632321 → 8.1.0-16121703802

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 (172) hide show
  1. package/esm2022/adf-process-services-cloud.mjs +5 -0
  2. package/esm2022/lib/app/app-list-cloud.module.mjs +20 -0
  3. package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +67 -0
  4. package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +125 -0
  5. package/esm2022/lib/app/models/application-instance.model.mjs +24 -0
  6. package/esm2022/lib/app/public-api.mjs +22 -0
  7. package/esm2022/lib/app/services/apps-process-cloud.service.mjs +97 -0
  8. package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +163 -0
  9. package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +97 -0
  10. package/esm2022/lib/common/index.mjs +18 -0
  11. package/esm2022/lib/common/interface/environment.interface.mjs +18 -0
  12. package/esm2022/lib/common/interface/index.mjs +18 -0
  13. package/esm2022/lib/common/interface/public-api.mjs +18 -0
  14. package/esm2022/lib/common/public-api.mjs +19 -0
  15. package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +57 -0
  16. package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +31 -0
  17. package/esm2022/lib/form/components/form-cloud.component.mjs +415 -0
  18. package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +53 -0
  19. package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +35 -0
  20. package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +249 -0
  21. package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +136 -0
  22. package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +107 -0
  23. package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +120 -0
  24. package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +122 -0
  25. package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +189 -0
  26. package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +85 -0
  27. package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +80 -0
  28. package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +463 -0
  29. package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +29 -0
  30. package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +46 -0
  31. package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +82 -0
  32. package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +91 -0
  33. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +81 -0
  34. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +53 -0
  35. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +86 -0
  36. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +116 -0
  37. package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +187 -0
  38. package/esm2022/lib/form/form-cloud.module.mjs +103 -0
  39. package/esm2022/lib/form/models/form-cloud-representation.model.mjs +48 -0
  40. package/esm2022/lib/form/models/task-variable-cloud.model.mjs +28 -0
  41. package/esm2022/lib/form/public-api.mjs +44 -0
  42. package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +120 -0
  43. package/esm2022/lib/form/services/display-mode.service.mjs +146 -0
  44. package/esm2022/lib/form/services/form-cloud.service.interface.mjs +18 -0
  45. package/esm2022/lib/form/services/form-cloud.service.mjs +201 -0
  46. package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +18 -0
  47. package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +51 -0
  48. package/esm2022/lib/form/services/form-utils.service.mjs +37 -0
  49. package/esm2022/lib/form/services/process-cloud-content.service.mjs +71 -0
  50. package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +52 -0
  51. package/esm2022/lib/group/components/group-cloud.component.mjs +423 -0
  52. package/esm2022/lib/group/group-cloud.module.mjs +33 -0
  53. package/esm2022/lib/group/models/identity-group.model.mjs +18 -0
  54. package/esm2022/lib/group/public-api.mjs +21 -0
  55. package/esm2022/lib/group/services/identity-group.service.mjs +89 -0
  56. package/esm2022/lib/models/application-version.model.mjs +21 -0
  57. package/esm2022/lib/models/constant-values.type.mjs +18 -0
  58. package/esm2022/lib/models/data-column-custom-data.mjs +18 -0
  59. package/esm2022/lib/models/date-cloud-filter.model.mjs +31 -0
  60. package/esm2022/lib/models/date-format-cloud.model.mjs +18 -0
  61. package/esm2022/lib/models/engine-event-cloud.model.mjs +18 -0
  62. package/esm2022/lib/models/filter-cloud-model.mjs +128 -0
  63. package/esm2022/lib/models/process-definition-cloud.model.mjs +32 -0
  64. package/esm2022/lib/models/process-instance-variable.model.mjs +18 -0
  65. package/esm2022/lib/models/process-variable-filter.model.mjs +18 -0
  66. package/esm2022/lib/models/task-cloud.model.mjs +23 -0
  67. package/esm2022/lib/models/task-list-sorting.model.mjs +40 -0
  68. package/esm2022/lib/models/variable-definition.mjs +18 -0
  69. package/esm2022/lib/people/components/people-cloud.component.mjs +498 -0
  70. package/esm2022/lib/people/models/identity-user.model.mjs +18 -0
  71. package/esm2022/lib/people/people-cloud.module.mjs +33 -0
  72. package/esm2022/lib/people/public-api.mjs +21 -0
  73. package/esm2022/lib/people/services/identity-user.service.mjs +119 -0
  74. package/esm2022/lib/process/process-cloud.module.mjs +40 -0
  75. package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +801 -0
  76. package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +58 -0
  77. package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +292 -0
  78. package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +170 -0
  79. package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +44 -0
  80. package/esm2022/lib/process/process-filters/public-api.mjs +23 -0
  81. package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +408 -0
  82. package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +137 -0
  83. package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +33 -0
  84. package/esm2022/lib/process/process-header/public-api.mjs +19 -0
  85. package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +593 -0
  86. package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +31 -0
  87. package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +18 -0
  88. package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +24 -0
  89. package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +37 -0
  90. package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +107 -0
  91. package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +40 -0
  92. package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +45 -0
  93. package/esm2022/lib/process/process-list/public-api.mjs +25 -0
  94. package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +253 -0
  95. package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +109 -0
  96. package/esm2022/lib/process/public-api.mjs +23 -0
  97. package/esm2022/lib/process/services/process-cloud.service.mjs +105 -0
  98. package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +480 -0
  99. package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +18 -0
  100. package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +26 -0
  101. package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +26 -0
  102. package/esm2022/lib/process/start-process/public-api.mjs +21 -0
  103. package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +125 -0
  104. package/esm2022/lib/process-services-cloud.module.mjs +91 -0
  105. package/esm2022/lib/rich-text-editor/editorjs-config.mjs +101 -0
  106. package/esm2022/lib/rich-text-editor/index.mjs +18 -0
  107. package/esm2022/lib/rich-text-editor/public-api.mjs +19 -0
  108. package/esm2022/lib/rich-text-editor/rich-text-editor.component.mjs +80 -0
  109. package/esm2022/lib/rich-text-editor/rich-text-editor.module.mjs +33 -0
  110. package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +186 -0
  111. package/esm2022/lib/screen/models/screen-cloud.model.mjs +18 -0
  112. package/esm2022/lib/screen/public-api.mjs +18 -0
  113. package/esm2022/lib/services/base-cloud.service.mjs +83 -0
  114. package/esm2022/lib/services/cloud-token.service.mjs +23 -0
  115. package/esm2022/lib/services/form-fields.interfaces.mjs +55 -0
  116. package/esm2022/lib/services/local-preference-cloud.service.mjs +122 -0
  117. package/esm2022/lib/services/notification-cloud.service.mjs +45 -0
  118. package/esm2022/lib/services/preference-cloud.interface.mjs +18 -0
  119. package/esm2022/lib/services/public-api.mjs +28 -0
  120. package/esm2022/lib/services/screen-rendering.service.mjs +30 -0
  121. package/esm2022/lib/services/task-list-cloud.service.interface.mjs +18 -0
  122. package/esm2022/lib/services/user-preference-cloud.service.mjs +105 -0
  123. package/esm2022/lib/services/variable-mapper.sevice.mjs +77 -0
  124. package/esm2022/lib/services/web-socket.service.mjs +146 -0
  125. package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +32 -0
  126. package/esm2022/lib/task/models/task-details-cloud.model.mjs +26 -0
  127. package/esm2022/lib/task/models/task.model.mjs +23 -0
  128. package/esm2022/lib/task/public-api.mjs +26 -0
  129. package/esm2022/lib/task/services/task-cloud.service.mjs +272 -0
  130. package/esm2022/lib/task/task-cloud.module.mjs +45 -0
  131. package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +59 -0
  132. package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +467 -0
  133. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +205 -0
  134. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +317 -0
  135. package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +146 -0
  136. package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +142 -0
  137. package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +72 -0
  138. package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +255 -0
  139. package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +207 -0
  140. package/esm2022/lib/task/task-filters/public-api.mjs +27 -0
  141. package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +283 -0
  142. package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +392 -0
  143. package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +56 -0
  144. package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +214 -0
  145. package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +89 -0
  146. package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +283 -0
  147. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +101 -0
  148. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +87 -0
  149. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +78 -0
  150. package/esm2022/lib/task/task-form/public-api.mjs +21 -0
  151. package/esm2022/lib/task/task-form/task-form.module.mjs +36 -0
  152. package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +280 -0
  153. package/esm2022/lib/task/task-header/public-api.mjs +19 -0
  154. package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +33 -0
  155. package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +331 -0
  156. package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +115 -0
  157. package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +31 -0
  158. package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +389 -0
  159. package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +18 -0
  160. package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +18 -0
  161. package/esm2022/lib/task/task-list/public-api.mjs +23 -0
  162. package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +115 -0
  163. package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +178 -0
  164. package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +57 -0
  165. package/esm2022/lib/types.mjs +18 -0
  166. package/esm2022/public-api.mjs +40 -0
  167. package/fesm2022/adf-process-services-cloud.mjs +355 -350
  168. package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
  169. package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
  170. package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
  171. package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
  172. package/package.json +6 -4
@@ -0,0 +1,480 @@
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, HostListener, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
18
+ import { ConfirmDialogComponent, InplaceFormInputComponent, LocalizedDatePipe, TranslationService, isOutcomeButtonVisible } from '@alfresco/adf-core';
19
+ import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
20
+ import { MatAutocompleteModule, MatAutocompleteTrigger } from '@angular/material/autocomplete';
21
+ import { catchError, debounceTime, map } from 'rxjs/operators';
22
+ import { ProcessPayloadCloud } from '../models/process-payload-cloud.model';
23
+ import { ProcessWithFormPayloadCloud } from '../models/process-with-form-payload-cloud.model';
24
+ import { StartProcessCloudService } from '../services/start-process-cloud.service';
25
+ import { BehaviorSubject, forkJoin, of, combineLatest } from 'rxjs';
26
+ import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
27
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
28
+ import { getTime } from 'date-fns';
29
+ import { CommonModule } from '@angular/common';
30
+ import { TranslatePipe } from '@ngx-translate/core';
31
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
32
+ import { MatCardModule } from '@angular/material/card';
33
+ import { MatButtonModule } from '@angular/material/button';
34
+ import { MatIconModule } from '@angular/material/icon';
35
+ import { MatInputModule } from '@angular/material/input';
36
+ import { MatOptionModule } from '@angular/material/core';
37
+ import { FormCloudComponent } from '../../../form/components/form-cloud.component';
38
+ import { FormCustomOutcomesComponent } from '../../../form/components/form-cloud-custom-outcomes.component';
39
+ import { MatDialog } from '@angular/material/dialog';
40
+ import * as i0 from "@angular/core";
41
+ import * as i1 from "@alfresco/adf-core";
42
+ import * as i2 from "@angular/common";
43
+ import * as i3 from "@angular/material/progress-spinner";
44
+ import * as i4 from "@angular/material/card";
45
+ import * as i5 from "@angular/material/button";
46
+ import * as i6 from "@angular/material/icon";
47
+ import * as i7 from "@angular/material/input";
48
+ import * as i8 from "@angular/material/form-field";
49
+ import * as i9 from "@angular/material/core";
50
+ import * as i10 from "@angular/material/autocomplete";
51
+ import * as i11 from "@angular/forms";
52
+ const MAX_NAME_LENGTH = 255;
53
+ const PROCESS_DEFINITION_DEBOUNCE = 300;
54
+ const DATE_TIME_IDENTIFIER_REG_EXP = new RegExp('%{datetime}', 'i');
55
+ const PROCESS_DEFINITION_IDENTIFIER_REG_EXP = new RegExp('%{processdefinition}', 'i');
56
+ export class StartProcessCloudComponent {
57
+ get isProcessFormValid() {
58
+ if (this.hasForm && this.isFormCloudLoaded) {
59
+ return (this.formCloud ? !Object.keys(this.formCloud.values).length : false) || this.formCloud?.isValid || this.isProcessStarting;
60
+ }
61
+ else {
62
+ return this.processForm.valid || this.isProcessStarting;
63
+ }
64
+ }
65
+ get disableStartButton() {
66
+ return !this.appName || !this.processDefinition.valid || this.isProcessStarting || this.isFormCloudLoading;
67
+ }
68
+ get isProcessDefinitionsEmpty() {
69
+ return !this.processDefinitionList.length;
70
+ }
71
+ get processInstanceName() {
72
+ return this.processForm.controls.processInstanceName;
73
+ }
74
+ get processDefinition() {
75
+ return this.processForm.controls.processDefinition;
76
+ }
77
+ get hasForm() {
78
+ return !!this.processDefinitionCurrent?.formKey;
79
+ }
80
+ get defaultStartProcessButtonLabel() {
81
+ return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.START').toUpperCase();
82
+ }
83
+ get defaultCancelProcessButtonLabel() {
84
+ return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.CANCEL').toUpperCase();
85
+ }
86
+ constructor(translateService) {
87
+ this.translateService = translateService;
88
+ /** (required) Name of the app. */
89
+ this.appName = '';
90
+ /** Maximum length of the process name. */
91
+ this.maxNameLength = MAX_NAME_LENGTH;
92
+ /** Name of the process. */
93
+ this.name = '';
94
+ /** Show/hide the process dropdown list. */
95
+ this.showSelectProcessDropdown = true;
96
+ /** Show/hide title. */
97
+ this.showTitle = true;
98
+ /** Show/hide cancel button. */
99
+ this.showCancelButton = true;
100
+ /** Toggle rendering of the `Open next task` checkbox. */
101
+ this.showNextTaskCheckbox = false;
102
+ /** Whether the `Open next task` checkbox is checked by default or not. */
103
+ this.isNextTaskCheckboxChecked = false;
104
+ /** Emitted when the process is successfully started. */
105
+ this.success = new EventEmitter();
106
+ /** Emitted when the starting process is cancelled */
107
+ this.cancel = new EventEmitter();
108
+ /** Emitted when an error occurs. */
109
+ this.error = new EventEmitter();
110
+ /** Emitted when form content is clicked. */
111
+ this.formContentClicked = new EventEmitter();
112
+ /** Emitted when process definition selection changes. */
113
+ this.processDefinitionSelection = new EventEmitter();
114
+ /** Emitted when the `Open next task` checkbox was toggled. */
115
+ this.nextTaskCheckboxCheckedChanged = new EventEmitter();
116
+ this.processDefinitionList = [];
117
+ this.errorMessageId = '';
118
+ this.processPayloadCloud = new ProcessPayloadCloud();
119
+ this.filteredProcesses = [];
120
+ this.staticMappings = [];
121
+ this.isProcessStarting = false;
122
+ this.isFormCloudLoaded = false;
123
+ this.isFormCloudLoading = false;
124
+ this.processDefinitionLoaded = false;
125
+ this.processForm = new FormGroup({
126
+ processInstanceName: new FormControl('', [
127
+ Validators.required,
128
+ Validators.maxLength(this.getMaxNameLength()),
129
+ Validators.pattern('^[^\\s]+(\\s+[^\\s]+)*$')
130
+ ]),
131
+ processDefinition: new FormControl('', [Validators.required, this.processDefinitionNameValidator()])
132
+ });
133
+ this.destroyRef = inject(DestroyRef);
134
+ this.startProcessCloudService = inject(StartProcessCloudService);
135
+ this.localizedDatePipe = inject(LocalizedDatePipe);
136
+ this.displayStartSubject = new BehaviorSubject(null);
137
+ this.hasVisibleOutcomesSubject = new BehaviorSubject(false);
138
+ this.dialog = inject(MatDialog);
139
+ this.showSaveButton = false;
140
+ this.showCompleteButton = false;
141
+ this.startProcessButtonLabel = this.defaultStartProcessButtonLabel;
142
+ this.cancelButtonLabel = this.defaultCancelProcessButtonLabel;
143
+ }
144
+ ngOnInit() {
145
+ this.processDefinition.setValue(this.processDefinitionName);
146
+ this.processDefinition.valueChanges
147
+ .pipe(debounceTime(PROCESS_DEFINITION_DEBOUNCE))
148
+ .pipe(takeUntilDestroyed(this.destroyRef))
149
+ .subscribe((processDefinitionName) => {
150
+ this.selectProcessDefinitionByProcessDefinitionName(processDefinitionName);
151
+ });
152
+ this.showStartProcessButton$ = combineLatest([this.displayStartSubject, this.hasVisibleOutcomesSubject]).pipe(map(([displayStart, hasVisibleOutcomes]) => (displayStart !== null ? displayStart === 'true' : !hasVisibleOutcomes)));
153
+ }
154
+ ngOnChanges(changes) {
155
+ if (changes['appName'] && changes['appName'].currentValue !== changes['appName'].previousValue) {
156
+ this.appName = changes['appName'].currentValue;
157
+ if (this.appName || this.appName === '') {
158
+ this.loadProcessDefinitions();
159
+ }
160
+ }
161
+ if (changes['values'] && changes['values'].currentValue !== changes['values'].previousValue) {
162
+ this.resolvedValues = this.staticMappings.concat(this.values || []);
163
+ }
164
+ }
165
+ onKeyDown(event) {
166
+ event.stopPropagation();
167
+ }
168
+ onFormLoaded(form) {
169
+ this.isFormCloudLoaded = true;
170
+ this.formCloud = form;
171
+ const anyOutcomeVisible = form?.outcomes?.some((outcome) => isOutcomeButtonVisible(outcome, {
172
+ isFormReadOnly: form.readOnly,
173
+ showCompleteButton: this.showCompleteButton,
174
+ showSaveButton: this.showSaveButton
175
+ }));
176
+ this.hasVisibleOutcomesSubject.next(anyOutcomeVisible);
177
+ }
178
+ getMaxNameLength() {
179
+ return this.maxNameLength > MAX_NAME_LENGTH ? MAX_NAME_LENGTH : this.maxNameLength;
180
+ }
181
+ selectProcessDefinitionByProcessDefinitionName(processDefinitionName) {
182
+ this.filteredProcesses = this.getProcessDefinitionListByNameOrKey(processDefinitionName);
183
+ if (this.isProcessFormValid && this.filteredProcesses && this.filteredProcesses.length === 1) {
184
+ this.setProcessDefinitionOnForm(this.filteredProcesses[0].name);
185
+ }
186
+ }
187
+ setProcessDefinitionOnForm(selectedProcessDefinitionName) {
188
+ this.isFormCloudLoading = true;
189
+ const processDefinitionCurrent = this.filteredProcesses.find((process) => process.name === selectedProcessDefinitionName || process.key === selectedProcessDefinitionName);
190
+ forkJoin([
191
+ this.startProcessCloudService
192
+ .getStartEventFormStaticValuesMapping(this.appName, processDefinitionCurrent.id)
193
+ .pipe(catchError(() => of([]))),
194
+ this.startProcessCloudService
195
+ .getStartEventConstants(this.appName, processDefinitionCurrent.id)
196
+ .pipe(catchError(() => of([])))
197
+ ]).subscribe(([staticMappings, constants]) => {
198
+ this.staticMappings = staticMappings;
199
+ this.resolvedValues = this.staticMappings.concat(this.values || []);
200
+ this.processDefinitionCurrent = processDefinitionCurrent;
201
+ this.isFormCloudLoading = false;
202
+ const displayStart = constants?.find((constant) => constant.name === 'startEnabled');
203
+ const startLabel = constants?.find((constant) => constant.name === 'startLabel');
204
+ const displayCancel = constants?.find((constant) => constant.name === 'cancelEnabled');
205
+ const cancelLabel = constants?.find((constant) => constant.name === 'cancelLabel');
206
+ if (displayStart) {
207
+ this.displayStartSubject.next(displayStart?.value);
208
+ }
209
+ if (startLabel) {
210
+ this.startProcessButtonLabel = startLabel?.value?.trim()?.length > 0 ? startLabel.value.trim() : this.defaultStartProcessButtonLabel;
211
+ }
212
+ if (displayCancel) {
213
+ this.showCancelButton = displayCancel?.value === 'true' && this.showCancelButton;
214
+ }
215
+ if (cancelLabel) {
216
+ this.cancelButtonLabel = cancelLabel?.value?.trim()?.length > 0 ? cancelLabel.value.trim() : this.defaultCancelProcessButtonLabel;
217
+ }
218
+ });
219
+ this.isFormCloudLoaded = false;
220
+ this.processPayloadCloud.processDefinitionKey = processDefinitionCurrent.key;
221
+ }
222
+ getProcessDefinitionListByNameOrKey(processDefinitionName) {
223
+ return this.processDefinitionList.filter((processDefinitionCloud) => !processDefinitionName || this.getProcessDefinition(processDefinitionCloud, processDefinitionName));
224
+ }
225
+ getProcessIfExists(processDefinition) {
226
+ let matchedProcess = this.processDefinitionList.find((option) => this.getProcessDefinition(option, processDefinition));
227
+ if (!matchedProcess) {
228
+ matchedProcess = new ProcessDefinitionCloud();
229
+ }
230
+ return matchedProcess;
231
+ }
232
+ getProcessDefinitionByName(processDefinitionName) {
233
+ const matchedProcess = processDefinitionName ? this.getProcessIfExists(processDefinitionName) : this.processDefinitionList[0];
234
+ return matchedProcess;
235
+ }
236
+ selectDefaultProcessDefinition() {
237
+ const selectedProcess = this.getProcessDefinitionByName(this.processDefinitionName);
238
+ if (selectedProcess) {
239
+ this.processDefinition.setValue(selectedProcess.name);
240
+ this.processDefinitionSelectionChanged(selectedProcess);
241
+ }
242
+ }
243
+ loadProcessDefinitions() {
244
+ this.resetErrorMessage();
245
+ this.startProcessCloudService
246
+ .getProcessDefinitions(this.appName)
247
+ .pipe(takeUntilDestroyed(this.destroyRef))
248
+ .subscribe((processDefinitionRepresentations) => {
249
+ this.processDefinitionList = processDefinitionRepresentations;
250
+ if (processDefinitionRepresentations.length === 1) {
251
+ this.selectDefaultProcessDefinition();
252
+ }
253
+ else if (this.processDefinitionName) {
254
+ this.processDefinition.setValue(this.processDefinitionName);
255
+ const processDefinition = this.processDefinitionList.find((process) => process.name === this.processDefinitionName);
256
+ if (processDefinition) {
257
+ this.filteredProcesses = this.getProcessDefinitionListByNameOrKey(processDefinition.name);
258
+ this.setProcessDefinitionOnForm(processDefinition.name);
259
+ this.processDefinitionSelectionChanged(processDefinition);
260
+ }
261
+ }
262
+ this.processDefinitionLoaded = true;
263
+ }, () => {
264
+ this.errorMessageId = 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.LOAD_PROCESS_DEFS';
265
+ });
266
+ }
267
+ isValidName(name) {
268
+ return !!name;
269
+ }
270
+ getProcessDefinition(processDefinitionCloud, processDefinitionName) {
271
+ return ((this.isValidName(processDefinitionCloud.name) &&
272
+ processDefinitionCloud.name.toLowerCase().includes(processDefinitionName.toLowerCase())) ||
273
+ processDefinitionCloud.key?.toLowerCase().includes(processDefinitionName.toLowerCase()));
274
+ }
275
+ buildProcessCloudPayload() {
276
+ this.processPayloadCloud.name = this.processInstanceName.value;
277
+ if (this.variables) {
278
+ this.processPayloadCloud.variables = this.variables;
279
+ }
280
+ if (this.hasForm) {
281
+ this.processPayloadCloud.variables = Object.assign(this.processPayloadCloud.variables, this.formCloud.values);
282
+ }
283
+ }
284
+ onCustomOutcomeClicked(outcome) {
285
+ this.customOutcome = outcome;
286
+ this.startProcess();
287
+ }
288
+ startProcessWithoutConfirmation() {
289
+ this.isProcessStarting = true;
290
+ const action = this.hasForm
291
+ ? this.startProcessCloudService.startProcessWithForm(this.appName, this.processDefinitionCurrent.formKey, this.processDefinitionCurrent.version, new ProcessWithFormPayloadCloud({
292
+ processName: this.processInstanceName.value,
293
+ processDefinitionKey: this.processPayloadCloud.processDefinitionKey,
294
+ variables: this.variables ?? {},
295
+ values: this.formCloud.values,
296
+ outcome: this.customOutcome
297
+ }))
298
+ : this.startProcessCloudService.startProcess(this.appName, new ProcessPayloadCloud({
299
+ name: this.processInstanceName.value,
300
+ processDefinitionKey: this.processPayloadCloud.processDefinitionKey,
301
+ variables: this.variables ?? {}
302
+ }));
303
+ action.subscribe({
304
+ next: (res) => {
305
+ this.success.emit(res);
306
+ this.isProcessStarting = false;
307
+ },
308
+ error: (err) => {
309
+ this.errorMessageId = 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.START';
310
+ this.unifyErrorResponse(err);
311
+ this.error.emit(err);
312
+ this.isProcessStarting = false;
313
+ }
314
+ });
315
+ }
316
+ startProcess() {
317
+ if (!this.formCloud?.confirmMessage?.show) {
318
+ this.startProcessWithoutConfirmation();
319
+ }
320
+ else {
321
+ const dialogRef = this.dialog.open(ConfirmDialogComponent, {
322
+ data: {
323
+ message: this.formCloud.confirmMessage.message
324
+ },
325
+ minWidth: '450px'
326
+ });
327
+ dialogRef.afterClosed().subscribe((result) => {
328
+ if (result) {
329
+ this.startProcessWithoutConfirmation();
330
+ }
331
+ });
332
+ }
333
+ }
334
+ unifyErrorResponse(err) {
335
+ if (!err?.response?.body?.entry && err?.response?.body?.message) {
336
+ err.response.body = {
337
+ entry: JSON.parse(err.response.body.message)
338
+ };
339
+ }
340
+ }
341
+ cancelStartProcess() {
342
+ this.cancel.emit();
343
+ }
344
+ resetErrorMessage() {
345
+ this.errorMessageId = '';
346
+ }
347
+ resetProcessDefinitionList() {
348
+ this.processDefinition.setValue('');
349
+ this.filteredProcesses = this.processDefinitionList;
350
+ }
351
+ displayProcessNameOnDropdown(process) {
352
+ if (process) {
353
+ let processName = process;
354
+ if (typeof process !== 'string') {
355
+ processName = process.name;
356
+ }
357
+ return processName;
358
+ }
359
+ }
360
+ displayDropdown(event) {
361
+ event.stopPropagation();
362
+ if (!this.inputAutocomplete.panelOpen) {
363
+ this.resetProcessDefinitionList();
364
+ this.inputAutocomplete.openPanel();
365
+ }
366
+ else {
367
+ this.inputAutocomplete.closePanel();
368
+ }
369
+ }
370
+ processDefinitionNameValidator() {
371
+ return (control) => {
372
+ const processDefinitionFieldValue = control.value;
373
+ let processDefinitionNameError = false;
374
+ if (processDefinitionFieldValue) {
375
+ const processDefinition = this.getProcessIfExists(processDefinitionFieldValue);
376
+ if (!processDefinition.key) {
377
+ processDefinitionNameError = true;
378
+ }
379
+ }
380
+ return processDefinitionNameError ? { 'invalid name': true } : null;
381
+ };
382
+ }
383
+ getProcessDefinitionValue(process) {
384
+ return process.name ? process.name : process.key;
385
+ }
386
+ onFormContentClicked(content) {
387
+ this.formContentClicked.emit(content);
388
+ }
389
+ processDefinitionSelectionChanged(processDefinition) {
390
+ if (processDefinition) {
391
+ this.setDefaultProcessName(processDefinition.name);
392
+ this.processDefinitionSelection.emit(processDefinition);
393
+ }
394
+ }
395
+ setDefaultProcessName(processDefinitionName) {
396
+ const processInstanceDetails = { processDefinitionName };
397
+ const defaultProcessName = this.getDefaultProcessName(this.name, processInstanceDetails);
398
+ this.processInstanceName.setValue(defaultProcessName);
399
+ this.processInstanceName.markAsDirty();
400
+ this.processInstanceName.markAsTouched();
401
+ }
402
+ getDefaultProcessName(processNameFormat, processInstance) {
403
+ let processName = processNameFormat;
404
+ if (processName.match(DATE_TIME_IDENTIFIER_REG_EXP)) {
405
+ const presentDateTime = getTime(new Date());
406
+ processName = processName.replace(DATE_TIME_IDENTIFIER_REG_EXP, this.localizedDatePipe.transform(presentDateTime, 'medium'));
407
+ }
408
+ if (processName.match(PROCESS_DEFINITION_IDENTIFIER_REG_EXP)) {
409
+ const selectedProcessDefinitionName = processInstance ? processInstance.processDefinitionName : '';
410
+ processName = processName.replace(PROCESS_DEFINITION_IDENTIFIER_REG_EXP, selectedProcessDefinitionName);
411
+ }
412
+ return processName;
413
+ }
414
+ onNextTaskCheckboxCheckedChanged(event) {
415
+ this.nextTaskCheckboxCheckedChanged.emit(event);
416
+ }
417
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartProcessCloudComponent, deps: [{ token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
418
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StartProcessCloudComponent, isStandalone: true, selector: "adf-cloud-start-process", inputs: { appName: "appName", maxNameLength: "maxNameLength", name: "name", processDefinitionName: "processDefinitionName", variables: "variables", values: "values", showSelectProcessDropdown: "showSelectProcessDropdown", showTitle: "showTitle", showCancelButton: "showCancelButton", displayModeConfigurations: "displayModeConfigurations", showNextTaskCheckbox: "showNextTaskCheckbox", isNextTaskCheckboxChecked: "isNextTaskCheckboxChecked" }, outputs: { success: "success", cancel: "cancel", error: "error", formContentClicked: "formContentClicked", processDefinitionSelection: "processDefinitionSelection", nextTaskCheckboxCheckedChanged: "nextTaskCheckboxCheckedChanged" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, providers: [LocalizedDatePipe], viewQueries: [{ propertyName: "inputAutocomplete", first: true, predicate: MatAutocompleteTrigger, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-card appearance=\"outlined\" class=\"adf-start-process\" *ngIf=\"processDefinitionLoaded; else spinner\">\n\n <mat-card-content>\n <mat-card-title\n *ngIf=\"showTitle\"\n class=\"adf-title\">\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.TITLE' | translate}}\n </mat-card-title>\n\n <mat-card-subtitle id=\"error-message\" *ngIf=\"errorMessageId\">\n {{ errorMessageId | translate }}\n </mat-card-subtitle>\n\n <div *ngIf=\"!isProcessDefinitionsEmpty; else emptyProcessDefinitionsList\">\n <form [formGroup]=\"processForm\" class=\"adf-select-process-form\">\n <mat-form-field\n class=\"adf-process-input-container\"\n floatLabel=\"always\"\n *ngIf=\"showSelectProcessDropdown\"\n data-automation-id=\"adf-select-cloud-process-dropdown\"\n >\n <mat-label class=\"adf-start-process-input-label\">{{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.TYPE' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"processDefinition\"\n [matAutocomplete]=\"auto\"\n id=\"processDefinitionName\"\n >\n\n <div class=\"adf-process-input-autocomplete\">\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n id=\"processDefinitionOptions\"\n [displayWith]=\"displayProcessNameOnDropdown\"\n (optionSelected)=\"setProcessDefinitionOnForm($event.option.value)\" >\n <mat-option\n *ngFor=\"let processDef of filteredProcesses\"\n [value]=\"getProcessDefinitionValue(processDef)\"\n (click)=\"processDefinitionSelectionChanged(processDef)\">\n {{ getProcessDefinitionValue(processDef) }}\n </mat-option>\n </mat-autocomplete>\n\n <button\n id=\"adf-select-process-dropdown\"\n title=\"{{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.SELECT_PROCESS_DROPDOWN' | translate}}\"\n mat-icon-button\n (click)=\"displayDropdown($event)\">\n <mat-icon>arrow_drop_down</mat-icon>\n </button>\n\n </div>\n <mat-error\n *ngIf=\"processDefinition.hasError('required')\"\n class=\"adf-error-pb\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_DEFINITION_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <adf-inplace-form-input [control]=\"processInstanceName\">\n <ng-container label>\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.NAME' | translate}}\n </ng-container>\n\n <ng-container error>\n <span *ngIf=\"processInstanceName.hasError('required')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_NAME_REQUIRED' | translate }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('maxlength')\" id=\"adf-start-process-maxlength-error\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.MAXIMUM_LENGTH' | translate : { characters : maxNameLength } }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('pattern')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.SPACE_VALIDATOR' | translate }}\n </span>\n </ng-container>\n </adf-inplace-form-input>\n </form>\n\n <ng-container *ngIf=\"hasForm else taskFormCloudButtons\">\n <adf-cloud-form\n #startForm\n [appName]=\"appName\"\n [appVersion]=\"processDefinitionCurrent.appVersion\"\n [data]=\"resolvedValues\"\n [formId]=\"processDefinitionCurrent.formKey\"\n [displayModeConfigurations]=\"displayModeConfigurations\"\n [showSaveButton]=\"showSaveButton\"\n [showCompleteButton]=\"showCompleteButton\"\n [showRefreshButton]=\"false\"\n [showValidationIcon]=\"false\"\n [showTitle]=\"false\"\n [showNextTaskCheckbox]=\"showNextTaskCheckbox\"\n [isNextTaskCheckboxChecked]=\"isNextTaskCheckboxChecked\"\n (formContentClicked)=\"onFormContentClicked($event)\"\n (formLoaded)=\"onFormLoaded($event)\"\n (executeOutcome)=\"onCustomOutcomeClicked($event.outcome.name)\"\n (nextTaskCheckboxCheckedChanged)=\"onNextTaskCheckboxCheckedChanged($event)\"\n >\n <adf-cloud-form-custom-outcomes>\n <ng-template [ngTemplateOutlet]=\"taskFormCloudButtons\" />\n </adf-cloud-form-custom-outcomes>\n </adf-cloud-form>\n </ng-container>\n </div>\n\n </mat-card-content>\n\n</mat-card>\n\n<ng-template #taskFormCloudButtons>\n <div class=\"adf-start-process-cloud-actions\">\n <button\n *ngIf=\"showCancelButton\"\n mat-button\n (click)=\"cancelStartProcess()\"\n id=\"cancel_process\"\n >\n {{ cancelButtonLabel }}\n </button>\n <button\n *ngIf=\"showStartProcessButton$ | async\"\n color=\"primary\"\n mat-raised-button\n [disabled]=\"disableStartButton || !isProcessFormValid\"\n (click)=\"startProcess()\"\n data-automation-id=\"btn-start\"\n id=\"button-start\"\n class=\"adf-btn-start\"\n >\n {{ startProcessButtonLabel }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #emptyProcessDefinitionsList>\n <mat-card-content *ngIf=\"processDefinitionLoaded\">\n <mat-card-subtitle class=\"error-message\" id=\"no-process-message\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.NO_PROCESS_DEFINITIONS' | translate | uppercase}}\n </mat-card-subtitle>\n </mat-card-content>\n</ng-template>\n\n<ng-template #spinner>\n <div class=\"adf-loading-container\">\n <mat-progress-spinner\n class=\"adf-loading\"\n color=\"primary\"\n mode=\"indeterminate\" />\n </div>\n</ng-template>\n", styles: [".adf-start-process .adf-start-process-input-label{color:var(--adf-theme-mat-grey-color-a200-dark)}.adf-start-process-cloud-actions{display:flex;justify-content:flex-end}.adf-select-process-form{display:flex;flex-direction:column}.adf-title{padding-bottom:1.25em}.adf-process-input-container{margin:0 7px}.adf-process-input-autocomplete{display:flex}.adf-process-input-autocomplete button{position:absolute;right:-14px;top:0}.adf-form-container .adf-form-container-card:has(.adf-form-container-card-content){box-shadow:none;padding:0}.adf-start-form-actions{text-align:right}.adf-loading{margin:auto}.adf-loading-container{min-height:300px;display:flex;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i4.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: InplaceFormInputComponent, selector: "adf-inplace-form-input", inputs: ["control"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.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: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.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: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i11.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i11.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FormCloudComponent, selector: "adf-cloud-form", inputs: ["appName", "appVersion", "formId", "processInstanceId", "taskId", "data", "displayModeConfigurations", "showNextTaskCheckbox", "isNextTaskCheckboxChecked", "showCompleteButton"], outputs: ["formSaved", "formCompleted", "formLoaded", "formDataRefreshed", "formContentClicked", "displayModeOn", "displayModeOff", "nextTaskCheckboxCheckedChanged"] }, { kind: "component", type: FormCustomOutcomesComponent, selector: "adf-cloud-form-custom-outcomes" }], encapsulation: i0.ViewEncapsulation.None }); }
419
+ }
420
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartProcessCloudComponent, decorators: [{
421
+ type: Component,
422
+ args: [{ selector: 'adf-cloud-start-process', standalone: true, imports: [
423
+ CommonModule,
424
+ TranslatePipe,
425
+ MatProgressSpinnerModule,
426
+ MatCardModule,
427
+ MatButtonModule,
428
+ InplaceFormInputComponent,
429
+ MatIconModule,
430
+ MatInputModule,
431
+ MatOptionModule,
432
+ MatAutocompleteModule,
433
+ ReactiveFormsModule,
434
+ FormCloudComponent,
435
+ FormCustomOutcomesComponent
436
+ ], providers: [LocalizedDatePipe], encapsulation: ViewEncapsulation.None, template: "<mat-card appearance=\"outlined\" class=\"adf-start-process\" *ngIf=\"processDefinitionLoaded; else spinner\">\n\n <mat-card-content>\n <mat-card-title\n *ngIf=\"showTitle\"\n class=\"adf-title\">\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.TITLE' | translate}}\n </mat-card-title>\n\n <mat-card-subtitle id=\"error-message\" *ngIf=\"errorMessageId\">\n {{ errorMessageId | translate }}\n </mat-card-subtitle>\n\n <div *ngIf=\"!isProcessDefinitionsEmpty; else emptyProcessDefinitionsList\">\n <form [formGroup]=\"processForm\" class=\"adf-select-process-form\">\n <mat-form-field\n class=\"adf-process-input-container\"\n floatLabel=\"always\"\n *ngIf=\"showSelectProcessDropdown\"\n data-automation-id=\"adf-select-cloud-process-dropdown\"\n >\n <mat-label class=\"adf-start-process-input-label\">{{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.TYPE' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"processDefinition\"\n [matAutocomplete]=\"auto\"\n id=\"processDefinitionName\"\n >\n\n <div class=\"adf-process-input-autocomplete\">\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n id=\"processDefinitionOptions\"\n [displayWith]=\"displayProcessNameOnDropdown\"\n (optionSelected)=\"setProcessDefinitionOnForm($event.option.value)\" >\n <mat-option\n *ngFor=\"let processDef of filteredProcesses\"\n [value]=\"getProcessDefinitionValue(processDef)\"\n (click)=\"processDefinitionSelectionChanged(processDef)\">\n {{ getProcessDefinitionValue(processDef) }}\n </mat-option>\n </mat-autocomplete>\n\n <button\n id=\"adf-select-process-dropdown\"\n title=\"{{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.SELECT_PROCESS_DROPDOWN' | translate}}\"\n mat-icon-button\n (click)=\"displayDropdown($event)\">\n <mat-icon>arrow_drop_down</mat-icon>\n </button>\n\n </div>\n <mat-error\n *ngIf=\"processDefinition.hasError('required')\"\n class=\"adf-error-pb\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_DEFINITION_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <adf-inplace-form-input [control]=\"processInstanceName\">\n <ng-container label>\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.NAME' | translate}}\n </ng-container>\n\n <ng-container error>\n <span *ngIf=\"processInstanceName.hasError('required')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_NAME_REQUIRED' | translate }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('maxlength')\" id=\"adf-start-process-maxlength-error\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.MAXIMUM_LENGTH' | translate : { characters : maxNameLength } }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('pattern')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.SPACE_VALIDATOR' | translate }}\n </span>\n </ng-container>\n </adf-inplace-form-input>\n </form>\n\n <ng-container *ngIf=\"hasForm else taskFormCloudButtons\">\n <adf-cloud-form\n #startForm\n [appName]=\"appName\"\n [appVersion]=\"processDefinitionCurrent.appVersion\"\n [data]=\"resolvedValues\"\n [formId]=\"processDefinitionCurrent.formKey\"\n [displayModeConfigurations]=\"displayModeConfigurations\"\n [showSaveButton]=\"showSaveButton\"\n [showCompleteButton]=\"showCompleteButton\"\n [showRefreshButton]=\"false\"\n [showValidationIcon]=\"false\"\n [showTitle]=\"false\"\n [showNextTaskCheckbox]=\"showNextTaskCheckbox\"\n [isNextTaskCheckboxChecked]=\"isNextTaskCheckboxChecked\"\n (formContentClicked)=\"onFormContentClicked($event)\"\n (formLoaded)=\"onFormLoaded($event)\"\n (executeOutcome)=\"onCustomOutcomeClicked($event.outcome.name)\"\n (nextTaskCheckboxCheckedChanged)=\"onNextTaskCheckboxCheckedChanged($event)\"\n >\n <adf-cloud-form-custom-outcomes>\n <ng-template [ngTemplateOutlet]=\"taskFormCloudButtons\" />\n </adf-cloud-form-custom-outcomes>\n </adf-cloud-form>\n </ng-container>\n </div>\n\n </mat-card-content>\n\n</mat-card>\n\n<ng-template #taskFormCloudButtons>\n <div class=\"adf-start-process-cloud-actions\">\n <button\n *ngIf=\"showCancelButton\"\n mat-button\n (click)=\"cancelStartProcess()\"\n id=\"cancel_process\"\n >\n {{ cancelButtonLabel }}\n </button>\n <button\n *ngIf=\"showStartProcessButton$ | async\"\n color=\"primary\"\n mat-raised-button\n [disabled]=\"disableStartButton || !isProcessFormValid\"\n (click)=\"startProcess()\"\n data-automation-id=\"btn-start\"\n id=\"button-start\"\n class=\"adf-btn-start\"\n >\n {{ startProcessButtonLabel }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #emptyProcessDefinitionsList>\n <mat-card-content *ngIf=\"processDefinitionLoaded\">\n <mat-card-subtitle class=\"error-message\" id=\"no-process-message\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.NO_PROCESS_DEFINITIONS' | translate | uppercase}}\n </mat-card-subtitle>\n </mat-card-content>\n</ng-template>\n\n<ng-template #spinner>\n <div class=\"adf-loading-container\">\n <mat-progress-spinner\n class=\"adf-loading\"\n color=\"primary\"\n mode=\"indeterminate\" />\n </div>\n</ng-template>\n", styles: [".adf-start-process .adf-start-process-input-label{color:var(--adf-theme-mat-grey-color-a200-dark)}.adf-start-process-cloud-actions{display:flex;justify-content:flex-end}.adf-select-process-form{display:flex;flex-direction:column}.adf-title{padding-bottom:1.25em}.adf-process-input-container{margin:0 7px}.adf-process-input-autocomplete{display:flex}.adf-process-input-autocomplete button{position:absolute;right:-14px;top:0}.adf-form-container .adf-form-container-card:has(.adf-form-container-card-content){box-shadow:none;padding:0}.adf-start-form-actions{text-align:right}.adf-loading{margin:auto}.adf-loading-container{min-height:300px;display:flex;height:100%}\n"] }]
437
+ }], ctorParameters: () => [{ type: i1.TranslationService }], propDecorators: { inputAutocomplete: [{
438
+ type: ViewChild,
439
+ args: [MatAutocompleteTrigger]
440
+ }], appName: [{
441
+ type: Input
442
+ }], maxNameLength: [{
443
+ type: Input
444
+ }], name: [{
445
+ type: Input
446
+ }], processDefinitionName: [{
447
+ type: Input
448
+ }], variables: [{
449
+ type: Input
450
+ }], values: [{
451
+ type: Input
452
+ }], showSelectProcessDropdown: [{
453
+ type: Input
454
+ }], showTitle: [{
455
+ type: Input
456
+ }], showCancelButton: [{
457
+ type: Input
458
+ }], displayModeConfigurations: [{
459
+ type: Input
460
+ }], showNextTaskCheckbox: [{
461
+ type: Input
462
+ }], isNextTaskCheckboxChecked: [{
463
+ type: Input
464
+ }], success: [{
465
+ type: Output
466
+ }], cancel: [{
467
+ type: Output
468
+ }], error: [{
469
+ type: Output
470
+ }], formContentClicked: [{
471
+ type: Output
472
+ }], processDefinitionSelection: [{
473
+ type: Output
474
+ }], nextTaskCheckboxCheckedChanged: [{
475
+ type: Output
476
+ }], onKeyDown: [{
477
+ type: HostListener,
478
+ args: ['keydown', ['$event']]
479
+ }] } });
480
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQtcHJvY2Vzcy1jbG91ZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvcHJvY2Vzcy1zZXJ2aWNlcy1jbG91ZC9zcmMvbGliL3Byb2Nlc3Mvc3RhcnQtcHJvY2Vzcy9jb21wb25lbnRzL3N0YXJ0LXByb2Nlc3MtY2xvdWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3Byb2Nlc3Mtc2VydmljZXMtY2xvdWQvc3JjL2xpYi9wcm9jZXNzL3N0YXJ0LXByb2Nlc3MvY29tcG9uZW50cy9zdGFydC1wcm9jZXNzLWNsb3VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsc0JBQXNCLEVBR3RCLHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2SCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRixPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM5RixP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QUs7Z0JBS04sb0JBQW9CO3NCQURuQixLQUFLO2dCQUtOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFLTixPQUFPO3NCQUROLE1BQU07Z0JBS1AsTUFBTTtzQkFETCxNQUFNO2dCQUtQLEtBQUs7c0JBREosTUFBTTtnQkFLUCxrQkFBa0I7c0JBRGpCLE1BQU07Z0JBS1AsMEJBQTBCO3NCQUR6QixNQUFNO2dCQUtQLDhCQUE4QjtzQkFEN0IsTUFBTTtnQkErR1AsU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ29uZmlybURpYWxvZ0NvbXBvbmVudCxcbiAgICBDb250ZW50TGlua01vZGVsLFxuICAgIEZvcm1Nb2RlbCxcbiAgICBJbnBsYWNlRm9ybUlucHV0Q29tcG9uZW50LFxuICAgIExvY2FsaXplZERhdGVQaXBlLFxuICAgIFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBpc091dGNvbWVCdXR0b25WaXNpYmxlXG59IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHJvY2Vzc0luc3RhbmNlQ2xvdWQgfSBmcm9tICcuLi9tb2RlbHMvcHJvY2Vzcy1pbnN0YW5jZS1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBQcm9jZXNzUGF5bG9hZENsb3VkIH0gZnJvbSAnLi4vbW9kZWxzL3Byb2Nlc3MtcGF5bG9hZC1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBQcm9jZXNzV2l0aEZvcm1QYXlsb2FkQ2xvdWQgfSBmcm9tICcuLi9tb2RlbHMvcHJvY2Vzcy13aXRoLWZvcm0tcGF5bG9hZC1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBTdGFydFByb2Nlc3NDbG91ZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdGFydC1wcm9jZXNzLWNsb3VkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvcHJvY2Vzcy1kZWZpbml0aW9uLWNsb3VkLm1vZGVsJztcbmltcG9ydCB7IFRhc2tWYXJpYWJsZUNsb3VkIH0gZnJvbSAnLi4vLi4vLi4vZm9ybS9tb2RlbHMvdGFzay12YXJpYWJsZS1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtQ2xvdWREaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLWZpZWxkcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGdldFRpbWUgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBNYXRDYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IEZvcm1DbG91ZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Zvcm0vY29tcG9uZW50cy9mb3JtLWNsb3VkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtQ3VzdG9tT3V0Y29tZXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9mb3JtL2NvbXBvbmVudHMvZm9ybS1jbG91ZC1jdXN0b20tb3V0Y29tZXMuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdENoZWNrYm94Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuY29uc3QgTUFYX05BTUVfTEVOR1RIOiBudW1iZXIgPSAyNTU7XG5jb25zdCBQUk9DRVNTX0RFRklOSVRJT05fREVCT1VOQ0U6IG51bWJlciA9IDMwMDtcbmNvbnN0IERBVEVfVElNRV9JREVOVElGSUVSX1JFR19FWFAgPSBuZXcgUmVnRXhwKCcle2RhdGV0aW1lfScsICdpJyk7XG5jb25zdCBQUk9DRVNTX0RFRklOSVRJT05fSURFTlRJRklFUl9SRUdfRVhQID0gbmV3IFJlZ0V4cCgnJXtwcm9jZXNzZGVmaW5pdGlvbn0nLCAnaScpO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1jbG91ZC1zdGFydC1wcm9jZXNzJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVQaXBlLFxuICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsXG4gICAgICAgIE1hdENhcmRNb2R1bGUsXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgSW5wbGFjZUZvcm1JbnB1dENvbXBvbmVudCxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICAgICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBGb3JtQ2xvdWRDb21wb25lbnQsXG4gICAgICAgIEZvcm1DdXN0b21PdXRjb21lc0NvbXBvbmVudFxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbTG9jYWxpemVkRGF0ZVBpcGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zdGFydC1wcm9jZXNzLWNsb3VkLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zdGFydC1wcm9jZXNzLWNsb3VkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTdGFydFByb2Nlc3NDbG91ZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpXG4gICAgaW5wdXRBdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG5cbiAgICAvKiogKHJlcXVpcmVkKSBOYW1lIG9mIHRoZSBhcHAuICovXG4gICAgQElucHV0KClcbiAgICBhcHBOYW1lOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJvY2VzcyBuYW1lLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4TmFtZUxlbmd0aDogbnVtYmVyID0gTUFYX05BTUVfTEVOR1RIO1xuXG4gICAgLyoqIE5hbWUgb2YgdGhlIHByb2Nlc3MuICovXG4gICAgQElucHV0KClcbiAgICBuYW1lOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBOYW1lIG9mIHRoZSBwcm9jZXNzIGRlZmluaXRpb24uICovXG4gICAgQElucHV0KClcbiAgICBwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZztcblxuICAgIC8qKiBWYXJpYWJsZXMgdG8gYXR0YWNoIHRvIHRoZSBwYXlsb2FkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdmFyaWFibGVzOiBhbnk7XG5cbiAgICAvKiogUGFyYW1ldGVyIHRvIHBhc3MgZm9ybSBmaWVsZCB2YWx1ZXMgaW4gdGhlIHN0YXJ0IGZvcm0gaWYgb25lIGlzIGFzc29jaWF0ZWQuICovXG4gICAgQElucHV0KClcbiAgICB2YWx1ZXM6IFRhc2tWYXJpYWJsZUNsb3VkW107XG5cbiAgICAvKiogU2hvdy9oaWRlIHRoZSBwcm9jZXNzIGRyb3Bkb3duIGxpc3QuICovXG4gICAgQElucHV0KClcbiAgICBzaG93U2VsZWN0UHJvY2Vzc0Ryb3Bkb3duOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBTaG93L2hpZGUgdGl0bGUuICovXG4gICAgQElucHV0KClcbiAgICBzaG93VGl0bGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFNob3cvaGlkZSBjYW5jZWwgYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0NhbmNlbEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXZhaWxhYmxlIGRpc3BsYXkgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBmb3JtLlxuICAgICAqIChzdGFydCBwcm9jZXNzIGV2ZW50IGNhbiBoYXZlIGFzc2lnbmVkIGZvcm0pXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb25zOiBGb3JtQ2xvdWREaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb25bXTtcblxuICAgIC8qKiBUb2dnbGUgcmVuZGVyaW5nIG9mIHRoZSBgT3BlbiBuZXh0IHRhc2tgIGNoZWNrYm94LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd05leHRUYXNrQ2hlY2tib3ggPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBgT3BlbiBuZXh0IHRhc2tgIGNoZWNrYm94IGlzIGNoZWNrZWQgYnkgZGVmYXVsdCBvciBub3QuICovXG4gICAgQElucHV0KClcbiAgICBpc05leHRUYXNrQ2hlY2tib3hDaGVja2VkID0gZmFsc2U7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBwcm9jZXNzIGlzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHN1Y2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPFByb2Nlc3NJbnN0YW5jZUNsb3VkPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgc3RhcnRpbmcgcHJvY2VzcyBpcyBjYW5jZWxsZWQgKi9cbiAgICBAT3V0cHV0KClcbiAgICBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPFByb2Nlc3NJbnN0YW5jZUNsb3VkPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMuICovXG4gICAgQE91dHB1dCgpXG4gICAgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gZm9ybSBjb250ZW50IGlzIGNsaWNrZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9ybUNvbnRlbnRDbGlja2VkOiBFdmVudEVtaXR0ZXI8Q29udGVudExpbmtNb2RlbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHByb2Nlc3MgZGVmaW5pdGlvbiBzZWxlY3Rpb24gY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBwcm9jZXNzRGVmaW5pdGlvblNlbGVjdGlvbjogRXZlbnRFbWl0dGVyPFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9jZXNzRGVmaW5pdGlvbkNsb3VkPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgYE9wZW4gbmV4dCB0YXNrYCBjaGVja2JveCB3YXMgdG9nZ2xlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBuZXh0VGFza0NoZWNrYm94Q2hlY2tlZENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1hdENoZWNrYm94Q2hhbmdlPigpO1xuXG4gICAgcHJvY2Vzc0RlZmluaXRpb25MaXN0OiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkW10gPSBbXTtcbiAgICBwcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQ/OiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkO1xuICAgIGVycm9yTWVzc2FnZUlkOiBzdHJpbmcgPSAnJztcbiAgICBwcm9jZXNzUGF5bG9hZENsb3VkID0gbmV3IFByb2Nlc3NQYXlsb2FkQ2xvdWQoKTtcbiAgICBmaWx0ZXJlZFByb2Nlc3NlczogUHJvY2Vzc0RlZmluaXRpb25DbG91ZFtdID0gW107XG4gICAgc3RhdGljTWFwcGluZ3M6IFRhc2tWYXJpYWJsZUNsb3VkW10gPSBbXTtcbiAgICByZXNvbHZlZFZhbHVlcz86IFRhc2tWYXJpYWJsZUNsb3VkW107XG4gICAgY3VzdG9tT3V0Y29tZTogc3RyaW5nO1xuXG4gICAgaXNQcm9jZXNzU3RhcnRpbmcgPSBmYWxzZTtcbiAgICBpc0Zvcm1DbG91ZExvYWRlZCA9IGZhbHNlO1xuICAgIGlzRm9ybUNsb3VkTG9hZGluZyA9IGZhbHNlO1xuICAgIHByb2Nlc3NEZWZpbml0aW9uTG9hZGVkID0gZmFsc2U7XG5cbiAgICBzaG93U3RhcnRQcm9jZXNzQnV0dG9uJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBzdGFydFByb2Nlc3NCdXR0b25MYWJlbDogc3RyaW5nO1xuICAgIGNhbmNlbEJ1dHRvbkxhYmVsOiBzdHJpbmc7XG5cbiAgICBmb3JtQ2xvdWQ/OiBGb3JtTW9kZWw7XG4gICAgcHJvY2Vzc0Zvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgcHJvY2Vzc0luc3RhbmNlTmFtZTogbmV3IEZvcm1Db250cm9sKCcnLCBbXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgodGhpcy5nZXRNYXhOYW1lTGVuZ3RoKCkpLFxuICAgICAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKCdeW15cXFxcc10rKFxcXFxzK1teXFxcXHNdKykqJCcpXG4gICAgICAgIF0pLFxuICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbjogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWVWYWxpZGF0b3IoKV0pXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGFydFByb2Nlc3NDbG91ZFNlcnZpY2UgPSBpbmplY3QoU3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsaXplZERhdGVQaXBlID0gaW5qZWN0KExvY2FsaXplZERhdGVQaXBlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlTdGFydFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBoYXNWaXNpYmxlT3V0Y29tZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcblxuICAgIHNob3dTYXZlQnV0dG9uID0gZmFsc2U7XG4gICAgc2hvd0NvbXBsZXRlQnV0dG9uID0gZmFsc2U7XG5cbiAgICBnZXQgaXNQcm9jZXNzRm9ybVZhbGlkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5oYXNGb3JtICYmIHRoaXMuaXNGb3JtQ2xvdWRMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5mb3JtQ2xvdWQgPyAhT2JqZWN0LmtleXModGhpcy5mb3JtQ2xvdWQudmFsdWVzKS5sZW5ndGggOiBmYWxzZSkgfHwgdGhpcy5mb3JtQ2xvdWQ/LmlzVmFsaWQgfHwgdGhpcy5pc1Byb2Nlc3NTdGFydGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGb3JtLnZhbGlkIHx8IHRoaXMuaXNQcm9jZXNzU3RhcnRpbmc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZGlzYWJsZVN0YXJ0QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuYXBwTmFtZSB8fCAhdGhpcy5wcm9jZXNzRGVmaW5pdGlvbi52YWxpZCB8fCB0aGlzLmlzUHJvY2Vzc1N0YXJ0aW5nIHx8IHRoaXMuaXNGb3JtQ2xvdWRMb2FkaW5nO1xuICAgIH1cblxuICAgIGdldCBpc1Byb2Nlc3NEZWZpbml0aW9uc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXQgcHJvY2Vzc0luc3RhbmNlTmFtZSgpOiBGb3JtQ29udHJvbDxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Zvcm0uY29udHJvbHMucHJvY2Vzc0luc3RhbmNlTmFtZTtcbiAgICB9XG5cbiAgICBnZXQgcHJvY2Vzc0RlZmluaXRpb24oKTogRm9ybUNvbnRyb2w8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGb3JtLmNvbnRyb2xzLnByb2Nlc3NEZWZpbml0aW9uO1xuICAgIH1cblxuICAgIGdldCBoYXNGb3JtKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnByb2Nlc3NEZWZpbml0aW9uQ3VycmVudD8uZm9ybUtleTtcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdFN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5GT1JNLkFDVElPTi5TVEFSVCcpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGRlZmF1bHRDYW5jZWxQcm9jZXNzQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkZPUk0uQUNUSU9OLkNBTkNFTCcpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5zdGFydFByb2Nlc3NCdXR0b25MYWJlbCA9IHRoaXMuZGVmYXVsdFN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsO1xuICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbkxhYmVsID0gdGhpcy5kZWZhdWx0Q2FuY2VsUHJvY2Vzc0J1dHRvbkxhYmVsO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uLnNldFZhbHVlKHRoaXMucHJvY2Vzc0RlZmluaXRpb25OYW1lKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbi52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZShQUk9DRVNTX0RFRklOSVRJT05fREVCT1VOQ0UpKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChwcm9jZXNzRGVmaW5pdGlvbk5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFByb2Nlc3NEZWZpbml0aW9uQnlQcm9jZXNzRGVmaW5pdGlvbk5hbWUocHJvY2Vzc0RlZmluaXRpb25OYW1lKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2hvd1N0YXJ0UHJvY2Vzc0J1dHRvbiQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRpc3BsYXlTdGFydFN1YmplY3QsIHRoaXMuaGFzVmlzaWJsZU91dGNvbWVzU3ViamVjdF0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKFtkaXNwbGF5U3RhcnQsIGhhc1Zpc2libGVPdXRjb21lc10pID0+IChkaXNwbGF5U3RhcnQgIT09IG51bGwgPyBkaXNwbGF5U3RhcnQgPT09ICd0cnVlJyA6ICFoYXNWaXNpYmxlT3V0Y29tZXMpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2FwcE5hbWUnXSAmJiBjaGFuZ2VzWydhcHBOYW1lJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWydhcHBOYW1lJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBOYW1lID0gY2hhbmdlc1snYXBwTmFtZSddLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYXBwTmFtZSB8fCB0aGlzLmFwcE5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUHJvY2Vzc0RlZmluaXRpb25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1sndmFsdWVzJ10gJiYgY2hhbmdlc1sndmFsdWVzJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWyd2YWx1ZXMnXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVkVmFsdWVzID0gdGhpcy5zdGF0aWNNYXBwaW5ncy5jb25jYXQodGhpcy52YWx1ZXMgfHwgW10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIG9uRm9ybUxvYWRlZChmb3JtOiBGb3JtTW9kZWwpIHtcbiAgICAgICAgdGhpcy5pc0Zvcm1DbG91ZExvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9ybUNsb3VkID0gZm9ybTtcblxuICAgICAgICBjb25zdCBhbnlPdXRjb21lVmlzaWJsZSA9IGZvcm0/Lm91dGNvbWVzPy5zb21lKChvdXRjb21lKSA9PlxuICAgICAgICAgICAgaXNPdXRjb21lQnV0dG9uVmlzaWJsZShvdXRjb21lLCB7XG4gICAgICAgICAgICAgICAgaXNGb3JtUmVhZE9ubHk6IGZvcm0ucmVhZE9ubHksXG4gICAgICAgICAgICAgICAgc2hvd0NvbXBsZXRlQnV0dG9uOiB0aGlzLnNob3dDb21wbGV0ZUJ1dHRvbixcbiAgICAgICAgICAgICAgICBzaG93U2F2ZUJ1dHRvbjogdGhpcy5zaG93U2F2ZUJ1dHRvblxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5oYXNWaXNpYmxlT3V0Y29tZXNTdWJqZWN0Lm5leHQoYW55T3V0Y29tZVZpc2libGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF4TmFtZUxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhOYW1lTGVuZ3RoID4gTUFYX05BTUVfTEVOR1RIID8gTUFYX05BTUVfTEVOR1RIIDogdGhpcy5tYXhOYW1lTGVuZ3RoO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0UHJvY2Vzc0RlZmluaXRpb25CeVByb2Nlc3NEZWZpbml0aW9uTmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcmVkUHJvY2Vzc2VzID0gdGhpcy5nZXRQcm9jZXNzRGVmaW5pdGlvbkxpc3RCeU5hbWVPcktleShwcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzUHJvY2Vzc0Zvcm1WYWxpZCAmJiB0aGlzLmZpbHRlcmVkUHJvY2Vzc2VzICYmIHRoaXMuZmlsdGVyZWRQcm9jZXNzZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnNldFByb2Nlc3NEZWZpbml0aW9uT25Gb3JtKHRoaXMuZmlsdGVyZWRQcm9jZXNzZXNbMF0ubmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRQcm9jZXNzRGVmaW5pdGlvbk9uRm9ybShzZWxlY3RlZFByb2Nlc3NEZWZpbml0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuaXNGb3JtQ2xvdWRMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc0RlZmluaXRpb25DdXJyZW50ID0gdGhpcy5maWx0ZXJlZFByb2Nlc3Nlcy5maW5kKFxuICAgICAgICAgICAgKHByb2Nlc3M6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQpID0+IHByb2Nlc3MubmFtZSA9PT0gc2VsZWN0ZWRQcm9jZXNzRGVmaW5pdGlvbk5hbWUgfHwgcHJvY2Vzcy5rZXkgPT09IHNlbGVjdGVkUHJvY2Vzc0RlZmluaXRpb25OYW1lXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9ya0pvaW4oW1xuICAgICAgICAgICAgdGhpcy5zdGFydFByb2Nlc3NDbG91ZFNlcnZpY2VcbiAgICAgICAgICAgICAgICAuZ2V0U3RhcnRFdmVudEZvcm1TdGF0aWNWYWx1ZXNNYXBwaW5nKHRoaXMuYXBwTmFtZSwgcHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmlkKVxuICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgVGFza1ZhcmlhYmxlQ2xvdWRbXSkpKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldFN0YXJ0RXZlbnRDb25zdGFudHModGhpcy5hcHBOYW1lLCBwcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQuaWQpXG4gICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihbXSBhcyBUYXNrVmFyaWFibGVDbG91ZFtdKSkpXG4gICAgICAgIF0pLnN1YnNjcmliZSgoW3N0YXRpY01hcHBpbmdzLCBjb25zdGFudHNdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXRpY01hcHBpbmdzID0gc3RhdGljTWFwcGluZ3M7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVkVmFsdWVzID0gdGhpcy5zdGF0aWNNYXBwaW5ncy5jb25jYXQodGhpcy52YWx1ZXMgfHwgW10pO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQgPSBwcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQ7XG4gICAgICAgICAgICB0aGlzLmlzRm9ybUNsb3VkTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5U3RhcnQgPSBjb25zdGFudHM/LmZpbmQoKGNvbnN0YW50KSA9PiBjb25zdGFudC5uYW1lID09PSAnc3RhcnRFbmFibGVkJyk7XG4gICAgICAgICAgICBjb25zdCBzdGFydExhYmVsID0gY29uc3RhbnRzPy5maW5kKChjb25zdGFudCkgPT4gY29uc3RhbnQubmFtZSA9PT0gJ3N0YXJ0TGFiZWwnKTtcblxuICAgICAgICAgICAgY29uc3QgZGlzcGxheUNhbmNlbCA9IGNvbnN0YW50cz8uZmluZCgoY29uc3RhbnQpID0+IGNvbnN0YW50Lm5hbWUgPT09ICdjYW5jZWxFbmFibGVkJyk7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxMYWJlbCA9IGNvbnN0YW50cz8uZmluZCgoY29uc3RhbnQpID0+IGNvbnN0YW50Lm5hbWUgPT09ICdjYW5jZWxMYWJlbCcpO1xuXG4gICAgICAgICAgICBpZiAoZGlzcGxheVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5U3RhcnRTdWJqZWN0Lm5leHQoZGlzcGxheVN0YXJ0Py52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhcnRMYWJlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzQnV0dG9uTGFiZWwgPSBzdGFydExhYmVsPy52YWx1ZT8udHJpbSgpPy5sZW5ndGggPiAwID8gc3RhcnRMYWJlbC52YWx1ZS50cmltKCkgOiB0aGlzLmRlZmF1bHRTdGFydFByb2Nlc3NCdXR0b25MYWJlbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRpc3BsYXlDYW5jZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dDYW5jZWxCdXR0b24gPSBkaXNwbGF5Q2FuY2VsPy52YWx1ZSA9PT0gJ3RydWUnICYmIHRoaXMuc2hvd0NhbmNlbEJ1dHRvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYW5jZWxMYWJlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uTGFiZWwgPSBjYW5jZWxMYWJlbD8udmFsdWU/LnRyaW0oKT8ubGVuZ3RoID4gMCA/IGNhbmNlbExhYmVsLnZhbHVlLnRyaW0oKSA6IHRoaXMuZGVmYXVsdENhbmNlbFByb2Nlc3NCdXR0b25MYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pc0Zvcm1DbG91ZExvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb2Nlc3NQYXlsb2FkQ2xvdWQucHJvY2Vzc0RlZmluaXRpb25LZXkgPSBwcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQua2V5O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc0RlZmluaXRpb25MaXN0QnlOYW1lT3JLZXkocHJvY2Vzc0RlZmluaXRpb25OYW1lOiBzdHJpbmcpOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3QuZmlsdGVyKFxuICAgICAgICAgICAgKHByb2Nlc3NEZWZpbml0aW9uQ2xvdWQpID0+ICFwcm9jZXNzRGVmaW5pdGlvbk5hbWUgfHwgdGhpcy5nZXRQcm9jZXNzRGVmaW5pdGlvbihwcm9jZXNzRGVmaW5pdGlvbkNsb3VkLCBwcm9jZXNzRGVmaW5pdGlvbk5hbWUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzSWZFeGlzdHMocHJvY2Vzc0RlZmluaXRpb246IHN0cmluZyk6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQge1xuICAgICAgICBsZXQgbWF0Y2hlZFByb2Nlc3MgPSB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdC5maW5kKChvcHRpb24pID0+IHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb24ob3B0aW9uLCBwcm9jZXNzRGVmaW5pdGlvbikpO1xuICAgICAgICBpZiAoIW1hdGNoZWRQcm9jZXNzKSB7XG4gICAgICAgICAgICBtYXRjaGVkUHJvY2VzcyA9IG5ldyBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0Y2hlZFByb2Nlc3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzRGVmaW5pdGlvbkJ5TmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQge1xuICAgICAgICBjb25zdCBtYXRjaGVkUHJvY2VzcyA9IHByb2Nlc3NEZWZpbml0aW9uTmFtZSA/IHRoaXMuZ2V0UHJvY2Vzc0lmRXhpc3RzKHByb2Nlc3NEZWZpbml0aW9uTmFtZSkgOiB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdFswXTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZWRQcm9jZXNzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0RGVmYXVsdFByb2Nlc3NEZWZpbml0aW9uKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFByb2Nlc3MgPSB0aGlzLmdldFByb2Nlc3NEZWZpbml0aW9uQnlOYW1lKHRoaXMucHJvY2Vzc0RlZmluaXRpb25OYW1lKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkUHJvY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbi5zZXRWYWx1ZShzZWxlY3RlZFByb2Nlc3MubmFtZSk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uU2VsZWN0aW9uQ2hhbmdlZChzZWxlY3RlZFByb2Nlc3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRQcm9jZXNzRGVmaW5pdGlvbnMoKSB7XG4gICAgICAgIHRoaXMucmVzZXRFcnJvck1lc3NhZ2UoKTtcblxuICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZVxuICAgICAgICAgICAgLmdldFByb2Nlc3NEZWZpbml0aW9ucyh0aGlzLmFwcE5hbWUpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKHByb2Nlc3NEZWZpbml0aW9uUmVwcmVzZW50YXRpb25zOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3QgPSBwcm9jZXNzRGVmaW5pdGlvblJlcHJlc2VudGF0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NEZWZpbml0aW9uUmVwcmVzZW50YXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0UHJvY2Vzc0RlZmluaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbi5zZXRWYWx1ZSh0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEZWZpbml0aW9uID0gdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3QuZmluZCgocHJvY2VzcykgPT4gcHJvY2Vzcy5uYW1lID09PSB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc0RlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkUHJvY2Vzc2VzID0gdGhpcy5nZXRQcm9jZXNzRGVmaW5pdGlvbkxpc3RCeU5hbWVPcktleShwcm9jZXNzRGVmaW5pdGlvbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFByb2Nlc3NEZWZpbml0aW9uT25Gb3JtKHByb2Nlc3NEZWZpbml0aW9uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25TZWxlY3Rpb25DaGFuZ2VkKHByb2Nlc3NEZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25Mb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZUlkID0gJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRVJST1IuTE9BRF9QUk9DRVNTX0RFRlMnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhbmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2Nlc3NEZWZpbml0aW9uKHByb2Nlc3NEZWZpbml0aW9uQ2xvdWQ6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQsIHByb2Nlc3NEZWZpbml0aW9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodGhpcy5pc1ZhbGlkTmFtZShwcm9jZXNzRGVmaW5pdGlvbkNsb3VkLm5hbWUpICYmXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25DbG91ZC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocHJvY2Vzc0RlZmluaXRpb25OYW1lLnRvTG93ZXJDYXNlKCkpKSB8fFxuICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25DbG91ZC5rZXk/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocHJvY2Vzc0RlZmluaXRpb25OYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYnVpbGRQcm9jZXNzQ2xvdWRQYXlsb2FkKCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NQYXlsb2FkQ2xvdWQubmFtZSA9IHRoaXMucHJvY2Vzc0luc3RhbmNlTmFtZS52YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMudmFyaWFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NQYXlsb2FkQ2xvdWQudmFyaWFibGVzID0gdGhpcy52YXJpYWJsZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NQYXlsb2FkQ2xvdWQudmFyaWFibGVzID0gT2JqZWN0LmFzc2lnbih0aGlzLnByb2Nlc3NQYXlsb2FkQ2xvdWQudmFyaWFibGVzLCB0aGlzLmZvcm1DbG91ZC52YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DdXN0b21PdXRjb21lQ2xpY2tlZChvdXRjb21lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jdXN0b21PdXRjb21lID0gb3V0Y29tZTtcbiAgICAgICAgdGhpcy5zdGFydFByb2Nlc3MoKTtcbiAgICB9XG5cbiAgICBzdGFydFByb2Nlc3NXaXRob3V0Q29uZmlybWF0aW9uKCkge1xuICAgICAgICB0aGlzLmlzUHJvY2Vzc1N0YXJ0aW5nID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmhhc0Zvcm1cbiAgICAgICAgICAgID8gdGhpcy5zdGFydFByb2Nlc3NDbG91ZFNlcnZpY2Uuc3RhcnRQcm9jZXNzV2l0aEZvcm0oXG4gICAgICAgICAgICAgICAgICB0aGlzLmFwcE5hbWUsXG4gICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uQ3VycmVudC5mb3JtS2V5LFxuICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQudmVyc2lvbixcbiAgICAgICAgICAgICAgICAgIG5ldyBQcm9jZXNzV2l0aEZvcm1QYXlsb2FkQ2xvdWQoe1xuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lOiB0aGlzLnByb2Nlc3NJbnN0YW5jZU5hbWUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXk6IHRoaXMucHJvY2Vzc1BheWxvYWRDbG91ZC5wcm9jZXNzRGVmaW5pdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHRoaXMudmFyaWFibGVzID8/IHt9LFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogdGhpcy5mb3JtQ2xvdWQudmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWU6IHRoaXMuY3VzdG9tT3V0Y29tZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLnN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZS5zdGFydFByb2Nlc3MoXG4gICAgICAgICAgICAgICAgICB0aGlzLmFwcE5hbWUsXG4gICAgICAgICAgICAgICAgICBuZXcgUHJvY2Vzc1BheWxvYWRDbG91ZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5wcm9jZXNzSW5zdGFuY2VOYW1lLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5OiB0aGlzLnByb2Nlc3NQYXlsb2FkQ2xvdWQucHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzOiB0aGlzLnZhcmlhYmxlcyA/PyB7fVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICBhY3Rpb24uc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Y2Nlc3MuZW1pdChyZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNQcm9jZXNzU3RhcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlSWQgPSAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5TVEFSVCc7XG4gICAgICAgICAgICAgICAgdGhpcy51bmlmeUVycm9yUmVzcG9uc2UoZXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yLmVtaXQoZXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUHJvY2Vzc1N0YXJ0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXJ0UHJvY2VzcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1DbG91ZD8uY29uZmlybU1lc3NhZ2U/LnNob3cpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzV2l0aG91dENvbmZpcm1hdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmZvcm1DbG91ZC5jb25maXJtTWVzc2FnZS5tZXNzYWdlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzQ1MHB4J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc1dpdGhvdXRDb25maXJtYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdW5pZnlFcnJvclJlc3BvbnNlKGVycjogYW55KSB7XG4gICAgICAgIGlmICghZXJyPy5yZXNwb25zZT8uYm9keT8uZW50cnkgJiYgZXJyPy5yZXNwb25zZT8uYm9keT8ubWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyLnJlc3BvbnNlLmJvZHkgPSB7XG4gICAgICAgICAgICAgICAgZW50cnk6IEpTT04ucGFyc2UoZXJyLnJlc3BvbnNlLmJvZHkubWVzc2FnZSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYW5jZWxTdGFydFByb2Nlc3MoKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0RXJyb3JNZXNzYWdlKCkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZUlkID0gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldFByb2Nlc3NEZWZpbml0aW9uTGlzdCgpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbi5zZXRWYWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRQcm9jZXNzZXMgPSB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdDtcbiAgICB9XG5cbiAgICBkaXNwbGF5UHJvY2Vzc05hbWVPbkRyb3Bkb3duKHByb2Nlc3M6IGFueSkge1xuICAgICAgICBpZiAocHJvY2Vzcykge1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NOYW1lID0gcHJvY2VzcztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZSA9IHByb2Nlc3MubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzTmFtZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3BsYXlEcm9wZG93bihldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKCF0aGlzLmlucHV0QXV0b2NvbXBsZXRlLnBhbmVsT3Blbikge1xuICAgICAgICAgICAgdGhpcy5yZXNldFByb2Nlc3NEZWZpbml0aW9uTGlzdCgpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dEF1dG9jb21wbGV0ZS5vcGVuUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRBdXRvY29tcGxldGUuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc0RlZmluaXRpb25OYW1lVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzRGVmaW5pdGlvbkZpZWxkVmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NEZWZpbml0aW9uTmFtZUVycm9yID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzRGVmaW5pdGlvbkZpZWxkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzRGVmaW5pdGlvbiA9IHRoaXMuZ2V0UHJvY2Vzc0lmRXhpc3RzKHByb2Nlc3NEZWZpbml0aW9uRmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzRGVmaW5pdGlvbi5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25OYW1lRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NEZWZpbml0aW9uTmFtZUVycm9yID8geyAnaW52YWxpZCBuYW1lJzogdHJ1ZSB9IDogbnVsbDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRQcm9jZXNzRGVmaW5pdGlvblZhbHVlKHByb2Nlc3M6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5uYW1lID8gcHJvY2Vzcy5uYW1lIDogcHJvY2Vzcy5rZXk7XG4gICAgfVxuXG4gICAgb25Gb3JtQ29udGVudENsaWNrZWQoY29udGVudDogQ29udGVudExpbmtNb2RlbCkge1xuICAgICAgICB0aGlzLmZvcm1Db250ZW50Q2xpY2tlZC5lbWl0KGNvbnRlbnQpO1xuICAgIH1cblxuICAgIHByb2Nlc3NEZWZpbml0aW9uU2VsZWN0aW9uQ2hhbmdlZChwcm9jZXNzRGVmaW5pdGlvbjogUHJvY2Vzc0RlZmluaXRpb25DbG91ZCkge1xuICAgICAgICBpZiAocHJvY2Vzc0RlZmluaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdFByb2Nlc3NOYW1lKHByb2Nlc3NEZWZpbml0aW9uLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvblNlbGVjdGlvbi5lbWl0KHByb2Nlc3NEZWZpbml0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldERlZmF1bHRQcm9jZXNzTmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBwcm9jZXNzSW5zdGFuY2VEZXRhaWxzOiBQcm9jZXNzSW5zdGFuY2VDbG91ZCA9IHsgcHJvY2Vzc0RlZmluaXRpb25OYW1lIH07XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQcm9jZXNzTmFtZSA9IHRoaXMuZ2V0RGVmYXVsdFByb2Nlc3NOYW1lKHRoaXMubmFtZSwgcHJvY2Vzc0luc3RhbmNlRGV0YWlscyk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0luc3RhbmNlTmFtZS5zZXRWYWx1ZShkZWZhdWx0UHJvY2Vzc05hbWUpO1xuICAgICAgICB0aGlzLnByb2Nlc3NJbnN0YW5jZU5hbWUubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzSW5zdGFuY2VOYW1lLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0UHJvY2Vzc05hbWUocHJvY2Vzc05hbWVGb3JtYXQ6IHN0cmluZywgcHJvY2Vzc0luc3RhbmNlPzogUHJvY2Vzc0luc3RhbmNlQ2xvdWQpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZUZvcm1hdDtcbiAgICAgICAgaWYgKHByb2Nlc3NOYW1lLm1hdGNoKERBVEVfVElNRV9JREVOVElGSUVSX1JFR19FWFApKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVzZW50RGF0ZVRpbWUgPSBnZXRUaW1lKG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZS5yZXBsYWNlKERBVEVfVElNRV9JREVOVElGSUVSX1JFR19FWFAsIHRoaXMubG9jYWxpemVkRGF0ZVBpcGUudHJhbnNmb3JtKHByZXNlbnREYXRlVGltZSwgJ21lZGl1bScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9jZXNzTmFtZS5tYXRjaChQUk9DRVNTX0RFRklOSVRJT05fSURFTlRJRklFUl9SRUdfRVhQKSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9jZXNzRGVmaW5pdGlvbk5hbWUgPSBwcm9jZXNzSW5zdGFuY2UgPyBwcm9jZXNzSW5zdGFuY2UucHJvY2Vzc0RlZmluaXRpb25OYW1lIDogJyc7XG4gICAgICAgICAgICBwcm9jZXNzTmFtZSA9IHByb2Nlc3NOYW1lLnJlcGxhY2UoUFJPQ0VTU19ERUZJTklUSU9OX0lERU5USUZJRVJfUkVHX0VYUCwgc2VsZWN0ZWRQcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9jZXNzTmFtZTtcbiAgICB9XG5cbiAgICBvbk5leHRUYXNrQ2hlY2tib3hDaGVja2VkQ2hhbmdlZChldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5uZXh0VGFza0NoZWNrYm94Q2hlY2tlZENoYW5nZWQuZW1pdChldmVudCk7XG4gICAgfVxufVxuIiwiPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiIGNsYXNzPVwiYWRmLXN0YXJ0LXByb2Nlc3NcIiAqbmdJZj1cInByb2Nlc3NEZWZpbml0aW9uTG9hZGVkOyBlbHNlIHNwaW5uZXJcIj5cblxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICA8bWF0LWNhcmQtdGl0bGVcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1RpdGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRmLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAge3snQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5GT1JNLlRJVExFJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XG5cbiAgICAgICAgPG1hdC1jYXJkLXN1YnRpdGxlIGlkPVwiZXJyb3ItbWVzc2FnZVwiICpuZ0lmPVwiZXJyb3JNZXNzYWdlSWRcIj5cbiAgICAgICAgICAgIHt7IGVycm9yTWVzc2FnZUlkIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbWF0LWNhcmQtc3VidGl0bGU+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1Byb2Nlc3NEZWZpbml0aW9uc0VtcHR5OyBlbHNlIGVtcHR5UHJvY2Vzc0RlZmluaXRpb25zTGlzdFwiPlxuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJwcm9jZXNzRm9ybVwiIGNsYXNzPVwiYWRmLXNlbGVjdC1wcm9jZXNzLWZvcm1cIj5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZGYtcHJvY2Vzcy1pbnB1dC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwiYWx3YXlzXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93U2VsZWN0UHJvY2Vzc0Ryb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYWRmLXNlbGVjdC1jbG91ZC1wcm9jZXNzLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiYWRmLXN0YXJ0LXByb2Nlc3MtaW5wdXQtbGFiZWxcIj57eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5GT1JNLkxBQkVMLlRZUEUnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2Nlc3NEZWZpbml0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicHJvY2Vzc0RlZmluaXRpb25OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1wcm9jZXNzLWlucHV0LWF1dG9jb21wbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwcm9jZXNzRGVmaW5pdGlvbk9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwiZGlzcGxheVByb2Nlc3NOYW1lT25Ecm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZXRQcm9jZXNzRGVmaW5pdGlvbk9uRm9ybSgkZXZlbnQub3B0aW9uLnZhbHVlKVwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByb2Nlc3NEZWYgb2YgZmlsdGVyZWRQcm9jZXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRQcm9jZXNzRGVmaW5pdGlvblZhbHVlKHByb2Nlc3NEZWYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJvY2Vzc0RlZmluaXRpb25TZWxlY3Rpb25DaGFuZ2VkKHByb2Nlc3NEZWYpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFByb2Nlc3NEZWZpbml0aW9uVmFsdWUocHJvY2Vzc0RlZikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYWRmLXNlbGVjdC1wcm9jZXNzLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eydBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkZPUk0uU0VMRUNUX1BST0NFU1NfRFJPUERPV04nIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlEcm9wZG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9jZXNzRGVmaW5pdGlvbi5oYXNFcnJvcigncmVxdWlyZWQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZGYtZXJyb3ItcGJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRVJST1IuUFJPQ0VTU19ERUZJTklUSU9OX1JFUVVJUkVEJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgIDxhZGYtaW5wbGFjZS1mb3JtLWlucHV0IFtjb250cm9sXT1cInByb2Nlc3NJbnN0YW5jZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRk9STS5MQUJFTC5OQU1FJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2Nlc3NJbnN0YW5jZU5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5QUk9DRVNTX05BTUVfUkVRVUlSRUQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2Nlc3NJbnN0YW5jZU5hbWUuaGFzRXJyb3IoJ21heGxlbmd0aCcpXCIgaWQ9XCJhZGYtc3RhcnQtcHJvY2Vzcy1tYXhsZW5ndGgtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5NQVhJTVVNX0xFTkdUSCcgfCB0cmFuc2xhdGUgOiB7IGNoYXJhY3RlcnMgOiBtYXhOYW1lTGVuZ3RoIH0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvY2Vzc0luc3RhbmNlTmFtZS5oYXNFcnJvcigncGF0dGVybicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRVJST1IuU1BBQ0VfVkFMSURBVE9SJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2FkZi1pbnBsYWNlLWZvcm0taW5wdXQ+XG4gICAgICAgICAgICA8L2Zvcm0+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNGb3JtIGVsc2UgdGFza0Zvcm1DbG91ZEJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICA8YWRmLWNsb3VkLWZvcm1cbiAgICAgICAgICAgICAgICAgICAgI3N0YXJ0Rm9ybVxuICAgICAgICAgICAgICAgICAgICBbYXBwTmFtZV09XCJhcHBOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2FwcFZlcnNpb25dPVwicHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmFwcFZlcnNpb25cIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJyZXNvbHZlZFZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtSWRdPVwicHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmZvcm1LZXlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheU1vZGVDb25maWd1cmF0aW9uc109XCJkaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTYXZlQnV0dG9uXT1cInNob3dTYXZlQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDb21wbGV0ZUJ1dHRvbl09XCJzaG93Q29tcGxldGVCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1JlZnJlc2hCdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dUaXRsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93TmV4dFRhc2tDaGVja2JveF09XCJzaG93TmV4dFRhc2tDaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIFtpc05leHRUYXNrQ2hlY2tib3hDaGVja2VkXT1cImlzTmV4dFRhc2tDaGVja2JveENoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAoZm9ybUNvbnRlbnRDbGlja2VkKT1cIm9uRm9ybUNvbnRlbnRDbGlja2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoZm9ybUxvYWRlZCk9XCJvbkZvcm1Mb2FkZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChleGVjdXRlT3V0Y29tZSk9XCJvbkN1c3RvbU91dGNvbWVDbGlja2VkKCRldmVudC5vdXRjb21lLm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgKG5leHRUYXNrQ2hlY2tib3hDaGVja2VkQ2hhbmdlZCk9XCJvbk5leHRUYXNrQ2hlY2tib3hDaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YWRmLWNsb3VkLWZvcm0tY3VzdG9tLW91dGNvbWVzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0YXNrRm9ybUNsb3VkQnV0dG9uc1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2FkZi1jbG91ZC1mb3JtLWN1c3RvbS1vdXRjb21lcz5cbiAgICAgICAgICAgICAgICA8L2FkZi1jbG91ZC1mb3JtPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuXG48L21hdC1jYXJkPlxuXG48bmctdGVtcGxhdGUgI3Rhc2tGb3JtQ2xvdWRCdXR0b25zPlxuICAgIDxkaXYgY2xhc3M9XCJhZGYtc3RhcnQtcHJvY2Vzcy1jbG91ZC1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvblwiXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsU3RhcnRQcm9jZXNzKClcIlxuICAgICAgICAgICAgaWQ9XCJjYW5jZWxfcHJvY2Vzc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IGNhbmNlbEJ1dHRvbkxhYmVsIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cInNob3dTdGFydFByb2Nlc3NCdXR0b24kIHwgYXN5bmNcIlxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVN0YXJ0QnV0dG9uIHx8ICFpc1Byb2Nlc3NGb3JtVmFsaWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInN0YXJ0UHJvY2VzcygpXCJcbiAgICAgICAgICAgIGRhdGEtYXV0b21hdGlvbi1pZD1cImJ0bi1zdGFydFwiXG4gICAgICAgICAgICBpZD1cImJ1dHRvbi1zdGFydFwiXG4gICAgICAgICAgICBjbGFzcz1cImFkZi1idG4tc3RhcnRcIlxuICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgc3RhcnRQcm9jZXNzQnV0dG9uTGFiZWwgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5UHJvY2Vzc0RlZmluaXRpb25zTGlzdD5cbiAgICA8bWF0LWNhcmQtY29udGVudCAqbmdJZj1cInByb2Nlc3NEZWZpbml0aW9uTG9hZGVkXCI+XG4gICAgICAgIDxtYXQtY2FyZC1zdWJ0aXRsZSBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIiBpZD1cIm5vLXByb2Nlc3MtbWVzc2FnZVwiPlxuICAgICAgICAgICAge3sgJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuTk9fUFJPQ0VTU19ERUZJTklUSU9OUycgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2V9fVxuICAgICAgICA8L21hdC1jYXJkLXN1YnRpdGxlPlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3Bpbm5lcj5cbiAgICA8ZGl2IGNsYXNzPVwiYWRmLWxvYWRpbmctY29udGFpbmVyXCI+XG4gICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtbG9hZGluZ1wiXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAvPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==