@mediusinc/mng-commons-audit 3.0.0-rc.0 → 3.0.0-rc.1
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/README.md +32 -4
- package/assets/i18n/en.json +23 -21
- package/assets/i18n/sl.json +25 -14
- package/esm2022/lib/api/models/guiPropertyModel.mjs +6 -1
- package/esm2022/lib/api/models/index.mjs +1 -4
- package/esm2022/lib/api/services/audit-revisions-api.service.mjs +38 -21
- package/esm2022/lib/api/services/audit.service.mjs +45 -0
- package/esm2022/lib/audit.routes.mjs +33 -10
- package/esm2022/lib/components/entity-changes-field/entity-changes-field.component.mjs +49 -35
- package/esm2022/lib/components/pages/audit/audit-page.component.mjs +12 -0
- package/esm2022/lib/components/pages/entity-revisions/audit-entity-revisions-page.component.mjs +90 -32
- package/esm2022/lib/components/pages/revisions/audit-revisions-page.component.mjs +41 -45
- package/esm2022/lib/models/config.model.mjs +2 -0
- package/esm2022/lib/models/new-filter-match-type.model.mjs +19 -0
- package/esm2022/lib/models/revEntityWithId.model.mjs +9 -0
- package/esm2022/lib/service/module-config.token.mjs +3 -0
- package/esm2022/lib/utils/audit.util.mjs +300 -0
- package/fesm2022/mediusinc-mng-commons-audit.mjs +615 -306
- package/fesm2022/mediusinc-mng-commons-audit.mjs.map +1 -1
- package/lib/api/models/guiPropertyModel.d.ts +1 -0
- package/lib/api/models/index.d.ts +0 -3
- package/lib/api/services/audit-revisions-api.service.d.ts +16 -10
- package/lib/api/services/audit.service.d.ts +20 -0
- package/lib/audit.routes.d.ts +3 -2
- package/lib/components/entity-changes-field/entity-changes-field.component.d.ts +9 -6
- package/lib/components/pages/audit/audit-page.component.d.ts +5 -0
- package/lib/components/pages/entity-revisions/audit-entity-revisions-page.component.d.ts +21 -12
- package/lib/components/pages/revisions/audit-revisions-page.component.d.ts +8 -5
- package/lib/models/config.model.d.ts +4 -0
- package/lib/models/new-filter-match-type.model.d.ts +17 -0
- package/lib/models/revEntityWithId.model.d.ts +4 -0
- package/lib/service/module-config.token.d.ts +3 -0
- package/lib/utils/audit.util.d.ts +9 -0
- package/package.json +2 -3
- package/esm2022/lib/api/models/revEntityChangeDto.mjs +0 -52
- package/esm2022/lib/api/models/revEntityDto.mjs +0 -42
- package/esm2022/lib/api/models/revisionTypeEnumDto.mjs +0 -20
- package/esm2022/lib/api/services/audit-entity-revisions-api.service.mjs +0 -47
- package/esm2022/lib/components/pages/entity-revisions/entity-dropdown-page.component.mjs +0 -32
- package/lib/api/models/revEntityChangeDto.d.ts +0 -25
- package/lib/api/models/revEntityDto.d.ts +0 -20
- package/lib/api/models/revisionTypeEnumDto.d.ts +0 -5
- package/lib/api/services/audit-entity-revisions-api.service.d.ts +0 -14
- package/lib/components/pages/entity-revisions/entity-dropdown-page.component.d.ts +0 -12
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { MediusFilterMatchType, ObjectSerializer } from '@mediusinc/mng-commons';
|
|
2
|
+
import { GuiPropertyType, RevisionType } from '../api/models';
|
|
3
|
+
import { NewMediusFilterMatchType } from '../models/new-filter-match-type.model';
|
|
4
|
+
export class AuditUtil {
|
|
5
|
+
static addColumnsFromModel(descriptor, propertyList) {
|
|
6
|
+
for (const property of propertyList) {
|
|
7
|
+
if (property.propertyType === GuiPropertyType.Enum) {
|
|
8
|
+
// TODO is there a nicer way than appending "Dto" at the end of the simple name to match
|
|
9
|
+
descriptor
|
|
10
|
+
.addColumn(property.resolvedPropertyName)
|
|
11
|
+
.withSort()
|
|
12
|
+
.asEnum(ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'))
|
|
13
|
+
.withFilterLookupEnum(property.possibleEnumValues);
|
|
14
|
+
}
|
|
15
|
+
else if (property.propertyType === GuiPropertyType.Number) {
|
|
16
|
+
descriptor.addColumn(property.resolvedPropertyName).withSort().asNumber().withFilter();
|
|
17
|
+
}
|
|
18
|
+
else if (property.propertyType === GuiPropertyType.Boolean) {
|
|
19
|
+
descriptor.addColumn(property.resolvedPropertyName).withSort().asBoolean().withFilter();
|
|
20
|
+
}
|
|
21
|
+
else if (property.propertyType === GuiPropertyType.LocalDate) {
|
|
22
|
+
descriptor.addColumn(property.resolvedPropertyName).withSort().asDate('dd. MMM yyyy').withFilter();
|
|
23
|
+
}
|
|
24
|
+
else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
|
|
25
|
+
descriptor.addColumn(property.resolvedPropertyName).withSort().asDate('dd. MMM yyyy HH:mm').withFilter();
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// string / wildcard
|
|
29
|
+
descriptor.addColumn(property.resolvedPropertyName).withSort().withFilter();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return descriptor;
|
|
33
|
+
}
|
|
34
|
+
static addFieldsFromModel(descriptor, revModel) {
|
|
35
|
+
for (const property of revModel.properties) {
|
|
36
|
+
if (property.propertyType === GuiPropertyType.Enum) {
|
|
37
|
+
descriptor
|
|
38
|
+
.addFieldLookupEnum('revEntity.' + property.resolvedPropertyName, ObjectSerializer.get().findEnum(property.enumClassSimpleName), property.possibleEnumValues)
|
|
39
|
+
.withLabel(property.resolvedPropertyName)
|
|
40
|
+
.withDisabled();
|
|
41
|
+
}
|
|
42
|
+
else if (property.propertyType === GuiPropertyType.Number) {
|
|
43
|
+
descriptor
|
|
44
|
+
.addField('revEntity.' + property.resolvedPropertyName)
|
|
45
|
+
.withLabel(property.resolvedPropertyName)
|
|
46
|
+
.asNumber()
|
|
47
|
+
.withDisabled();
|
|
48
|
+
}
|
|
49
|
+
else if (property.propertyType === GuiPropertyType.Boolean) {
|
|
50
|
+
descriptor
|
|
51
|
+
.addField('revEntity.' + property.resolvedPropertyName)
|
|
52
|
+
.withLabel(property.resolvedPropertyName)
|
|
53
|
+
.withDisabled();
|
|
54
|
+
}
|
|
55
|
+
else if (property.propertyType === GuiPropertyType.LocalDate) {
|
|
56
|
+
descriptor
|
|
57
|
+
.addField('revEntity.' + property.resolvedPropertyName)
|
|
58
|
+
.withLabel(property.resolvedPropertyName)
|
|
59
|
+
.asDatePicker('dd. MMM yyyy')
|
|
60
|
+
.withDisabled();
|
|
61
|
+
}
|
|
62
|
+
else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
|
|
63
|
+
descriptor
|
|
64
|
+
.addField('revEntity.' + property.resolvedPropertyName)
|
|
65
|
+
.withLabel(property.resolvedPropertyName)
|
|
66
|
+
.asDatePicker('dd. MM yy', undefined, undefined, true, false)
|
|
67
|
+
.withDisabled();
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// string / wildcard
|
|
71
|
+
descriptor
|
|
72
|
+
.addField('revEntity.' + property.resolvedPropertyName)
|
|
73
|
+
.withLabel(property.resolvedPropertyName)
|
|
74
|
+
.withDisabled();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return descriptor;
|
|
78
|
+
}
|
|
79
|
+
static buildDescriptorForEntityRevision(descriptor, revModel, entityModel) {
|
|
80
|
+
descriptor
|
|
81
|
+
.addColumn('revType')
|
|
82
|
+
.withTitle('revType')
|
|
83
|
+
.asEnum(ObjectSerializer.get().findEnum('RevisionType'))
|
|
84
|
+
.withFilterLookupEnum([RevisionType.Add, RevisionType.Mod, RevisionType.Del]);
|
|
85
|
+
descriptor.addFieldLookupEnum('revType', ObjectSerializer.get().findEnum('RevisionType'), [RevisionType.Add, RevisionType.Mod, RevisionType.Del]).withLabel('revType');
|
|
86
|
+
for (const property of revModel.properties) {
|
|
87
|
+
if (property.propertyType === GuiPropertyType.Enum) {
|
|
88
|
+
// TODO is there a nicer way than appending "Dto" at the end of the simple name to match
|
|
89
|
+
descriptor
|
|
90
|
+
.addColumn('revEntity.' + property.resolvedPropertyName)
|
|
91
|
+
.withTitle(property.resolvedPropertyName)
|
|
92
|
+
.asEnum(ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'))
|
|
93
|
+
.withSort()
|
|
94
|
+
.withFilterLookupEnum(property.possibleEnumValues);
|
|
95
|
+
descriptor
|
|
96
|
+
.addFieldLookupEnum('revEntity.' + property.resolvedPropertyName, ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'), property.possibleEnumValues)
|
|
97
|
+
.withLabel(property.resolvedPropertyName);
|
|
98
|
+
}
|
|
99
|
+
else if (property.propertyType === GuiPropertyType.Number) {
|
|
100
|
+
descriptor
|
|
101
|
+
.addColumn('revEntity.' + property.resolvedPropertyName)
|
|
102
|
+
.withTitle(property.resolvedPropertyName)
|
|
103
|
+
.asNumber()
|
|
104
|
+
.withSort()
|
|
105
|
+
.withFilter();
|
|
106
|
+
descriptor
|
|
107
|
+
.addField('revEntity.' + property.resolvedPropertyName)
|
|
108
|
+
.withLabel(property.resolvedPropertyName)
|
|
109
|
+
.asNumber();
|
|
110
|
+
}
|
|
111
|
+
else if (property.propertyType === GuiPropertyType.Boolean) {
|
|
112
|
+
descriptor
|
|
113
|
+
.addColumn('revEntity.' + property.resolvedPropertyName)
|
|
114
|
+
.withTitle(property.resolvedPropertyName)
|
|
115
|
+
.asBoolean()
|
|
116
|
+
.withSort()
|
|
117
|
+
.withFilter();
|
|
118
|
+
descriptor.addField('revEntity.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
|
|
119
|
+
}
|
|
120
|
+
else if (property.propertyType === GuiPropertyType.LocalDate) {
|
|
121
|
+
descriptor
|
|
122
|
+
.addColumn('revEntity.' + property.resolvedPropertyName)
|
|
123
|
+
.withTitle(property.resolvedPropertyName)
|
|
124
|
+
.asDate('dd. MMM yyyy')
|
|
125
|
+
.withSort()
|
|
126
|
+
.withFilter();
|
|
127
|
+
descriptor
|
|
128
|
+
.addField('revEntity.' + property.resolvedPropertyName)
|
|
129
|
+
.withLabel(property.resolvedPropertyName)
|
|
130
|
+
.asDatePicker('dd. MMM yyyy');
|
|
131
|
+
}
|
|
132
|
+
else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
|
|
133
|
+
descriptor
|
|
134
|
+
.addColumn('revEntity.' + property.resolvedPropertyName)
|
|
135
|
+
.withTitle(property.resolvedPropertyName)
|
|
136
|
+
.asDate('dd. MMM yyyy HH:mm')
|
|
137
|
+
.withSort()
|
|
138
|
+
.withFilter();
|
|
139
|
+
descriptor
|
|
140
|
+
.addField('revEntity.' + property.resolvedPropertyName)
|
|
141
|
+
.withLabel(property.resolvedPropertyName)
|
|
142
|
+
.asDatePicker('dd. MM yy', undefined, undefined, true, false);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// string / wildcard
|
|
146
|
+
descriptor
|
|
147
|
+
.addColumn('revEntity.' + property.resolvedPropertyName)
|
|
148
|
+
.withTitle(property.resolvedPropertyName)
|
|
149
|
+
.withSort()
|
|
150
|
+
.withFilter();
|
|
151
|
+
descriptor.addField('revEntity.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
for (const property of entityModel.properties) {
|
|
155
|
+
if (property.propertyType === GuiPropertyType.Enum) {
|
|
156
|
+
// TODO is there a nicer way than appending "Dto" at the end of the simple name to match
|
|
157
|
+
descriptor
|
|
158
|
+
.addColumn('entityState.' + property.resolvedPropertyName)
|
|
159
|
+
.withTitle(property.resolvedPropertyName)
|
|
160
|
+
.asEnum(ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'))
|
|
161
|
+
.withSort()
|
|
162
|
+
.withFilterLookupEnum(property.possibleEnumValues);
|
|
163
|
+
descriptor
|
|
164
|
+
.addFieldLookupEnum('entityState.' + property.resolvedPropertyName, ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'), property.possibleEnumValues)
|
|
165
|
+
.withLabel(property.resolvedPropertyName);
|
|
166
|
+
}
|
|
167
|
+
else if (property.propertyType === GuiPropertyType.Number) {
|
|
168
|
+
descriptor
|
|
169
|
+
.addColumn('entityState.' + property.resolvedPropertyName)
|
|
170
|
+
.withTitle(property.resolvedPropertyName)
|
|
171
|
+
.asNumber()
|
|
172
|
+
.withSort()
|
|
173
|
+
.withFilter();
|
|
174
|
+
descriptor
|
|
175
|
+
.addField('entityState.' + property.resolvedPropertyName)
|
|
176
|
+
.withLabel(property.resolvedPropertyName)
|
|
177
|
+
.asNumber();
|
|
178
|
+
}
|
|
179
|
+
else if (property.propertyType === GuiPropertyType.Boolean) {
|
|
180
|
+
descriptor
|
|
181
|
+
.addColumn('entityState.' + property.resolvedPropertyName)
|
|
182
|
+
.withTitle(property.resolvedPropertyName)
|
|
183
|
+
.asBoolean()
|
|
184
|
+
.withSort()
|
|
185
|
+
.withFilter();
|
|
186
|
+
descriptor.addField('entityState.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
|
|
187
|
+
}
|
|
188
|
+
else if (property.propertyType === GuiPropertyType.LocalDate) {
|
|
189
|
+
descriptor
|
|
190
|
+
.addColumn('entityState.' + property.resolvedPropertyName)
|
|
191
|
+
.withTitle(property.resolvedPropertyName)
|
|
192
|
+
.asDate('dd. MMM yyyy')
|
|
193
|
+
.withSort()
|
|
194
|
+
.withFilter();
|
|
195
|
+
descriptor
|
|
196
|
+
.addField('entityState.' + property.resolvedPropertyName)
|
|
197
|
+
.withLabel(property.resolvedPropertyName)
|
|
198
|
+
.asDatePicker('dd. MMM yyyy');
|
|
199
|
+
}
|
|
200
|
+
else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
|
|
201
|
+
descriptor
|
|
202
|
+
.addColumn('entityState.' + property.resolvedPropertyName)
|
|
203
|
+
.withTitle(property.resolvedPropertyName)
|
|
204
|
+
.asDate('dd. MMM yyyy HH:mm')
|
|
205
|
+
.withSort()
|
|
206
|
+
.withFilter();
|
|
207
|
+
descriptor
|
|
208
|
+
.addField('entityState.' + property.resolvedPropertyName)
|
|
209
|
+
.withLabel(property.resolvedPropertyName)
|
|
210
|
+
.asDatePicker('dd. MM yy', undefined, undefined, true, false);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
// string / wildcard
|
|
214
|
+
descriptor
|
|
215
|
+
.addColumn('entityState.' + property.resolvedPropertyName)
|
|
216
|
+
.withTitle(property.resolvedPropertyName)
|
|
217
|
+
.withSort()
|
|
218
|
+
.withFilter();
|
|
219
|
+
descriptor.addField('entityState.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return descriptor;
|
|
223
|
+
}
|
|
224
|
+
static extractPropertyName(fullPropertyName) {
|
|
225
|
+
if (fullPropertyName?.includes('entityState.')) {
|
|
226
|
+
return fullPropertyName.replace('entityState.', '');
|
|
227
|
+
}
|
|
228
|
+
else if (fullPropertyName?.includes('revEntity.')) {
|
|
229
|
+
return fullPropertyName?.replace('revEntity.', '');
|
|
230
|
+
}
|
|
231
|
+
return fullPropertyName;
|
|
232
|
+
}
|
|
233
|
+
static appendMediusQueryParamsToUrl(queryParams) {
|
|
234
|
+
let url = `?firstResult=${queryParams.itemsOffset}&maxResults=${queryParams.itemsPerPage}`;
|
|
235
|
+
if (queryParams.sortProperty && queryParams.sortProperty.length > 0) {
|
|
236
|
+
url += '&sorts=';
|
|
237
|
+
const sortingQPs = [];
|
|
238
|
+
for (let i = 0; i < queryParams.sortProperty.length; i++) {
|
|
239
|
+
if (queryParams.sortAsc[i]) {
|
|
240
|
+
sortingQPs.push(`asc:${this.extractPropertyName(queryParams.sortProperty[i])}`);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
sortingQPs.push(`desc:${this.extractPropertyName(queryParams.sortProperty[i])}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
url += sortingQPs.join(',');
|
|
247
|
+
}
|
|
248
|
+
if (queryParams.filterParams && queryParams.filterParams.length > 0) {
|
|
249
|
+
const filterQPs = [];
|
|
250
|
+
for (const mfp of queryParams.filterParams) {
|
|
251
|
+
switch (mfp.filterMatchType) {
|
|
252
|
+
case MediusFilterMatchType.Equals: {
|
|
253
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Equals}:${mfp.filterValue}`);
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
case MediusFilterMatchType.NotEquals: {
|
|
257
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.NotEquals}:${mfp.filterValue}`);
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
case MediusFilterMatchType.FromTo: {
|
|
261
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Between}:${mfp.filterValue},${mfp.filterValueTo}`);
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
case MediusFilterMatchType.Contains: {
|
|
265
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Contains}:${mfp.filterValue}`);
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
case MediusFilterMatchType.StartsWith: {
|
|
269
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.StartsWith}:${mfp.filterValue}`);
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
case MediusFilterMatchType.EndsWith: {
|
|
273
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.EndsWith}:${mfp.filterValue}`);
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
case MediusFilterMatchType.In: {
|
|
277
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.In}:${mfp.filterValue}`);
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
case MediusFilterMatchType.NotIn: {
|
|
281
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.NotIn}:${mfp.filterValue}`);
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
case MediusFilterMatchType.SmallerThan: {
|
|
285
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.LessThan}:${mfp.filterValue}`);
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
case MediusFilterMatchType.GreaterThan: {
|
|
289
|
+
filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.GreaterThan}:${mfp.filterValue}`);
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
url += '&';
|
|
295
|
+
url += filterQPs.join('&');
|
|
296
|
+
}
|
|
297
|
+
return url;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvYXVkaXQudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1CLHFCQUFxQixFQUFvQixnQkFBZ0IsRUFBdUMsTUFBTSx3QkFBd0IsQ0FBQztBQUV6SixPQUFPLEVBQW1DLGVBQWUsRUFBeUIsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBRS9FLE1BQU0sT0FBTyxTQUFTO0lBQ1gsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFVBQWdDLEVBQUUsWUFBZ0M7UUFDaEcsS0FBSyxNQUFNLFFBQVEsSUFBSSxZQUFZLEVBQUU7WUFDakMsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLGVBQWUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hELHdGQUF3RjtnQkFDeEYsVUFBVTtxQkFDTCxTQUFTLENBQUMsUUFBUSxDQUFDLG9CQUFxQixDQUFDO3FCQUN6QyxRQUFRLEVBQUU7cUJBQ1YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLENBQUM7cUJBQzdFLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQzFEO2lCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUN6RCxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBcUIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzNGO2lCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsT0FBTyxFQUFFO2dCQUMxRCxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEs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SjtZQUNELEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDWCxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9yLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUsIE1lZGl1c1F1ZXJ5UGFyYW0sIE9iamVjdFNlcmlhbGl6ZXIsIFRhYmxlRGVzY3JpcHRvciwgVGFibGV2aWV3RGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucyc7XG5cbmltcG9ydCB7R3VpRW50aXR5TW9kZWwsIEd1aVByb3BlcnR5TW9kZWwsIEd1aVByb3BlcnR5VHlwZSwgUmV2RW50aXR5V2l0aFN0YXRlRHRvLCBSZXZpc2lvblR5cGV9IGZyb20gJy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGV9IGZyb20gJy4uL21vZGVscy9uZXctZmlsdGVyLW1hdGNoLXR5cGUubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgQXVkaXRVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGFkZENvbHVtbnNGcm9tTW9kZWwoZGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPGFueT4sIHByb3BlcnR5TGlzdDogR3VpUHJvcGVydHlNb2RlbFtdKTogVGFibGVEZXNjcmlwdG9yPGFueT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnR5TGlzdCkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkVudW0pIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIGlzIHRoZXJlIGEgbmljZXIgd2F5IHRoYW4gYXBwZW5kaW5nIFwiRHRvXCIgYXQgdGhlIGVuZCBvZiB0aGUgc2ltcGxlIG5hbWUgdG8gbWF0Y2hcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4ocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAuYXNFbnVtKE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0ocHJvcGVydHkuZW51bUNsYXNzU2ltcGxlTmFtZSArICdEdG8nKSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXJMb29rdXBFbnVtKHByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLk51bWJlcikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aFNvcnQoKS5hc051bWJlcigpLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aFNvcnQoKS5hc0Jvb2xlYW4oKS53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aFNvcnQoKS5hc0RhdGUoJ2RkLiBNTU0geXl5eScpLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuT2Zmc2V0RGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZENvbHVtbihwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpLndpdGhTb3J0KCkuYXNEYXRlKCdkZC4gTU1NIHl5eXkgSEg6bW0nKS53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHN0cmluZyAvIHdpbGRjYXJkXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5hZGRDb2x1bW4ocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKS53aXRoU29ydCgpLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZEZpZWxkc0Zyb21Nb2RlbDxUPihkZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+LCByZXZNb2RlbDogR3VpRW50aXR5TW9kZWwpOiBFZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiByZXZNb2RlbC5wcm9wZXJ0aWVzISkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkVudW0pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZExvb2t1cEVudW0oJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhLCBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUhKSwgcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5OdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGVQaWNrZXIoJ2RkLiBNTU0geXl5eScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuT2Zmc2V0RGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNEYXRlUGlja2VyKCdkZC4gTU0geXknLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nIC8gd2lsZGNhcmRcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBidWlsZERlc2NyaXB0b3JGb3JFbnRpdHlSZXZpc2lvbihcbiAgICAgICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvcjxSZXZFbnRpdHlXaXRoU3RhdGVEdG8+LFxuICAgICAgICByZXZNb2RlbDogR3VpRW50aXR5TW9kZWwsXG4gICAgICAgIGVudGl0eU1vZGVsOiBHdWlFbnRpdHlNb2RlbFxuICAgICk6IFRhYmxldmlld0Rlc2NyaXB0b3I8UmV2RW50aXR5V2l0aFN0YXRlRHRvPiB7XG4gICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ3JldlR5cGUnKVxuICAgICAgICAgICAgLndpdGhUaXRsZSgncmV2VHlwZScpXG4gICAgICAgICAgICAuYXNFbnVtKE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0oJ1JldmlzaW9uVHlwZScpKVxuICAgICAgICAgICAgLndpdGhGaWx0ZXJMb29rdXBFbnVtKFtSZXZpc2lvblR5cGUuQWRkLCBSZXZpc2lvblR5cGUuTW9kLCBSZXZpc2lvblR5cGUuRGVsXSk7XG4gICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtKCdyZXZUeXBlJywgT2JqZWN0U2VyaWFsaXplci5nZXQoKS5maW5kRW51bSgnUmV2aXNpb25UeXBlJyksIFtSZXZpc2lvblR5cGUuQWRkLCBSZXZpc2lvblR5cGUuTW9kLCBSZXZpc2lvblR5cGUuRGVsXSkud2l0aExhYmVsKCdyZXZUeXBlJyk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcmV2TW9kZWwucHJvcGVydGllcyEpIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5FbnVtKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBpcyB0aGVyZSBhIG5pY2VyIHdheSB0aGFuIGFwcGVuZGluZyBcIkR0b1wiIGF0IHRoZSBlbmQgb2YgdGhlIHNpbXBsZSBuYW1lIHRvIG1hdGNoXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0VudW0oT2JqZWN0U2VyaWFsaXplci5nZXQoKS5maW5kRW51bShwcm9wZXJ0eS5lbnVtQ2xhc3NTaW1wbGVOYW1lICsgJ0R0bycpKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlckxvb2t1cEVudW0ocHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKTtcblxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkTG9va3VwRW51bShcbiAgICAgICAgICAgICAgICAgICAgICAgICdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0ocHJvcGVydHkuZW51bUNsYXNzU2ltcGxlTmFtZSEgKyAnRHRvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5wb3NzaWJsZUVudW1WYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLk51bWJlcikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc051bWJlcigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0Jvb2xlYW4oKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGQoJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKS53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuTG9jYWxEYXRlKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGUoJ2RkLiBNTU0geXl5eScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZVBpY2tlcignZGQuIE1NTSB5eXl5Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLk9mZnNldERhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGUoJ2RkLiBNTU0geXl5eSBISDptbScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZVBpY2tlcignZGQuIE1NIHl5JywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nIC8gd2lsZGNhcmRcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFRpdGxlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBlbnRpdHlNb2RlbC5wcm9wZXJ0aWVzISkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkVudW0pIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIGlzIHRoZXJlIGEgbmljZXIgd2F5IHRoYW4gYXBwZW5kaW5nIFwiRHRvXCIgYXQgdGhlIGVuZCBvZiB0aGUgc2ltcGxlIG5hbWUgdG8gbWF0Y2hcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNFbnVtKE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0ocHJvcGVydHkuZW51bUNsYXNzU2ltcGxlTmFtZSArICdEdG8nKSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXJMb29rdXBFbnVtKHByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRMb29rdXBFbnVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEsXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUhICsgJ0R0bycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5OdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKCdlbnRpdHlTdGF0ZS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNCb29sZWFuKClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkKCdlbnRpdHlTdGF0ZS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKS53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuTG9jYWxEYXRlKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdlbnRpdHlTdGF0ZS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFRpdGxlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZSgnZGQuIE1NTSB5eXl5JylcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgnZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGVQaWNrZXIoJ2RkLiBNTU0geXl5eScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5PZmZzZXREYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbignZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGUoJ2RkLiBNTU0geXl5eSBISDptbScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNEYXRlUGlja2VyKCdkZC4gTU0geXknLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJpbmcgLyB3aWxkY2FyZFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbignZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5hZGRGaWVsZCgnZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFByb3BlcnR5TmFtZShmdWxsUHJvcGVydHlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoZnVsbFByb3BlcnR5TmFtZT8uaW5jbHVkZXMoJ2VudGl0eVN0YXRlLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVsbFByb3BlcnR5TmFtZS5yZXBsYWNlKCdlbnRpdHlTdGF0ZS4nLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnVsbFByb3BlcnR5TmFtZT8uaW5jbHVkZXMoJ3JldkVudGl0eS4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bGxQcm9wZXJ0eU5hbWU/LnJlcGxhY2UoJ3JldkVudGl0eS4nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bGxQcm9wZXJ0eU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhcHBlbmRNZWRpdXNRdWVyeVBhcmFtc1RvVXJsKHF1ZXJ5UGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHVybCA9IGA/Zmlyc3RSZXN1bHQ9JHtxdWVyeVBhcmFtcy5pdGVtc09mZnNldH0mbWF4UmVzdWx0cz0ke3F1ZXJ5UGFyYW1zLml0ZW1zUGVyUGFnZX1gO1xuICAgICAgICBpZiAocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5ICYmIHF1ZXJ5UGFyYW1zLnNvcnRQcm9wZXJ0eS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB1cmwgKz0gJyZzb3J0cz0nO1xuICAgICAgICAgICAgY29uc3Qgc29ydGluZ1FQcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeVBhcmFtcy5zb3J0UHJvcGVydHkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocXVlcnlQYXJhbXMuc29ydEFzYyFbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc29ydGluZ1FQcy5wdXNoKGBhc2M6JHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5W2ldKX1gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzb3J0aW5nUVBzLnB1c2goYGRlc2M6JHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5W2ldKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmwgKz0gc29ydGluZ1FQcy5qb2luKCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLmZpbHRlclBhcmFtcyAmJiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyUVBzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1mcCBvZiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1mcC5maWx0ZXJNYXRjaFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzfToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsc306JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Gcm9tVG86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5CZXR3ZWVufToke21mcC5maWx0ZXJWYWx1ZX0sJHttZnAuZmlsdGVyVmFsdWVUb31gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkNvbnRhaW5zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuQ29udGFpbnN9OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU3RhcnRzV2l0aDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLlN0YXJ0c1dpdGh9OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRW5kc1dpdGg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5FbmRzV2l0aH06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Jbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLklufToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuTm90SW59OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU21hbGxlclRoYW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5MZXNzVGhhbn06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5HcmVhdGVyVGhhbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkdyZWF0ZXJUaGFufToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsICs9ICcmJztcbiAgICAgICAgICAgIHVybCArPSBmaWx0ZXJRUHMuam9pbignJicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuIl19
|