@alfresco/adf-core 7.0.0-alpha.8-13005755934 → 7.0.0-alpha.8-13009426269
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/form/components/widgets/date/date.widget.mjs +2 -2
- package/esm2022/lib/form/components/widgets/date-time/date-time.widget.mjs +2 -2
- package/esm2022/lib/testing/index.mjs +2 -1
- package/esm2022/lib/testing/unit-testing-utils.mjs +364 -0
- package/fesm2022/adf-core.mjs +367 -3
- package/fesm2022/adf-core.mjs.map +1 -1
- package/lib/form/components/widgets/date-time/date-time.widget.d.ts +2 -1
- package/lib/testing/index.d.ts +1 -0
- package/lib/testing/unit-testing-utils.d.ts +134 -0
- package/package.json +3 -3
- package/schematics/migrations/package.json +3 -3
- package/schematics/migrations/schematics/migrations/collection.json +8 -8
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright © 2005-2024 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 { By } from '@angular/platform-browser';
|
|
18
|
+
import { MatSelectHarness } from '@angular/material/select/testing';
|
|
19
|
+
import { MatChipGridHarness, MatChipHarness, MatChipListboxHarness } from '@angular/material/chips/testing';
|
|
20
|
+
import { MatButtonHarness } from '@angular/material/button/testing';
|
|
21
|
+
import { MatIconHarness } from '@angular/material/icon/testing';
|
|
22
|
+
import { MatCheckboxHarness } from '@angular/material/checkbox/testing';
|
|
23
|
+
import { MatErrorHarness, MatFormFieldHarness } from '@angular/material/form-field/testing';
|
|
24
|
+
import { MatInputHarness } from '@angular/material/input/testing';
|
|
25
|
+
import { MatAutocompleteHarness } from '@angular/material/autocomplete/testing';
|
|
26
|
+
import { MatTabGroupHarness } from '@angular/material/tabs/testing';
|
|
27
|
+
import { MatToolbarHarness } from '@angular/material/toolbar/testing';
|
|
28
|
+
import { MatSnackBarHarness } from '@angular/material/snack-bar/testing';
|
|
29
|
+
import { MatProgressBarHarness } from '@angular/material/progress-bar/testing';
|
|
30
|
+
export class UnitTestingUtils {
|
|
31
|
+
constructor(debugElement, loader) {
|
|
32
|
+
this.debugElement = debugElement;
|
|
33
|
+
this.loader = loader;
|
|
34
|
+
this.debugElement = debugElement;
|
|
35
|
+
this.loader = loader;
|
|
36
|
+
}
|
|
37
|
+
setDebugElement(debugElement) {
|
|
38
|
+
this.debugElement = debugElement;
|
|
39
|
+
}
|
|
40
|
+
setLoader(loader) {
|
|
41
|
+
this.loader = loader;
|
|
42
|
+
}
|
|
43
|
+
getByCSS(selector) {
|
|
44
|
+
return this.debugElement.query(By.css(selector));
|
|
45
|
+
}
|
|
46
|
+
getAllByCSS(selector) {
|
|
47
|
+
return this.debugElement.queryAll(By.css(selector));
|
|
48
|
+
}
|
|
49
|
+
getInnerTextByCSS(selector) {
|
|
50
|
+
return this.getByCSS(selector).nativeElement.innerText;
|
|
51
|
+
}
|
|
52
|
+
getByDataAutomationId(dataAutomationId) {
|
|
53
|
+
return this.getByCSS(`[data-automation-id="${dataAutomationId}"]`);
|
|
54
|
+
}
|
|
55
|
+
getByDataAutomationClass(dataAutomationClass) {
|
|
56
|
+
return this.getByCSS(`[data-automation-class="${dataAutomationClass}"]`);
|
|
57
|
+
}
|
|
58
|
+
getInnerTextByDataAutomationId(dataAutomationId) {
|
|
59
|
+
return this.getByDataAutomationId(dataAutomationId).nativeElement.innerText;
|
|
60
|
+
}
|
|
61
|
+
getByDirective(directive) {
|
|
62
|
+
return this.debugElement.query(By.directive(directive));
|
|
63
|
+
}
|
|
64
|
+
/** Perform actions */
|
|
65
|
+
clickByCSS(selector) {
|
|
66
|
+
const element = this.getByCSS(selector);
|
|
67
|
+
element.triggerEventHandler('click', new MouseEvent('click'));
|
|
68
|
+
}
|
|
69
|
+
clickByDataAutomationId(dataAutomationId) {
|
|
70
|
+
this.getByDataAutomationId(dataAutomationId).nativeElement.click();
|
|
71
|
+
}
|
|
72
|
+
doubleClickByDataAutomationId(dataAutomationId) {
|
|
73
|
+
const element = this.getByDataAutomationId(dataAutomationId);
|
|
74
|
+
element.triggerEventHandler('dblclick', new MouseEvent('dblclick'));
|
|
75
|
+
}
|
|
76
|
+
blurByCSS(selector) {
|
|
77
|
+
const element = this.getByCSS(selector);
|
|
78
|
+
element.triggerEventHandler('blur', new FocusEvent('blur'));
|
|
79
|
+
}
|
|
80
|
+
hoverOverByCSS(selector) {
|
|
81
|
+
const element = this.getByCSS(selector);
|
|
82
|
+
element.triggerEventHandler('mouseenter', new MouseEvent('mouseenter'));
|
|
83
|
+
}
|
|
84
|
+
hoverOverByDataAutomationId(dataAutomationId) {
|
|
85
|
+
const element = this.getByDataAutomationId(dataAutomationId);
|
|
86
|
+
element.triggerEventHandler('mouseenter', new MouseEvent('mouseenter'));
|
|
87
|
+
}
|
|
88
|
+
mouseLeaveByCSS(selector) {
|
|
89
|
+
const element = this.getByCSS(selector);
|
|
90
|
+
element.triggerEventHandler('mouseleave', new MouseEvent('mouseleave'));
|
|
91
|
+
}
|
|
92
|
+
mouseLeaveByDataAutomationId(dataAutomationId) {
|
|
93
|
+
const element = this.getByDataAutomationId(dataAutomationId);
|
|
94
|
+
element.triggerEventHandler('mouseleave', new MouseEvent('mouseleave'));
|
|
95
|
+
}
|
|
96
|
+
keyBoardEventByCSS(selector, event, code, key) {
|
|
97
|
+
const element = this.getByCSS(selector);
|
|
98
|
+
element.nativeElement.dispatchEvent(new KeyboardEvent(event, { code, key }));
|
|
99
|
+
}
|
|
100
|
+
dispatchCustomEventByCSS(selector, eventName) {
|
|
101
|
+
const element = this.getByCSS(selector);
|
|
102
|
+
element.nativeElement.dispatchEvent(new CustomEvent(eventName));
|
|
103
|
+
}
|
|
104
|
+
/** Input related methods */
|
|
105
|
+
getInputByCSS(selector) {
|
|
106
|
+
return this.getByCSS(selector)?.nativeElement;
|
|
107
|
+
}
|
|
108
|
+
getInputByDataAutomationId(dataAutomationId) {
|
|
109
|
+
return this.getByDataAutomationId(dataAutomationId)?.nativeElement;
|
|
110
|
+
}
|
|
111
|
+
fillInputByCSS(selector, value) {
|
|
112
|
+
const input = this.getInputByCSS(selector);
|
|
113
|
+
input.value = value;
|
|
114
|
+
input.dispatchEvent(new Event('input'));
|
|
115
|
+
}
|
|
116
|
+
fillInputByDataAutomationId(dataAutomationId, value) {
|
|
117
|
+
const input = this.getInputByDataAutomationId(dataAutomationId);
|
|
118
|
+
input.value = value;
|
|
119
|
+
input.dispatchEvent(new Event('input'));
|
|
120
|
+
}
|
|
121
|
+
/** MatButton related methods */
|
|
122
|
+
async getMatButton() {
|
|
123
|
+
return this.loader.getHarness(MatButtonHarness);
|
|
124
|
+
}
|
|
125
|
+
async getMatButtonByCSS(selector) {
|
|
126
|
+
return this.loader.getHarness(MatButtonHarness.with({ selector }));
|
|
127
|
+
}
|
|
128
|
+
async getMatButtonByDataAutomationId(dataAutomationId) {
|
|
129
|
+
return this.loader.getHarness(MatButtonHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
|
|
130
|
+
}
|
|
131
|
+
async checkIfMatButtonExists() {
|
|
132
|
+
return this.loader.hasHarness(MatButtonHarness);
|
|
133
|
+
}
|
|
134
|
+
async checkIfMatButtonExistsWithDataAutomationId(dataAutomationId) {
|
|
135
|
+
return this.loader.hasHarness(MatButtonHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
|
|
136
|
+
}
|
|
137
|
+
async clickMatButton() {
|
|
138
|
+
const button = await this.getMatButton();
|
|
139
|
+
await button.click();
|
|
140
|
+
}
|
|
141
|
+
async clickMatButtonByCSS(selector) {
|
|
142
|
+
const button = await this.getMatButtonByCSS(selector);
|
|
143
|
+
await button.click();
|
|
144
|
+
}
|
|
145
|
+
async clickMatButtonByDataAutomationId(dataAutomationId) {
|
|
146
|
+
const button = await this.getMatButtonByDataAutomationId(dataAutomationId);
|
|
147
|
+
await button.click();
|
|
148
|
+
}
|
|
149
|
+
async sendKeysToMatButton(keys) {
|
|
150
|
+
const button = await this.getMatButton();
|
|
151
|
+
const host = await button.host();
|
|
152
|
+
await host.sendKeys(...keys);
|
|
153
|
+
}
|
|
154
|
+
/** MatCheckbox related methods */
|
|
155
|
+
async getMatCheckbox() {
|
|
156
|
+
return this.loader.getHarness(MatCheckboxHarness);
|
|
157
|
+
}
|
|
158
|
+
async getMatCheckboxByDataAutomationId(dataAutomationId) {
|
|
159
|
+
return this.loader.getHarness(MatCheckboxHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
|
|
160
|
+
}
|
|
161
|
+
async getMatCheckboxHost() {
|
|
162
|
+
const checkbox = await this.getMatCheckbox();
|
|
163
|
+
return checkbox.host();
|
|
164
|
+
}
|
|
165
|
+
async getAllMatCheckboxes() {
|
|
166
|
+
return this.loader.getAllHarnesses(MatCheckboxHarness);
|
|
167
|
+
}
|
|
168
|
+
async checkIfMatCheckboxIsChecked() {
|
|
169
|
+
const checkbox = await this.getMatCheckbox();
|
|
170
|
+
return checkbox.isChecked();
|
|
171
|
+
}
|
|
172
|
+
async checkIfMatCheckboxesHaveClass(className) {
|
|
173
|
+
const checkboxes = await this.getAllMatCheckboxes();
|
|
174
|
+
return checkboxes.every(async (checkbox) => (await checkbox.host()).hasClass(className));
|
|
175
|
+
}
|
|
176
|
+
async hoverOverMatCheckbox() {
|
|
177
|
+
const host = await this.getMatCheckboxHost();
|
|
178
|
+
await host.hover();
|
|
179
|
+
}
|
|
180
|
+
/** MatIcon related methods */
|
|
181
|
+
async getMatIconOrNull() {
|
|
182
|
+
return this.loader.getHarnessOrNull(MatIconHarness);
|
|
183
|
+
}
|
|
184
|
+
async getMatIconWithAncestorByDataAutomationId(dataAutomationId) {
|
|
185
|
+
return this.loader.getHarness(MatIconHarness.with({ ancestor: `[data-automation-id="${dataAutomationId}"]` }));
|
|
186
|
+
}
|
|
187
|
+
async getMatIconWithAncestorByCSS(selector) {
|
|
188
|
+
return this.loader.getHarness(MatIconHarness.with({ ancestor: selector }));
|
|
189
|
+
}
|
|
190
|
+
async getMatIconWithAncestorByCSSAndName(selector, name) {
|
|
191
|
+
return this.loader.getHarness(MatIconHarness.with({ ancestor: selector, name }));
|
|
192
|
+
}
|
|
193
|
+
async checkIfMatIconExistsWithAncestorByDataAutomationId(dataAutomationId) {
|
|
194
|
+
return this.loader.hasHarness(MatIconHarness.with({ ancestor: `[data-automation-id="${dataAutomationId}"]` }));
|
|
195
|
+
}
|
|
196
|
+
async checkIfMatIconExistsWithAncestorByCSSAndName(selector, name) {
|
|
197
|
+
return this.loader.hasHarness(MatIconHarness.with({ ancestor: selector, name }));
|
|
198
|
+
}
|
|
199
|
+
async clickMatIconWithAncestorByDataAutomationId(dataAutomationId) {
|
|
200
|
+
const icon = await this.getMatIconWithAncestorByDataAutomationId(dataAutomationId);
|
|
201
|
+
const host = await icon.host();
|
|
202
|
+
await host.click();
|
|
203
|
+
}
|
|
204
|
+
/** MatSelect related methods */
|
|
205
|
+
async getMatSelectOptions(isOpened = false) {
|
|
206
|
+
const select = await this.loader.getHarness(MatSelectHarness);
|
|
207
|
+
if (!isOpened) {
|
|
208
|
+
await select.open();
|
|
209
|
+
}
|
|
210
|
+
return select.getOptions();
|
|
211
|
+
}
|
|
212
|
+
async getMatSelectHost() {
|
|
213
|
+
const select = await this.loader.getHarness(MatSelectHarness);
|
|
214
|
+
return select.host();
|
|
215
|
+
}
|
|
216
|
+
async checkIfMatSelectExists() {
|
|
217
|
+
return this.loader.hasHarness(MatSelectHarness);
|
|
218
|
+
}
|
|
219
|
+
async openMatSelect() {
|
|
220
|
+
const select = await this.loader.getHarness(MatSelectHarness);
|
|
221
|
+
await select.open();
|
|
222
|
+
}
|
|
223
|
+
/** MatChips related methods */
|
|
224
|
+
async getMatChipByDataAutomationId(dataAutomationId) {
|
|
225
|
+
return this.loader.getHarness(MatChipHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
|
|
226
|
+
}
|
|
227
|
+
async checkIfMatChipExistsWithDataAutomationId(dataAutomationId) {
|
|
228
|
+
return this.loader.hasHarness(MatChipHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
|
|
229
|
+
}
|
|
230
|
+
async clickMatChip(dataAutomationId) {
|
|
231
|
+
const chip = await this.getMatChipByDataAutomationId(dataAutomationId);
|
|
232
|
+
const host = await chip.host();
|
|
233
|
+
await host.click();
|
|
234
|
+
}
|
|
235
|
+
async getMatChips() {
|
|
236
|
+
return this.loader.getAllHarnesses(MatChipHarness);
|
|
237
|
+
}
|
|
238
|
+
/** MatChipListbox related methods */
|
|
239
|
+
async getMatChipListboxByDataAutomationId(dataAutomationId) {
|
|
240
|
+
return this.loader.getHarness(MatChipListboxHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
|
|
241
|
+
}
|
|
242
|
+
async clickMatChipListbox(dataAutomationId) {
|
|
243
|
+
const chipList = await this.getMatChipListboxByDataAutomationId(dataAutomationId);
|
|
244
|
+
const host = await chipList.host();
|
|
245
|
+
await host.click();
|
|
246
|
+
}
|
|
247
|
+
/** MatChipGrid related methods */
|
|
248
|
+
async checkIfMatChipGridExists() {
|
|
249
|
+
return this.loader.hasHarness(MatChipGridHarness);
|
|
250
|
+
}
|
|
251
|
+
/** MatFromField related methods */
|
|
252
|
+
async getMatFormField() {
|
|
253
|
+
return this.loader.getHarness(MatFormFieldHarness);
|
|
254
|
+
}
|
|
255
|
+
async getMatFormFieldByCSS(selector) {
|
|
256
|
+
return this.loader.getHarness(MatFormFieldHarness.with({ selector }));
|
|
257
|
+
}
|
|
258
|
+
/** MatInput related methods */
|
|
259
|
+
async getMatInput() {
|
|
260
|
+
return this.loader.getHarness(MatInputHarness);
|
|
261
|
+
}
|
|
262
|
+
async getMatInputByCSS(selector) {
|
|
263
|
+
return this.loader.getHarness(MatInputHarness.with({ selector }));
|
|
264
|
+
}
|
|
265
|
+
async getMatInputByDataAutomationId(dataAutomationId) {
|
|
266
|
+
return this.loader.getHarness(MatInputHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
|
|
267
|
+
}
|
|
268
|
+
async getMatInputByPlaceholder(placeholder) {
|
|
269
|
+
return this.loader.getHarness(MatInputHarness.with({ placeholder }));
|
|
270
|
+
}
|
|
271
|
+
async getMatInputHost() {
|
|
272
|
+
const input = await this.getMatInput();
|
|
273
|
+
return input.host();
|
|
274
|
+
}
|
|
275
|
+
async checkIfMatInputExists() {
|
|
276
|
+
return this.loader.hasHarness(MatInputHarness);
|
|
277
|
+
}
|
|
278
|
+
async checkIfMatInputExistsWithCSS(selector) {
|
|
279
|
+
return this.loader.hasHarness(MatInputHarness.with({ selector }));
|
|
280
|
+
}
|
|
281
|
+
async checkIfMatInputExistsWithDataAutomationId(dataAutomationId) {
|
|
282
|
+
return this.loader.hasHarness(MatInputHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
|
|
283
|
+
}
|
|
284
|
+
async checkIfMatInputExistsWithPlaceholder(placeholder) {
|
|
285
|
+
return this.loader.hasHarness(MatInputHarness.with({ placeholder }));
|
|
286
|
+
}
|
|
287
|
+
async clickMatInput() {
|
|
288
|
+
const input = await this.getMatInput();
|
|
289
|
+
const host = await input.host();
|
|
290
|
+
await host.click();
|
|
291
|
+
}
|
|
292
|
+
async fillMatInput(value) {
|
|
293
|
+
const input = await this.getMatInput();
|
|
294
|
+
await input.setValue(value);
|
|
295
|
+
}
|
|
296
|
+
async fillMatInputByCSS(selector, value) {
|
|
297
|
+
const input = await this.getMatInputByCSS(selector);
|
|
298
|
+
await input.setValue(value);
|
|
299
|
+
}
|
|
300
|
+
async fillMatInputByDataAutomationId(dataAutomationId, value) {
|
|
301
|
+
const input = await this.getMatInputByDataAutomationId(dataAutomationId);
|
|
302
|
+
await input.setValue(value);
|
|
303
|
+
await (await input.host()).dispatchEvent('input');
|
|
304
|
+
}
|
|
305
|
+
async focusMatInput() {
|
|
306
|
+
const input = await this.getMatInput();
|
|
307
|
+
await input.focus();
|
|
308
|
+
}
|
|
309
|
+
async blurMatInput() {
|
|
310
|
+
const input = await this.getMatInput();
|
|
311
|
+
await input.blur();
|
|
312
|
+
}
|
|
313
|
+
async getMatInputValue() {
|
|
314
|
+
const input = await this.getMatInput();
|
|
315
|
+
return input.getValue();
|
|
316
|
+
}
|
|
317
|
+
async getMatInputValueByDataAutomationId(dataAutomationId) {
|
|
318
|
+
const input = await this.getMatInputByDataAutomationId(dataAutomationId);
|
|
319
|
+
return input.getValue();
|
|
320
|
+
}
|
|
321
|
+
async sendKeysToMatInput(keys) {
|
|
322
|
+
const input = await this.getMatInput();
|
|
323
|
+
const host = await input.host();
|
|
324
|
+
await host.sendKeys(...keys);
|
|
325
|
+
}
|
|
326
|
+
/** MatAutoComplete related methods */
|
|
327
|
+
async typeAndGetOptionsForMatAutoComplete(fixture, value) {
|
|
328
|
+
const autocomplete = await this.loader.getHarness(MatAutocompleteHarness);
|
|
329
|
+
await autocomplete.enterText(value);
|
|
330
|
+
fixture.detectChanges();
|
|
331
|
+
return autocomplete.getOptions();
|
|
332
|
+
}
|
|
333
|
+
/** MatError related methods */
|
|
334
|
+
async getMatErrorByCSS(selector) {
|
|
335
|
+
return this.loader.getHarness(MatErrorHarness.with({ selector }));
|
|
336
|
+
}
|
|
337
|
+
async getMatErrorByDataAutomationId(dataAutomationId) {
|
|
338
|
+
return this.loader.getHarness(MatErrorHarness.with({ selector: `[data-automation-id="${dataAutomationId}"]` }));
|
|
339
|
+
}
|
|
340
|
+
/** MatTabGroup related methods */
|
|
341
|
+
async getSelectedTabFromMatTabGroup() {
|
|
342
|
+
const tabs = await this.loader.getHarness(MatTabGroupHarness);
|
|
343
|
+
return tabs.getSelectedTab();
|
|
344
|
+
}
|
|
345
|
+
async getSelectedTabLabelFromMatTabGroup() {
|
|
346
|
+
const tab = await this.getSelectedTabFromMatTabGroup();
|
|
347
|
+
return tab.getLabel();
|
|
348
|
+
}
|
|
349
|
+
/** MatToolbar related methods */
|
|
350
|
+
async getMatToolbarHost() {
|
|
351
|
+
const toolbar = await this.loader.getHarness(MatToolbarHarness);
|
|
352
|
+
return toolbar.host();
|
|
353
|
+
}
|
|
354
|
+
/** MatSnackbar related methods */
|
|
355
|
+
async checkIfMatSnackbarExists() {
|
|
356
|
+
return this.loader.hasHarness(MatSnackBarHarness);
|
|
357
|
+
}
|
|
358
|
+
/** MatProgressBar related methods */
|
|
359
|
+
async getMatProgressBarHost() {
|
|
360
|
+
const progress = await this.loader.getHarness(MatProgressBarHarness);
|
|
361
|
+
return progress.host();
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC10ZXN0aW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvcmUvc3JjL2xpYi90ZXN0aW5nL3VuaXQtdGVzdGluZy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxrQkFBa0IsRUFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUvRSxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3pCLFlBQW9CLFlBQTJCLEVBQVUsTUFBc0I7UUFBM0QsaUJBQVksR0FBWixZQUFZLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFn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TyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxrQ0FBa0M7UUFDcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztRQUN2RCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsaUNBQWlDO0lBRWpDLEtBQUssQ0FBQyxpQkFBaUI7UUFDbkIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxrQ0FBa0M7SUFFbEMsS0FBSyxDQUFDLHdCQUF3QjtRQUMxQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELHFDQUFxQztJQUVyQyxLQUFLLENBQUMscUJBQXFCO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNyRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI0IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEhhcm5lc3NMb2FkZXIsIFRlc3RFbGVtZW50LCBUZXN0S2V5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Rlc3RpbmcnO1xuaW1wb3J0IHsgRGVidWdFbGVtZW50LCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCeSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTWF0U2VsZWN0SGFybmVzcyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdC90ZXN0aW5nJztcbmltcG9ydCB7IE1hdE9wdGlvbkhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0Q2hpcEdyaWRIYXJuZXNzLCBNYXRDaGlwSGFybmVzcywgTWF0Q2hpcExpc3Rib3hIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMvdGVzdGluZyc7XG5pbXBvcnQgeyBNYXRCdXR0b25IYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0SWNvbkhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gvdGVzdGluZyc7XG5pbXBvcnQgeyBNYXRFcnJvckhhcm5lc3MsIE1hdEZvcm1GaWVsZEhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0SW5wdXRIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQvdGVzdGluZyc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL3Rlc3RpbmcnO1xuaW1wb3J0IHsgQ29tcG9uZW50Rml4dHVyZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQgeyBNYXRUYWJHcm91cEhhcm5lc3MsIE1hdFRhYkhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0VG9vbGJhckhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sYmFyL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXJIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJIYXJuZXNzIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyL3Rlc3RpbmcnO1xuXG5leHBvcnQgY2xhc3MgVW5pdFRlc3RpbmdVdGlscyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWJ1Z0VsZW1lbnQ/OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgbG9hZGVyPzogSGFybmVzc0xvYWRlcikge1xuICAgICAgICB0aGlzLmRlYnVnRWxlbWVudCA9IGRlYnVnRWxlbWVudDtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgfVxuXG4gICAgc2V0RGVidWdFbGVtZW50KGRlYnVnRWxlbWVudDogRGVidWdFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVidWdFbGVtZW50ID0gZGVidWdFbGVtZW50O1xuICAgIH1cblxuICAgIHNldExvYWRlcihsb2FkZXI6IEhhcm5lc3NMb2FkZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgfVxuXG4gICAgZ2V0QnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IERlYnVnRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlYnVnRWxlbWVudC5xdWVyeShCeS5jc3Moc2VsZWN0b3IpKTtcbiAgICB9XG5cbiAgICBnZXRBbGxCeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogRGVidWdFbGVtZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnlBbGwoQnkuY3NzKHNlbGVjdG9yKSk7XG4gICAgfVxuXG4gICAgZ2V0SW5uZXJUZXh0QnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5Q1NTKHNlbGVjdG9yKS5uYXRpdmVFbGVtZW50LmlubmVyVGV4dDtcbiAgICB9XG5cbiAgICBnZXRCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogRGVidWdFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlDU1MoYFtkYXRhLWF1dG9tYXRpb24taWQ9XCIke2RhdGFBdXRvbWF0aW9uSWR9XCJdYCk7XG4gICAgfVxuXG4gICAgZ2V0QnlEYXRhQXV0b21hdGlvbkNsYXNzKGRhdGFBdXRvbWF0aW9uQ2xhc3M6IHN0cmluZyk6IERlYnVnRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5Q1NTKGBbZGF0YS1hdXRvbWF0aW9uLWNsYXNzPVwiJHtkYXRhQXV0b21hdGlvbkNsYXNzfVwiXWApO1xuICAgIH1cblxuICAgIGdldElubmVyVGV4dEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCkubmF0aXZlRWxlbWVudC5pbm5lclRleHQ7XG4gICAgfVxuXG4gICAgZ2V0QnlEaXJlY3RpdmUoZGlyZWN0aXZlOiBUeXBlPGFueT4pOiBEZWJ1Z0VsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKGRpcmVjdGl2ZSkpO1xuICAgIH1cblxuICAgIC8qKiBQZXJmb3JtIGFjdGlvbnMgKi9cblxuICAgIGNsaWNrQnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRCeUNTUyhzZWxlY3Rvcik7XG4gICAgICAgIGVsZW1lbnQudHJpZ2dlckV2ZW50SGFuZGxlcignY2xpY2snLCBuZXcgTW91c2VFdmVudCgnY2xpY2snKSk7XG4gICAgfVxuXG4gICAgY2xpY2tCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2V0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG5cbiAgICBkb3VibGVDbGlja0J5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJFdmVudEhhbmRsZXIoJ2RibGNsaWNrJywgbmV3IE1vdXNlRXZlbnQoJ2RibGNsaWNrJykpO1xuICAgIH1cblxuICAgIGJsdXJCeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEJ5Q1NTKHNlbGVjdG9yKTtcbiAgICAgICAgZWxlbWVudC50cmlnZ2VyRXZlbnRIYW5kbGVyKCdibHVyJywgbmV3IEZvY3VzRXZlbnQoJ2JsdXInKSk7XG4gICAgfVxuXG4gICAgaG92ZXJPdmVyQnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRCeUNTUyhzZWxlY3Rvcik7XG4gICAgICAgIGVsZW1lbnQudHJpZ2dlckV2ZW50SGFuZGxlcignbW91c2VlbnRlcicsIG5ldyBNb3VzZUV2ZW50KCdtb3VzZWVudGVyJykpO1xuICAgIH1cblxuICAgIGhvdmVyT3ZlckJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJFdmVudEhhbmRsZXIoJ21vdXNlZW50ZXInLCBuZXcgTW91c2VFdmVudCgnbW91c2VlbnRlcicpKTtcbiAgICB9XG5cbiAgICBtb3VzZUxlYXZlQnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRCeUNTUyhzZWxlY3Rvcik7XG4gICAgICAgIGVsZW1lbnQudHJpZ2dlckV2ZW50SGFuZGxlcignbW91c2VsZWF2ZScsIG5ldyBNb3VzZUV2ZW50KCdtb3VzZWxlYXZlJykpO1xuICAgIH1cblxuICAgIG1vdXNlTGVhdmVCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkKTtcbiAgICAgICAgZWxlbWVudC50cmlnZ2VyRXZlbnRIYW5kbGVyKCdtb3VzZWxlYXZlJywgbmV3IE1vdXNlRXZlbnQoJ21vdXNlbGVhdmUnKSk7XG4gICAgfVxuXG4gICAga2V5Qm9hcmRFdmVudEJ5Q1NTKHNlbGVjdG9yOiBzdHJpbmcsIGV2ZW50OiAna2V5dXAnIHwgJ2tleWRvd24nLCBjb2RlOiBzdHJpbmcsIGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEJ5Q1NTKHNlbGVjdG9yKTtcbiAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoZXZlbnQsIHsgY29kZSwga2V5IH0pKTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50QnlDU1Moc2VsZWN0b3I6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0QnlDU1Moc2VsZWN0b3IpO1xuICAgICAgICBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSk7XG4gICAgfVxuXG4gICAgLyoqIElucHV0IHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgZ2V0SW5wdXRCeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogSFRNTElucHV0RWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5Q1NTKHNlbGVjdG9yKT8ubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXRJbnB1dEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBIVE1MSW5wdXRFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpPy5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGZpbGxJbnB1dEJ5Q1NTKHNlbGVjdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmdldElucHV0QnlDU1Moc2VsZWN0b3IpO1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBpbnB1dC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnKSk7XG4gICAgfVxuXG4gICAgZmlsbElucHV0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQ6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZ2V0SW5wdXRCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCk7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcpKTtcbiAgICB9XG5cbiAgICAvKiogTWF0QnV0dG9uIHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0QnV0dG9uKCk6IFByb21pc2U8TWF0QnV0dG9uSGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRCdXR0b25IYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRCdXR0b25CeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogUHJvbWlzZTxNYXRCdXR0b25IYXJuZXNzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdEJ1dHRvbkhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRCdXR0b25CeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNYXRCdXR0b25IYXJuZXNzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdEJ1dHRvbkhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0lmTWF0QnV0dG9uRXhpc3RzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuaGFzSGFybmVzcyhNYXRCdXR0b25IYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0lmTWF0QnV0dG9uRXhpc3RzV2l0aERhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdEJ1dHRvbkhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGlja01hdEJ1dHRvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgdGhpcy5nZXRNYXRCdXR0b24oKTtcbiAgICAgICAgYXdhaXQgYnV0dG9uLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xpY2tNYXRCdXR0b25CeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IGF3YWl0IHRoaXMuZ2V0TWF0QnV0dG9uQnlDU1Moc2VsZWN0b3IpO1xuICAgICAgICBhd2FpdCBidXR0b24uY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGlja01hdEJ1dHRvbkJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgdGhpcy5nZXRNYXRCdXR0b25CeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCk7XG4gICAgICAgIGF3YWl0IGJ1dHRvbi5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIHNlbmRLZXlzVG9NYXRCdXR0b24oa2V5czogKHN0cmluZyB8IFRlc3RLZXkpW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgdGhpcy5nZXRNYXRCdXR0b24oKTtcbiAgICAgICAgY29uc3QgaG9zdCA9IGF3YWl0IGJ1dHRvbi5ob3N0KCk7XG4gICAgICAgIGF3YWl0IGhvc3Quc2VuZEtleXMoLi4ua2V5cyk7XG4gICAgfVxuXG4gICAgLyoqIE1hdENoZWNrYm94IHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0Q2hlY2tib3goKTogUHJvbWlzZTxNYXRDaGVja2JveEhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0Q2hlY2tib3hIYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRDaGVja2JveEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdENoZWNrYm94SGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRDaGVja2JveEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRDaGVja2JveEhvc3QoKTogUHJvbWlzZTxUZXN0RWxlbWVudD4ge1xuICAgICAgICBjb25zdCBjaGVja2JveCA9IGF3YWl0IHRoaXMuZ2V0TWF0Q2hlY2tib3goKTtcbiAgICAgICAgcmV0dXJuIGNoZWNrYm94Lmhvc3QoKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRBbGxNYXRDaGVja2JveGVzKCk6IFByb21pc2U8TWF0Q2hlY2tib3hIYXJuZXNzW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEFsbEhhcm5lc3NlcyhNYXRDaGVja2JveEhhcm5lc3MpO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrSWZNYXRDaGVja2JveElzQ2hlY2tlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgY2hlY2tib3ggPSBhd2FpdCB0aGlzLmdldE1hdENoZWNrYm94KCk7XG4gICAgICAgIHJldHVybiBjaGVja2JveC5pc0NoZWNrZWQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0lmTWF0Q2hlY2tib3hlc0hhdmVDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBjaGVja2JveGVzID0gYXdhaXQgdGhpcy5nZXRBbGxNYXRDaGVja2JveGVzKCk7XG4gICAgICAgIHJldHVybiBjaGVja2JveGVzLmV2ZXJ5KGFzeW5jIChjaGVja2JveCkgPT4gKGF3YWl0IGNoZWNrYm94Lmhvc3QoKSkuaGFzQ2xhc3MoY2xhc3NOYW1lKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgaG92ZXJPdmVyTWF0Q2hlY2tib3goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBhd2FpdCB0aGlzLmdldE1hdENoZWNrYm94SG9zdCgpO1xuICAgICAgICBhd2FpdCBob3N0LmhvdmVyKCk7XG4gICAgfVxuXG4gICAgLyoqIE1hdEljb24gcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBnZXRNYXRJY29uT3JOdWxsKCk6IFByb21pc2U8TWF0SWNvbkhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3NPck51bGwoTWF0SWNvbkhhcm5lc3MpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdEljb25XaXRoQW5jZXN0b3JCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNYXRJY29uSGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRJY29uSGFybmVzcy53aXRoKHsgYW5jZXN0b3I6IGBbZGF0YS1hdXRvbWF0aW9uLWlkPVwiJHtkYXRhQXV0b21hdGlvbklkfVwiXWAgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdEljb25XaXRoQW5jZXN0b3JCeUNTUyhzZWxlY3Rvcjogc3RyaW5nKTogUHJvbWlzZTxNYXRJY29uSGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRJY29uSGFybmVzcy53aXRoKHsgYW5jZXN0b3I6IHNlbGVjdG9yIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRJY29uV2l0aEFuY2VzdG9yQnlDU1NBbmROYW1lKHNlbGVjdG9yOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8TWF0SWNvbkhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0SWNvbkhhcm5lc3Mud2l0aCh7IGFuY2VzdG9yOiBzZWxlY3RvciwgbmFtZSB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tJZk1hdEljb25FeGlzdHNXaXRoQW5jZXN0b3JCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdEljb25IYXJuZXNzLndpdGgoeyBhbmNlc3RvcjogYFtkYXRhLWF1dG9tYXRpb24taWQ9XCIke2RhdGFBdXRvbWF0aW9uSWR9XCJdYCB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tJZk1hdEljb25FeGlzdHNXaXRoQW5jZXN0b3JCeUNTU0FuZE5hbWUoc2VsZWN0b3I6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdEljb25IYXJuZXNzLndpdGgoeyBhbmNlc3Rvcjogc2VsZWN0b3IsIG5hbWUgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsaWNrTWF0SWNvbldpdGhBbmNlc3RvckJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaWNvbiA9IGF3YWl0IHRoaXMuZ2V0TWF0SWNvbldpdGhBbmNlc3RvckJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkKTtcbiAgICAgICAgY29uc3QgaG9zdCA9IGF3YWl0IGljb24uaG9zdCgpO1xuICAgICAgICBhd2FpdCBob3N0LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIE1hdFNlbGVjdCByZWxhdGVkIG1ldGhvZHMgKi9cblxuICAgIGFzeW5jIGdldE1hdFNlbGVjdE9wdGlvbnMoaXNPcGVuZWQgPSBmYWxzZSk6IFByb21pc2U8TWF0T3B0aW9uSGFybmVzc1tdPiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0U2VsZWN0SGFybmVzcyk7XG4gICAgICAgIGlmICghaXNPcGVuZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHNlbGVjdC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGVjdC5nZXRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TWF0U2VsZWN0SG9zdCgpOiBQcm9taXNlPFRlc3RFbGVtZW50PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0U2VsZWN0SGFybmVzcyk7XG4gICAgICAgIHJldHVybiBzZWxlY3QuaG9zdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrSWZNYXRTZWxlY3RFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdFNlbGVjdEhhcm5lc3MpO1xuICAgIH1cblxuICAgIGFzeW5jIG9wZW5NYXRTZWxlY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0U2VsZWN0SGFybmVzcyk7XG4gICAgICAgIGF3YWl0IHNlbGVjdC5vcGVuKCk7XG4gICAgfVxuXG4gICAgLyoqIE1hdENoaXBzIHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0Q2hpcEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdENoaXBIYXJuZXNzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdENoaXBIYXJuZXNzLndpdGgoeyBzZWxlY3RvcjogYFtkYXRhLWF1dG9tYXRpb24taWQ9XCIke2RhdGFBdXRvbWF0aW9uSWR9XCJdYCB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tJZk1hdENoaXBFeGlzdHNXaXRoRGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmhhc0hhcm5lc3MoTWF0Q2hpcEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGlja01hdENoaXAoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNoaXAgPSBhd2FpdCB0aGlzLmdldE1hdENoaXBCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBhd2FpdCBjaGlwLmhvc3QoKTtcbiAgICAgICAgYXdhaXQgaG9zdC5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdENoaXBzKCk6IFByb21pc2U8TWF0Q2hpcEhhcm5lc3NbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0QWxsSGFybmVzc2VzKE1hdENoaXBIYXJuZXNzKTtcbiAgICB9XG5cbiAgICAvKiogTWF0Q2hpcExpc3Rib3ggcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBnZXRNYXRDaGlwTGlzdGJveEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdENoaXBMaXN0Ym94SGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRDaGlwTGlzdGJveEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGlja01hdENoaXBMaXN0Ym94KGRhdGFBdXRvbWF0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjaGlwTGlzdCA9IGF3YWl0IHRoaXMuZ2V0TWF0Q2hpcExpc3Rib3hCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBhd2FpdCBjaGlwTGlzdC5ob3N0KCk7XG4gICAgICAgIGF3YWl0IGhvc3QuY2xpY2soKTtcbiAgICB9XG5cbiAgICAvKiogTWF0Q2hpcEdyaWQgcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBjaGVja0lmTWF0Q2hpcEdyaWRFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdENoaXBHcmlkSGFybmVzcyk7XG4gICAgfVxuXG4gICAgLyoqIE1hdEZyb21GaWVsZCByZWxhdGVkIG1ldGhvZHMgKi9cblxuICAgIGFzeW5jIGdldE1hdEZvcm1GaWVsZCgpOiBQcm9taXNlPE1hdEZvcm1GaWVsZEhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0Rm9ybUZpZWxkSGFybmVzcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TWF0Rm9ybUZpZWxkQnlDU1Moc2VsZWN0b3I6IHN0cmluZyk6IFByb21pc2U8TWF0Rm9ybUZpZWxkSGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRGb3JtRmllbGRIYXJuZXNzLndpdGgoeyBzZWxlY3RvciB9KSk7XG4gICAgfVxuXG4gICAgLyoqIE1hdElucHV0IHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0SW5wdXQoKTogUHJvbWlzZTxNYXRJbnB1dEhhcm5lc3M+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0SW5wdXRIYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRJbnB1dEJ5Q1NTKHNlbGVjdG9yOiBzdHJpbmcpOiBQcm9taXNlPE1hdElucHV0SGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRJbnB1dEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRJbnB1dEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdElucHV0SGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRJbnB1dEhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRJbnB1dEJ5UGxhY2Vob2xkZXIocGxhY2Vob2xkZXI6IHN0cmluZyk6IFByb21pc2U8TWF0SW5wdXRIYXJuZXNzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdElucHV0SGFybmVzcy53aXRoKHsgcGxhY2Vob2xkZXIgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdElucHV0SG9zdCgpOiBQcm9taXNlPFRlc3RFbGVtZW50PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5nZXRNYXRJbnB1dCgpO1xuICAgICAgICByZXR1cm4gaW5wdXQuaG9zdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrSWZNYXRJbnB1dEV4aXN0cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmhhc0hhcm5lc3MoTWF0SW5wdXRIYXJuZXNzKTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0lmTWF0SW5wdXRFeGlzdHNXaXRoQ1NTKHNlbGVjdG9yOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmhhc0hhcm5lc3MoTWF0SW5wdXRIYXJuZXNzLndpdGgoeyBzZWxlY3RvciB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tJZk1hdElucHV0RXhpc3RzV2l0aERhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdElucHV0SGFybmVzcy53aXRoKHsgc2VsZWN0b3I6IGBbZGF0YS1hdXRvbWF0aW9uLWlkPVwiJHtkYXRhQXV0b21hdGlvbklkfVwiXWAgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrSWZNYXRJbnB1dEV4aXN0c1dpdGhQbGFjZWhvbGRlcihwbGFjZWhvbGRlcjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdElucHV0SGFybmVzcy53aXRoKHsgcGxhY2Vob2xkZXIgfSkpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsaWNrTWF0SW5wdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5nZXRNYXRJbnB1dCgpO1xuICAgICAgICBjb25zdCBob3N0ID0gYXdhaXQgaW5wdXQuaG9zdCgpO1xuICAgICAgICBhd2FpdCBob3N0LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZmlsbE1hdElucHV0KHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0KCk7XG4gICAgICAgIGF3YWl0IGlucHV0LnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBmaWxsTWF0SW5wdXRCeUNTUyhzZWxlY3Rvcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5nZXRNYXRJbnB1dEJ5Q1NTKHNlbGVjdG9yKTtcbiAgICAgICAgYXdhaXQgaW5wdXQuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIGFzeW5jIGZpbGxNYXRJbnB1dEJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpO1xuICAgICAgICBhd2FpdCBpbnB1dC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGF3YWl0IChhd2FpdCBpbnB1dC5ob3N0KCkpLmRpc3BhdGNoRXZlbnQoJ2lucHV0Jyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZm9jdXNNYXRJbnB1dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0KCk7XG4gICAgICAgIGF3YWl0IGlucHV0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgYmx1ck1hdElucHV0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMuZ2V0TWF0SW5wdXQoKTtcbiAgICAgICAgYXdhaXQgaW5wdXQuYmx1cigpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdElucHV0VmFsdWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0KCk7XG4gICAgICAgIHJldHVybiBpbnB1dC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1hdElucHV0VmFsdWVCeURhdGFBdXRvbWF0aW9uSWQoZGF0YUF1dG9tYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0QnlEYXRhQXV0b21hdGlvbklkKGRhdGFBdXRvbWF0aW9uSWQpO1xuICAgICAgICByZXR1cm4gaW5wdXQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZW5kS2V5c1RvTWF0SW5wdXQoa2V5czogKHN0cmluZyB8IFRlc3RLZXkpW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLmdldE1hdElucHV0KCk7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBhd2FpdCBpbnB1dC5ob3N0KCk7XG4gICAgICAgIGF3YWl0IGhvc3Quc2VuZEtleXMoLi4ua2V5cyk7XG4gICAgfVxuXG4gICAgLyoqIE1hdEF1dG9Db21wbGV0ZSByZWxhdGVkIG1ldGhvZHMgKi9cblxuICAgIGFzeW5jIHR5cGVBbmRHZXRPcHRpb25zRm9yTWF0QXV0b0NvbXBsZXRlKGZpeHR1cmU6IENvbXBvbmVudEZpeHR1cmU8YW55PiwgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8TWF0T3B0aW9uSGFybmVzc1tdPiB7XG4gICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZSA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0QXV0b2NvbXBsZXRlSGFybmVzcyk7XG4gICAgICAgIGF3YWl0IGF1dG9jb21wbGV0ZS5lbnRlclRleHQodmFsdWUpO1xuICAgICAgICBmaXh0dXJlLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICByZXR1cm4gYXV0b2NvbXBsZXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICAvKiogTWF0RXJyb3IgcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBnZXRNYXRFcnJvckJ5Q1NTKHNlbGVjdG9yOiBzdHJpbmcpOiBQcm9taXNlPE1hdEVycm9ySGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRFcnJvckhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXRFcnJvckJ5RGF0YUF1dG9tYXRpb25JZChkYXRhQXV0b21hdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1hdEVycm9ySGFybmVzcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRFcnJvckhhcm5lc3Mud2l0aCh7IHNlbGVjdG9yOiBgW2RhdGEtYXV0b21hdGlvbi1pZD1cIiR7ZGF0YUF1dG9tYXRpb25JZH1cIl1gIH0pKTtcbiAgICB9XG5cbiAgICAvKiogTWF0VGFiR3JvdXAgcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBnZXRTZWxlY3RlZFRhYkZyb21NYXRUYWJHcm91cCgpOiBQcm9taXNlPE1hdFRhYkhhcm5lc3M+IHtcbiAgICAgICAgY29uc3QgdGFicyA9IGF3YWl0IHRoaXMubG9hZGVyLmdldEhhcm5lc3MoTWF0VGFiR3JvdXBIYXJuZXNzKTtcbiAgICAgICAgcmV0dXJuIHRhYnMuZ2V0U2VsZWN0ZWRUYWIoKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRTZWxlY3RlZFRhYkxhYmVsRnJvbU1hdFRhYkdyb3VwKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHRhYiA9IGF3YWl0IHRoaXMuZ2V0U2VsZWN0ZWRUYWJGcm9tTWF0VGFiR3JvdXAoKTtcbiAgICAgICAgcmV0dXJuIHRhYi5nZXRMYWJlbCgpO1xuICAgIH1cblxuICAgIC8qKiBNYXRUb29sYmFyIHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0VG9vbGJhckhvc3QoKTogUHJvbWlzZTxUZXN0RWxlbWVudD4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gYXdhaXQgdGhpcy5sb2FkZXIuZ2V0SGFybmVzcyhNYXRUb29sYmFySGFybmVzcyk7XG4gICAgICAgIHJldHVybiB0b29sYmFyLmhvc3QoKTtcbiAgICB9XG5cbiAgICAvKiogTWF0U25hY2tiYXIgcmVsYXRlZCBtZXRob2RzICovXG5cbiAgICBhc3luYyBjaGVja0lmTWF0U25hY2tiYXJFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5oYXNIYXJuZXNzKE1hdFNuYWNrQmFySGFybmVzcyk7XG4gICAgfVxuXG4gICAgLyoqIE1hdFByb2dyZXNzQmFyIHJlbGF0ZWQgbWV0aG9kcyAqL1xuXG4gICAgYXN5bmMgZ2V0TWF0UHJvZ3Jlc3NCYXJIb3N0KCk6IFByb21pc2U8VGVzdEVsZW1lbnQ+IHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBhd2FpdCB0aGlzLmxvYWRlci5nZXRIYXJuZXNzKE1hdFByb2dyZXNzQmFySGFybmVzcyk7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcy5ob3N0KCk7XG4gICAgfVxufVxuIl19
|