@wemake4u/form-player-se 1.0.24 → 1.0.26
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/dialog/dialog.component.mjs +15 -7
- package/esm2022/lib/directives/collapse.directive.mjs +20 -12
- package/esm2022/lib/directives/date.directive.mjs +2 -2
- package/esm2022/lib/directives/dialog.directive.mjs +2 -1
- package/esm2022/lib/directives/dropdown.directive.mjs +23 -5
- package/esm2022/lib/directives/formIndex.directive.mjs +25 -0
- package/esm2022/lib/directives/grid.directive.mjs +64 -19
- package/esm2022/lib/directives/readonly.directive.mjs +101 -0
- package/esm2022/lib/dynamic-fields/dynamic-fields.component.mjs +51 -25
- package/esm2022/lib/dynamic-form/dynamic-form.component.mjs +123 -107
- package/esm2022/lib/locale/locale-de.mjs +3 -2
- package/esm2022/lib/locale/locale-en.mjs +3 -2
- package/esm2022/lib/locale/locale-es.mjs +3 -2
- package/esm2022/lib/locale/locale-fr.mjs +3 -2
- package/esm2022/lib/locale/locale-it.mjs +3 -2
- package/esm2022/lib/locale/locale-pt.mjs +3 -2
- package/esm2022/lib/services/chart.service.mjs +62 -56
- package/esm2022/lib/services/dialog.service.mjs +17 -2
- package/esm2022/lib/services/feel.service.mjs +186 -19
- package/esm2022/lib/services/form.service.mjs +100 -12
- package/esm2022/lib/services/formatter.service.mjs +68 -54
- package/esm2022/lib/services/function.service.mjs +2 -4
- package/esm2022/lib/services/grid.service.mjs +163 -51
- package/esm2022/lib/services/metadata.service.mjs +1 -8
- package/esm2022/lib/services/programmability.service.mjs +318 -64
- package/esm2022/lib/services/weak.service.mjs +3 -5
- package/esm2022/lib/utils/groupByRow.mjs +3 -1
- package/fesm2022/wemake4u-form-player-se.mjs +1337 -582
- package/fesm2022/wemake4u-form-player-se.mjs.map +1 -1
- package/lib/components/deleteRowRenderer/deleteRowRenderer.component.d.ts +1 -0
- package/lib/components/objectURLRenderer/objectURLRenderer.component.d.ts +1 -0
- package/lib/components/setFilter/setFilter.component.d.ts +1 -0
- package/lib/dialog/dialog.component.d.ts +11 -0
- package/lib/directives/collapse.directive.d.ts +7 -4
- package/lib/directives/dropdown.directive.d.ts +4 -0
- package/lib/directives/formIndex.directive.d.ts +10 -0
- package/lib/directives/grid.directive.d.ts +12 -5
- package/lib/directives/{disable.directive.d.ts → readonly.directive.d.ts} +7 -4
- package/lib/dynamic-fields/dynamic-fields.component.d.ts +27 -4
- package/lib/dynamic-form/dynamic-form.component.d.ts +19 -10
- package/lib/locale/locale-de.d.ts +1 -0
- package/lib/locale/locale-en.d.ts +1 -0
- package/lib/locale/locale-es.d.ts +1 -0
- package/lib/locale/locale-fr.d.ts +1 -0
- package/lib/locale/locale-it.d.ts +1 -0
- package/lib/locale/locale-pt.d.ts +1 -0
- package/lib/locale/locale.d.ts +7 -0
- package/lib/services/chart.service.d.ts +5 -2
- package/lib/services/dialog.service.d.ts +1 -1
- package/lib/services/feel.service.d.ts +8 -0
- package/lib/services/form.service.d.ts +12 -1
- package/lib/services/formatter.service.d.ts +8 -6
- package/lib/services/grid.service.d.ts +13 -3
- package/lib/services/metadata.service.d.ts +0 -3
- package/lib/services/programmability.service.d.ts +28 -4
- package/lib/utils/groupByRow.d.ts +2 -0
- package/package.json +2 -2
- package/esm2022/lib/directives/disable.directive.mjs +0 -90
- package/esm2022/lib/directives/disable.path.directive.mjs +0 -40
- package/lib/directives/disable.path.directive.d.ts +0 -16
|
@@ -1,36 +1,51 @@
|
|
|
1
1
|
import { Injectable, Optional } from '@angular/core';
|
|
2
|
-
import { FormArray } from '@angular/forms';
|
|
2
|
+
import { FormArray, Validators } from '@angular/forms';
|
|
3
3
|
import { ToProxy } from '../utils/functions';
|
|
4
|
-
import {
|
|
4
|
+
import { toFeelable } from '../utils/feelable';
|
|
5
|
+
import { Subject, takeUntil, distinctUntilChanged, isObservable } from "rxjs";
|
|
6
|
+
import { tap } from 'rxjs/operators';
|
|
5
7
|
import * as i0 from "@angular/core";
|
|
6
8
|
import * as i1 from "../services/feel.service";
|
|
7
9
|
import * as i2 from "../services/weak.service";
|
|
8
10
|
import * as i3 from "../services/toast.service";
|
|
9
11
|
import * as i4 from "../services/dialog.service";
|
|
10
|
-
import * as i5 from "../services/
|
|
11
|
-
import * as i6 from "
|
|
12
|
-
import * as i7 from "
|
|
13
|
-
import * as i8 from "../services/
|
|
12
|
+
import * as i5 from "../services/formatter.service";
|
|
13
|
+
import * as i6 from "../services/function.service";
|
|
14
|
+
import * as i7 from "./form.service";
|
|
15
|
+
import * as i8 from "../services/global.service";
|
|
16
|
+
import * as i9 from "../services/register.service";
|
|
17
|
+
import * as i10 from "../services/scope.service";
|
|
18
|
+
const StatusDependency = "$status";
|
|
14
19
|
export class ProgrammabilityService {
|
|
15
20
|
feelService;
|
|
16
21
|
weakService;
|
|
17
22
|
toastService;
|
|
18
23
|
dialogService;
|
|
24
|
+
formatterService;
|
|
19
25
|
functionService;
|
|
20
26
|
formService;
|
|
27
|
+
globalService;
|
|
21
28
|
register;
|
|
22
29
|
scope;
|
|
23
|
-
constructor(feelService, weakService, toastService, dialogService, functionService, formService, register, scope) {
|
|
30
|
+
constructor(feelService, weakService, toastService, dialogService, formatterService, functionService, formService, globalService, register, scope) {
|
|
24
31
|
this.feelService = feelService;
|
|
25
32
|
this.weakService = weakService;
|
|
26
33
|
this.toastService = toastService;
|
|
27
34
|
this.dialogService = dialogService;
|
|
35
|
+
this.formatterService = formatterService;
|
|
28
36
|
this.functionService = functionService;
|
|
29
37
|
this.formService = formService;
|
|
38
|
+
this.globalService = globalService;
|
|
30
39
|
this.register = register;
|
|
31
40
|
this.scope = scope;
|
|
41
|
+
this.Init();
|
|
32
42
|
this.predefinedFunctions = this.getPredefinedFunctions();
|
|
33
43
|
}
|
|
44
|
+
/*
|
|
45
|
+
Global Properties:
|
|
46
|
+
- feel-diagnostics: "on", "off"
|
|
47
|
+
- feel-cacheable: "on", "off"
|
|
48
|
+
*/
|
|
34
49
|
predefinedFunctions;
|
|
35
50
|
destroy$ = new Subject();
|
|
36
51
|
ngOnDestroy() {
|
|
@@ -38,7 +53,7 @@ export class ProgrammabilityService {
|
|
|
38
53
|
this.destroy$.complete();
|
|
39
54
|
}
|
|
40
55
|
isExpression(text) {
|
|
41
|
-
return text
|
|
56
|
+
return typeof text === 'string' && text.startsWith("=");
|
|
42
57
|
}
|
|
43
58
|
;
|
|
44
59
|
getExpression(text) {
|
|
@@ -47,26 +62,6 @@ export class ProgrammabilityService {
|
|
|
47
62
|
return "";
|
|
48
63
|
}
|
|
49
64
|
;
|
|
50
|
-
watchExpression(formGroup, value, callback) {
|
|
51
|
-
if (this.isExpression(value) && callback) {
|
|
52
|
-
const expression = this.getExpression(value);
|
|
53
|
-
const evaluateAndCall = () => {
|
|
54
|
-
const result = this.evalExpression(formGroup, expression, { cacheable: false });
|
|
55
|
-
if (isObservable(result)) {
|
|
56
|
-
result.pipe(take(1)).subscribe((data) => {
|
|
57
|
-
callback(data);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
callback(result);
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
this.watchingExpression(formGroup, expression, () => {
|
|
65
|
-
evaluateAndCall();
|
|
66
|
-
});
|
|
67
|
-
evaluateAndCall();
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
65
|
evaluateString(formGroup, value) {
|
|
71
66
|
if (this.isExpression(value)) {
|
|
72
67
|
return this.evalExpression(formGroup, this.getExpression(value));
|
|
@@ -111,7 +106,9 @@ export class ProgrammabilityService {
|
|
|
111
106
|
else {
|
|
112
107
|
template = value;
|
|
113
108
|
}
|
|
114
|
-
|
|
109
|
+
if (!template)
|
|
110
|
+
return "";
|
|
111
|
+
return this.evalTemplate(formGroup, template);
|
|
115
112
|
}
|
|
116
113
|
evaluateUnary(formGroup, value, input) {
|
|
117
114
|
if (this.isExpression(value)) {
|
|
@@ -121,26 +118,131 @@ export class ProgrammabilityService {
|
|
|
121
118
|
}
|
|
122
119
|
invalidate(value) {
|
|
123
120
|
if (this.isExpression(value)) {
|
|
124
|
-
this.
|
|
121
|
+
this.invalidateExpression(this.getExpression(value));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
watch(formGroup, dependencies, callback) {
|
|
125
|
+
this.watchingDependencies(formGroup, dependencies, callback);
|
|
126
|
+
}
|
|
127
|
+
getDependencies(expression) {
|
|
128
|
+
return this.feelService.getDependencies(expression);
|
|
129
|
+
}
|
|
130
|
+
disable(formGroup, control, value) {
|
|
131
|
+
// se riabilito un FormGroup vengono riabilitato tutti i child
|
|
132
|
+
// mentre dovrebbero essere rivalutati se hanno una condizione o un valore static.
|
|
133
|
+
const logDisabled = (value) => {
|
|
134
|
+
if (!this.verbose)
|
|
135
|
+
return;
|
|
136
|
+
console.log(value ? "Disable" : "Enable", control, { path: this.getPath(control), formGroup });
|
|
137
|
+
};
|
|
138
|
+
const disableControl = (value) => {
|
|
139
|
+
if (value === true) {
|
|
140
|
+
if (control.disabled)
|
|
141
|
+
return;
|
|
142
|
+
control.disable();
|
|
143
|
+
logDisabled(value);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
if (control.enabled)
|
|
147
|
+
return;
|
|
148
|
+
control.enable();
|
|
149
|
+
logDisabled(value);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
if (typeof value === 'boolean') {
|
|
153
|
+
disableControl(value);
|
|
154
|
+
}
|
|
155
|
+
else if (typeof value === 'string') {
|
|
156
|
+
if (this.isExpression(value)) {
|
|
157
|
+
const expression = this.getExpression(value);
|
|
158
|
+
const dependencies = this.getDependencies(expression);
|
|
159
|
+
const applyExpression = () => {
|
|
160
|
+
const result = this.evaluateBoolean(formGroup, value, { cacheable: false });
|
|
161
|
+
disableControl(result);
|
|
162
|
+
};
|
|
163
|
+
if (dependencies.length > 0) {
|
|
164
|
+
this.watch(formGroup, dependencies, () => {
|
|
165
|
+
applyExpression();
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
applyExpression();
|
|
169
|
+
}
|
|
125
170
|
}
|
|
126
171
|
}
|
|
172
|
+
validate(formGroup, key, required, validations) {
|
|
173
|
+
const validators = [];
|
|
174
|
+
const noWatching = () => { };
|
|
175
|
+
if (required === true) {
|
|
176
|
+
validators.push(Validators.required);
|
|
177
|
+
}
|
|
178
|
+
if (!Array.isArray(validations)) {
|
|
179
|
+
return [validators, noWatching];
|
|
180
|
+
}
|
|
181
|
+
validations.forEach((item) => {
|
|
182
|
+
if (!this.isExpression(item.expression))
|
|
183
|
+
return;
|
|
184
|
+
if (item.type === "validate") {
|
|
185
|
+
validators.push(this.validateFn(formGroup, item));
|
|
186
|
+
}
|
|
187
|
+
else if (item.type === "invalidate") {
|
|
188
|
+
validators.push(this.invalidateFn(formGroup, item));
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
const watching = (control) => {
|
|
192
|
+
this.watchForValidation(formGroup, control, key, validations);
|
|
193
|
+
};
|
|
194
|
+
return [validators, watching];
|
|
195
|
+
}
|
|
127
196
|
cacheable = true;
|
|
197
|
+
verbose = false;
|
|
198
|
+
onErrorHandler = this.onError.bind(this);
|
|
199
|
+
Init() {
|
|
200
|
+
this.cacheable = this.globalService.getProperty("feel-cacheable", "on") === "on";
|
|
201
|
+
this.verbose = this.globalService.getProperty("feel-diagnostics", "off") === "on";
|
|
202
|
+
if (this.verbose)
|
|
203
|
+
console.log("Programmability Service Initialized", { cacheable: this.cacheable, verbose: this.verbose });
|
|
204
|
+
}
|
|
128
205
|
evalUnaryTest(formGroup, expression, input) {
|
|
206
|
+
const logError = (expression, error) => {
|
|
207
|
+
console.warn(expression, { formGroup, error });
|
|
208
|
+
};
|
|
209
|
+
const logEvaluation = (expression, result) => {
|
|
210
|
+
if (!this.verbose)
|
|
211
|
+
return;
|
|
212
|
+
console.log("Evaluate UnaryTest:", expression, result, { formGroup });
|
|
213
|
+
};
|
|
129
214
|
try {
|
|
130
|
-
|
|
215
|
+
const result = this.feelService.evalUnaryTest(expression, this.getContext(formGroup), input);
|
|
216
|
+
logEvaluation(expression, result);
|
|
217
|
+
return result;
|
|
131
218
|
}
|
|
132
219
|
catch (e) {
|
|
133
|
-
|
|
220
|
+
logError(expression, e);
|
|
134
221
|
return null;
|
|
135
222
|
}
|
|
136
223
|
}
|
|
137
224
|
evalExpression(formGroup, expression, options = {}) {
|
|
225
|
+
const logError = (expression, error) => {
|
|
226
|
+
console.warn(expression, { formGroup, options, error });
|
|
227
|
+
};
|
|
228
|
+
const logInvalidate = (expression) => {
|
|
229
|
+
if (!this.verbose)
|
|
230
|
+
return;
|
|
231
|
+
console.log("Invalidate Expression:", expression, { formGroup, options });
|
|
232
|
+
};
|
|
233
|
+
const logEvaluation = (expression, result) => {
|
|
234
|
+
if (!this.verbose)
|
|
235
|
+
return;
|
|
236
|
+
console.log("Evaluate Expression:", expression, result, { formGroup, options });
|
|
237
|
+
};
|
|
138
238
|
const evaluate = () => {
|
|
139
239
|
try {
|
|
140
|
-
|
|
240
|
+
const result = this.feelService.evalExpression(expression, this.getContext(formGroup, options));
|
|
241
|
+
logEvaluation(expression, result);
|
|
242
|
+
return result;
|
|
141
243
|
}
|
|
142
244
|
catch (e) {
|
|
143
|
-
|
|
245
|
+
logError(expression, e);
|
|
144
246
|
return null;
|
|
145
247
|
}
|
|
146
248
|
};
|
|
@@ -148,7 +250,51 @@ export class ProgrammabilityService {
|
|
|
148
250
|
if (cacheable) {
|
|
149
251
|
const watchKey = `:watch(${expression})`;
|
|
150
252
|
this.weakService.call(this, watchKey, () => {
|
|
151
|
-
this.watchingExpression(formGroup, expression, () =>
|
|
253
|
+
this.watchingExpression(formGroup, expression, () => {
|
|
254
|
+
this.invalidateExpression(expression);
|
|
255
|
+
logInvalidate(expression);
|
|
256
|
+
});
|
|
257
|
+
return true;
|
|
258
|
+
});
|
|
259
|
+
return this.weakService.call(this, expression, evaluate, null, this.onErrorHandler);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
return evaluate();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
evalTemplate(formGroup, expression, options = {}) {
|
|
266
|
+
const logError = (expression, error) => {
|
|
267
|
+
console.warn(expression, { formGroup, options, error });
|
|
268
|
+
};
|
|
269
|
+
const logInvalidate = (expression) => {
|
|
270
|
+
if (!this.verbose)
|
|
271
|
+
return;
|
|
272
|
+
console.log("Invalidate Template:", expression, { formGroup, options });
|
|
273
|
+
};
|
|
274
|
+
const logEvaluation = (expression, result) => {
|
|
275
|
+
if (!this.verbose)
|
|
276
|
+
return;
|
|
277
|
+
console.log("Evaluate Template:", expression, result, { formGroup, options });
|
|
278
|
+
};
|
|
279
|
+
const evaluate = () => {
|
|
280
|
+
try {
|
|
281
|
+
const result = this.feelService.evalTemplate(expression, this.getContext(formGroup));
|
|
282
|
+
logEvaluation(expression, result);
|
|
283
|
+
return result;
|
|
284
|
+
}
|
|
285
|
+
catch (e) {
|
|
286
|
+
logError(expression, e);
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
const cacheable = options.cacheable ?? this.cacheable;
|
|
291
|
+
if (cacheable) {
|
|
292
|
+
const watchKey = `:watchTemplate(${expression})`;
|
|
293
|
+
this.weakService.call(this, watchKey, () => {
|
|
294
|
+
this.watchingTemplateExpression(formGroup, expression, () => {
|
|
295
|
+
this.invalidateExpression(expression);
|
|
296
|
+
logInvalidate(expression);
|
|
297
|
+
});
|
|
152
298
|
return true;
|
|
153
299
|
});
|
|
154
300
|
return this.weakService.call(this, expression, evaluate);
|
|
@@ -157,12 +303,16 @@ export class ProgrammabilityService {
|
|
|
157
303
|
return evaluate();
|
|
158
304
|
}
|
|
159
305
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
return
|
|
306
|
+
onError(result) {
|
|
307
|
+
if (isObservable(result)) {
|
|
308
|
+
return result.pipe(tap({
|
|
309
|
+
error: err => {
|
|
310
|
+
this.toastService.notifyError(err.message);
|
|
311
|
+
}
|
|
312
|
+
}));
|
|
163
313
|
}
|
|
164
|
-
|
|
165
|
-
return
|
|
314
|
+
else {
|
|
315
|
+
return result;
|
|
166
316
|
}
|
|
167
317
|
}
|
|
168
318
|
getPredefinedFunctions() {
|
|
@@ -170,6 +320,7 @@ export class ProgrammabilityService {
|
|
|
170
320
|
this.dialogService,
|
|
171
321
|
this.toastService,
|
|
172
322
|
this.functionService,
|
|
323
|
+
this.formatterService,
|
|
173
324
|
this.register
|
|
174
325
|
];
|
|
175
326
|
return providers.reduce((acc, provider) => {
|
|
@@ -219,11 +370,12 @@ export class ProgrammabilityService {
|
|
|
219
370
|
const baseContext = formGroup?.value ?? {};
|
|
220
371
|
const self = this;
|
|
221
372
|
let context = {
|
|
222
|
-
|
|
373
|
+
get console() { return ToProxy(console); },
|
|
223
374
|
get parent() { return self.getParentContext(formGroup); },
|
|
224
375
|
get root() { return self.getRootContext(formGroup); },
|
|
225
376
|
formGroup: () => ToProxy(formGroup),
|
|
226
377
|
_: this.scope?.getContext(),
|
|
378
|
+
...baseContext,
|
|
227
379
|
fn: {
|
|
228
380
|
...this.predefinedFunctions,
|
|
229
381
|
...this.getFormFunctions(formGroup),
|
|
@@ -241,55 +393,157 @@ export class ProgrammabilityService {
|
|
|
241
393
|
return context;
|
|
242
394
|
}
|
|
243
395
|
watchingExpression(formGroup, expression, callback) {
|
|
396
|
+
const logDependencies = (dependencies) => {
|
|
397
|
+
if (!this.verbose)
|
|
398
|
+
return;
|
|
399
|
+
console.log("Get Dependencies:", expression, dependencies, { formGroup });
|
|
400
|
+
};
|
|
244
401
|
const context = this.getContext(formGroup);
|
|
245
402
|
const dependencies = this.feelService.getDependencies(expression, context);
|
|
403
|
+
logDependencies(dependencies);
|
|
404
|
+
this.watchingDependencies(formGroup, dependencies, callback);
|
|
405
|
+
}
|
|
406
|
+
;
|
|
407
|
+
watchingTemplateExpression(formGroup, expression, callback) {
|
|
408
|
+
const logDependencies = (dependencies) => {
|
|
409
|
+
if (!this.verbose)
|
|
410
|
+
return;
|
|
411
|
+
console.log("Get Template Dependencies:", expression, dependencies, { formGroup });
|
|
412
|
+
};
|
|
413
|
+
const context = this.getContext(formGroup);
|
|
414
|
+
const dependencies = this.feelService.getTemplateDependencies(expression, context);
|
|
415
|
+
logDependencies(dependencies);
|
|
246
416
|
this.watchingDependencies(formGroup, dependencies, callback);
|
|
247
417
|
}
|
|
248
418
|
;
|
|
249
419
|
watchingDependencies(formGroup, dependencies, callback) {
|
|
250
|
-
const
|
|
251
|
-
|
|
420
|
+
const logWatching = (dependence) => {
|
|
421
|
+
if (!this.verbose)
|
|
422
|
+
return;
|
|
423
|
+
const text = Array.isArray(dependence) ? dependence.join(".") : dependence;
|
|
424
|
+
console.log("Watching dependence:", text, { formGroup });
|
|
425
|
+
};
|
|
426
|
+
const logValueChanged = (control) => {
|
|
427
|
+
if (!this.verbose)
|
|
428
|
+
return;
|
|
429
|
+
console.log("Value Changed:", control.value, { path: this.getPath(control), control });
|
|
430
|
+
};
|
|
431
|
+
const logStatusChanged = (control) => {
|
|
432
|
+
if (!this.verbose)
|
|
433
|
+
return;
|
|
434
|
+
console.log("Status Changed:", control.status, { path: this.getPath(control), control });
|
|
435
|
+
};
|
|
436
|
+
const valueSubscribe = (control) => {
|
|
252
437
|
control.valueChanges
|
|
253
438
|
.pipe(takeUntil(this.destroy$))
|
|
254
439
|
.subscribe(() => {
|
|
255
440
|
setTimeout(() => {
|
|
256
441
|
callback();
|
|
442
|
+
logValueChanged(control);
|
|
443
|
+
});
|
|
444
|
+
});
|
|
445
|
+
};
|
|
446
|
+
const statusSubscribe = (control) => {
|
|
447
|
+
control.statusChanges
|
|
448
|
+
.pipe(distinctUntilChanged(), takeUntil(this.destroy$))
|
|
449
|
+
.subscribe(() => {
|
|
450
|
+
setTimeout(() => {
|
|
451
|
+
callback();
|
|
452
|
+
logStatusChanged(control);
|
|
257
453
|
});
|
|
258
454
|
});
|
|
259
455
|
};
|
|
260
456
|
for (const dependence of dependencies) {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
457
|
+
const [path, status] = this.processDependencies(dependence);
|
|
458
|
+
//potrei scrivere una funzione che mi restituisce i control da control
|
|
459
|
+
//risalendo fino al FormGroup
|
|
460
|
+
const control = this.formService.getControl(formGroup, path);
|
|
461
|
+
if (control) {
|
|
462
|
+
if (!status) {
|
|
463
|
+
valueSubscribe(control);
|
|
464
|
+
logWatching(dependence);
|
|
269
465
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
subscribe(control);
|
|
274
|
-
}
|
|
466
|
+
else {
|
|
467
|
+
statusSubscribe(control);
|
|
468
|
+
logWatching(dependence);
|
|
275
469
|
}
|
|
276
470
|
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
invalidateExpression(expression) {
|
|
474
|
+
this.weakService.invalidate(this, expression);
|
|
475
|
+
}
|
|
476
|
+
processDependencies(dependency) {
|
|
477
|
+
const statusDependency = Array.isArray(dependency)
|
|
478
|
+
&& dependency.length > 1
|
|
479
|
+
&& dependency[0] === StatusDependency;
|
|
480
|
+
return statusDependency
|
|
481
|
+
? [dependency.slice(1), true]
|
|
482
|
+
: [dependency, false];
|
|
483
|
+
}
|
|
484
|
+
getPath(control) {
|
|
485
|
+
return this.formService.getPath(control).join(".");
|
|
486
|
+
}
|
|
487
|
+
validateFn(formGroup, item) {
|
|
488
|
+
return (control) => {
|
|
489
|
+
return this.validateRule(formGroup, control, item, (result) => !result);
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
invalidateFn(formGroup, item) {
|
|
493
|
+
return (control) => {
|
|
494
|
+
return this.validateRule(formGroup, control, item, (result) => result);
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
validateRule(formGroup, control, item, predicate) {
|
|
498
|
+
//if (!control.touched)
|
|
499
|
+
// return null;
|
|
500
|
+
const logValidation = (value) => {
|
|
501
|
+
if (!this.verbose)
|
|
502
|
+
return;
|
|
503
|
+
if (value === null) {
|
|
504
|
+
console.log("Validate successfully", control.value, { path: this.getPath(control), item, control, formGroup });
|
|
505
|
+
}
|
|
277
506
|
else {
|
|
278
|
-
|
|
279
|
-
if (control) {
|
|
280
|
-
subscribe(control);
|
|
281
|
-
}
|
|
507
|
+
console.log("Validation failed", control.value, { resut: value, path: this.getPath(control), item, control, formGroup });
|
|
282
508
|
}
|
|
509
|
+
};
|
|
510
|
+
var result = this.evaluateUnary(formGroup, item.expression, control.value);
|
|
511
|
+
if (predicate(result)) {
|
|
512
|
+
const message = this.evaluateString(formGroup, item.message);
|
|
513
|
+
const validationError = { error: true, message };
|
|
514
|
+
logValidation(validationError);
|
|
515
|
+
return validationError;
|
|
516
|
+
}
|
|
517
|
+
logValidation(null);
|
|
518
|
+
return null;
|
|
519
|
+
}
|
|
520
|
+
watchForValidation(formGroup, control, key, validations) {
|
|
521
|
+
if (Array.isArray(validations)) {
|
|
522
|
+
const expressions = validations
|
|
523
|
+
.filter(item => this.isExpression(item.expression))
|
|
524
|
+
.map(item => "=" + this.getExpression(item.expression));
|
|
525
|
+
if (expressions.length === 0)
|
|
526
|
+
return;
|
|
527
|
+
const feelable = toFeelable(expressions);
|
|
528
|
+
const dependencies = this.getDependencies(feelable)
|
|
529
|
+
.filter(dep => dep !== key);
|
|
530
|
+
if (dependencies.length === 0)
|
|
531
|
+
return;
|
|
532
|
+
this.watch(formGroup, dependencies, () => {
|
|
533
|
+
setTimeout(() => {
|
|
534
|
+
control.updateValueAndValidity();
|
|
535
|
+
});
|
|
536
|
+
});
|
|
283
537
|
}
|
|
284
538
|
}
|
|
285
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgrammabilityService, deps: [{ token: i1.FeelService }, { token: i2.WeakService }, { token: i3.ToastService }, { token: i4.DialogService }, { token: i5.
|
|
539
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgrammabilityService, deps: [{ token: i1.FeelService }, { token: i2.WeakService }, { token: i3.ToastService }, { token: i4.DialogService }, { token: i5.FormatterService }, { token: i6.FunctionService }, { token: i7.FormService }, { token: i8.GlobalService }, { token: i9.RegisterService, optional: true }, { token: i10.ScopeService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
286
540
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgrammabilityService });
|
|
287
541
|
}
|
|
288
542
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgrammabilityService, decorators: [{
|
|
289
543
|
type: Injectable
|
|
290
|
-
}], ctorParameters: () => [{ type: i1.FeelService }, { type: i2.WeakService }, { type: i3.ToastService }, { type: i4.DialogService }, { type: i5.
|
|
544
|
+
}], ctorParameters: () => [{ type: i1.FeelService }, { type: i2.WeakService }, { type: i3.ToastService }, { type: i4.DialogService }, { type: i5.FormatterService }, { type: i6.FunctionService }, { type: i7.FormService }, { type: i8.GlobalService }, { type: i9.RegisterService, decorators: [{
|
|
291
545
|
type: Optional
|
|
292
|
-
}] }, { type:
|
|
546
|
+
}] }, { type: i10.ScopeService, decorators: [{
|
|
293
547
|
type: Optional
|
|
294
548
|
}] }] });
|
|
295
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbW1hYmlsaXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2lyaW8vc3JjL2xpYi9zZXJ2aWNlcy9wcm9ncmFtbWFiaWxpdHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQW1CLFNBQVMsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBU3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7O0FBRzlELE1BQU0sT0FBTyxzQkFBc0I7SUFFYjtJQUNSO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDWTtJQUNBO0lBUHhCLFlBQW9CLFdBQXdCLEVBQ2hDLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLGVBQWdDLEVBQ2hDLFdBQXdCLEVBQ1osUUFBeUIsRUFDekIsS0FBbUI7UUFQdkIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDaEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ1osYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUd6QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVnQixtQkFBbUIsQ0FBc0I7SUFFbEQsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFF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Qy9CLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxDQUFDO2dCQUVELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ3pDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzVDLElBQUksT0FBTyxFQUFFLENBQUM7d0JBQ1osU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNyQixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDWixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7d0dBalVVLHNCQUFzQjs0R0FBdEIsc0JBQXNCOzs0RkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVOzswQkFTSixRQUFROzswQkFDUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGZWVsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ZlZWwuc2VydmljZSc7XHJcbmltcG9ydCB7IFNjb3BlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Njb3BlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZWdpc3RlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZWdpc3Rlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IEZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Z1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4vZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgV2Vha1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy93ZWFrLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb1Byb3h5IH0gZnJvbSAnLi4vdXRpbHMvZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsLCBpc09ic2VydmFibGUsIHRha2UgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUHJvZ3JhbW1hYmlsaXR5U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmVlbFNlcnZpY2U6IEZlZWxTZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgd2Vha1NlcnZpY2U6IFdlYWtTZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgZnVuY3Rpb25TZXJ2aWNlOiBGdW5jdGlvblNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBmb3JtU2VydmljZTogRm9ybVNlcnZpY2VcclxuICAgICwgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWdpc3RlcjogUmVnaXN0ZXJTZXJ2aWNlXHJcbiAgICAsIEBPcHRpb25hbCgpIHByaXZhdGUgc2NvcGU6IFNjb3BlU2VydmljZVxyXG4gICkge1xyXG5cclxuICAgIHRoaXMucHJlZGVmaW5lZEZ1bmN0aW9ucyA9IHRoaXMuZ2V0UHJlZGVmaW5lZEZ1bmN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVkZWZpbmVkRnVuY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIGlzRXhwcmVzc2lvbih0ZXh0OiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGV4dCAhPSBudWxsICYmIHRleHQuc3RhcnRzV2l0aChcIj1cIik7XHJcbiAgfTtcclxuXHJcbiAgZ2V0RXhwcmVzc2lvbih0ZXh0OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmlzRXhwcmVzc2lvbih0ZXh0KSlcclxuICAgICAgcmV0dXJuIHRleHQhLnN1YnN0cmluZygxKTtcclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH07XHJcblxyXG4gIHdhdGNoRXhwcmVzc2lvbihmb3JtR3JvdXA6IEZvcm1Hcm91cCwgdmFsdWU6IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uKHZhbHVlKSAmJiBjYWxsYmFjaykge1xyXG4gICAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5nZXRFeHByZXNzaW9uKHZhbHVlKTtcclxuXHJcbiAgICAgIGNvbnN0IGV2YWx1YXRlQW5kQ2FsbCA9ICgpID0+IHsgICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZXZhbEV4cHJlc3Npb24oZm9ybUdyb3VwLCBleHByZXNzaW9uLCB7IGNhY2hlYWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XHJcbiAgICAgICAgICByZXN1bHQucGlwZShcclxuICAgICAgICAgICAgdGFrZSgxKVxyXG4gICAgICAgICAgKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhkYXRhKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLndhdGNoaW5nRXhwcmVzc2lvbihmb3JtR3JvdXAsIGV4cHJlc3Npb24sICgpID0+IHtcclxuICAgICAgICBldmFsdWF0ZUFuZENhbGwoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBldmFsdWF0ZUFuZENhbGwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV2YWx1YXRlU3RyaW5nKGZvcm1Hcm91cDogRm9ybUdyb3VwLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5pc0V4cHJlc3Npb24odmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmV2YWxFeHByZXNzaW9uKGZvcm1Hcm91cCwgdGhpcy5nZXRFeHByZXNzaW9uKHZhbHVlKSkgYXMgc3RyaW5nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlID8/IFwiXCI7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZUJvb2xlYW4oZm9ybUdyb3VwOiBGb3JtR3JvdXAsIHZhbHVlOiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCwgb3B0aW9uczogRXZhbHVhdGVPcHRpb25zID0ge30pOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCBzdHJWYWx1ZTogc3RyaW5nID0gdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmlzRXhwcmVzc2lvbihzdHJWYWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ldmFsRXhwcmVzc2lvbihmb3JtR3JvdXAsIHRoaXMuZ2V0RXhwcmVzc2lvbihzdHJWYWx1ZSksIG9wdGlvbnMpIGFzIGJvb2xlYW47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVOdW1iZXIoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnN0IHN0clZhbHVlOiBzdHJpbmcgPSB2YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uKHN0clZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmV2YWxFeHByZXNzaW9uKGZvcm1Hcm91cCwgdGhpcy5nZXRFeHByZXNzaW9uKHN0clZhbHVlKSkgYXMgbnVtYmVyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlKGZvcm1Hcm91cDogRm9ybUdyb3VwLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCwgb3B0aW9uczogRXZhbHVhdGVPcHRpb25zID0geyB9KTogYW55IHtcclxuICAgIGlmICh0aGlzLmlzRXhwcmVzc2lvbih2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZXZhbEV4cHJlc3Npb24oZm9ybUdyb3VwLCB0aGlzLmdldEV4cHJlc3Npb24odmFsdWUpLCBvcHRpb25zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVUZW1wbGF0ZShmb3JtR3JvdXA6IEZvcm1Hcm91cCwgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBhbnkge1xyXG5cclxuICAgIGxldCB0ZW1wbGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uKHZhbHVlKSkge1xyXG4gICAgICB0ZW1wbGF0ZSA9IHRoaXMuZXZhbEV4cHJlc3Npb24oZm9ybUdyb3VwLCB0aGlzLmdldEV4cHJlc3Npb24odmFsdWUpKSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGVtcGxhdGUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5ldmFsVGVtcGxhdGUoZm9ybUdyb3VwLCB0ZW1wbGF0ZSA/PyBcIlwiKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlVW5hcnkoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIHZhbHVlOiBzdHJpbmcgfCBudWxsLCBpbnB1dDogYW55KTogYW55IHtcclxuICAgIGlmICh0aGlzLmlzRXhwcmVzc2lvbih2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZXZhbFVuYXJ5VGVzdChmb3JtR3JvdXAsIHRoaXMuZ2V0RXhwcmVzc2lvbih2YWx1ZSksIGlucHV0KTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgaW52YWxpZGF0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uKHZhbHVlKSkge1xyXG4gICAgICB0aGlzLndlYWtTZXJ2aWNlLmludmFsaWRhdGUodGhpcywgdGhpcy5nZXRFeHByZXNzaW9uKHZhbHVlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhY2hlYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgZXZhbFVuYXJ5VGVzdChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgZXhwcmVzc2lvbjogc3RyaW5nLCBpbnB1dDogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5mZWVsU2VydmljZS5ldmFsVW5hcnlUZXN0KGV4cHJlc3Npb25cclxuICAgICAgICAsIHRoaXMuZ2V0Q29udGV4dChmb3JtR3JvdXApXHJcbiAgICAgICAgLCBpbnB1dCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGV4cHJlc3Npb24sIGUpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXZhbEV4cHJlc3Npb24oZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogRXZhbHVhdGVPcHRpb25zID0ge30pOiBhbnkge1xyXG4gICAgY29uc3QgZXZhbHVhdGUgPSAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVlbFNlcnZpY2UuZXZhbEV4cHJlc3Npb24oZXhwcmVzc2lvblxyXG4gICAgICAgICAgLCB0aGlzLmdldENvbnRleHQoZm9ybUdyb3VwLCBvcHRpb25zKSlcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGV4cHJlc3Npb24sIGUpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGNhY2hlYWJsZSA9IG9wdGlvbnMuY2FjaGVhYmxlID8/IHRoaXMuY2FjaGVhYmxlO1xyXG5cclxuICAgIGlmIChjYWNoZWFibGUpIHtcclxuICAgICAgY29uc3Qgd2F0Y2hLZXkgPSBgOndhdGNoKCR7ZXhwcmVzc2lvbn0pYDtcclxuXHJcbiAgICAgIHRoaXMud2Vha1NlcnZpY2UuY2FsbCh0aGlzLCB3YXRjaEtleSwgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMud2F0Y2hpbmdFeHByZXNzaW9uKGZvcm1Hcm91cCwgZXhwcmVzc2lvblxyXG4gICAgICAgICAgLCAoKSA9PiB0aGlzLndlYWtTZXJ2aWNlLmludmFsaWRhdGUodGhpcywgZXhwcmVzc2lvbikpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLndlYWtTZXJ2aWNlLmNhbGwodGhpcywgZXhwcmVzc2lvbiwgZXZhbHVhdGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBldmFsdWF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBldmFsVGVtcGxhdGUoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGV4cHJlc3Npb246IHN0cmluZyk6IGFueSB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5mZWVsU2VydmljZS5ldmFsVGVtcGxhdGUoZXhwcmVzc2lvblxyXG4gICAgICAgICwgdGhpcy5nZXRDb250ZXh0KGZvcm1Hcm91cCkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJlZGVmaW5lZEZ1bmN0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuXHJcbiAgICBjb25zdCBwcm92aWRlcnM6IElFdmFsdWF0b3JQcm92aWRlcltdID0gW1xyXG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UsXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLFxyXG4gICAgICB0aGlzLmZ1bmN0aW9uU2VydmljZSxcclxuICAgICAgdGhpcy5yZWdpc3RlciAgICAgIFxyXG4gICAgXTtcclxuXHJcbiAgICByZXR1cm4gcHJvdmlkZXJzLnJlZHVjZSgoYWNjLCBwcm92aWRlcikgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmFjYyxcclxuICAgICAgICAuLi5wcm92aWRlci5nZXRDb250ZXh0KClcclxuICAgICAgfTtcclxuICAgIH0sIHt9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9ybUZ1bmN0aW9ucyhmb3JtR3JvdXA6IEZvcm1Hcm91cCB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1TZXJ2aWNlLmdldENvbnRleHQoZm9ybUdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFyZW50Q29udGV4dChmb3JtR3JvdXA6IEZvcm1Hcm91cCB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAoZm9ybUdyb3VwID09PSBudWxsKSB7IFxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChmb3JtR3JvdXApO1xyXG5cclxuICAgIGlmICghcGFyZW50KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLnBhcmVudC52YWx1ZSxcclxuICAgICAgZm9ybUdyb3VwOiAoKSA9PiBUb1Byb3h5KHBhcmVudCksICAgICAgXHJcbiAgICAgIGdldCBwYXJlbnQoKSB7IHJldHVybiBzZWxmLmdldFBhcmVudENvbnRleHQocGFyZW50KTsgfSxcclxuICAgIH07ICAgIFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSb290Q29udGV4dChmb3JtR3JvdXA6IEZvcm1Hcm91cCB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAoZm9ybUdyb3VwID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCByb290ID0gZm9ybUdyb3VwPy5yb290O1xyXG5cclxuICAgIGlmICghcm9vdCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcm9vdC52YWx1ZTsgICAgXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhcmVudChmb3JtR3JvdXA6IEZvcm1Hcm91cCkgOiBGb3JtR3JvdXAgfCBudWxsIHtcclxuICAgIGxldCBwYXJlbnQgPSBmb3JtR3JvdXAucGFyZW50O1xyXG5cclxuICAgIHdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgcGFyZW50ID0gcGFyZW50Py5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcmVudCBhcyBGb3JtR3JvdXAgfCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb250ZXh0KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgb3B0aW9uczogRXZhbHVhdGVPcHRpb25zID0ge30pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuXHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cCB8IG51bGw7XHJcblxyXG4gICAgY29uc3QgYmFzZUNvbnRleHQgPSBmb3JtR3JvdXA/LnZhbHVlID8/IHsgfTtcclxuXHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuXHJcbiAgICBsZXQgY29udGV4dCA9IHtcclxuICAgICAgLi4uYmFzZUNvbnRleHQsXHJcbiAgICAgIGdldCBwYXJlbnQoKSB7IHJldHVybiBzZWxmLmdldFBhcmVudENvbnRleHQoZm9ybUdyb3VwKTsgfSxcclxuICAgICAgZ2V0IHJvb3QoKSB7IHJldHVybiBzZWxmLmdldFJvb3RDb250ZXh0KGZvcm1Hcm91cCk7IH0sXHJcbiAgICAgIGZvcm1Hcm91cDogKCkgPT4gVG9Qcm94eShmb3JtR3JvdXApLFxyXG4gICAgICBfOiB0aGlzLnNjb3BlPy5nZXRDb250ZXh0KCksXHJcbiAgICAgIGZuOiB7XHJcbiAgICAgICAgLi4udGhpcy5wcmVkZWZpbmVkRnVuY3Rpb25zLFxyXG4gICAgICAgIC4uLnRoaXMuZ2V0Rm9ybUZ1bmN0aW9ucyhmb3JtR3JvdXApLFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnMuZXh0ZW5kQ29udGV4dCkge1xyXG4gICAgICBjb25zdCBleHRlbmRlZCA9IG9wdGlvbnMuZXh0ZW5kQ29udGV4dCgpO1xyXG4gICAgICBpZiAoZXh0ZW5kZWQpIHtcclxuICAgICAgICBjb250ZXh0ID0ge1xyXG4gICAgICAgICAgLi4uY29udGV4dCxcclxuICAgICAgICAgIC4uLmV4dGVuZGVkXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdhdGNoaW5nRXhwcmVzc2lvbihmb3JtR3JvdXA6IEZvcm1Hcm91cCwgZXhwcmVzc2lvbjogc3RyaW5nLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dChmb3JtR3JvdXApO1xyXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gdGhpcy5mZWVsU2VydmljZS5nZXREZXBlbmRlbmNpZXMoZXhwcmVzc2lvbiwgY29udGV4dCk7XHJcbiAgICB0aGlzLndhdGNoaW5nRGVwZW5kZW5jaWVzKGZvcm1Hcm91cCwgZGVwZW5kZW5jaWVzLCBjYWxsYmFjayk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSB3YXRjaGluZ0RlcGVuZGVuY2llcyhmb3JtR3JvdXA6IEZvcm1Hcm91cCwgZGVwZW5kZW5jaWVzOiAoc3RyaW5nIHwgc3RyaW5nW10pW10sIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICBjb25zdCBwYXJlbnROYW1lOiBzdHJpbmcgPSBcInBhcmVudFwiO1xyXG5cclxuICAgIGNvbnN0IHN1YnNjcmliZSA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgY29udHJvbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jZSBvZiBkZXBlbmRlbmNpZXMpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jZSkpIHtcclxuICAgICAgICBsZXQgdGFyZ2V0Rm9ybTogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IGZvcm1Hcm91cDtcclxuICAgICAgICBsZXQgY29udHJvbFBhdGggPSBkZXBlbmRlbmNlO1xyXG5cclxuICAgICAgICB3aGlsZSAoY29udHJvbFBhdGgubGVuZ3RoID4gMCAmJiBjb250cm9sUGF0aFswXSA9PT0gcGFyZW50TmFtZSkge1xyXG4gICAgICAgICAgaWYgKCF0YXJnZXRGb3JtLnBhcmVudClcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB0YXJnZXRGb3JtID0gdGFyZ2V0Rm9ybS5wYXJlbnQ7XHJcbiAgICAgICAgICBjb250cm9sUGF0aCA9IGNvbnRyb2xQYXRoLnNsaWNlKDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2xQYXRoLmxlbmd0aCA+IDAgJiYgdGFyZ2V0Rm9ybSkge1xyXG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IHRhcmdldEZvcm0uZ2V0KGNvbnRyb2xQYXRoKTtcclxuICAgICAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgICAgIHN1YnNjcmliZShjb250cm9sKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZGVwZW5kZW5jZSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICAgIHN1YnNjcmliZShjb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gICAgXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFdmFsdWF0b3JQcm92aWRlciB7XHJcbiAgZ2V0Q29udGV4dChzY29wZT86IGFueSk6IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXZhbHVhdGVPcHRpb25zIHtcclxuICBjYWNoZWFibGU/OiBib29sZWFuO1xyXG4gIGV4dGVuZENvbnRleHQ/OiBFeHRlbmRDb250ZXh0Rm47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEV4dGVuZENvbnRleHRGbiA9ICgpID0+IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbiJdfQ==
|
|
549
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbW1hYmlsaXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2lyaW8vc3JjL2xpYi9zZXJ2aWNlcy9wcm9ncmFtbWFiaWxpdHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQW1CLFNBQVMsRUFBMEIsVUFBVSxFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBV2xILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7O0FBRXJDLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0FBR25DLE1BQU0sT0FBTyxzQkFBc0I7SUFFYjtJQUNSO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ1k7SUFDQTtJQVR4QixZQUFvQixXQUF3QixFQUNoQyxXQUF3QixFQUN4QixZQUEwQixFQUMxQixhQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsZUFBZ0MsRUFDaEMsV0FBd0IsRUFDeEIsYUFBNEIsRUFDaEIsUUFBeUIsRUFDekIsS0FBbUI7UUFUdkIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDaEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7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QkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ2xELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRTFELElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFFckMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO2lCQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7WUFFOUIsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsT0FBTztZQUV0QyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO2dCQUN2QyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUNuQyxDQUFDLENBQUMsQ0FBQztZQUVMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7d0dBM2xCVSxzQkFBc0I7NEdBQXRCLHNCQUFzQjs7NEZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVTs7MEJBV0osUUFBUTs7MEJBQ1IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZlZWxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZmVlbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2NvcGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc2NvcGUuc2VydmljZSc7XHJcbmltcG9ydCB7IFJlZ2lzdGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3JlZ2lzdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZnVuY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEdsb2JhbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9nbG9iYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZm9ybWF0dGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXZWFrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3dlYWsuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvUHJveHkgfSBmcm9tICcuLi91dGlscy9mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyB0b0ZlZWxhYmxlIH0gZnJvbSAnLi4vdXRpbHMvZmVlbGFibGUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBpc09ic2VydmFibGUsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5jb25zdCBTdGF0dXNEZXBlbmRlbmN5ID0gXCIkc3RhdHVzXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBQcm9ncmFtbWFiaWxpdHlTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmZWVsU2VydmljZTogRmVlbFNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSB3ZWFrU2VydmljZTogV2Vha1NlcnZpY2VcclxuICAgICwgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZVxyXG4gICAgLCBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBmb3JtYXR0ZXJTZXJ2aWNlOiBGb3JtYXR0ZXJTZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgZnVuY3Rpb25TZXJ2aWNlOiBGdW5jdGlvblNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBmb3JtU2VydmljZTogRm9ybVNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBnbG9iYWxTZXJ2aWNlOiBHbG9iYWxTZXJ2aWNlXHJcbiAgICAsIEBPcHRpb25hbCgpIHByaXZhdGUgcmVnaXN0ZXI6IFJlZ2lzdGVyU2VydmljZVxyXG4gICAgLCBAT3B0aW9uYWwoKSBwcml2YXRlIHNjb3BlOiBTY29wZVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuSW5pdCgpO1xyXG4gICAgdGhpcy5wcmVkZWZpbmVkRnVuY3Rpb25zID0gdGhpcy5nZXRQcmVkZWZpbmVkRnVuY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAgR2xvYmFsIFByb3BlcnRpZXM6XHJcbiAgICAtIGZlZWwtZGlhZ25vc3RpY3M6IFwib25cIiwgXCJvZmZcIlxyXG4gICAgLSBmZWVsLWNhY2hlYWJsZTogXCJvblwiLCBcIm9mZlwiXHJcbiAgKi9cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVkZWZpbmVkRnVuY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIGlzRXhwcmVzc2lvbih0ZXh0OiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnICYmIHRleHQuc3RhcnRzV2l0aChcIj1cIik7XHJcbiAgfTtcclxuXHJcbiAgZ2V0RXhwcmVzc2lvbih0ZXh0OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmlzRXhwcmVzc2lvbih0ZXh0KSlcclxuICAgICAgcmV0dXJuIHRleHQhLnN1YnN0cmluZygxKTtcclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH07XHJcblxyXG4gIGV2YWx1YXRlU3RyaW5nKGZvcm1Hcm91cDogRm9ybUdyb3VwLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5pc0V4cHJlc3Npb24odmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmV2YWxFeHByZXNzaW9uKGZvcm1Hcm91cCwgdGhpcy5nZXRFeHByZXNzaW9uKHZhbHVlKSkgYXMgc3RyaW5nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlID8/IFwiXCI7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZUJvb2xlYW4oZm9ybUdyb3VwOiBGb3JtR3JvdXAsIHZhbHVlOiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCwgb3B0aW9uczogRXZhbHVhdGVPcHRpb25zID0ge30pOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCBzdHJWYWx1ZTogc3RyaW5nID0gdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLmlzRXhwcmVzc2lvbihzdHJWYWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ldmFsRXhwcmVzc2lvbihmb3JtR3JvdXAsIHRoaXMuZ2V0RXhwcmVzc2lvbihzdHJWYWx1ZSksIG9wdGlvbnMpIGFzIGJvb2xlYW47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVOdW1iZXIoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnN0IHN0clZhbHVlOiBzdHJpbmcgPSB2YWx1ZTtcclxuICAgICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uKHN0clZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmV2YWxFeHByZXNzaW9uKGZvcm1Hcm91cCwgdGhpcy5nZXRFeHByZXNzaW9uKHN0clZhbHVlKSkgYXMgbnVtYmVyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlKGZvcm1Hcm91cDogRm9ybUdyb3VwLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCwgb3B0aW9uczogRXZhbHVhdGVPcHRpb25zID0geyB9KTogYW55IHtcclxuICAgIGlmICh0aGlzLmlzRXhwcmVzc2lvbih2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZXZhbEV4cHJlc3Npb24oZm9ybUdyb3VwLCB0aGlzLmdldEV4cHJlc3Npb24odmFsdWUpLCBvcHRpb25zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVUZW1wbGF0ZShmb3JtR3JvdXA6IEZvcm1Hcm91cCwgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBhbnkge1xyXG5cclxuICAgIGxldCB0ZW1wbGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uKHZhbHVlKSkge1xyXG4gICAgICB0ZW1wbGF0ZSA9IHRoaXMuZXZhbEV4cHJlc3Npb24oZm9ybUdyb3VwLCB0aGlzLmdldEV4cHJlc3Npb24odmFsdWUpKSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGVtcGxhdGUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRlbXBsYXRlKVxyXG4gICAgICByZXR1cm4gXCJcIjtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5ldmFsVGVtcGxhdGUoZm9ybUdyb3VwLCB0ZW1wbGF0ZSk7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZVVuYXJ5KGZvcm1Hcm91cDogRm9ybUdyb3VwLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCwgaW5wdXQ6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5pc0V4cHJlc3Npb24odmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmV2YWxVbmFyeVRlc3QoZm9ybUdyb3VwLCB0aGlzLmdldEV4cHJlc3Npb24odmFsdWUpLCBpbnB1dCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGludmFsaWRhdGUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRXhwcmVzc2lvbih2YWx1ZSkpIHtcclxuICAgICAgdGhpcy5pbnZhbGlkYXRlRXhwcmVzc2lvbih0aGlzLmdldEV4cHJlc3Npb24odmFsdWUpKTsgICAgICBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdhdGNoKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBkZXBlbmRlbmNpZXM6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSwgY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcclxuICAgIHRoaXMud2F0Y2hpbmdEZXBlbmRlbmNpZXMoZm9ybUdyb3VwLCBkZXBlbmRlbmNpZXMsIGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIGdldERlcGVuZGVuY2llcyhleHByZXNzaW9uOiBzdHJpbmcpOiAoc3RyaW5nIHwgc3RyaW5nW10pW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmVlbFNlcnZpY2UuZ2V0RGVwZW5kZW5jaWVzKGV4cHJlc3Npb24pO1xyXG4gIH1cclxuXHJcbiAgZGlzYWJsZShmb3JtR3JvdXA6IEZvcm1Hcm91cCwgY29udHJvbDogQWJzdHJhY3RDb250cm9sLCB2YWx1ZTogYm9vbGVhbiB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgIC8vIHNlIHJpYWJpbGl0byB1biBGb3JtR3JvdXAgdmVuZ29ubyByaWFiaWxpdGF0byB0dXR0aSBpIGNoaWxkXHJcbiAgICAvLyBtZW50cmUgZG92cmViYmVybyBlc3NlcmUgcml2YWx1dGF0aSBzZSBoYW5ubyB1bmEgY29uZGl6aW9uZSBvIHVuIHZhbG9yZSBzdGF0aWMuXHJcbiAgICBjb25zdCBsb2dEaXNhYmxlZCA9ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy52ZXJib3NlKSByZXR1cm47XHJcbiAgICAgIGNvbnNvbGUubG9nKHZhbHVlID8gXCJEaXNhYmxlXCIgOiBcIkVuYWJsZVwiLCBjb250cm9sLCB7IHBhdGg6IHRoaXMuZ2V0UGF0aChjb250cm9sKSwgZm9ybUdyb3VwIH0pO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGRpc2FibGVDb250cm9sID0gKHZhbHVlOiBib29sZWFuIHwgbnVsbCkgPT4ge1xyXG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgICBpZiAoY29udHJvbC5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgIGxvZ0Rpc2FibGVkKHZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoY29udHJvbC5lbmFibGVkKSByZXR1cm47XHJcbiAgICAgICAgY29udHJvbC5lbmFibGUoKTtcclxuICAgICAgICBsb2dEaXNhYmxlZCh2YWx1ZSk7ICAgICAgICBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIGRpc2FibGVDb250cm9sKHZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uKHZhbHVlKSkge1xyXG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmdldEV4cHJlc3Npb24odmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHRoaXMuZ2V0RGVwZW5kZW5jaWVzKGV4cHJlc3Npb24pO1xyXG4gICAgICAgIGNvbnN0IGFwcGx5RXhwcmVzc2lvbiA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZXZhbHVhdGVCb29sZWFuKGZvcm1Hcm91cCwgdmFsdWUsIHsgY2FjaGVhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICAgIGRpc2FibGVDb250cm9sKHJlc3VsdCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMud2F0Y2goZm9ybUdyb3VwLCBkZXBlbmRlbmNpZXMsICgpID0+IHtcclxuICAgICAgICAgICAgYXBwbHlFeHByZXNzaW9uKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXBwbHlFeHByZXNzaW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBrZXk6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuLCB2YWxpZGF0aW9ucz86IFZhbGlkYXRpb25SdWxlW10pOiBbVmFsaWRhdG9yRm5bXSwgKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gdm9pZF1cclxuICB7XHJcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcblxyXG4gICAgY29uc3Qgbm9XYXRjaGluZyA9ICgpID0+IHsgfTtcclxuXHJcbiAgICBpZiAocmVxdWlyZWQgPT09IHRydWUpIHtcclxuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWxpZGF0aW9ucykpIHtcclxuICAgICAgcmV0dXJuIFt2YWxpZGF0b3JzLCBub1dhdGNoaW5nXTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0aW9ucy5mb3JFYWNoKChpdGVtOiBWYWxpZGF0aW9uUnVsZSkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNFeHByZXNzaW9uKGl0ZW0uZXhwcmVzc2lvbikpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJ2YWxpZGF0ZVwiKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKHRoaXMudmFsaWRhdGVGbihmb3JtR3JvdXAsIGl0ZW0pKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiaW52YWxpZGF0ZVwiKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKHRoaXMuaW52YWxpZGF0ZUZuKGZvcm1Hcm91cCwgaXRlbSkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB3YXRjaGluZyA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkID0+IHtcclxuICAgICAgdGhpcy53YXRjaEZvclZhbGlkYXRpb24oZm9ybUdyb3VwLCBjb250cm9sLCBrZXksIHZhbGlkYXRpb25zKTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIHJldHVybiBbdmFsaWRhdG9ycywgd2F0Y2hpbmddO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWNoZWFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBvbkVycm9ySGFuZGxlcjogYW55ID0gdGhpcy5vbkVycm9yLmJpbmQodGhpcyk7XHJcblxyXG4gIHByaXZhdGUgSW5pdCgpIHtcclxuICAgIHRoaXMuY2FjaGVhYmxlID0gdGhpcy5nbG9iYWxTZXJ2aWNlLmdldFByb3BlcnR5KFwiZmVlbC1jYWNoZWFibGVcIiwgXCJvblwiKSA9PT0gXCJvblwiO1xyXG4gICAgdGhpcy52ZXJib3NlID0gdGhpcy5nbG9iYWxTZXJ2aWNlLmdldFByb3BlcnR5KFwiZmVlbC1kaWFnbm9zdGljc1wiLCBcIm9mZlwiKSA9PT0gXCJvblwiO1xyXG4gICAgaWYgKHRoaXMudmVyYm9zZSlcclxuICAgICAgY29uc29sZS5sb2coXCJQcm9ncmFtbWFiaWxpdHkgU2VydmljZSBJbml0aWFsaXplZFwiLCB7IGNhY2hlYWJsZTogdGhpcy5jYWNoZWFibGUsIHZlcmJvc2U6IHRoaXMudmVyYm9zZSB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXZhbFVuYXJ5VGVzdChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgZXhwcmVzc2lvbjogc3RyaW5nLCBpbnB1dDogYW55KSB7XHJcbiAgICBjb25zdCBsb2dFcnJvciA9IChleHByZXNzaW9uOiBzdHJpbmcsIGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS53YXJuKGV4cHJlc3Npb24sIHsgZm9ybUdyb3VwLCBlcnJvciB9KTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbG9nRXZhbHVhdGlvbiA9IChleHByZXNzaW9uOiBzdHJpbmcsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy52ZXJib3NlKSByZXR1cm47XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRXZhbHVhdGUgVW5hcnlUZXN0OlwiLCBleHByZXNzaW9uLCByZXN1bHQsIHsgZm9ybUdyb3VwIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZlZWxTZXJ2aWNlLmV2YWxVbmFyeVRlc3QoZXhwcmVzc2lvblxyXG4gICAgICAgICwgdGhpcy5nZXRDb250ZXh0KGZvcm1Hcm91cClcclxuICAgICAgICAsIGlucHV0KTtcclxuICAgICAgbG9nRXZhbHVhdGlvbihleHByZXNzaW9uLCByZXN1bHQpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBsb2dFcnJvcihleHByZXNzaW9uLCBlKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV2YWxFeHByZXNzaW9uKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBleHByZXNzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IEV2YWx1YXRlT3B0aW9ucyA9IHt9KTogYW55IHtcclxuXHJcbiAgICBjb25zdCBsb2dFcnJvciA9IChleHByZXNzaW9uOiBzdHJpbmcsIGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS53YXJuKGV4cHJlc3Npb24sIHsgZm9ybUdyb3VwLCBvcHRpb25zLCBlcnJvciB9KTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbG9nSW52YWxpZGF0ZSA9IChleHByZXNzaW9uOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnZlcmJvc2UpIHJldHVybjtcclxuICAgICAgY29uc29sZS5sb2coXCJJbnZhbGlkYXRlIEV4cHJlc3Npb246XCIsIGV4cHJlc3Npb24sIHsgZm9ybUdyb3VwLCBvcHRpb25zIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBsb2dFdmFsdWF0aW9uID0gKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnZlcmJvc2UpIHJldHVybjtcclxuICAgICAgY29uc29sZS5sb2coXCJFdmFsdWF0ZSBFeHByZXNzaW9uOlwiLCBleHByZXNzaW9uLCByZXN1bHQsIHsgZm9ybUdyb3VwLCBvcHRpb25zIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBldmFsdWF0ZSA9ICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZlZWxTZXJ2aWNlLmV2YWxFeHByZXNzaW9uKGV4cHJlc3Npb25cclxuICAgICAgICAgICwgdGhpcy5nZXRDb250ZXh0KGZvcm1Hcm91cCwgb3B0aW9ucykpO1xyXG4gICAgICAgIGxvZ0V2YWx1YXRpb24oZXhwcmVzc2lvbiwgcmVzdWx0KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgbG9nRXJyb3IoZXhwcmVzc2lvbiwgZSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY2FjaGVhYmxlID0gb3B0aW9ucy5jYWNoZWFibGUgPz8gdGhpcy5jYWNoZWFibGU7XHJcblxyXG4gICAgaWYgKGNhY2hlYWJsZSkge1xyXG4gICAgICBjb25zdCB3YXRjaEtleSA9IGA6d2F0Y2goJHtleHByZXNzaW9ufSlgO1xyXG5cclxuICAgICAgdGhpcy53ZWFrU2VydmljZS5jYWxsKHRoaXMsIHdhdGNoS2V5LCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy53YXRjaGluZ0V4cHJlc3Npb24oZm9ybUdyb3VwLCBleHByZXNzaW9uXHJcbiAgICAgICAgICAsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlRXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICAgICAgICAgICAgbG9nSW52YWxpZGF0ZShleHByZXNzaW9uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLndlYWtTZXJ2aWNlLmNhbGwodGhpcywgZXhwcmVzc2lvbiwgZXZhbHVhdGUsIG51bGwsIHRoaXMub25FcnJvckhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBldmFsdWF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBldmFsVGVtcGxhdGUoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogRXZhbHVhdGVPcHRpb25zID0ge30pOiBhbnkge1xyXG5cclxuICAgIGNvbnN0IGxvZ0Vycm9yID0gKGV4cHJlc3Npb246IHN0cmluZywgZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLndhcm4oZXhwcmVzc2lvbiwgeyBmb3JtR3JvdXAsIG9wdGlvbnMsIGVycm9yIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBsb2dJbnZhbGlkYXRlID0gKGV4cHJlc3Npb246IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMudmVyYm9zZSkgcmV0dXJuO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkludmFsaWRhdGUgVGVtcGxhdGU6XCIsIGV4cHJlc3Npb24sIHsgZm9ybUdyb3VwLCBvcHRpb25zIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBsb2dFdmFsdWF0aW9uID0gKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnZlcmJvc2UpIHJldHVybjtcclxuICAgICAgY29uc29sZS5sb2coXCJFdmFsdWF0ZSBUZW1wbGF0ZTpcIiwgZXhwcmVzc2lvbiwgcmVzdWx0LCB7IGZvcm1Hcm91cCwgb3B0aW9ucyB9KTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZXZhbHVhdGUgPSAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mZWVsU2VydmljZS5ldmFsVGVtcGxhdGUoZXhwcmVzc2lvblxyXG4gICAgICAgICAgLCB0aGlzLmdldENvbnRleHQoZm9ybUdyb3VwKSk7XHJcbiAgICAgICAgbG9nRXZhbHVhdGlvbihleHByZXNzaW9uLCByZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBsb2dFcnJvcihleHByZXNzaW9uLCBlKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjYWNoZWFibGUgPSBvcHRpb25zLmNhY2hlYWJsZSA/PyB0aGlzLmNhY2hlYWJsZTtcclxuICAgIFxyXG4gICAgaWYgKGNhY2hlYWJsZSkge1xyXG4gICAgICBjb25zdCB3YXRjaEtleSA9IGA6d2F0Y2hUZW1wbGF0ZSgke2V4cHJlc3Npb259KWA7XHJcblxyXG4gICAgICB0aGlzLndlYWtTZXJ2aWNlLmNhbGwodGhpcywgd2F0Y2hLZXksICgpID0+IHtcclxuICAgICAgICB0aGlzLndhdGNoaW5nVGVtcGxhdGVFeHByZXNzaW9uKGZvcm1Hcm91cCwgZXhwcmVzc2lvblxyXG4gICAgICAgICAgLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XHJcbiAgICAgICAgICAgIGxvZ0ludmFsaWRhdGUoZXhwcmVzc2lvbik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy53ZWFrU2VydmljZS5jYWxsKHRoaXMsIGV4cHJlc3Npb24sIGV2YWx1YXRlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gZXZhbHVhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25FcnJvcihyZXN1bHQ6IGFueSk6IGFueSB7XHJcbiAgICBpZiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdC5waXBlKFxyXG4gICAgICAgIHRhcCh7XHJcbiAgICAgICAgICBlcnJvcjogZXJyID0+IHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uubm90aWZ5RXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJlZGVmaW5lZEZ1bmN0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuXHJcbiAgICBjb25zdCBwcm92aWRlcnM6IElFdmFsdWF0b3JQcm92aWRlcltdID0gW1xyXG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UsXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLFxyXG4gICAgICB0aGlzLmZ1bmN0aW9uU2VydmljZSxcclxuICAgICAgdGhpcy5mb3JtYXR0ZXJTZXJ2aWNlLFxyXG4gICAgICB0aGlzLnJlZ2lzdGVyICAgICAgXHJcbiAgICBdO1xyXG5cclxuICAgIHJldHVybiBwcm92aWRlcnMucmVkdWNlKChhY2MsIHByb3ZpZGVyKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uYWNjLFxyXG4gICAgICAgIC4uLnByb3ZpZGVyLmdldENvbnRleHQoKVxyXG4gICAgICB9O1xyXG4gICAgfSwge30pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGb3JtRnVuY3Rpb25zKGZvcm1Hcm91cDogRm9ybUdyb3VwIHwgbnVsbCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybVNlcnZpY2UuZ2V0Q29udGV4dChmb3JtR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQYXJlbnRDb250ZXh0KGZvcm1Hcm91cDogRm9ybUdyb3VwIHwgbnVsbCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsIHtcclxuICAgIGlmIChmb3JtR3JvdXAgPT09IG51bGwpIHsgXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KGZvcm1Hcm91cCk7XHJcblxyXG4gICAgaWYgKCFwYXJlbnQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ucGFyZW50LnZhbHVlLFxyXG4gICAgICBmb3JtR3JvdXA6ICgpID0+IFRvUHJveHkocGFyZW50KSwgICAgICBcclxuICAgICAgZ2V0IHBhcmVudCgpIHsgcmV0dXJuIHNlbGYuZ2V0UGFyZW50Q29udGV4dChwYXJlbnQpOyB9LFxyXG4gICAgfTsgICAgXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJvb3RDb250ZXh0KGZvcm1Hcm91cDogRm9ybUdyb3VwIHwgbnVsbCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsIHtcclxuICAgIGlmIChmb3JtR3JvdXAgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IHJvb3QgPSBmb3JtR3JvdXA/LnJvb3Q7XHJcblxyXG4gICAgaWYgKCFyb290KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByb290LnZhbHVlOyAgICBcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFyZW50KGZvcm1Hcm91cDogRm9ybUdyb3VwKSA6IEZvcm1Hcm91cCB8IG51bGwge1xyXG4gICAgbGV0IHBhcmVudCA9IGZvcm1Hcm91cC5wYXJlbnQ7XHJcblxyXG4gICAgd2hpbGUgKHBhcmVudCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICBwYXJlbnQgPSBwYXJlbnQ/LnBhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGFyZW50IGFzIEZvcm1Hcm91cCB8IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRleHQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBvcHRpb25zOiBFdmFsdWF0ZU9wdGlvbnMgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG5cclxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwIHwgbnVsbDtcclxuXHJcbiAgICBjb25zdCBiYXNlQ29udGV4dCA9IGZvcm1Hcm91cD8udmFsdWUgPz8geyB9O1xyXG5cclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG5cclxuICAgIGxldCBjb250ZXh0ID0ge1xyXG4gICAgICBnZXQgY29uc29sZSgpIHsgcmV0dXJuIFRvUHJveHkoY29uc29sZSk7IH0sXHJcbiAgICAgIGdldCBwYXJlbnQoKSB7IHJldHVybiBzZWxmLmdldFBhcmVudENvbnRleHQoZm9ybUdyb3VwKTsgfSxcclxuICAgICAgZ2V0IHJvb3QoKSB7IHJldHVybiBzZWxmLmdldFJvb3RDb250ZXh0KGZvcm1Hcm91cCk7IH0sXHJcbiAgICAgIGZvcm1Hcm91cDogKCkgPT4gVG9Qcm94eShmb3JtR3JvdXApLFxyXG4gICAgICBfOiB0aGlzLnNjb3BlPy5nZXRDb250ZXh0KCksXHJcbiAgICAgIC4uLmJhc2VDb250ZXh0LFxyXG4gICAgICBmbjoge1xyXG4gICAgICAgIC4uLnRoaXMucHJlZGVmaW5lZEZ1bmN0aW9ucyxcclxuICAgICAgICAuLi50aGlzLmdldEZvcm1GdW5jdGlvbnMoZm9ybUdyb3VwKSxcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zLmV4dGVuZENvbnRleHQpIHtcclxuICAgICAgY29uc3QgZXh0ZW5kZWQgPSBvcHRpb25zLmV4dGVuZENvbnRleHQoKTtcclxuICAgICAgaWYgKGV4dGVuZGVkKSB7XHJcbiAgICAgICAgY29udGV4dCA9IHtcclxuICAgICAgICAgIC4uLmNvbnRleHQsXHJcbiAgICAgICAgICAuLi5leHRlbmRlZFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3YXRjaGluZ0V4cHJlc3Npb24oZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGV4cHJlc3Npb246IHN0cmluZywgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxvZ0RlcGVuZGVuY2llcyA9IChkZXBlbmRlbmNpZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMudmVyYm9zZSkgcmV0dXJuO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkdldCBEZXBlbmRlbmNpZXM6XCIsIGV4cHJlc3Npb24sIGRlcGVuZGVuY2llcywgeyBmb3JtR3JvdXAgfSk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dChmb3JtR3JvdXApO1xyXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gdGhpcy5mZWVsU2VydmljZS5nZXREZXBlbmRlbmNpZXMoZXhwcmVzc2lvbiwgY29udGV4dCk7XHJcbiAgICBsb2dEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKTtcclxuICAgIHRoaXMud2F0Y2hpbmdEZXBlbmRlbmNpZXMoZm9ybUdyb3VwLCBkZXBlbmRlbmNpZXMsIGNhbGxiYWNrKTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHdhdGNoaW5nVGVtcGxhdGVFeHByZXNzaW9uKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBleHByZXNzaW9uOiBzdHJpbmcsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICBjb25zdCBsb2dEZXBlbmRlbmNpZXMgPSAoZGVwZW5kZW5jaWVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnZlcmJvc2UpIHJldHVybjtcclxuICAgICAgY29uc29sZS5sb2coXCJHZXQgVGVtcGxhdGUgRGVwZW5kZW5jaWVzOlwiLCBleHByZXNzaW9uLCBkZXBlbmRlbmNpZXMsIHsgZm9ybUdyb3VwIH0pO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoZm9ybUdyb3VwKTtcclxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHRoaXMuZmVlbFNlcnZpY2UuZ2V0VGVtcGxhdGVEZXBlbmRlbmNpZXMoZXhwcmVzc2lvbiwgY29udGV4dCk7XHJcbiAgICBsb2dEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKTtcclxuICAgIHRoaXMud2F0Y2hpbmdEZXBlbmRlbmNpZXMoZm9ybUdyb3VwLCBkZXBlbmRlbmNpZXMsIGNhbGxiYWNrKTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHdhdGNoaW5nRGVwZW5kZW5jaWVzKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBkZXBlbmRlbmNpZXM6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxvZ1dhdGNoaW5nID0gKGRlcGVuZGVuY2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMudmVyYm9zZSkgcmV0dXJuO1xyXG4gICAgICBjb25zdCB0ZXh0ID0gQXJyYXkuaXNBcnJheShkZXBlbmRlbmNlKSA/IGRlcGVuZGVuY2Uuam9pbihcIi5cIikgOiBkZXBlbmRlbmNlO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIldhdGNoaW5nIGRlcGVuZGVuY2U6XCIsIHRleHQsIHsgZm9ybUdyb3VwIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBsb2dWYWx1ZUNoYW5nZWQgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy52ZXJib3NlKSByZXR1cm47XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiVmFsdWUgQ2hhbmdlZDpcIiwgY29udHJvbC52YWx1ZSwgeyBwYXRoOiB0aGlzLmdldFBhdGgoY29udHJvbCksIGNvbnRyb2wgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGxvZ1N0YXR1c0NoYW5nZWQgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy52ZXJib3NlKSByZXR1cm47XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiU3RhdHVzIENoYW5nZWQ6XCIsIGNvbnRyb2wuc3RhdHVzLCB7IHBhdGg6IHRoaXMuZ2V0UGF0aChjb250cm9sKSwgY29udHJvbCB9KTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgdmFsdWVTdWJzY3JpYmUgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIGxvZ1ZhbHVlQ2hhbmdlZChjb250cm9sKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0YXR1c1N1YnNjcmliZSA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgY29udHJvbC5zdGF0dXNDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIGxvZ1N0YXR1c0NoYW5nZWQoY29udHJvbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY2Ugb2YgZGVwZW5kZW5jaWVzKSB7XHJcbiAgICAgIGNvbnN0IFtwYXRoLCBzdGF0dXNdID0gdGhpcy5wcm9jZXNzRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2UpO1xyXG4gICAgICAvL3BvdHJlaSBzY3JpdmVyZSB1bmEgZnVuemlvbmUgY2hlIG1pIHJlc3RpdHVpc2NlIGkgY29udHJvbCBkYSBjb250cm9sXHJcbiAgICAgIC8vcmlzYWxlbmRvIGZpbm8gYWwgRm9ybUdyb3VwXHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1TZXJ2aWNlLmdldENvbnRyb2woZm9ybUdyb3VwLCBwYXRoKTtcclxuICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICBpZiAoIXN0YXR1cykge1xyXG4gICAgICAgICAgdmFsdWVTdWJzY3JpYmUoY29udHJvbCk7XHJcbiAgICAgICAgICBsb2dXYXRjaGluZyhkZXBlbmRlbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzdGF0dXNTdWJzY3JpYmUoY29udHJvbCk7XHJcbiAgICAgICAgICBsb2dXYXRjaGluZyhkZXBlbmRlbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gICAgXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludmFsaWRhdGVFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy53ZWFrU2VydmljZS5pbnZhbGlkYXRlKHRoaXMsIGV4cHJlc3Npb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcm9jZXNzRGVwZW5kZW5jaWVzKGRlcGVuZGVuY3k6IHN0cmluZyB8IHN0cmluZ1tdKTogW3N0cmluZyB8IHN0cmluZ1tdLCBib29sZWFuXSB7XHJcbiAgICBjb25zdCBzdGF0dXNEZXBlbmRlbmN5ID0gQXJyYXkuaXNBcnJheShkZXBlbmRlbmN5KVxyXG4gICAgICAmJiBkZXBlbmRlbmN5Lmxlbmd0aCA+IDFcclxuICAgICAgJiYgZGVwZW5kZW5jeVswXSA9PT0gU3RhdHVzRGVwZW5kZW5jeTtcclxuXHJcbiAgICByZXR1cm4gc3RhdHVzRGVwZW5kZW5jeVxyXG4gICAgICA/IFtkZXBlbmRlbmN5LnNsaWNlKDEpLCB0cnVlXVxyXG4gICAgICA6IFtkZXBlbmRlbmN5LCBmYWxzZV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhdGgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1TZXJ2aWNlLmdldFBhdGgoY29udHJvbCkuam9pbihcIi5cIik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbGlkYXRlRm4oZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGl0ZW06IFZhbGlkYXRpb25SdWxlKTogVmFsaWRhdG9yRm4geyAgICBcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJ1bGUoZm9ybUdyb3VwLCBjb250cm9sLCBpdGVtLCAocmVzdWx0OiBhbnkpID0+ICFyZXN1bHQpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW52YWxpZGF0ZUZuKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBpdGVtOiBWYWxpZGF0aW9uUnVsZSk6IFZhbGlkYXRvckZuIHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJ1bGUoZm9ybUdyb3VwLCBjb250cm9sLCBpdGVtLCAocmVzdWx0OiBhbnkpID0+IHJlc3VsdCk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZVJ1bGUoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgaXRlbTogVmFsaWRhdGlvblJ1bGVcclxuICAgICwgcHJlZGljYXRlOiAocmVzdWx0OiBhbnkpID0+IGJvb2xlYW4pOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcblxyXG4gICAgLy9pZiAoIWNvbnRyb2wudG91Y2hlZClcclxuICAgIC8vICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBsb2dWYWxpZGF0aW9uID0gKHZhbHVlOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMudmVyYm9zZSkgcmV0dXJuO1xyXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlZhbGlkYXRlIHN1Y2Nlc3NmdWxseVwiLCBjb250cm9sLnZhbHVlLCB7IHBhdGg6IHRoaXMuZ2V0UGF0aChjb250cm9sKSwgaXRlbSwgY29udHJvbCwgZm9ybUdyb3VwIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVmFsaWRhdGlvbiBmYWlsZWRcIiwgY29udHJvbC52YWx1ZSwgeyByZXN1dDogdmFsdWUsIHBhdGg6IHRoaXMuZ2V0UGF0aChjb250cm9sKSwgaXRlbSwgY29udHJvbCwgZm9ybUdyb3VwIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHZhciByZXN1bHQgPSB0aGlzLmV2YWx1YXRlVW5hcnkoZm9ybUdyb3VwLCBpdGVtLmV4cHJlc3Npb24sIGNvbnRyb2wudmFsdWUpO1xyXG5cclxuICAgIGlmIChwcmVkaWNhdGUocmVzdWx0KSkge1xyXG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5ldmFsdWF0ZVN0cmluZyhmb3JtR3JvdXAsIGl0ZW0ubWVzc2FnZSk7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IHsgZXJyb3I6IHRydWUsIG1lc3NhZ2UgfTtcclxuICAgICAgbG9nVmFsaWRhdGlvbih2YWxpZGF0aW9uRXJyb3IpO1xyXG4gICAgICByZXR1cm4gdmFsaWRhdGlvbkVycm9yO1xyXG4gICAgfVxyXG5cclxuICAgIGxvZ1ZhbGlkYXRpb24obnVsbCk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd2F0Y2hGb3JWYWxpZGF0aW9uKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGtleTogc3RyaW5nLCB2YWxpZGF0aW9uczogVmFsaWRhdGlvblJ1bGVbXSk6IHZvaWQge1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbGlkYXRpb25zKSkge1xyXG4gICAgICBjb25zdCBleHByZXNzaW9ucyA9IHZhbGlkYXRpb25zXHJcbiAgICAgICAgLmZpbHRlcihpdGVtID0+IHRoaXMuaXNFeHByZXNzaW9uKGl0ZW0uZXhwcmVzc2lvbikpXHJcbiAgICAgICAgLm1hcChpdGVtID0+IFwiPVwiICsgdGhpcy5nZXRFeHByZXNzaW9uKGl0ZW0uZXhwcmVzc2lvbikpO1xyXG5cclxuICAgICAgaWYgKGV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgZmVlbGFibGUgPSB0b0ZlZWxhYmxlKGV4cHJlc3Npb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHRoaXMuZ2V0RGVwZW5kZW5jaWVzKGZlZWxhYmxlKVxyXG4gICAgICAgIC5maWx0ZXIoZGVwID0+IGRlcCAhPT0ga2V5KTtcclxuXHJcbiAgICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLndhdGNoKGZvcm1Hcm91cCwgZGVwZW5kZW5jaWVzLCAoKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFdmFsdWF0b3JQcm92aWRlciB7XHJcbiAgZ2V0Q29udGV4dChzY29wZT86IGFueSk6IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXZhbHVhdGVPcHRpb25zIHtcclxuICBjYWNoZWFibGU/OiBib29sZWFuO1xyXG4gIGV4dGVuZENvbnRleHQ/OiBFeHRlbmRDb250ZXh0Rm47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEV4dGVuZENvbnRleHRGbiA9ICgpID0+IFJlY29yZDxzdHJpbmcsIGFueT47XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SdWxlIHtcclxuICBleHByZXNzaW9uOiBzdHJpbmc7XHJcbiAgdHlwZTogXCJ2YWxpZGF0ZVwiIHwgXCJpbnZhbGlkYXRlXCI7XHJcbiAgbWVzc2FnZTogc3RyaW5nXHJcbn1cclxuIl19
|