@hmcts/ccd-case-ui-toolkit 7.2.27 → 7.2.28
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/esm2022/lib/shared/components/palette/palette.module.mjs +7 -2
- package/esm2022/lib/shared/components/palette/query-management/components/query-check-your-answers/query-check-your-answers.component.mjs +51 -193
- package/esm2022/lib/shared/components/palette/query-management/components/query-write/query-write-raise-query/query-write-raise-query.component.mjs +59 -6
- package/esm2022/lib/shared/components/palette/query-management/components/query-write/query-write-respond-to-query/query-write-respond-to-query.component.mjs +39 -6
- package/esm2022/lib/shared/components/palette/query-management/constants/query-management.constants.mjs +7 -0
- package/esm2022/lib/shared/components/palette/query-management/read-query-management-field.component.mjs +18 -9
- package/esm2022/lib/shared/components/palette/query-management/services/index.mjs +2 -1
- package/esm2022/lib/shared/components/palette/query-management/services/query-management.service.mjs +179 -0
- package/fesm2022/hmcts-ccd-case-ui-toolkit.mjs +585 -462
- package/fesm2022/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
- package/lib/shared/components/palette/palette.module.d.ts.map +1 -1
- package/lib/shared/components/palette/query-management/components/query-check-your-answers/query-check-your-answers.component.d.ts +15 -13
- package/lib/shared/components/palette/query-management/components/query-check-your-answers/query-check-your-answers.component.d.ts.map +1 -1
- package/lib/shared/components/palette/query-management/components/query-write/query-write-raise-query/query-write-raise-query.component.d.ts +24 -3
- package/lib/shared/components/palette/query-management/components/query-write/query-write-raise-query/query-write-raise-query.component.d.ts.map +1 -1
- package/lib/shared/components/palette/query-management/components/query-write/query-write-respond-to-query/query-write-respond-to-query.component.d.ts +12 -3
- package/lib/shared/components/palette/query-management/components/query-write/query-write-respond-to-query/query-write-respond-to-query.component.d.ts.map +1 -1
- package/lib/shared/components/palette/query-management/constants/query-management.constants.d.ts +7 -0
- package/lib/shared/components/palette/query-management/constants/query-management.constants.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/services/index.d.ts +1 -0
- package/lib/shared/components/palette/query-management/services/index.d.ts.map +1 -1
- package/lib/shared/components/palette/query-management/services/query-management.service.d.ts +21 -0
- package/lib/shared/components/palette/query-management/services/query-management.service.d.ts.map +1 -0
- package/package.json +1 -1
package/esm2022/lib/shared/components/palette/query-management/services/query-management.service.mjs
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Router } from '@angular/router';
|
|
3
|
+
import { QueryCreateContext } from '../models';
|
|
4
|
+
import { SessionStorageService } from '../../../../services';
|
|
5
|
+
import { USER_DETAILS } from '../../../../utils';
|
|
6
|
+
import { QueryManagementUtils } from '../utils/query-management.utils';
|
|
7
|
+
import { CASE_QUERIES_COLLECTION_ID, FIELD_TYPE_COMPLEX, DISPLAY_CONTEXT_READONLY, QM_SELECT_FIRST_COLLECTION, QM_COLLECTION_PROMPT, CIVIL_JURISDICTION } from '../constants/query-management.constants';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/router";
|
|
10
|
+
import * as i2 from "../../../../services";
|
|
11
|
+
export class QueryManagementService {
|
|
12
|
+
router;
|
|
13
|
+
sessionStorageService;
|
|
14
|
+
caseQueriesCollections;
|
|
15
|
+
fieldId;
|
|
16
|
+
constructor(router, sessionStorageService) {
|
|
17
|
+
this.router = router;
|
|
18
|
+
this.sessionStorageService = sessionStorageService;
|
|
19
|
+
}
|
|
20
|
+
generateCaseQueriesCollectionData(formGroup, queryCreateContext, queryItem, messageId // Get the message ID from route params (if present)
|
|
21
|
+
) {
|
|
22
|
+
let currentUserDetails;
|
|
23
|
+
try {
|
|
24
|
+
currentUserDetails = JSON.parse(this.sessionStorageService.getItem(USER_DETAILS));
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
console.error('Could not parse USER_DETAILS from session storage:', e);
|
|
28
|
+
currentUserDetails = {};
|
|
29
|
+
}
|
|
30
|
+
const caseMessage = queryCreateContext === QueryCreateContext.NEW_QUERY
|
|
31
|
+
? QueryManagementUtils.getNewQueryData(formGroup, currentUserDetails)
|
|
32
|
+
: QueryManagementUtils.getRespondOrFollowupQueryData(formGroup, queryItem, currentUserDetails);
|
|
33
|
+
const isNewQuery = queryCreateContext === QueryCreateContext.NEW_QUERY; // Check if this is a new query
|
|
34
|
+
// Check if the field ID has been set dynamically
|
|
35
|
+
if (!this.fieldId) {
|
|
36
|
+
console.error('Error: Field ID for CaseQueriesCollection not found. Cannot proceed with data generation.');
|
|
37
|
+
this.router.navigate(['/', 'service-down']);
|
|
38
|
+
throw new Error('Field ID for CaseQueriesCollection not found. Aborting query data generation.');
|
|
39
|
+
}
|
|
40
|
+
// Initialize new query data structure
|
|
41
|
+
const newQueryData = {};
|
|
42
|
+
if (this.caseQueriesCollections?.length) {
|
|
43
|
+
let matchedCollection;
|
|
44
|
+
// If it's not a new query, try to find the existing collection with the message ID
|
|
45
|
+
if (!isNewQuery && messageId) {
|
|
46
|
+
matchedCollection = this.caseQueriesCollections.find((collection) => collection.caseMessages.some((message) => message.value.id === messageId));
|
|
47
|
+
}
|
|
48
|
+
if (matchedCollection) {
|
|
49
|
+
// Append the new case message to the matched collection's caseMessages
|
|
50
|
+
matchedCollection.caseMessages.push({
|
|
51
|
+
id: null,
|
|
52
|
+
value: caseMessage
|
|
53
|
+
});
|
|
54
|
+
// Add the matched collection to newQueryData
|
|
55
|
+
newQueryData[this.fieldId] = {
|
|
56
|
+
...matchedCollection, // Keep existing data intact
|
|
57
|
+
caseMessages: [...matchedCollection.caseMessages] // Append the updated messages array
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Use partyName from the first collection (assumption: all share the same party)
|
|
62
|
+
const originalPartyName = this.caseQueriesCollections?.[0]?.partyName ?? currentUserDetails?.name;
|
|
63
|
+
// If no collection matches, or it's a new query
|
|
64
|
+
newQueryData[this.fieldId] = {
|
|
65
|
+
partyName: originalPartyName,
|
|
66
|
+
roleOnCase: '', // Not returned by CCD
|
|
67
|
+
caseMessages: [
|
|
68
|
+
{
|
|
69
|
+
id: null,
|
|
70
|
+
value: caseMessage
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
};
|
|
74
|
+
// If caseQueriesCollections is not empty, append its data
|
|
75
|
+
newQueryData[this.fieldId].caseMessages.push(...this.caseQueriesCollections.flatMap((collection) => collection.caseMessages));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// If there are no existing collections, create a new one (e.g., for new queries)
|
|
80
|
+
newQueryData[this.fieldId] = {
|
|
81
|
+
partyName: currentUserDetails?.name || `${currentUserDetails?.forename} ${currentUserDetails?.surname}`, // Not returned by CCD
|
|
82
|
+
roleOnCase: '', // Not returned by CCD
|
|
83
|
+
caseMessages: [
|
|
84
|
+
{
|
|
85
|
+
id: null,
|
|
86
|
+
value: caseMessage
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return newQueryData;
|
|
92
|
+
}
|
|
93
|
+
setCaseQueriesCollectionData(eventData, queryCreateContext, caseDetails, messageId) {
|
|
94
|
+
const resolvedFieldId = this.resolveFieldId(eventData, queryCreateContext, caseDetails, messageId);
|
|
95
|
+
if (!resolvedFieldId) {
|
|
96
|
+
console.error('Failed to resolve fieldId for CaseQueriesCollection. Cannot proceed.');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.fieldId = resolvedFieldId;
|
|
100
|
+
this.caseQueriesCollections = eventData.case_fields.reduce((acc, field) => {
|
|
101
|
+
if (field.id === this.fieldId) {
|
|
102
|
+
const extracted = QueryManagementUtils.extractCaseQueriesFromCaseField(field);
|
|
103
|
+
if (extracted && typeof extracted === 'object') {
|
|
104
|
+
acc.push(extracted);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return acc;
|
|
108
|
+
}, []);
|
|
109
|
+
}
|
|
110
|
+
resolveFieldId(eventData, queryCreateContext, caseDetails, messageId) {
|
|
111
|
+
// Step 1: Filter candidate fields (must be editable CaseQueriesCollection fields)
|
|
112
|
+
const candidateFields = eventData?.case_fields?.filter((field) => field.field_type.id === CASE_QUERIES_COLLECTION_ID &&
|
|
113
|
+
field.field_type.type === FIELD_TYPE_COMPLEX &&
|
|
114
|
+
field.display_context !== DISPLAY_CONTEXT_READONLY);
|
|
115
|
+
if (!candidateFields?.length) {
|
|
116
|
+
console.warn('No editable CaseQueriesCollection fields found.');
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const numberOfCollections = candidateFields.length;
|
|
120
|
+
const jurisdictionId = caseDetails?.case_type?.jurisdiction?.id ?? '';
|
|
121
|
+
// Step 2: If messageId is present, try to locate the field containing that message
|
|
122
|
+
if (messageId) {
|
|
123
|
+
const fieldByMessage = candidateFields.find((field) => field?.value?.caseMessages?.some((msg) => msg?.value?.id === messageId));
|
|
124
|
+
if (fieldByMessage) {
|
|
125
|
+
return fieldByMessage.id; // Found the matching field by message ID
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Step 3: Handle new queries
|
|
129
|
+
if (queryCreateContext === QueryCreateContext.NEW_QUERY) {
|
|
130
|
+
// If there's only one collection, use it
|
|
131
|
+
if (numberOfCollections === 1) {
|
|
132
|
+
return candidateFields[0].id;
|
|
133
|
+
}
|
|
134
|
+
// For multiple collections, use jurisdiction-based resolution strategy
|
|
135
|
+
if (this.getCollectionSelectionMethod(jurisdictionId) === QM_SELECT_FIRST_COLLECTION) {
|
|
136
|
+
// Choose the one with the lowest order from the first wizard page
|
|
137
|
+
const firstOrdered = this.getCaseQueriesCollectionFieldOrderFromWizardPages(eventData);
|
|
138
|
+
if (firstOrdered) {
|
|
139
|
+
return firstOrdered.id;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.error(`Error: Multiple CaseQueriesCollections are not supported yet for the ${jurisdictionId} jurisdiction`);
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Step 4: Fallback — if none of the above succeeded
|
|
148
|
+
console.warn('Could not determine fieldId for context:', queryCreateContext);
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
getCaseQueriesCollectionFieldOrderFromWizardPages(eventData) {
|
|
152
|
+
const candidateFields = eventData?.case_fields?.filter((field) => field.field_type.id === CASE_QUERIES_COLLECTION_ID &&
|
|
153
|
+
field.field_type.type === FIELD_TYPE_COMPLEX &&
|
|
154
|
+
field.display_context !== DISPLAY_CONTEXT_READONLY);
|
|
155
|
+
if (!candidateFields?.length) {
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
const firstPageFields = eventData?.wizard_pages?.[0]?.wizard_page_fields;
|
|
159
|
+
if (!firstPageFields) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
return candidateFields
|
|
163
|
+
.map((field) => {
|
|
164
|
+
const wizardField = firstPageFields.find((f) => f.case_field_id === field.id);
|
|
165
|
+
return { field, order: wizardField?.order ?? Number.MAX_SAFE_INTEGER };
|
|
166
|
+
})
|
|
167
|
+
.sort((a, b) => a.order - b.order)[0]?.field;
|
|
168
|
+
}
|
|
169
|
+
getCollectionSelectionMethod(jurisdiction) {
|
|
170
|
+
return jurisdiction.toUpperCase() === CIVIL_JURISDICTION ? QM_SELECT_FIRST_COLLECTION : QM_COLLECTION_PROMPT;
|
|
171
|
+
}
|
|
172
|
+
static ɵfac = function QueryManagementService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || QueryManagementService)(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i2.SessionStorageService)); };
|
|
173
|
+
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: QueryManagementService, factory: QueryManagementService.ɵfac, providedIn: 'root' });
|
|
174
|
+
}
|
|
175
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryManagementService, [{
|
|
176
|
+
type: Injectable,
|
|
177
|
+
args: [{ providedIn: 'root' }]
|
|
178
|
+
}], () => [{ type: i1.Router }, { type: i2.SessionStorageService }], null); })();
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktbWFuYWdlbWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9jb21wb25lbnRzL3BhbGV0dGUvcXVlcnktbWFuYWdlbWVudC9zZXJ2aWNlcy9xdWVyeS1tYW5hZ2VtZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUEyQixrQkFBa0IsRUFBd0MsTUFBTSxXQUFXLENBQUM7QUFDOUcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QiwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNuQixNQUFNLHlDQUF5QyxDQUFDOzs7O0FBS2pELE1BQU0sT0FBTyxzQkFBc0I7SUFLZDtJQUNBO0lBTFosc0JBQXNCLENBQTBCO0lBQ2hELE9BQU8sQ0FBUztJQUV2QixZQUNtQixNQUFjLEVBQ2QscUJBQTRDO1FBRDVDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO0lBQzVELENBQUM7SUFFRyxpQ0FBaUMsQ0FDdEMsU0FBb0IsRUFDcEIsa0JBQXNDLEVBQ3RDLFNBQXdCLEVBQ3hCLFNBQWtCLENBQUMsb0RBQW9EOztRQUV2RSxJQUFJLGtCQUFrQixDQUFDO1FBRXZCLElBQUksQ0FBQztZ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bXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ2FzZUZpZWxkLCBDYXNlRXZlbnRUcmlnZ2VyLCBDYXNlVmlldyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zaGFyZWQvZG9tYWluJztcbmltcG9ydCB7IFFtQ2FzZVF1ZXJpZXNDb2xsZWN0aW9uLCBRdWVyeUNyZWF0ZUNvbnRleHQsIFF1ZXJ5TGlzdEl0ZW0sIENhc2VRdWVyaWVzQ29sbGVjdGlvbiB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBTZXNzaW9uU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBVU0VSX0RFVEFJTFMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBRdWVyeU1hbmFnZW1lbnRVdGlscyB9IGZyb20gJy4uL3V0aWxzL3F1ZXJ5LW1hbmFnZW1lbnQudXRpbHMnO1xuaW1wb3J0IHtcbiAgQ0FTRV9RVUVSSUVTX0NPTExFQ1RJT05fSUQsXG4gIEZJRUxEX1RZUEVfQ09NUExFWCxcbiAgRElTUExBWV9DT05URVhUX1JFQURPTkxZLFxuICBRTV9TRUxFQ1RfRklSU1RfQ09MTEVDVElPTixcbiAgUU1fQ09MTEVDVElPTl9QUk9NUFQsXG4gIENJVklMX0pVUklTRElDVElPTlxufSBmcm9tICcuLi9jb25zdGFudHMvcXVlcnktbWFuYWdlbWVudC5jb25zdGFudHMnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuXG5leHBvcnQgY2xhc3MgUXVlcnlNYW5hZ2VtZW50U2VydmljZSB7XG4gIHB1YmxpYyBjYXNlUXVlcmllc0NvbGxlY3Rpb25zOiBDYXNlUXVlcmllc0NvbGxlY3Rpb25bXTtcbiAgcHVibGljIGZpZWxkSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlOiBTZXNzaW9uU3RvcmFnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZW5lcmF0ZUNhc2VRdWVyaWVzQ29sbGVjdGlvbkRhdGEoXG4gICAgZm9ybUdyb3VwOiBGb3JtR3JvdXAsXG4gICAgcXVlcnlDcmVhdGVDb250ZXh0OiBRdWVyeUNyZWF0ZUNvbnRleHQsXG4gICAgcXVlcnlJdGVtOiBRdWVyeUxpc3RJdGVtLFxuICAgIG1lc3NhZ2VJZD86IHN0cmluZyAvLyBHZXQgdGhlIG1lc3NhZ2UgSUQgZnJvbSByb3V0ZSBwYXJhbXMgKGlmIHByZXNlbnQpXG4gICk6IFFtQ2FzZVF1ZXJpZXNDb2xsZWN0aW9uIHtcbiAgICBsZXQgY3VycmVudFVzZXJEZXRhaWxzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGN1cnJlbnRVc2VyRGV0YWlscyA9IEpTT04ucGFyc2UodGhpcy5zZXNzaW9uU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShVU0VSX0RFVEFJTFMpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgcGFyc2UgVVNFUl9ERVRBSUxTIGZyb20gc2Vzc2lvbiBzdG9yYWdlOicsIGUpO1xuICAgICAgY3VycmVudFVzZXJEZXRhaWxzID0ge307XG4gICAgfVxuICAgIGNvbnN0IGNhc2VNZXNzYWdlID0gcXVlcnlDcmVhdGVDb250ZXh0ID09PSBRdWVyeUNyZWF0ZUNvbnRleHQuTkVXX1FVRVJZXG4gICAgICA/IFF1ZXJ5TWFuYWdlbWVudFV0aWxzLmdldE5ld1F1ZXJ5RGF0YShmb3JtR3JvdXAsIGN1cnJlbnRVc2VyRGV0YWlscylcbiAgICAgIDogUXVlcnlNYW5hZ2VtZW50VXRpbHMuZ2V0UmVzcG9uZE9yRm9sbG93dXBRdWVyeURhdGEoZm9ybUdyb3VwLCBxdWVyeUl0ZW0sIGN1cnJlbnRVc2VyRGV0YWlscyk7XG5cbiAgICBjb25zdCBpc05ld1F1ZXJ5ID0gcXVlcnlDcmVhdGVDb250ZXh0ID09PSBRdWVyeUNyZWF0ZUNvbnRleHQuTkVXX1FVRVJZOyAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbmV3IHF1ZXJ5XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZmllbGQgSUQgaGFzIGJlZW4gc2V0IGR5bmFtaWNhbGx5XG4gICAgaWYgKCF0aGlzLmZpZWxkSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBGaWVsZCBJRCBmb3IgQ2FzZVF1ZXJpZXNDb2xsZWN0aW9uIG5vdCBmb3VuZC4gQ2Fubm90IHByb2NlZWQgd2l0aCBkYXRhIGdlbmVyYXRpb24uJyk7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nLCAnc2VydmljZS1kb3duJ10pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWVsZCBJRCBmb3IgQ2FzZVF1ZXJpZXNDb2xsZWN0aW9uIG5vdCBmb3VuZC4gQWJvcnRpbmcgcXVlcnkgZGF0YSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgbmV3IHF1ZXJ5IGRhdGEgc3RydWN0dXJlXG4gICAgY29uc3QgbmV3UXVlcnlEYXRhOiBRbUNhc2VRdWVyaWVzQ29sbGVjdGlvbiA9IHt9O1xuXG4gICAgaWYgKHRoaXMuY2FzZVF1ZXJpZXNDb2xsZWN0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICBsZXQgbWF0Y2hlZENvbGxlY3Rpb247XG5cbiAgICAgIC8vIElmIGl0J3Mgbm90IGEgbmV3IHF1ZXJ5LCB0cnkgdG8gZmluZCB0aGUgZXhpc3RpbmcgY29sbGVjdGlvbiB3aXRoIHRoZSBtZXNzYWdlIElEXG4gICAgICBpZiAoIWlzTmV3UXVlcnkgJiYgbWVzc2FnZUlkKSB7XG4gICAgICAgIG1hdGNoZWRDb2xsZWN0aW9uID0gdGhpcy5jYXNlUXVlcmllc0NvbGxlY3Rpb25zLmZpbmQoKGNvbGxlY3Rpb24pID0+XG4gICAgICAgICAgY29sbGVjdGlvbi5jYXNlTWVzc2FnZXMuc29tZSgobWVzc2FnZSkgPT4gbWVzc2FnZS52YWx1ZS5pZCA9PT0gbWVzc2FnZUlkKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hlZENvbGxlY3Rpb24pIHtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgY2FzZSBtZXNzYWdlIHRvIHRoZSBtYXRjaGVkIGNvbGxlY3Rpb24ncyBjYXNlTWVzc2FnZXNcbiAgICAgICAgbWF0Y2hlZENvbGxlY3Rpb24uY2FzZU1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgIHZhbHVlOiBjYXNlTWVzc2FnZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgdGhlIG1hdGNoZWQgY29sbGVjdGlvbiB0byBuZXdRdWVyeURhdGFcbiAgICAgICAgbmV3UXVlcnlEYXRhW3RoaXMuZmllbGRJZF0gPSB7XG4gICAgICAgICAgLi4ubWF0Y2hlZENvbGxlY3Rpb24sIC8vIEtlZXAgZXhpc3RpbmcgZGF0YSBpbnRhY3RcbiAgICAgICAgICBjYXNlTWVzc2FnZXM6IFsuLi5tYXRjaGVkQ29sbGVjdGlvbi5jYXNlTWVzc2FnZXNdIC8vIEFwcGVuZCB0aGUgdXBkYXRlZCBtZXNzYWdlcyBhcnJheVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlIHBhcnR5TmFtZSBmcm9tIHRoZSBmaXJzdCBjb2xsZWN0aW9uIChhc3N1bXB0aW9uOiBhbGwgc2hhcmUgdGhlIHNhbWUgcGFydHkpXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUGFydHlOYW1lID0gdGhpcy5jYXNlUXVlcmllc0NvbGxlY3Rpb25zPy5bMF0/LnBhcnR5TmFtZSA/PyBjdXJyZW50VXNlckRldGFpbHM/Lm5hbWU7XG5cbiAgICAgICAgLy8gSWYgbm8gY29sbGVjdGlvbiBtYXRjaGVzLCBvciBpdCdzIGEgbmV3IHF1ZXJ5XG4gICAgICAgIG5ld1F1ZXJ5RGF0YVt0aGlzLmZpZWxkSWRdID0ge1xuICAgICAgICAgIHBhcnR5TmFtZTogb3JpZ2luYWxQYXJ0eU5hbWUsXG4gICAgICAgICAgcm9sZU9uQ2FzZTogJycsIC8vIE5vdCByZXR1cm5lZCBieSBDQ0RcbiAgICAgICAgICBjYXNlTWVzc2FnZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgIHZhbHVlOiBjYXNlTWVzc2FnZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJZiBjYXNlUXVlcmllc0NvbGxlY3Rpb25zIGlzIG5vdCBlbXB0eSwgYXBwZW5kIGl0cyBkYXRhXG4gICAgICAgIG5ld1F1ZXJ5RGF0YVt0aGlzLmZpZWxkSWRdLmNhc2VNZXNzYWdlcy5wdXNoKFxuICAgICAgICAgIC4uLnRoaXMuY2FzZVF1ZXJpZXNDb2xsZWN0aW9ucy5mbGF0TWFwKChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLmNhc2VNZXNzYWdlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV4aXN0aW5nIGNvbGxlY3Rpb25zLCBjcmVhdGUgYSBuZXcgb25lIChlLmcuLCBmb3IgbmV3IHF1ZXJpZXMpXG4gICAgICBuZXdRdWVyeURhdGFbdGhpcy5maWVsZElkXSA9IHtcbiAgICAgICAgcGFydHlOYW1lOiBjdXJyZW50VXNlckRldGFpbHM/Lm5hbWUgfHwgYCR7Y3VycmVudFVzZXJEZXRhaWxzPy5mb3JlbmFtZX0gJHtjdXJyZW50VXNlckRldGFpbHM/LnN1cm5hbWV9YCwgLy8gTm90IHJldHVybmVkIGJ5IENDRFxuICAgICAgICByb2xlT25DYXNlOiAnJywgLy8gTm90IHJldHVybmVkIGJ5IENDRFxuICAgICAgICBjYXNlTWVzc2FnZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgIHZhbHVlOiBjYXNlTWVzc2FnZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1F1ZXJ5RGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDYXNlUXVlcmllc0NvbGxlY3Rpb25EYXRhKFxuICAgIGV2ZW50RGF0YTogQ2FzZUV2ZW50VHJpZ2dlcixcbiAgICBxdWVyeUNyZWF0ZUNvbnRleHQ6IFF1ZXJ5Q3JlYXRlQ29udGV4dCxcbiAgICBjYXNlRGV0YWlsczogQ2FzZVZpZXcsXG4gICAgbWVzc2FnZUlkPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkRmllbGRJZCA9IHRoaXMucmVzb2x2ZUZpZWxkSWQoZXZlbnREYXRhLCBxdWVyeUNyZWF0ZUNvbnRleHQsIGNhc2VEZXRhaWxzLCBtZXNzYWdlSWQpO1xuXG4gICAgaWYgKCFyZXNvbHZlZEZpZWxkSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIGZpZWxkSWQgZm9yIENhc2VRdWVyaWVzQ29sbGVjdGlvbi4gQ2Fubm90IHByb2NlZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maWVsZElkID0gcmVzb2x2ZWRGaWVsZElkO1xuXG4gICAgdGhpcy5jYXNlUXVlcmllc0NvbGxlY3Rpb25zID0gZXZlbnREYXRhLmNhc2VfZmllbGRzLnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmlkID09PSB0aGlzLmZpZWxkSWQpIHtcbiAgICAgICAgY29uc3QgZXh0cmFjdGVkID0gUXVlcnlNYW5hZ2VtZW50VXRpbHMuZXh0cmFjdENhc2VRdWVyaWVzRnJvbUNhc2VGaWVsZChmaWVsZCk7XG4gICAgICAgIGlmIChleHRyYWN0ZWQgJiYgdHlwZW9mIGV4dHJhY3RlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBhY2MucHVzaChleHRyYWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUZpZWxkSWQoXG4gICAgZXZlbnREYXRhOiBDYXNlRXZlbnRUcmlnZ2VyLFxuICAgIHF1ZXJ5Q3JlYXRlQ29udGV4dDogUXVlcnlDcmVhdGVDb250ZXh0LFxuICAgIGNhc2VEZXRhaWxzOiBDYXNlVmlldyxcbiAgICBtZXNzYWdlSWQ/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gIC8vIFN0ZXAgMTogRmlsdGVyIGNhbmRpZGF0ZSBmaWVsZHMgKG11c3QgYmUgZWRpdGFibGUgQ2FzZVF1ZXJpZXNDb2xsZWN0aW9uIGZpZWxkcylcbiAgICBjb25zdCBjYW5kaWRhdGVGaWVsZHMgPSBldmVudERhdGE/LmNhc2VfZmllbGRzPy5maWx0ZXIoXG4gICAgICAoZmllbGQpID0+XG4gICAgICAgIGZpZWxkLmZpZWxkX3R5cGUuaWQgPT09IENBU0VfUVVFUklFU19DT0xMRUNUSU9OX0lEICYmXG4gICAgICBmaWVsZC5maWVsZF90eXBlLnR5cGUgPT09IEZJRUxEX1RZUEVfQ09NUExFWCAmJlxuICAgICAgZmllbGQuZGlzcGxheV9jb250ZXh0ICE9PSBESVNQTEFZX0NPTlRFWFRfUkVBRE9OTFlcbiAgICApO1xuXG4gICAgaWYgKCFjYW5kaWRhdGVGaWVsZHM/Lmxlbmd0aCkge1xuICAgICAgY29uc29sZS53YXJuKCdObyBlZGl0YWJsZSBDYXNlUXVlcmllc0NvbGxlY3Rpb24gZmllbGRzIGZvdW5kLicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbnVtYmVyT2ZDb2xsZWN0aW9ucyA9IGNhbmRpZGF0ZUZpZWxkcy5sZW5ndGg7XG4gICAgY29uc3QganVyaXNkaWN0aW9uSWQgPSBjYXNlRGV0YWlscz8uY2FzZV90eXBlPy5qdXJpc2RpY3Rpb24/LmlkID8/ICcnO1xuXG4gICAgLy8gU3RlcCAyOiBJZiBtZXNzYWdlSWQgaXMgcHJlc2VudCwgdHJ5IHRvIGxvY2F0ZSB0aGUgZmllbGQgY29udGFpbmluZyB0aGF0IG1lc3NhZ2VcbiAgICBpZiAobWVzc2FnZUlkKSB7XG4gICAgICBjb25zdCBmaWVsZEJ5TWVzc2FnZSA9IGNhbmRpZGF0ZUZpZWxkcy5maW5kKChmaWVsZCkgPT5cbiAgICAgICAgZmllbGQ/LnZhbHVlPy5jYXNlTWVzc2FnZXM/LnNvbWUoKG1zZykgPT4gbXNnPy52YWx1ZT8uaWQgPT09IG1lc3NhZ2VJZClcbiAgICAgICk7XG4gICAgICBpZiAoZmllbGRCeU1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkQnlNZXNzYWdlLmlkOyAvLyBGb3VuZCB0aGUgbWF0Y2hpbmcgZmllbGQgYnkgbWVzc2FnZSBJRFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogSGFuZGxlIG5ldyBxdWVyaWVzXG4gICAgaWYgKHF1ZXJ5Q3JlYXRlQ29udGV4dCA9PT0gUXVlcnlDcmVhdGVDb250ZXh0Lk5FV19RVUVSWSkge1xuICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgY29sbGVjdGlvbiwgdXNlIGl0XG4gICAgICBpZiAobnVtYmVyT2ZDb2xsZWN0aW9ucyA9PT0gMSkge1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlRmllbGRzWzBdLmlkO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgbXVsdGlwbGUgY29sbGVjdGlvbnMsIHVzZSBqdXJpc2RpY3Rpb24tYmFzZWQgcmVzb2x1dGlvbiBzdHJhdGVneVxuICAgICAgaWYgKHRoaXMuZ2V0Q29sbGVjdGlvblNlbGVjdGlvbk1ldGhvZChqdXJpc2RpY3Rpb25JZCkgPT09IFFNX1NFTEVDVF9GSVJTVF9DT0xMRUNUSU9OKSB7XG4gICAgICAvLyBDaG9vc2UgdGhlIG9uZSB3aXRoIHRoZSBsb3dlc3Qgb3JkZXIgZnJvbSB0aGUgZmlyc3Qgd2l6YXJkIHBhZ2VcbiAgICAgICAgY29uc3QgZmlyc3RPcmRlcmVkID0gdGhpcy5nZXRDYXNlUXVlcmllc0NvbGxlY3Rpb25GaWVsZE9yZGVyRnJvbVdpemFyZFBhZ2VzKGV2ZW50RGF0YSk7XG4gICAgICAgIGlmIChmaXJzdE9yZGVyZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmlyc3RPcmRlcmVkLmlkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogTXVsdGlwbGUgQ2FzZVF1ZXJpZXNDb2xsZWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQgZm9yIHRoZSAke2p1cmlzZGljdGlvbklkfSBqdXJpc2RpY3Rpb25gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RlcCA0OiBGYWxsYmFjayDigJQgaWYgbm9uZSBvZiB0aGUgYWJvdmUgc3VjY2VlZGVkXG4gICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZGV0ZXJtaW5lIGZpZWxkSWQgZm9yIGNvbnRleHQ6JywgcXVlcnlDcmVhdGVDb250ZXh0KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2FzZVF1ZXJpZXNDb2xsZWN0aW9uRmllbGRPcmRlckZyb21XaXphcmRQYWdlcyhldmVudERhdGE6IENhc2VFdmVudFRyaWdnZXIpOiBDYXNlRmllbGQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUZpZWxkcyA9IGV2ZW50RGF0YT8uY2FzZV9maWVsZHM/LmZpbHRlcihcbiAgICAgIChmaWVsZCkgPT5cbiAgICAgICAgZmllbGQuZmllbGRfdHlwZS5pZCA9PT0gQ0FTRV9RVUVSSUVTX0NPTExFQ1RJT05fSUQgJiZcbiAgICAgICAgZmllbGQuZmllbGRfdHlwZS50eXBlID09PSBGSUVMRF9UWVBFX0NPTVBMRVggJiZcbiAgICAgICAgZmllbGQuZGlzcGxheV9jb250ZXh0ICE9PSBESVNQTEFZX0NPTlRFWFRfUkVBRE9OTFlcbiAgICApO1xuXG4gICAgaWYgKCFjYW5kaWRhdGVGaWVsZHM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFBhZ2VGaWVsZHMgPSBldmVudERhdGE/LndpemFyZF9wYWdlcz8uWzBdPy53aXphcmRfcGFnZV9maWVsZHM7XG5cbiAgICBpZiAoIWZpcnN0UGFnZUZpZWxkcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlRmllbGRzXG4gICAgICAubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICBjb25zdCB3aXphcmRGaWVsZCA9IGZpcnN0UGFnZUZpZWxkcy5maW5kKChmKSA9PiBmLmNhc2VfZmllbGRfaWQgPT09IGZpZWxkLmlkKTtcbiAgICAgICAgcmV0dXJuIHsgZmllbGQsIG9yZGVyOiB3aXphcmRGaWVsZD8ub3JkZXIgPz8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpWzBdPy5maWVsZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sbGVjdGlvblNlbGVjdGlvbk1ldGhvZChqdXJpc2RpY3Rpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGp1cmlzZGljdGlvbi50b1VwcGVyQ2FzZSgpID09PSBDSVZJTF9KVVJJU0RJQ1RJT04gPyBRTV9TRUxFQ1RfRklSU1RfQ09MTEVDVElPTiA6IFFNX0NPTExFQ1RJT05fUFJPTVBUO1xuICB9XG59XG5cbiJdfQ==
|