@alfresco/adf-process-services-cloud 8.1.0-16500060130 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/assets/adf-process-services-cloud/i18n/de.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/es.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/fr.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/it.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/pl.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/pt.json +0 -3
- package/fesm2022/adf-process-services-cloud.mjs +490 -410
- package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
- package/lib/app/services/apps-process-cloud.service.d.ts +2 -2
- package/lib/form/components/widgets/display-rich-text/display-rich-text.widget.scss +0 -1
- package/lib/process/start-process/components/start-process-cloud.component.d.ts +0 -1
- package/lib/process/start-process/components/start-process-cloud.component.scss +4 -0
- package/lib/process/start-process/services/start-process-cloud.service.d.ts +1 -0
- package/lib/process-services-cloud.module.d.ts +2 -1
- package/lib/screen/components/screen-cloud/screen-cloud.component.d.ts +1 -1
- package/lib/screen/public-api.d.ts +3 -1
- package/lib/screen/services/provide-screen.d.ts +37 -0
- package/lib/{services → screen/services}/screen-rendering.service.d.ts +29 -0
- package/lib/services/public-api.d.ts +0 -1
- package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
- package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
- package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
- package/package.json +4 -6
- package/esm2022/adf-process-services-cloud.mjs +0 -5
- package/esm2022/lib/app/app-list-cloud.module.mjs +0 -20
- package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +0 -67
- package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +0 -125
- package/esm2022/lib/app/models/application-instance.model.mjs +0 -24
- package/esm2022/lib/app/public-api.mjs +0 -22
- package/esm2022/lib/app/services/apps-process-cloud.service.mjs +0 -97
- package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +0 -163
- package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +0 -97
- package/esm2022/lib/common/index.mjs +0 -18
- package/esm2022/lib/common/interface/environment.interface.mjs +0 -18
- package/esm2022/lib/common/interface/index.mjs +0 -18
- package/esm2022/lib/common/interface/public-api.mjs +0 -18
- package/esm2022/lib/common/public-api.mjs +0 -19
- package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +0 -57
- package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +0 -31
- package/esm2022/lib/form/components/form-cloud.component.mjs +0 -420
- package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +0 -53
- package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +0 -35
- package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +0 -249
- package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +0 -136
- package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +0 -107
- package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +0 -120
- package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +0 -122
- package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +0 -189
- package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +0 -85
- package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +0 -80
- package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +0 -464
- package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +0 -29
- package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +0 -46
- package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +0 -82
- package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +0 -91
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +0 -81
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +0 -53
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +0 -86
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +0 -116
- package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +0 -187
- package/esm2022/lib/form/form-cloud.module.mjs +0 -99
- package/esm2022/lib/form/models/form-cloud-representation.model.mjs +0 -48
- package/esm2022/lib/form/models/task-variable-cloud.model.mjs +0 -28
- package/esm2022/lib/form/public-api.mjs +0 -44
- package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +0 -120
- package/esm2022/lib/form/services/display-mode.service.mjs +0 -146
- package/esm2022/lib/form/services/form-cloud.service.interface.mjs +0 -18
- package/esm2022/lib/form/services/form-cloud.service.mjs +0 -201
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +0 -18
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +0 -51
- package/esm2022/lib/form/services/form-utils.service.mjs +0 -37
- package/esm2022/lib/form/services/process-cloud-content.service.mjs +0 -71
- package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +0 -52
- package/esm2022/lib/group/components/group-cloud.component.mjs +0 -423
- package/esm2022/lib/group/group-cloud.module.mjs +0 -33
- package/esm2022/lib/group/models/identity-group.model.mjs +0 -18
- package/esm2022/lib/group/public-api.mjs +0 -21
- package/esm2022/lib/group/services/identity-group.service.mjs +0 -89
- package/esm2022/lib/models/application-version.model.mjs +0 -21
- package/esm2022/lib/models/constant-values.type.mjs +0 -18
- package/esm2022/lib/models/data-column-custom-data.mjs +0 -18
- package/esm2022/lib/models/date-cloud-filter.model.mjs +0 -31
- package/esm2022/lib/models/date-format-cloud.model.mjs +0 -18
- package/esm2022/lib/models/engine-event-cloud.model.mjs +0 -18
- package/esm2022/lib/models/filter-cloud-model.mjs +0 -128
- package/esm2022/lib/models/process-definition-cloud.model.mjs +0 -32
- package/esm2022/lib/models/process-instance-variable.model.mjs +0 -18
- package/esm2022/lib/models/process-variable-filter.model.mjs +0 -18
- package/esm2022/lib/models/task-cloud.model.mjs +0 -23
- package/esm2022/lib/models/task-list-sorting.model.mjs +0 -40
- package/esm2022/lib/models/variable-definition.mjs +0 -18
- package/esm2022/lib/people/components/people-cloud.component.mjs +0 -498
- package/esm2022/lib/people/models/identity-user.model.mjs +0 -18
- package/esm2022/lib/people/people-cloud.module.mjs +0 -33
- package/esm2022/lib/people/public-api.mjs +0 -21
- package/esm2022/lib/people/services/identity-user.service.mjs +0 -119
- package/esm2022/lib/process/process-cloud.module.mjs +0 -40
- package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +0 -801
- package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +0 -58
- package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +0 -292
- package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +0 -170
- package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +0 -44
- package/esm2022/lib/process/process-filters/public-api.mjs +0 -23
- package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +0 -408
- package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +0 -137
- package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +0 -33
- package/esm2022/lib/process/process-header/public-api.mjs +0 -19
- package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +0 -593
- package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +0 -31
- package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +0 -18
- package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +0 -24
- package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +0 -37
- package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +0 -107
- package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +0 -40
- package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +0 -45
- package/esm2022/lib/process/process-list/public-api.mjs +0 -25
- package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +0 -253
- package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +0 -109
- package/esm2022/lib/process/public-api.mjs +0 -23
- package/esm2022/lib/process/services/process-cloud.service.mjs +0 -105
- package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +0 -465
- package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +0 -18
- package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +0 -26
- package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +0 -26
- package/esm2022/lib/process/start-process/public-api.mjs +0 -21
- package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +0 -125
- package/esm2022/lib/process-services-cloud.module.mjs +0 -98
- package/esm2022/lib/providers.mjs +0 -45
- package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +0 -186
- package/esm2022/lib/screen/models/screen-cloud.model.mjs +0 -18
- package/esm2022/lib/screen/public-api.mjs +0 -18
- package/esm2022/lib/services/base-cloud.service.mjs +0 -83
- package/esm2022/lib/services/cloud-token.service.mjs +0 -23
- package/esm2022/lib/services/form-fields.interfaces.mjs +0 -55
- package/esm2022/lib/services/local-preference-cloud.service.mjs +0 -122
- package/esm2022/lib/services/notification-cloud.service.mjs +0 -45
- package/esm2022/lib/services/preference-cloud.interface.mjs +0 -18
- package/esm2022/lib/services/public-api.mjs +0 -28
- package/esm2022/lib/services/screen-rendering.service.mjs +0 -30
- package/esm2022/lib/services/task-list-cloud.service.interface.mjs +0 -18
- package/esm2022/lib/services/user-preference-cloud.service.mjs +0 -105
- package/esm2022/lib/services/variable-mapper.sevice.mjs +0 -77
- package/esm2022/lib/services/web-socket.service.mjs +0 -146
- package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +0 -32
- package/esm2022/lib/task/models/task-details-cloud.model.mjs +0 -26
- package/esm2022/lib/task/models/task.model.mjs +0 -23
- package/esm2022/lib/task/public-api.mjs +0 -26
- package/esm2022/lib/task/services/task-cloud.service.mjs +0 -272
- package/esm2022/lib/task/task-cloud.module.mjs +0 -45
- package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +0 -59
- package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +0 -467
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +0 -205
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +0 -317
- package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +0 -146
- package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +0 -142
- package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +0 -72
- package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +0 -255
- package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +0 -207
- package/esm2022/lib/task/task-filters/public-api.mjs +0 -27
- package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +0 -283
- package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +0 -392
- package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +0 -56
- package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +0 -231
- package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +0 -89
- package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +0 -309
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +0 -101
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +0 -87
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +0 -85
- package/esm2022/lib/task/task-form/public-api.mjs +0 -21
- package/esm2022/lib/task/task-form/task-form.module.mjs +0 -36
- package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +0 -280
- package/esm2022/lib/task/task-header/public-api.mjs +0 -19
- package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +0 -33
- package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +0 -331
- package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +0 -115
- package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +0 -31
- package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +0 -389
- package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +0 -18
- package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +0 -18
- package/esm2022/lib/task/task-list/public-api.mjs +0 -23
- package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +0 -115
- package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +0 -178
- package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +0 -35
- package/esm2022/lib/types.mjs +0 -18
- package/esm2022/public-api.mjs +0 -40
- /package/lib/screen/{models → components/screen-cloud}/screen-cloud.model.d.ts +0 -0
|
@@ -1,408 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
import { Injectable, inject } from '@angular/core';
|
|
18
|
-
import { of, BehaviorSubject, Subject } from 'rxjs';
|
|
19
|
-
import { ProcessFilterCloudModel } from '../models/process-filter-cloud.model';
|
|
20
|
-
import { switchMap, map } from 'rxjs/operators';
|
|
21
|
-
import { PROCESS_FILTERS_SERVICE_TOKEN } from '../../../services/cloud-token.service';
|
|
22
|
-
import { IdentityUserService } from '../../../people/services/identity-user.service';
|
|
23
|
-
import { NotificationCloudService } from '../../../services/notification-cloud.service';
|
|
24
|
-
import * as i0 from "@angular/core";
|
|
25
|
-
const PROCESS_EVENT_SUBSCRIPTION_QUERY = `
|
|
26
|
-
subscription {
|
|
27
|
-
engineEvents(eventType: [
|
|
28
|
-
PROCESS_CANCELLED
|
|
29
|
-
PROCESS_COMPLETED
|
|
30
|
-
PROCESS_CREATED
|
|
31
|
-
PROCESS_RESUMED
|
|
32
|
-
PROCESS_SUSPENDED
|
|
33
|
-
PROCESS_STARTED
|
|
34
|
-
]) {
|
|
35
|
-
eventType
|
|
36
|
-
entity
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
`;
|
|
40
|
-
export class ProcessFilterCloudService {
|
|
41
|
-
constructor() {
|
|
42
|
-
this.filterKeyToBeRefreshedSource = new Subject();
|
|
43
|
-
this.filterKeyToBeRefreshed$ = this.filterKeyToBeRefreshedSource.asObservable();
|
|
44
|
-
this.preferenceService = inject(PROCESS_FILTERS_SERVICE_TOKEN);
|
|
45
|
-
this.identityUserService = inject(IdentityUserService);
|
|
46
|
-
this.notificationCloudService = inject(NotificationCloudService);
|
|
47
|
-
this.filtersSubject = new BehaviorSubject([]);
|
|
48
|
-
this.filters$ = this.filtersSubject.asObservable();
|
|
49
|
-
}
|
|
50
|
-
readQueryParams(obj) {
|
|
51
|
-
const model = Object.assign({}, obj);
|
|
52
|
-
if (Object.prototype.hasOwnProperty.call(obj, 'appVersion') && obj['appVersion']) {
|
|
53
|
-
if (typeof obj['appVersion'] === 'string') {
|
|
54
|
-
model.appVersion = obj['appVersion'].split(',').map((str) => parseInt(str, 10));
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (Object.prototype.hasOwnProperty.call(obj, 'lastModifiedFrom')) {
|
|
58
|
-
model.lastModifiedFrom = new Date(parseInt(obj['lastModifiedFrom'], 10));
|
|
59
|
-
}
|
|
60
|
-
if (Object.prototype.hasOwnProperty.call(obj, 'lastModifiedTo')) {
|
|
61
|
-
model.lastModifiedTo = new Date(parseInt(obj['lastModifiedTo'], 10));
|
|
62
|
-
}
|
|
63
|
-
return model;
|
|
64
|
-
}
|
|
65
|
-
writeQueryParams(value, filterProperties, appName, id) {
|
|
66
|
-
value = value || {};
|
|
67
|
-
const result = {
|
|
68
|
-
appName: appName || value['appName'],
|
|
69
|
-
id: id || value['id'],
|
|
70
|
-
...(value['environmentId'] && {
|
|
71
|
-
environmentId: value['environmentId']
|
|
72
|
-
})
|
|
73
|
-
};
|
|
74
|
-
for (const prop of filterProperties) {
|
|
75
|
-
if (prop === 'appVersionMultiple') {
|
|
76
|
-
const versions = value['appVersion'];
|
|
77
|
-
if (Array.isArray(versions) && versions.length > 0) {
|
|
78
|
-
result['appVersion'] = versions.join(',');
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else if (prop === 'lastModified') {
|
|
82
|
-
if (value['lastModifiedFrom']) {
|
|
83
|
-
result['lastModifiedFrom'] = value['lastModifiedFrom'].valueOf();
|
|
84
|
-
}
|
|
85
|
-
if (value['lastModifiedTo']) {
|
|
86
|
-
result['lastModifiedTo'] = value['lastModifiedTo'].valueOf();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else if (Object.prototype.hasOwnProperty.call(value, prop)) {
|
|
90
|
-
result[prop] = value[prop];
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return result;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Creates and returns the default process instance filters for a app.
|
|
97
|
-
*
|
|
98
|
-
* @param appName Name of the target app
|
|
99
|
-
*/
|
|
100
|
-
createDefaultFilters(appName) {
|
|
101
|
-
const key = this.prepareKey(appName);
|
|
102
|
-
this.preferenceService
|
|
103
|
-
.getPreferences(appName, key)
|
|
104
|
-
.pipe(switchMap((response) => {
|
|
105
|
-
const preferences = response?.list?.entries ? response.list.entries : [];
|
|
106
|
-
if (!this.hasPreferences(preferences)) {
|
|
107
|
-
return this.createProcessFilters(appName, key, this.defaultProcessFilters(appName));
|
|
108
|
-
}
|
|
109
|
-
else if (!this.hasProcessFilters(preferences, key)) {
|
|
110
|
-
return this.createProcessFilters(appName, key, this.defaultProcessFilters(appName));
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
return of(this.findFiltersByKeyInPreferences(preferences, key));
|
|
114
|
-
}
|
|
115
|
-
}), switchMap((filters) => this.handleCreateFilterBackwardsCompatibility(appName, key, filters)))
|
|
116
|
-
.subscribe((filters) => {
|
|
117
|
-
this.addFiltersToStream(filters);
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Gets all process instance filters for a process app.
|
|
122
|
-
*
|
|
123
|
-
* @param appName Name of the target app
|
|
124
|
-
* @returns Observable of process filters details
|
|
125
|
-
*/
|
|
126
|
-
getProcessFilters(appName) {
|
|
127
|
-
this.createDefaultFilters(appName);
|
|
128
|
-
return this.filters$;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Get process instance filter for given filter id
|
|
132
|
-
*
|
|
133
|
-
* @param appName Name of the target app
|
|
134
|
-
* @param id Id of the target process instance filter
|
|
135
|
-
* @returns Observable of process instance filter details
|
|
136
|
-
*/
|
|
137
|
-
getFilterById(appName, id) {
|
|
138
|
-
const key = this.prepareKey(appName);
|
|
139
|
-
return this.getProcessFiltersByKey(appName, key).pipe(switchMap((filters) => {
|
|
140
|
-
if (filters?.length === 0) {
|
|
141
|
-
return this.createProcessFilters(appName, key, this.defaultProcessFilters(appName));
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
return of(filters);
|
|
145
|
-
}
|
|
146
|
-
}), map((filters) => filters.filter((filter) => filter.id === id)[0]));
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Adds a new process instance filter
|
|
150
|
-
*
|
|
151
|
-
* @param newFilter The new filter to add
|
|
152
|
-
* @returns Observable of process instance filters with newly added filter
|
|
153
|
-
*/
|
|
154
|
-
addFilter(newFilter) {
|
|
155
|
-
const { appName, name } = newFilter;
|
|
156
|
-
const key = this.prepareKey(appName);
|
|
157
|
-
return this.getProcessFiltersByKey(appName, key).pipe(switchMap((filters) => {
|
|
158
|
-
if (filters?.length === 0) {
|
|
159
|
-
return this.createProcessFilters(appName, key, [newFilter]);
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
const index = filters.findIndex((filter) => filter.name === name);
|
|
163
|
-
if (index >= 0) {
|
|
164
|
-
filters.splice(index, 1);
|
|
165
|
-
}
|
|
166
|
-
filters.push(newFilter);
|
|
167
|
-
return this.preferenceService.updatePreference(appName, key, filters);
|
|
168
|
-
}
|
|
169
|
-
}), map((filters) => {
|
|
170
|
-
this.addFiltersToStream(filters);
|
|
171
|
-
return filters;
|
|
172
|
-
}));
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Update process instance filter
|
|
176
|
-
*
|
|
177
|
-
* @param updatedFilter The new filter to update
|
|
178
|
-
* @returns Observable of process instance filters with updated filter
|
|
179
|
-
*/
|
|
180
|
-
updateFilter(updatedFilter) {
|
|
181
|
-
const key = this.prepareKey(updatedFilter.appName);
|
|
182
|
-
return this.getProcessFiltersByKey(updatedFilter.appName, key).pipe(switchMap((filters) => {
|
|
183
|
-
if (filters?.length === 0) {
|
|
184
|
-
return this.createProcessFilters(updatedFilter.appName, key, [updatedFilter]);
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
const itemIndex = filters.findIndex((filter) => filter.id === updatedFilter.id);
|
|
188
|
-
filters[itemIndex] = updatedFilter;
|
|
189
|
-
return this.updateProcessFilters(updatedFilter.appName, key, filters);
|
|
190
|
-
}
|
|
191
|
-
}), map((updatedFilters) => {
|
|
192
|
-
this.addFiltersToStream(updatedFilters);
|
|
193
|
-
return updatedFilters;
|
|
194
|
-
}));
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Delete process instance filter
|
|
198
|
-
*
|
|
199
|
-
* @param deletedFilter The new filter to delete
|
|
200
|
-
* @returns Observable of process instance filters without deleted filter
|
|
201
|
-
*/
|
|
202
|
-
deleteFilter(deletedFilter) {
|
|
203
|
-
const key = this.prepareKey(deletedFilter.appName);
|
|
204
|
-
return this.getProcessFiltersByKey(deletedFilter.appName, key).pipe(switchMap((filters) => {
|
|
205
|
-
if (filters && filters.length > 0) {
|
|
206
|
-
filters = filters.filter((filter) => filter.id !== deletedFilter.id);
|
|
207
|
-
return this.updateProcessFilters(deletedFilter.appName, key, filters);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
return of([]);
|
|
211
|
-
}
|
|
212
|
-
}), map((filters) => {
|
|
213
|
-
this.addFiltersToStream(filters);
|
|
214
|
-
return filters;
|
|
215
|
-
}));
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Checks if given filter is a default filter
|
|
219
|
-
*
|
|
220
|
-
* @param filterName Name of the target process filter
|
|
221
|
-
* @returns Boolean value for whether the filter is a default filter
|
|
222
|
-
*/
|
|
223
|
-
isDefaultFilter(filterName) {
|
|
224
|
-
const defaultFilters = this.defaultProcessFilters();
|
|
225
|
-
return defaultFilters.findIndex((filter) => filterName === filter.name) !== -1;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Reset the process filters to the default configuration if it exists and stores it.
|
|
229
|
-
* If there is no default configuration for the process cloud filter with the provided filter name,
|
|
230
|
-
* then it changes nothing but stores the current values of the filter
|
|
231
|
-
*
|
|
232
|
-
* @param appName Name of the target app
|
|
233
|
-
* @param filter The process filter to be restored to defaults
|
|
234
|
-
* @returns Observable of process filters details
|
|
235
|
-
*/
|
|
236
|
-
resetProcessFilterToDefaults(appName, filter) {
|
|
237
|
-
const defaultFilter = this.defaultProcessFilters(appName).find((defaultFilterDefinition) => defaultFilterDefinition.name === filter.name) || filter;
|
|
238
|
-
defaultFilter.id = filter.id;
|
|
239
|
-
return this.updateFilter(defaultFilter);
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Checks user preference are empty or not
|
|
243
|
-
*
|
|
244
|
-
* @param preferences User preferences of the target app
|
|
245
|
-
* @returns Boolean value if the preferences are not empty
|
|
246
|
-
*/
|
|
247
|
-
hasPreferences(preferences) {
|
|
248
|
-
return preferences && preferences.length > 0;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Checks for process instance filters in given user preferences
|
|
252
|
-
*
|
|
253
|
-
* @param preferences User preferences of the target app
|
|
254
|
-
* @param key Key of the process instance filters
|
|
255
|
-
* @returns Boolean value if the preference has process instance filters
|
|
256
|
-
*/
|
|
257
|
-
hasProcessFilters(preferences, key) {
|
|
258
|
-
const filters = preferences.find((filter) => filter.entry.key === key);
|
|
259
|
-
return filters?.entry ? JSON.parse(filters.entry.value).length > 0 : false;
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Calls create preference api to create process instance filters
|
|
263
|
-
*
|
|
264
|
-
* @param appName Name of the target app
|
|
265
|
-
* @param key Key of the process instance filters
|
|
266
|
-
* @param filters Details of new process instance filter
|
|
267
|
-
* @returns Observable of created process instance filters
|
|
268
|
-
*/
|
|
269
|
-
createProcessFilters(appName, key, filters) {
|
|
270
|
-
return this.preferenceService.createPreference(appName, key, filters);
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Calls get preference api to get process instance filter by preference key
|
|
274
|
-
*
|
|
275
|
-
* @param appName Name of the target app
|
|
276
|
-
* @param key Key of the process instance filters
|
|
277
|
-
* @returns Observable of process instance filters
|
|
278
|
-
*/
|
|
279
|
-
getProcessFiltersByKey(appName, key) {
|
|
280
|
-
return this.preferenceService.getPreferenceByKey(appName, key);
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Calls update preference api to update process instance filter
|
|
284
|
-
*
|
|
285
|
-
* @param appName Name of the target app
|
|
286
|
-
* @param key Key of the process instance filters
|
|
287
|
-
* @param filters Details of update filter
|
|
288
|
-
* @returns Observable of updated process instance filters
|
|
289
|
-
*/
|
|
290
|
-
updateProcessFilters(appName, key, filters) {
|
|
291
|
-
return this.preferenceService.updatePreference(appName, key, filters);
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Creates a uniq key with appName and username
|
|
295
|
-
*
|
|
296
|
-
* @param appName Name of the target app
|
|
297
|
-
* @returns String of process instance filters preference key
|
|
298
|
-
*/
|
|
299
|
-
prepareKey(appName) {
|
|
300
|
-
const user = this.identityUserService.getCurrentUserInfo();
|
|
301
|
-
return `process-filters-${appName}-${user.username}`;
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Finds and returns the process instance filters from preferences
|
|
305
|
-
*
|
|
306
|
-
* @returns Array of ProcessFilterCloudModel
|
|
307
|
-
* @param preferences preferences
|
|
308
|
-
* @param key key
|
|
309
|
-
*/
|
|
310
|
-
findFiltersByKeyInPreferences(preferences, key) {
|
|
311
|
-
const result = preferences.find((filter) => filter.entry.key === key);
|
|
312
|
-
return result?.entry ? JSON.parse(result.entry.value) : [];
|
|
313
|
-
}
|
|
314
|
-
addFiltersToStream(filters) {
|
|
315
|
-
this.filtersSubject.next(filters);
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Creates and returns the default filters for a process app.
|
|
319
|
-
*
|
|
320
|
-
* @param appName Name of the target app
|
|
321
|
-
* @returns Array of ProcessFilterCloudModel
|
|
322
|
-
*/
|
|
323
|
-
defaultProcessFilters(appName) {
|
|
324
|
-
return [
|
|
325
|
-
new ProcessFilterCloudModel({
|
|
326
|
-
name: 'ADF_CLOUD_PROCESS_FILTERS.RUNNING_PROCESSES',
|
|
327
|
-
icon: 'inbox',
|
|
328
|
-
key: 'running-processes',
|
|
329
|
-
appName,
|
|
330
|
-
sort: 'startDate',
|
|
331
|
-
status: 'RUNNING',
|
|
332
|
-
order: 'DESC',
|
|
333
|
-
showCounter: true
|
|
334
|
-
}),
|
|
335
|
-
new ProcessFilterCloudModel({
|
|
336
|
-
name: 'ADF_CLOUD_PROCESS_FILTERS.COMPLETED_PROCESSES',
|
|
337
|
-
icon: 'done',
|
|
338
|
-
key: 'completed-processes',
|
|
339
|
-
appName,
|
|
340
|
-
sort: 'startDate',
|
|
341
|
-
status: 'COMPLETED',
|
|
342
|
-
order: 'DESC',
|
|
343
|
-
showCounter: false
|
|
344
|
-
}),
|
|
345
|
-
new ProcessFilterCloudModel({
|
|
346
|
-
name: 'ADF_CLOUD_PROCESS_FILTERS.ALL_PROCESSES',
|
|
347
|
-
key: 'all-processes',
|
|
348
|
-
icon: 'adjust',
|
|
349
|
-
appName,
|
|
350
|
-
sort: 'startDate',
|
|
351
|
-
status: '',
|
|
352
|
-
order: 'DESC',
|
|
353
|
-
showCounter: false
|
|
354
|
-
})
|
|
355
|
-
];
|
|
356
|
-
}
|
|
357
|
-
getProcessNotificationSubscription(appName) {
|
|
358
|
-
return this.notificationCloudService
|
|
359
|
-
.makeGQLQuery(appName, PROCESS_EVENT_SUBSCRIPTION_QUERY)
|
|
360
|
-
.pipe(map((events) => events?.data?.engineEvents));
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* Refresh filter key
|
|
364
|
-
*
|
|
365
|
-
* @param filterKey Key of the filter
|
|
366
|
-
*/
|
|
367
|
-
refreshFilter(filterKey) {
|
|
368
|
-
this.filterKeyToBeRefreshedSource.next(filterKey);
|
|
369
|
-
}
|
|
370
|
-
/**
|
|
371
|
-
* This method is run after retrieving the filter array from preferences.
|
|
372
|
-
* It handles the backwards compatibility with the new API by looking for the new properties and their counterparts in each passed filter.
|
|
373
|
-
* If the new property is not found, it is created and assigned the value constructed from the old property.
|
|
374
|
-
* The filters are then updated in the preferences and returned.
|
|
375
|
-
* Old properties are left untouched for purposes like feature toggling.
|
|
376
|
-
*
|
|
377
|
-
* @param appName Name of the target app.
|
|
378
|
-
* @param key Key of the process filters.
|
|
379
|
-
* @param filters Array of process filters to be checked for backward compatibility.
|
|
380
|
-
* @returns Observable of process filters with updated properties.
|
|
381
|
-
*/
|
|
382
|
-
handleCreateFilterBackwardsCompatibility(appName, key, filters) {
|
|
383
|
-
filters.forEach((filter) => {
|
|
384
|
-
if (filter.processDefinitionName && !filter.processDefinitionNames) {
|
|
385
|
-
filter.processDefinitionNames = [filter.processDefinitionName];
|
|
386
|
-
}
|
|
387
|
-
if (filter.initiator && !filter.initiators) {
|
|
388
|
-
filter.initiators = [filter.initiator];
|
|
389
|
-
}
|
|
390
|
-
if (filter.appVersion && !filter.appVersions) {
|
|
391
|
-
filter.appVersions = [filter.appVersion.toString()];
|
|
392
|
-
}
|
|
393
|
-
if (filter.status && !filter.statuses) {
|
|
394
|
-
filter.statuses = [filter.status];
|
|
395
|
-
}
|
|
396
|
-
});
|
|
397
|
-
return this.updateProcessFilters(appName, key, filters);
|
|
398
|
-
}
|
|
399
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProcessFilterCloudService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
400
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProcessFilterCloudService, providedIn: 'root' }); }
|
|
401
|
-
}
|
|
402
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProcessFilterCloudService, decorators: [{
|
|
403
|
-
type: Injectable,
|
|
404
|
-
args: [{
|
|
405
|
-
providedIn: 'root'
|
|
406
|
-
}]
|
|
407
|
-
}], ctorParameters: () => [] });
|
|
408
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1maWx0ZXItY2xvdWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzLWNsb3VkL3NyYy9saWIvcHJvY2Vzcy9wcm9jZXNzLWZpbHRlcnMvc2VydmljZXMvcHJvY2Vzcy1maWx0ZXItY2xvdWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsRUFBRSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7QUFHeEYsTUFBTSxnQ0FBZ0MsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Q0FjeEMsQ0FBQztBQUtGLE1BQU0sT0FBTyx5QkFBeUI7SUFVbEM7UUFQUSxpQ0FBNEIsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQzdELDRCQUF1QixHQUF1QixJQUFJLENBQUMsNEJBQTRCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFOUUsc0JBQWlCLEdBQUcsTUFBTSxDQUFrQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzNGLHdCQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xELDZCQUF3QixHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxD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Q0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDakUsTUFBTSxDQUFDLHNCQUFzQixHQUFHLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLENBQUMsV0FBVyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxDQUFDOytHQXhaUSx5QkFBeUI7bUhBQXpCLHlCQUF5QixjQUZ0QixNQUFNOzs0RkFFVCx5QkFBeUI7a0JBSHJDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL3Byb2Nlc3MtZmlsdGVyLWNsb3VkLm1vZGVsJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUFJPQ0VTU19GSUxURVJTX1NFUlZJQ0VfVE9LRU4gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jbG91ZC10b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IFByZWZlcmVuY2VDbG91ZFNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wcmVmZXJlbmNlLWNsb3VkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZGVudGl0eVVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vcGVvcGxlL3NlcnZpY2VzL2lkZW50aXR5LXVzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25DbG91ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24tY2xvdWQuc2VydmljZSc7XG5pbXBvcnQgeyBUYXNrQ2xvdWRFbmdpbmVFdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9lbmdpbmUtZXZlbnQtY2xvdWQubW9kZWwnO1xuXG5jb25zdCBQUk9DRVNTX0VWRU5UX1NVQlNDUklQVElPTl9RVUVSWSA9IGBcbiAgICBzdWJzY3JpcHRpb24ge1xuICAgICAgICBlbmdpbmVFdmVudHMoZXZlbnRUeXBlOiBbXG4gICAgICAgICAgICBQUk9DRVNTX0NBTkNFTExFRFxuICAgICAgICAgICAgUFJPQ0VTU19DT01QTEVURURcbiAgICAgICAgICAgIFBST0NFU1NfQ1JFQVRFRFxuICAgICAgICAgICAgUFJPQ0VTU19SRVNVTUVEXG4gICAgICAgICAgICBQUk9DRVNTX1NVU1BFTkRFRFxuICAgICAgICAgICAgUFJPQ0VTU19TVEFSVEVEXG4gICAgICAgIF0pIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZVxuICAgICAgICAgICAgZW50aXR5XG4gICAgICAgIH1cbiAgICB9XG5gO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFByb2Nlc3NGaWx0ZXJDbG91ZFNlcnZpY2Uge1xuICAgIHByaXZhdGUgZmlsdGVyc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdPjtcbiAgICBmaWx0ZXJzJDogT2JzZXJ2YWJsZTxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdPjtcbiAgICBwcml2YXRlIGZpbHRlcktleVRvQmVSZWZyZXNoZWRTb3VyY2UgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgZmlsdGVyS2V5VG9CZVJlZnJlc2hlZCQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuZmlsdGVyS2V5VG9CZVJlZnJlc2hlZFNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJlZmVyZW5jZVNlcnZpY2UgPSBpbmplY3Q8UHJlZmVyZW5jZUNsb3VkU2VydmljZUludGVyZmFjZT4oUFJPQ0VTU19GSUxURVJTX1NFUlZJQ0VfVE9LRU4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWRlbnRpdHlVc2VyU2VydmljZSA9IGluamVjdChJZGVudGl0eVVzZXJTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbkNsb3VkU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25DbG91ZFNlcnZpY2UpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcbiAgICAgICAgdGhpcy5maWx0ZXJzJCA9IHRoaXMuZmlsdGVyc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVhZFF1ZXJ5UGFyYW1zKG9iajogYW55KTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwge1xuICAgICAgICBjb25zdCBtb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIG9iaikgYXMgUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWw7XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosICdhcHBWZXJzaW9uJykgJiYgb2JqWydhcHBWZXJzaW9uJ10pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqWydhcHBWZXJzaW9uJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbW9kZWwuYXBwVmVyc2lvbiA9IG9ialsnYXBwVmVyc2lvbiddLnNwbGl0KCcsJykubWFwKChzdHIpID0+IHBhcnNlSW50KHN0ciwgMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCAnbGFzdE1vZGlmaWVkRnJvbScpKSB7XG4gICAgICAgICAgICBtb2RlbC5sYXN0TW9kaWZpZWRGcm9tID0gbmV3IERhdGUocGFyc2VJbnQob2JqWydsYXN0TW9kaWZpZWRGcm9tJ10sIDEwKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgJ2xhc3RNb2RpZmllZFRvJykpIHtcbiAgICAgICAgICAgIG1vZGVsLmxhc3RNb2RpZmllZFRvID0gbmV3IERhdGUocGFyc2VJbnQob2JqWydsYXN0TW9kaWZpZWRUbyddLCAxMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cblxuICAgIHdyaXRlUXVlcnlQYXJhbXModmFsdWU6IGFueSwgZmlsdGVyUHJvcGVydGllczogc3RyaW5nW10sIGFwcE5hbWU/OiBzdHJpbmcsIGlkPzogc3RyaW5nKTogYW55IHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSB8fCB7fTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgYXBwTmFtZTogYXBwTmFtZSB8fCB2YWx1ZVsnYXBwTmFtZSddLFxuICAgICAgICAgICAgaWQ6IGlkIHx8IHZhbHVlWydpZCddLFxuICAgICAgICAgICAgLi4uKHZhbHVlWydlbnZpcm9ubWVudElkJ10gJiYge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50SWQ6IHZhbHVlWydlbnZpcm9ubWVudElkJ11cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnYXBwVmVyc2lvbk11bHRpcGxlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb25zID0gdmFsdWVbJ2FwcFZlcnNpb24nXTtcblxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZlcnNpb25zKSAmJiB2ZXJzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnYXBwVmVyc2lvbiddID0gdmVyc2lvbnMuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCA9PT0gJ2xhc3RNb2RpZmllZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVbJ2xhc3RNb2RpZmllZEZyb20nXSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2xhc3RNb2RpZmllZEZyb20nXSA9IHZhbHVlWydsYXN0TW9kaWZpZWRGcm9tJ10udmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZVsnbGFzdE1vZGlmaWVkVG8nXSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2xhc3RNb2RpZmllZFRvJ10gPSB2YWx1ZVsnbGFzdE1vZGlmaWVkVG8nXS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gdmFsdWVbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGRlZmF1bHQgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXJzIGZvciBhIGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcHBOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCBhcHBcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURlZmF1bHRGaWx0ZXJzKGFwcE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMucHJlcGFyZUtleShhcHBOYW1lKTtcbiAgICAgICAgdGhpcy5wcmVmZXJlbmNlU2VydmljZVxuICAgICAgICAgICAgLmdldFByZWZlcmVuY2VzKGFwcE5hbWUsIGtleSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlZmVyZW5jZXMgPSByZXNwb25zZT8ubGlzdD8uZW50cmllcyA/IHJlc3BvbnNlLmxpc3QuZW50cmllcyA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzUHJlZmVyZW5jZXMocHJlZmVyZW5jZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQcm9jZXNzRmlsdGVycyhhcHBOYW1lLCBrZXksIHRoaXMuZGVmYXVsdFByb2Nlc3NGaWx0ZXJzKGFwcE5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5oYXNQcm9jZXNzRmlsdGVycyhwcmVmZXJlbmNlcywga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUHJvY2Vzc0ZpbHRlcnMoYXBwTmFtZSwga2V5LCB0aGlzLmRlZmF1bHRQcm9jZXNzRmlsdGVycyhhcHBOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5maW5kRmlsdGVyc0J5S2V5SW5QcmVmZXJlbmNlcyhwcmVmZXJlbmNlcywga2V5KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlcnMpID0+IHRoaXMuaGFuZGxlQ3JlYXRlRmlsdGVyQmFja3dhcmRzQ29tcGF0aWJpbGl0eShhcHBOYW1lLCBrZXksIGZpbHRlcnMpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsdGVyc1RvU3RyZWFtKGZpbHRlcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXJzIGZvciBhIHByb2Nlc3MgYXBwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcE5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IGFwcFxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgcHJvY2VzcyBmaWx0ZXJzIGRldGFpbHNcbiAgICAgKi9cbiAgICBnZXRQcm9jZXNzRmlsdGVycyhhcHBOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsW10+IHtcbiAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0RmlsdGVycyhhcHBOYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVycyQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVyIGZvciBnaXZlbiBmaWx0ZXIgaWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcHBOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCBhcHBcbiAgICAgKiBAcGFyYW0gaWQgSWQgb2YgdGhlIHRhcmdldCBwcm9jZXNzIGluc3RhbmNlIGZpbHRlclxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXIgZGV0YWlsc1xuICAgICAqL1xuICAgIGdldEZpbHRlckJ5SWQoYXBwTmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbD4ge1xuICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMucHJlcGFyZUtleShhcHBOYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc0ZpbHRlcnNCeUtleShhcHBOYW1lLCBrZXkpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlcnMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVycz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVByb2Nlc3NGaWx0ZXJzKGFwcE5hbWUsIGtleSwgdGhpcy5kZWZhdWx0UHJvY2Vzc0ZpbHRlcnMoYXBwTmFtZSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihmaWx0ZXJzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgoZmlsdGVycykgPT4gZmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmlkID09PSBpZClbMF0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBwcm9jZXNzIGluc3RhbmNlIGZpbHRlclxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlciBUaGUgbmV3IGZpbHRlciB0byBhZGRcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVycyB3aXRoIG5ld2x5IGFkZGVkIGZpbHRlclxuICAgICAqL1xuICAgIGFkZEZpbHRlcihuZXdGaWx0ZXI6IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsKTogT2JzZXJ2YWJsZTxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdPiB7XG4gICAgICAgIGNvbnN0IHsgYXBwTmFtZSwgbmFtZSB9ID0gbmV3RmlsdGVyO1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnByZXBhcmVLZXkoYXBwTmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvY2Vzc0ZpbHRlcnNCeUtleShhcHBOYW1lLCBrZXkpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlcnMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVycz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVByb2Nlc3NGaWx0ZXJzKGFwcE5hbWUsIGtleSwgW25ld0ZpbHRlcl0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcikgPT4gZmlsdGVyLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKG5ld0ZpbHRlcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZlcmVuY2VTZXJ2aWNlLnVwZGF0ZVByZWZlcmVuY2UoYXBwTmFtZSwga2V5LCBmaWx0ZXJzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsdGVyc1RvU3RyZWFtKGZpbHRlcnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgVXBkYXRlIHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXBkYXRlZEZpbHRlciBUaGUgbmV3IGZpbHRlciB0byB1cGRhdGVcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVycyB3aXRoIHVwZGF0ZWQgZmlsdGVyXG4gICAgICovXG4gICAgdXBkYXRlRmlsdGVyKHVwZGF0ZWRGaWx0ZXI6IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsKTogT2JzZXJ2YWJsZTxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdPiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMucHJlcGFyZUtleSh1cGRhdGVkRmlsdGVyLmFwcE5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzRmlsdGVyc0J5S2V5KHVwZGF0ZWRGaWx0ZXIuYXBwTmFtZSwga2V5KS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChmaWx0ZXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcnM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQcm9jZXNzRmlsdGVycyh1cGRhdGVkRmlsdGVyLmFwcE5hbWUsIGtleSwgW3VwZGF0ZWRGaWx0ZXJdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSBmaWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKSA9PiBmaWx0ZXIuaWQgPT09IHVwZGF0ZWRGaWx0ZXIuaWQpO1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzW2l0ZW1JbmRleF0gPSB1cGRhdGVkRmlsdGVyO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVQcm9jZXNzRmlsdGVycyh1cGRhdGVkRmlsdGVyLmFwcE5hbWUsIGtleSwgZmlsdGVycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAoKHVwZGF0ZWRGaWx0ZXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWx0ZXJzVG9TdHJlYW0odXBkYXRlZEZpbHRlcnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkRmlsdGVycztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIERlbGV0ZSBwcm9jZXNzIGluc3RhbmNlIGZpbHRlclxuICAgICAqXG4gICAgICogQHBhcmFtIGRlbGV0ZWRGaWx0ZXIgVGhlIG5ldyBmaWx0ZXIgdG8gZGVsZXRlXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiBwcm9jZXNzIGluc3RhbmNlIGZpbHRlcnMgd2l0aG91dCBkZWxldGVkIGZpbHRlclxuICAgICAqL1xuICAgIGRlbGV0ZUZpbHRlcihkZWxldGVkRmlsdGVyOiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbCk6IE9ic2VydmFibGU8UHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWxbXT4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnByZXBhcmVLZXkoZGVsZXRlZEZpbHRlci5hcHBOYW1lKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzRmlsdGVyc0J5S2V5KGRlbGV0ZWRGaWx0ZXIuYXBwTmFtZSwga2V5KS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChmaWx0ZXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcnMgJiYgZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuaWQgIT09IGRlbGV0ZWRGaWx0ZXIuaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVQcm9jZXNzRmlsdGVycyhkZWxldGVkRmlsdGVyLmFwcE5hbWUsIGtleSwgZmlsdGVycyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsdGVyc1RvU3RyZWFtKGZpbHRlcnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZ2l2ZW4gZmlsdGVyIGlzIGEgZGVmYXVsdCBmaWx0ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCBwcm9jZXNzIGZpbHRlclxuICAgICAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWUgZm9yIHdoZXRoZXIgdGhlIGZpbHRlciBpcyBhIGRlZmF1bHQgZmlsdGVyXG4gICAgICovXG4gICAgaXNEZWZhdWx0RmlsdGVyKGZpbHRlck5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVycyA9IHRoaXMuZGVmYXVsdFByb2Nlc3NGaWx0ZXJzKCk7XG4gICAgICAgIHJldHVybiBkZWZhdWx0RmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcikgPT4gZmlsdGVyTmFtZSA9PT0gZmlsdGVyLm5hbWUpICE9PSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGUgcHJvY2VzcyBmaWx0ZXJzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgaXQgZXhpc3RzIGFuZCBzdG9yZXMgaXQuXG4gICAgICogSWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgcHJvY2VzcyBjbG91ZCBmaWx0ZXIgd2l0aCB0aGUgcHJvdmlkZWQgZmlsdGVyIG5hbWUsXG4gICAgICogdGhlbiBpdCBjaGFuZ2VzIG5vdGhpbmcgYnV0IHN0b3JlcyB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGZpbHRlclxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcE5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IGFwcFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIHByb2Nlc3MgZmlsdGVyIHRvIGJlIHJlc3RvcmVkIHRvIGRlZmF1bHRzXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiBwcm9jZXNzIGZpbHRlcnMgZGV0YWlsc1xuICAgICAqL1xuICAgIHJlc2V0UHJvY2Vzc0ZpbHRlclRvRGVmYXVsdHMoYXBwTmFtZTogc3RyaW5nLCBmaWx0ZXI6IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsKTogT2JzZXJ2YWJsZTxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdPiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPVxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0UHJvY2Vzc0ZpbHRlcnMoYXBwTmFtZSkuZmluZCgoZGVmYXVsdEZpbHRlckRlZmluaXRpb24pID0+IGRlZmF1bHRGaWx0ZXJEZWZpbml0aW9uLm5hbWUgPT09IGZpbHRlci5uYW1lKSB8fCBmaWx0ZXI7XG4gICAgICAgIGRlZmF1bHRGaWx0ZXIuaWQgPSBmaWx0ZXIuaWQ7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUZpbHRlcihkZWZhdWx0RmlsdGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdXNlciBwcmVmZXJlbmNlIGFyZSBlbXB0eSBvciBub3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlcyBVc2VyIHByZWZlcmVuY2VzIG9mIHRoZSB0YXJnZXQgYXBwXG4gICAgICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSBpZiB0aGUgcHJlZmVyZW5jZXMgYXJlIG5vdCBlbXB0eVxuICAgICAqL1xuICAgIHByaXZhdGUgaGFzUHJlZmVyZW5jZXMocHJlZmVyZW5jZXM6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcHJlZmVyZW5jZXMgJiYgcHJlZmVyZW5jZXMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgZm9yIHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVycyBpbiBnaXZlbiB1c2VyIHByZWZlcmVuY2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZXMgVXNlciBwcmVmZXJlbmNlcyBvZiB0aGUgdGFyZ2V0IGFwcFxuICAgICAqIEBwYXJhbSBrZXkgS2V5IG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIGZpbHRlcnNcbiAgICAgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIGlmIHRoZSBwcmVmZXJlbmNlIGhhcyBwcm9jZXNzIGluc3RhbmNlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGhhc1Byb2Nlc3NGaWx0ZXJzKHByZWZlcmVuY2VzOiBhbnksIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBwcmVmZXJlbmNlcy5maW5kKChmaWx0ZXI6IGFueSkgPT4gZmlsdGVyLmVudHJ5LmtleSA9PT0ga2V5KTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcnM/LmVudHJ5ID8gSlNPTi5wYXJzZShmaWx0ZXJzLmVudHJ5LnZhbHVlKS5sZW5ndGggPiAwIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgY3JlYXRlIHByZWZlcmVuY2UgYXBpIHRvIGNyZWF0ZSBwcm9jZXNzIGluc3RhbmNlIGZpbHRlcnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcHBOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCBhcHBcbiAgICAgKiBAcGFyYW0ga2V5IEtleSBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgRGV0YWlscyBvZiBuZXcgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXJcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIGNyZWF0ZWQgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXJzXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVQcm9jZXNzRmlsdGVycyhhcHBOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nLCBmaWx0ZXJzOiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdKTogT2JzZXJ2YWJsZTxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWZlcmVuY2VTZXJ2aWNlLmNyZWF0ZVByZWZlcmVuY2UoYXBwTmFtZSwga2V5LCBmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBnZXQgcHJlZmVyZW5jZSBhcGkgdG8gZ2V0IHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVyIGJ5IHByZWZlcmVuY2Uga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXBwTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgYXBwXG4gICAgICogQHBhcmFtIGtleSBLZXkgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVyc1xuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXJzXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzRmlsdGVyc0J5S2V5KGFwcE5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlZmVyZW5jZVNlcnZpY2UuZ2V0UHJlZmVyZW5jZUJ5S2V5KGFwcE5hbWUsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgdXBkYXRlIHByZWZlcmVuY2UgYXBpIHRvIHVwZGF0ZSBwcm9jZXNzIGluc3RhbmNlIGZpbHRlclxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcE5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IGFwcFxuICAgICAqIEBwYXJhbSBrZXkgS2V5IG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmlsdGVycyBEZXRhaWxzIG9mIHVwZGF0ZSBmaWx0ZXJcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHVwZGF0ZWQgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXJzXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVQcm9jZXNzRmlsdGVycyhhcHBOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nLCBmaWx0ZXJzOiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdKTogT2JzZXJ2YWJsZTxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWZlcmVuY2VTZXJ2aWNlLnVwZGF0ZVByZWZlcmVuY2UoYXBwTmFtZSwga2V5LCBmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdW5pcSBrZXkgd2l0aCBhcHBOYW1lIGFuZCB1c2VybmFtZVxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcE5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IGFwcFxuICAgICAqIEByZXR1cm5zIFN0cmluZyBvZiBwcm9jZXNzIGluc3RhbmNlIGZpbHRlcnMgcHJlZmVyZW5jZSBrZXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVLZXkoYXBwTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuaWRlbnRpdHlVc2VyU2VydmljZS5nZXRDdXJyZW50VXNlckluZm8oKTtcbiAgICAgICAgcmV0dXJuIGBwcm9jZXNzLWZpbHRlcnMtJHthcHBOYW1lfS0ke3VzZXIudXNlcm5hbWV9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXJzIGZyb20gcHJlZmVyZW5jZXNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsXG4gICAgICogQHBhcmFtIHByZWZlcmVuY2VzIHByZWZlcmVuY2VzXG4gICAgICogQHBhcmFtIGtleSBrZXlcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRGaWx0ZXJzQnlLZXlJblByZWZlcmVuY2VzKHByZWZlcmVuY2VzOiBhbnksIGtleTogc3RyaW5nKTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWxbXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHByZWZlcmVuY2VzLmZpbmQoKGZpbHRlcjogYW55KSA9PiBmaWx0ZXIuZW50cnkua2V5ID09PSBrZXkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0Py5lbnRyeSA/IEpTT04ucGFyc2UocmVzdWx0LmVudHJ5LnZhbHVlKSA6IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkRmlsdGVyc1RvU3RyZWFtKGZpbHRlcnM6IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsW10pIHtcbiAgICAgICAgdGhpcy5maWx0ZXJzU3ViamVjdC5uZXh0KGZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGRlZmF1bHQgZmlsdGVycyBmb3IgYSBwcm9jZXNzIGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcHBOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCBhcHBcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFxuICAgICAqL1xuICAgIHByaXZhdGUgZGVmYXVsdFByb2Nlc3NGaWx0ZXJzKGFwcE5hbWU/OiBzdHJpbmcpOiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FERl9DTE9VRF9QUk9DRVNTX0ZJTFRFUlMuUlVOTklOR19QUk9DRVNTRVMnLFxuICAgICAgICAgICAgICAgIGljb246ICdpbmJveCcsXG4gICAgICAgICAgICAgICAga2V5OiAncnVubmluZy1wcm9jZXNzZXMnLFxuICAgICAgICAgICAgICAgIGFwcE5hbWUsXG4gICAgICAgICAgICAgICAgc29ydDogJ3N0YXJ0RGF0ZScsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnUlVOTklORycsXG4gICAgICAgICAgICAgICAgb3JkZXI6ICdERVNDJyxcbiAgICAgICAgICAgICAgICBzaG93Q291bnRlcjogdHJ1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBREZfQ0xPVURfUFJPQ0VTU19GSUxURVJTLkNPTVBMRVRFRF9QUk9DRVNTRVMnLFxuICAgICAgICAgICAgICAgIGljb246ICdkb25lJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdjb21wbGV0ZWQtcHJvY2Vzc2VzJyxcbiAgICAgICAgICAgICAgICBhcHBOYW1lLFxuICAgICAgICAgICAgICAgIHNvcnQ6ICdzdGFydERhdGUnLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgb3JkZXI6ICdERVNDJyxcbiAgICAgICAgICAgICAgICBzaG93Q291bnRlcjogZmFsc2VcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQURGX0NMT1VEX1BST0NFU1NfRklMVEVSUy5BTExfUFJPQ0VTU0VTJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdhbGwtcHJvY2Vzc2VzJyxcbiAgICAgICAgICAgICAgICBpY29uOiAnYWRqdXN0JyxcbiAgICAgICAgICAgICAgICBhcHBOYW1lLFxuICAgICAgICAgICAgICAgIHNvcnQ6ICdzdGFydERhdGUnLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJycsXG4gICAgICAgICAgICAgICAgb3JkZXI6ICdERVNDJyxcbiAgICAgICAgICAgICAgICBzaG93Q291bnRlcjogZmFsc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZ2V0UHJvY2Vzc05vdGlmaWNhdGlvblN1YnNjcmlwdGlvbihhcHBOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRhc2tDbG91ZEVuZ2luZUV2ZW50W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uQ2xvdWRTZXJ2aWNlXG4gICAgICAgICAgICAubWFrZUdRTFF1ZXJ5KGFwcE5hbWUsIFBST0NFU1NfRVZFTlRfU1VCU0NSSVBUSU9OX1FVRVJZKVxuICAgICAgICAgICAgLnBpcGUobWFwKChldmVudHM6IGFueSkgPT4gZXZlbnRzPy5kYXRhPy5lbmdpbmVFdmVudHMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWZyZXNoIGZpbHRlciBrZXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXJLZXkgIEtleSBvZiB0aGUgZmlsdGVyXG4gICAgICovXG4gICAgcmVmcmVzaEZpbHRlcihmaWx0ZXJLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcktleVRvQmVSZWZyZXNoZWRTb3VyY2UubmV4dChmaWx0ZXJLZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHJ1biBhZnRlciByZXRyaWV2aW5nIHRoZSBmaWx0ZXIgYXJyYXkgZnJvbSBwcmVmZXJlbmNlcy5cbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBuZXcgQVBJIGJ5IGxvb2tpbmcgZm9yIHRoZSBuZXcgcHJvcGVydGllcyBhbmQgdGhlaXIgY291bnRlcnBhcnRzIGluIGVhY2ggcGFzc2VkIGZpbHRlci5cbiAgICAgKiBJZiB0aGUgbmV3IHByb3BlcnR5IGlzIG5vdCBmb3VuZCwgaXQgaXMgY3JlYXRlZCBhbmQgYXNzaWduZWQgdGhlIHZhbHVlIGNvbnN0cnVjdGVkIGZyb20gdGhlIG9sZCBwcm9wZXJ0eS5cbiAgICAgKiBUaGUgZmlsdGVycyBhcmUgdGhlbiB1cGRhdGVkIGluIHRoZSBwcmVmZXJlbmNlcyBhbmQgcmV0dXJuZWQuXG4gICAgICogT2xkIHByb3BlcnRpZXMgYXJlIGxlZnQgdW50b3VjaGVkIGZvciBwdXJwb3NlcyBsaWtlIGZlYXR1cmUgdG9nZ2xpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXBwTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgYXBwLlxuICAgICAqIEBwYXJhbSBrZXkgS2V5IG9mIHRoZSBwcm9jZXNzIGZpbHRlcnMuXG4gICAgICogQHBhcmFtIGZpbHRlcnMgQXJyYXkgb2YgcHJvY2VzcyBmaWx0ZXJzIHRvIGJlIGNoZWNrZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiBwcm9jZXNzIGZpbHRlcnMgd2l0aCB1cGRhdGVkIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVDcmVhdGVGaWx0ZXJCYWNrd2FyZHNDb21wYXRpYmlsaXR5KFxuICAgICAgICBhcHBOYW1lOiBzdHJpbmcsXG4gICAgICAgIGtleTogc3RyaW5nLFxuICAgICAgICBmaWx0ZXJzOiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdXG4gICAgKTogT2JzZXJ2YWJsZTxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbFtdPiB7XG4gICAgICAgIGZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyLnByb2Nlc3NEZWZpbml0aW9uTmFtZSAmJiAhZmlsdGVyLnByb2Nlc3NEZWZpbml0aW9uTmFtZXMpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIucHJvY2Vzc0RlZmluaXRpb25OYW1lcyA9IFtmaWx0ZXIucHJvY2Vzc0RlZmluaXRpb25OYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWx0ZXIuaW5pdGlhdG9yICYmICFmaWx0ZXIuaW5pdGlhdG9ycykge1xuICAgICAgICAgICAgICAgIGZpbHRlci5pbml0aWF0b3JzID0gW2ZpbHRlci5pbml0aWF0b3JdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbHRlci5hcHBWZXJzaW9uICYmICFmaWx0ZXIuYXBwVmVyc2lvbnMpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIuYXBwVmVyc2lvbnMgPSBbZmlsdGVyLmFwcFZlcnNpb24udG9TdHJpbmcoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsdGVyLnN0YXR1cyAmJiAhZmlsdGVyLnN0YXR1c2VzKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyLnN0YXR1c2VzID0gW2ZpbHRlci5zdGF0dXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVQcm9jZXNzRmlsdGVycyhhcHBOYW1lLCBrZXksIGZpbHRlcnMpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
import { Component, DestroyRef, EventEmitter, inject, Input, Output, ViewEncapsulation } from '@angular/core';
|
|
18
|
-
import { AppConfigService, CardViewComponent, CardViewDateItemModel, CardViewTextItemModel, TranslationService } from '@alfresco/adf-core';
|
|
19
|
-
import { ProcessCloudService } from '../../services/process-cloud.service';
|
|
20
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
21
|
-
import { MatCardModule } from '@angular/material/card';
|
|
22
|
-
import { NgIf } from '@angular/common';
|
|
23
|
-
import * as i0 from "@angular/core";
|
|
24
|
-
import * as i1 from "../../services/process-cloud.service";
|
|
25
|
-
import * as i2 from "@alfresco/adf-core";
|
|
26
|
-
import * as i3 from "@angular/material/card";
|
|
27
|
-
export class ProcessHeaderCloudComponent {
|
|
28
|
-
constructor(processCloudService, translationService, appConfig) {
|
|
29
|
-
this.processCloudService = processCloudService;
|
|
30
|
-
this.translationService = translationService;
|
|
31
|
-
this.appConfig = appConfig;
|
|
32
|
-
/** (Required) The name of the application. */
|
|
33
|
-
this.appName = '';
|
|
34
|
-
/** Gets emitted each time a new process instance details are loaded. */
|
|
35
|
-
this.loaded = new EventEmitter();
|
|
36
|
-
this.destroyRef = inject(DestroyRef);
|
|
37
|
-
}
|
|
38
|
-
ngOnInit() {
|
|
39
|
-
this.dateFormat = this.appConfig.get('adf-cloud-process-header.defaultDateFormat');
|
|
40
|
-
this.dateLocale = this.appConfig.get('dateValues.defaultDateLocale');
|
|
41
|
-
this.processCloudService.dataChangesDetected
|
|
42
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
43
|
-
.subscribe((processDetails) => this.onLoaded(processDetails));
|
|
44
|
-
}
|
|
45
|
-
ngOnChanges() {
|
|
46
|
-
if ((this.appName || this.appName === '') && this.processInstanceId) {
|
|
47
|
-
this.loadProcessInstanceDetails(this.appName, this.processInstanceId);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
loadProcessInstanceDetails(appName, processInstanceId) {
|
|
51
|
-
this.processCloudService.getProcessInstanceById(appName, processInstanceId).subscribe((result) => this.onLoaded(result));
|
|
52
|
-
}
|
|
53
|
-
onLoaded(processInstanceDetails) {
|
|
54
|
-
this.processInstanceDetails = processInstanceDetails;
|
|
55
|
-
this.refreshData();
|
|
56
|
-
this.loaded.emit(processInstanceDetails);
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Refresh the card data
|
|
60
|
-
*/
|
|
61
|
-
refreshData() {
|
|
62
|
-
if (this.processInstanceDetails) {
|
|
63
|
-
const defaultProperties = this.initDefaultProperties();
|
|
64
|
-
const filteredProperties = this.appConfig.get('adf-cloud-process-header.presets.properties');
|
|
65
|
-
this.properties = defaultProperties.filter((cardItem) => this.isValidSelection(filteredProperties, cardItem));
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
initDefaultProperties() {
|
|
69
|
-
return [
|
|
70
|
-
new CardViewTextItemModel({
|
|
71
|
-
label: 'ADF_CLOUD_PROCESS_HEADER.PROPERTIES.ID',
|
|
72
|
-
value: this.processInstanceDetails.id,
|
|
73
|
-
key: 'id'
|
|
74
|
-
}),
|
|
75
|
-
new CardViewTextItemModel({
|
|
76
|
-
label: 'ADF_CLOUD_PROCESS_HEADER.PROPERTIES.NAME',
|
|
77
|
-
value: this.processInstanceDetails.name,
|
|
78
|
-
key: 'name',
|
|
79
|
-
default: this.translationService.instant('ADF_CLOUD_PROCESS_HEADER.PROPERTIES.NAME_DEFAULT')
|
|
80
|
-
}),
|
|
81
|
-
new CardViewTextItemModel({
|
|
82
|
-
label: 'ADF_CLOUD_PROCESS_HEADER.PROPERTIES.STATUS',
|
|
83
|
-
value: this.processInstanceDetails.status,
|
|
84
|
-
key: 'status'
|
|
85
|
-
}),
|
|
86
|
-
new CardViewTextItemModel({
|
|
87
|
-
label: 'ADF_CLOUD_PROCESS_HEADER.PROPERTIES.INITIATOR',
|
|
88
|
-
value: this.processInstanceDetails.initiator,
|
|
89
|
-
key: 'initiator'
|
|
90
|
-
}),
|
|
91
|
-
new CardViewDateItemModel({
|
|
92
|
-
label: 'ADF_CLOUD_PROCESS_HEADER.PROPERTIES.START_DATE',
|
|
93
|
-
value: this.processInstanceDetails.startDate,
|
|
94
|
-
key: 'startDate',
|
|
95
|
-
format: this.dateFormat,
|
|
96
|
-
locale: this.dateLocale
|
|
97
|
-
}),
|
|
98
|
-
new CardViewDateItemModel({
|
|
99
|
-
label: 'ADF_CLOUD_PROCESS_HEADER.PROPERTIES.LAST_MODIFIED',
|
|
100
|
-
value: this.processInstanceDetails.lastModified,
|
|
101
|
-
key: 'lastModified',
|
|
102
|
-
format: this.dateFormat,
|
|
103
|
-
locale: this.dateLocale
|
|
104
|
-
}),
|
|
105
|
-
new CardViewTextItemModel({
|
|
106
|
-
label: 'ADF_CLOUD_PROCESS_HEADER.PROPERTIES.PARENT_ID',
|
|
107
|
-
value: this.processInstanceDetails.parentId,
|
|
108
|
-
key: 'parentId',
|
|
109
|
-
default: this.translationService.instant('ADF_CLOUD_PROCESS_HEADER.PROPERTIES.NONE')
|
|
110
|
-
}),
|
|
111
|
-
new CardViewTextItemModel({
|
|
112
|
-
label: 'ADF_CLOUD_PROCESS_HEADER.PROPERTIES.BUSINESS_KEY',
|
|
113
|
-
value: this.processInstanceDetails.businessKey,
|
|
114
|
-
key: 'businessKey',
|
|
115
|
-
default: this.translationService.instant('ADF_CLOUD_PROCESS_HEADER.PROPERTIES.NONE')
|
|
116
|
-
})
|
|
117
|
-
];
|
|
118
|
-
}
|
|
119
|
-
isValidSelection(filteredProperties, cardItem) {
|
|
120
|
-
return filteredProperties ? filteredProperties.indexOf(cardItem.key) >= 0 : true;
|
|
121
|
-
}
|
|
122
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProcessHeaderCloudComponent, deps: [{ token: i1.ProcessCloudService }, { token: i2.TranslationService }, { token: i2.AppConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
123
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProcessHeaderCloudComponent, isStandalone: true, selector: "adf-cloud-process-header", inputs: { appName: "appName", processInstanceId: "processInstanceId" }, outputs: { loaded: "loaded" }, host: { classAttribute: "adf-cloud-process-header" }, usesOnChanges: true, ngImport: i0, template: "<mat-card appearance=\"outlined\" *ngIf=\"processInstanceDetails\" class=\"adf-process-header-cloud-card\">\n <mat-card-content>\n <adf-card-view [properties]=\"properties\" />\n </mat-card-content>\n</mat-card>\n", styles: [".adf-process-header-cloud-card{background-color:var(--adf-theme-background-card-color)}\n"], dependencies: [{ kind: "component", type: CardViewComponent, selector: "adf-card-view", inputs: ["properties", "editable", "displayEmpty", "displayNoneOption", "displayClearAction", "copyToClipboardAction", "useChipsForMultiValueProperty", "multiValueSeparator", "displayLabelForChips"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
124
|
-
}
|
|
125
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProcessHeaderCloudComponent, decorators: [{
|
|
126
|
-
type: Component,
|
|
127
|
-
args: [{ selector: 'adf-cloud-process-header', standalone: true, imports: [CardViewComponent, MatCardModule, NgIf], encapsulation: ViewEncapsulation.None, host: { class: 'adf-cloud-process-header' }, template: "<mat-card appearance=\"outlined\" *ngIf=\"processInstanceDetails\" class=\"adf-process-header-cloud-card\">\n <mat-card-content>\n <adf-card-view [properties]=\"properties\" />\n </mat-card-content>\n</mat-card>\n", styles: [".adf-process-header-cloud-card{background-color:var(--adf-theme-background-card-color)}\n"] }]
|
|
128
|
-
}], ctorParameters: () => [{ type: i1.ProcessCloudService }, { type: i2.TranslationService }, { type: i2.AppConfigService }], propDecorators: { appName: [{
|
|
129
|
-
type: Input,
|
|
130
|
-
args: [{ required: true }]
|
|
131
|
-
}], processInstanceId: [{
|
|
132
|
-
type: Input,
|
|
133
|
-
args: [{ required: true }]
|
|
134
|
-
}], loaded: [{
|
|
135
|
-
type: Output
|
|
136
|
-
}] } });
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1oZWFkZXItY2xvdWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3Byb2Nlc3Mtc2VydmljZXMtY2xvdWQvc3JjL2xpYi9wcm9jZXNzL3Byb2Nlc3MtaGVhZGVyL2NvbXBvbmVudHMvcHJvY2Vzcy1oZWFkZXItY2xvdWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3Byb2Nlc3Mtc2VydmljZXMtY2xvdWQvc3JjL2xpYi9wcm9jZXNzL3Byb2Nlc3MtaGVhZGVyL2NvbXBvbmVudHMvcHJvY2Vzcy1oZWFkZXItY2xvdWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSSxPQUFPLEVBQ0gsZ0JBQWdCLEVBRWhCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFFckIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBV3ZDLE1BQU0sT0FBTywyQkFBMkI7SUFvQnBDLFlBQ1ksbUJBQXdDLEVBQ3hDLGtCQUFzQyxFQUN0QyxTQUEyQjtRQUYzQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FB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Q0FBQztJQUNOLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxrQkFBNEIsRUFBRSxRQUErQjtRQUNsRixPQUFPLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3JGLENBQUM7K0dBckhRLDJCQUEyQjttR0FBM0IsMkJBQTJCLHNRQzFDeEMsNE5BS0EsbUpEK0JjLGlCQUFpQixpUUFBRSxhQUFhLDJOQUFFLElBQUk7OzRGQU12QywyQkFBMkI7a0JBVHZDLFNBQVM7K0JBQ0ksMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsaUJBRWxDLGlCQUFpQixDQUFDLElBQUksUUFFL0IsRUFBRSxLQUFLLEVBQUUsMEJBQTBCLEVBQUU7d0pBSzNDLE9BQU87c0JBRE4sS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBS3pCLGlCQUFpQjtzQkFEaEIsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBS3pCLE1BQU07c0JBREwsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFwcENvbmZpZ1NlcnZpY2UsXG4gICAgQ2FyZFZpZXdCYXNlSXRlbU1vZGVsLFxuICAgIENhcmRWaWV3Q29tcG9uZW50LFxuICAgIENhcmRWaWV3RGF0ZUl0ZW1Nb2RlbCxcbiAgICBDYXJkVmlld0l0ZW0sXG4gICAgQ2FyZFZpZXdUZXh0SXRlbU1vZGVsLFxuICAgIFRyYW5zbGF0aW9uU2VydmljZVxufSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgUHJvY2Vzc0luc3RhbmNlQ2xvdWQgfSBmcm9tICcuLi8uLi9zdGFydC1wcm9jZXNzL21vZGVscy9wcm9jZXNzLWluc3RhbmNlLWNsb3VkLm1vZGVsJztcbmltcG9ydCB7IFByb2Nlc3NDbG91ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9jZXNzLWNsb3VkLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTWF0Q2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLWNsb3VkLXByb2Nlc3MtaGVhZGVyJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDYXJkVmlld0NvbXBvbmVudCwgTWF0Q2FyZE1vZHVsZSwgTmdJZl0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Byb2Nlc3MtaGVhZGVyLWNsb3VkLmNvbXBvbmVudC5odG1sJyxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHN0eWxlVXJsczogWycuL3Byb2Nlc3MtaGVhZGVyLWNsb3VkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaG9zdDogeyBjbGFzczogJ2FkZi1jbG91ZC1wcm9jZXNzLWhlYWRlcicgfVxufSlcbmV4cG9ydCBjbGFzcyBQcm9jZXNzSGVhZGVyQ2xvdWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gICAgLyoqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uLiAqL1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgYXBwTmFtZTogc3RyaW5nID0gJyc7XG5cbiAgICAvKiogKFJlcXVpcmVkKSBUaGUgaWQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuICovXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nO1xuXG4gICAgLyoqIEdldHMgZW1pdHRlZCBlYWNoIHRpbWUgYSBuZXcgcHJvY2VzcyBpbnN0YW5jZSBkZXRhaWxzIGFyZSBsb2FkZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgbG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9jZXNzSW5zdGFuY2VDbG91ZD4oKTtcblxuICAgIHByb2Nlc3NJbnN0YW5jZURldGFpbHM6IFByb2Nlc3NJbnN0YW5jZUNsb3VkO1xuICAgIHByb3BlcnRpZXM6IENhcmRWaWV3SXRlbVtdO1xuICAgIGRhdGVGb3JtYXQ6IHN0cmluZztcbiAgICBkYXRlTG9jYWxlOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBwcm9jZXNzQ2xvdWRTZXJ2aWNlOiBQcm9jZXNzQ2xvdWRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFwcENvbmZpZzogQXBwQ29uZmlnU2VydmljZVxuICAgICkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmRhdGVGb3JtYXQgPSB0aGlzLmFwcENvbmZpZy5nZXQoJ2FkZi1jbG91ZC1wcm9jZXNzLWhlYWRlci5kZWZhdWx0RGF0ZUZvcm1hdCcpO1xuICAgICAgICB0aGlzLmRhdGVMb2NhbGUgPSB0aGlzLmFwcENvbmZpZy5nZXQoJ2RhdGVWYWx1ZXMuZGVmYXVsdERhdGVMb2NhbGUnKTtcblxuICAgICAgICB0aGlzLnByb2Nlc3NDbG91ZFNlcnZpY2UuZGF0YUNoYW5nZXNEZXRlY3RlZFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChwcm9jZXNzRGV0YWlscykgPT4gdGhpcy5vbkxvYWRlZChwcm9jZXNzRGV0YWlscykpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKCkge1xuICAgICAgICBpZiAoKHRoaXMuYXBwTmFtZSB8fCB0aGlzLmFwcE5hbWUgPT09ICcnKSAmJiB0aGlzLnByb2Nlc3NJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRQcm9jZXNzSW5zdGFuY2VEZXRhaWxzKHRoaXMuYXBwTmFtZSwgdGhpcy5wcm9jZXNzSW5zdGFuY2VJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRQcm9jZXNzSW5zdGFuY2VEZXRhaWxzKGFwcE5hbWU6IHN0cmluZywgcHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnByb2Nlc3NDbG91ZFNlcnZpY2UuZ2V0UHJvY2Vzc0luc3RhbmNlQnlJZChhcHBOYW1lLCBwcm9jZXNzSW5zdGFuY2VJZCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHRoaXMub25Mb2FkZWQocmVzdWx0KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkxvYWRlZChwcm9jZXNzSW5zdGFuY2VEZXRhaWxzOiBQcm9jZXNzSW5zdGFuY2VDbG91ZCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NJbnN0YW5jZURldGFpbHMgPSBwcm9jZXNzSW5zdGFuY2VEZXRhaWxzO1xuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XG5cbiAgICAgICAgdGhpcy5sb2FkZWQuZW1pdChwcm9jZXNzSW5zdGFuY2VEZXRhaWxzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWZyZXNoIHRoZSBjYXJkIGRhdGFcbiAgICAgKi9cbiAgICByZWZyZXNoRGF0YSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0luc3RhbmNlRGV0YWlscykge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFByb3BlcnRpZXMgPSB0aGlzLmluaXREZWZhdWx0UHJvcGVydGllcygpO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0aWVzID0gdGhpcy5hcHBDb25maWcuZ2V0PHN0cmluZ1tdPignYWRmLWNsb3VkLXByb2Nlc3MtaGVhZGVyLnByZXNldHMucHJvcGVydGllcycpO1xuICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gZGVmYXVsdFByb3BlcnRpZXMuZmlsdGVyKChjYXJkSXRlbSkgPT4gdGhpcy5pc1ZhbGlkU2VsZWN0aW9uKGZpbHRlcmVkUHJvcGVydGllcywgY2FyZEl0ZW0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBDYXJkVmlld1RleHRJdGVtTW9kZWwoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfSEVBREVSLlBST1BFUlRJRVMuSUQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnByb2Nlc3NJbnN0YW5jZURldGFpbHMuaWQsXG4gICAgICAgICAgICAgICAga2V5OiAnaWQnXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBDYXJkVmlld1RleHRJdGVtTW9kZWwoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfSEVBREVSLlBST1BFUlRJRVMuTkFNRScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucHJvY2Vzc0luc3RhbmNlRGV0YWlscy5uYW1lLFxuICAgICAgICAgICAgICAgIGtleTogJ25hbWUnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmluc3RhbnQoJ0FERl9DTE9VRF9QUk9DRVNTX0hFQURFUi5QUk9QRVJUSUVTLk5BTUVfREVGQVVMVCcpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBDYXJkVmlld1RleHRJdGVtTW9kZWwoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfSEVBREVSLlBST1BFUlRJRVMuU1RBVFVTJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wcm9jZXNzSW5zdGFuY2VEZXRhaWxzLnN0YXR1cyxcbiAgICAgICAgICAgICAgICBrZXk6ICdzdGF0dXMnXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBDYXJkVmlld1RleHRJdGVtTW9kZWwoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfSEVBREVSLlBST1BFUlRJRVMuSU5JVElBVE9SJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wcm9jZXNzSW5zdGFuY2VEZXRhaWxzLmluaXRpYXRvcixcbiAgICAgICAgICAgICAgICBrZXk6ICdpbml0aWF0b3InXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBDYXJkVmlld0RhdGVJdGVtTW9kZWwoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfSEVBREVSLlBST1BFUlRJRVMuU1RBUlRfREFURScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucHJvY2Vzc0luc3RhbmNlRGV0YWlscy5zdGFydERhdGUsXG4gICAgICAgICAgICAgICAga2V5OiAnc3RhcnREYXRlJyxcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMuZGF0ZUxvY2FsZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgQ2FyZFZpZXdEYXRlSXRlbU1vZGVsKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0hFQURFUi5QUk9QRVJUSUVTLkxBU1RfTU9ESUZJRUQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnByb2Nlc3NJbnN0YW5jZURldGFpbHMubGFzdE1vZGlmaWVkLFxuICAgICAgICAgICAgICAgIGtleTogJ2xhc3RNb2RpZmllZCcsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiB0aGlzLmRhdGVGb3JtYXQsXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmRhdGVMb2NhbGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IENhcmRWaWV3VGV4dEl0ZW1Nb2RlbCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfUFJPQ0VTU19IRUFERVIuUFJPUEVSVElFUy5QQVJFTlRfSUQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnByb2Nlc3NJbnN0YW5jZURldGFpbHMucGFyZW50SWQsXG4gICAgICAgICAgICAgICAga2V5OiAncGFyZW50SWQnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmluc3RhbnQoJ0FERl9DTE9VRF9QUk9DRVNTX0hFQURFUi5QUk9QRVJUSUVTLk5PTkUnKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgQ2FyZFZpZXdUZXh0SXRlbU1vZGVsKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0hFQURFUi5QUk9QRVJUSUVTLkJVU0lORVNTX0tFWScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucHJvY2Vzc0luc3RhbmNlRGV0YWlscy5idXNpbmVzc0tleSxcbiAgICAgICAgICAgICAgICBrZXk6ICdidXNpbmVzc0tleScsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuaW5zdGFudCgnQURGX0NMT1VEX1BST0NFU1NfSEVBREVSLlBST1BFUlRJRVMuTk9ORScpXG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZFNlbGVjdGlvbihmaWx0ZXJlZFByb3BlcnRpZXM6IHN0cmluZ1tdLCBjYXJkSXRlbTogQ2FyZFZpZXdCYXNlSXRlbU1vZGVsKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BlcnRpZXMgPyBmaWx0ZXJlZFByb3BlcnRpZXMuaW5kZXhPZihjYXJkSXRlbS5rZXkpID49IDAgOiB0cnVlO1xuICAgIH1cbn1cbiIsIjxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIiAqbmdJZj1cInByb2Nlc3NJbnN0YW5jZURldGFpbHNcIiBjbGFzcz1cImFkZi1wcm9jZXNzLWhlYWRlci1jbG91ZC1jYXJkXCI+XG4gIDxtYXQtY2FyZC1jb250ZW50PlxuICAgIDxhZGYtY2FyZC12aWV3IFtwcm9wZXJ0aWVzXT1cInByb3BlcnRpZXNcIiAvPlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPlxuIl19
|