@gnwebsoft/ui 3.0.4 → 3.0.6
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/dist/{chunk-OT7COE7R.cjs → chunk-55VNGODF.cjs} +244 -4
- package/dist/chunk-BWC3LJIB.js +2265 -0
- package/dist/components/index.d.cts +2 -2
- package/dist/components/index.d.ts +2 -2
- package/dist/index.cjs +5 -3
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/dist/wrappers/index.cjs +5 -3
- package/dist/wrappers/index.d.cts +55 -8
- package/dist/wrappers/index.d.ts +55 -8
- package/dist/wrappers/index.js +3 -1
- package/package.json +1 -1
- package/dist/chunk-H3GQLELL.js +0 -2025
|
@@ -0,0 +1,2265 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useEnhancedTransform,
|
|
3
|
+
useTransform
|
|
4
|
+
} from "./chunk-DE62KYFK.js";
|
|
5
|
+
|
|
6
|
+
// src/wrappers/AsyncMultiSelect2/AsyncMultiSelect2.tsx
|
|
7
|
+
import {
|
|
8
|
+
Autocomplete,
|
|
9
|
+
CircularProgress,
|
|
10
|
+
Grid,
|
|
11
|
+
TextField,
|
|
12
|
+
useTheme
|
|
13
|
+
} from "@mui/material";
|
|
14
|
+
import { debounce } from "lodash";
|
|
15
|
+
import { useCallback, useEffect, useReducer, useMemo } from "react";
|
|
16
|
+
import { useController } from "react-hook-form";
|
|
17
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
var initialState = {
|
|
19
|
+
options: [],
|
|
20
|
+
selectedOptions: [],
|
|
21
|
+
inputValue: "",
|
|
22
|
+
loading: false,
|
|
23
|
+
initialLoaded: false
|
|
24
|
+
};
|
|
25
|
+
function componentReducer(state, action) {
|
|
26
|
+
switch (action.type) {
|
|
27
|
+
case "SET_OPTIONS":
|
|
28
|
+
return { ...state, options: action.payload, loading: false };
|
|
29
|
+
case "SET_SELECTED_OPTIONS":
|
|
30
|
+
return { ...state, selectedOptions: action.payload };
|
|
31
|
+
case "SET_INPUT_VALUE":
|
|
32
|
+
return { ...state, inputValue: action.payload };
|
|
33
|
+
case "SET_LOADING":
|
|
34
|
+
return { ...state, loading: action.payload };
|
|
35
|
+
case "SET_INITIAL_LOADED":
|
|
36
|
+
return { ...state, initialLoaded: action.payload };
|
|
37
|
+
case "RESET_OPTIONS":
|
|
38
|
+
return { ...state, options: state.selectedOptions };
|
|
39
|
+
default:
|
|
40
|
+
return state;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
var AsyncMultiSelect2Component = ({
|
|
44
|
+
name,
|
|
45
|
+
control,
|
|
46
|
+
placeholder,
|
|
47
|
+
initialValues,
|
|
48
|
+
label,
|
|
49
|
+
queryFn,
|
|
50
|
+
variant = "outlined",
|
|
51
|
+
sx,
|
|
52
|
+
disabled = false,
|
|
53
|
+
debounceMs = 400,
|
|
54
|
+
loadingText = "Loading...",
|
|
55
|
+
noOptionsText = "No options",
|
|
56
|
+
renderInput,
|
|
57
|
+
...rest
|
|
58
|
+
}) => {
|
|
59
|
+
const [state, dispatch] = useReducer(componentReducer, initialState);
|
|
60
|
+
const theme = useTheme();
|
|
61
|
+
const {
|
|
62
|
+
field,
|
|
63
|
+
fieldState: { error }
|
|
64
|
+
} = useController({
|
|
65
|
+
name,
|
|
66
|
+
control
|
|
67
|
+
});
|
|
68
|
+
const debouncedFetch = useMemo(
|
|
69
|
+
() => debounce(async (payload) => {
|
|
70
|
+
try {
|
|
71
|
+
const results = await queryFn(payload);
|
|
72
|
+
const mergedOptions = [
|
|
73
|
+
...state.selectedOptions,
|
|
74
|
+
...results.filter(
|
|
75
|
+
(option) => !state.selectedOptions.some((selected) => selected.value === option.value)
|
|
76
|
+
)
|
|
77
|
+
];
|
|
78
|
+
dispatch({ type: "SET_OPTIONS", payload: mergedOptions });
|
|
79
|
+
} catch (_error) {
|
|
80
|
+
dispatch({ type: "SET_LOADING", payload: false });
|
|
81
|
+
}
|
|
82
|
+
}, debounceMs),
|
|
83
|
+
[queryFn, state.selectedOptions, debounceMs]
|
|
84
|
+
);
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
if (!initialValues?.length || state.initialLoaded) return;
|
|
87
|
+
dispatch({ type: "SET_LOADING", payload: true });
|
|
88
|
+
const payload = {
|
|
89
|
+
query: null,
|
|
90
|
+
initialValues
|
|
91
|
+
};
|
|
92
|
+
queryFn(payload).then((results) => {
|
|
93
|
+
if (results) {
|
|
94
|
+
dispatch({ type: "SET_SELECTED_OPTIONS", payload: results });
|
|
95
|
+
dispatch({ type: "SET_OPTIONS", payload: results });
|
|
96
|
+
dispatch({ type: "SET_INITIAL_LOADED", payload: true });
|
|
97
|
+
field.onChange(results.map((option) => option.value));
|
|
98
|
+
}
|
|
99
|
+
dispatch({ type: "SET_LOADING", payload: false });
|
|
100
|
+
}).catch((_error) => {
|
|
101
|
+
dispatch({ type: "SET_LOADING", payload: false });
|
|
102
|
+
});
|
|
103
|
+
}, [initialValues, state.initialLoaded, queryFn, field]);
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
if (!state.initialLoaded) return;
|
|
106
|
+
if (state.inputValue === "") {
|
|
107
|
+
dispatch({ type: "RESET_OPTIONS" });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
dispatch({ type: "SET_LOADING", payload: true });
|
|
111
|
+
const payload = {
|
|
112
|
+
query: state.inputValue,
|
|
113
|
+
initialValues: null
|
|
114
|
+
};
|
|
115
|
+
debouncedFetch(payload);
|
|
116
|
+
}, [state.inputValue, state.initialLoaded, debouncedFetch]);
|
|
117
|
+
const handleChange = useCallback(
|
|
118
|
+
(event, newValue) => {
|
|
119
|
+
dispatch({ type: "SET_SELECTED_OPTIONS", payload: newValue });
|
|
120
|
+
field.onChange(newValue.map((option) => option.value));
|
|
121
|
+
},
|
|
122
|
+
[field]
|
|
123
|
+
);
|
|
124
|
+
const handleInputChange = useCallback(
|
|
125
|
+
(event, newInputValue) => {
|
|
126
|
+
dispatch({ type: "SET_INPUT_VALUE", payload: newInputValue });
|
|
127
|
+
},
|
|
128
|
+
[]
|
|
129
|
+
);
|
|
130
|
+
const isOptionEqualToValue = useCallback(
|
|
131
|
+
(option, value) => option.value === value.value,
|
|
132
|
+
[]
|
|
133
|
+
);
|
|
134
|
+
const getOptionLabel = useCallback((option) => option.label, []);
|
|
135
|
+
const defaultRenderInput = useCallback(
|
|
136
|
+
(params) => /* @__PURE__ */ jsx(
|
|
137
|
+
TextField,
|
|
138
|
+
{
|
|
139
|
+
...params,
|
|
140
|
+
label,
|
|
141
|
+
placeholder,
|
|
142
|
+
variant,
|
|
143
|
+
error: !!error,
|
|
144
|
+
helperText: error?.message,
|
|
145
|
+
slotProps: {
|
|
146
|
+
input: {
|
|
147
|
+
...params.InputProps,
|
|
148
|
+
endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
149
|
+
state.loading && /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }),
|
|
150
|
+
params.InputProps.endAdornment
|
|
151
|
+
] })
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
sx: {
|
|
155
|
+
"& .MuiInputBase-input": {
|
|
156
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
157
|
+
},
|
|
158
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
159
|
+
...sx
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
),
|
|
163
|
+
[label, placeholder, variant, error, state.loading, disabled, theme.palette.action.disabledBackground, sx]
|
|
164
|
+
);
|
|
165
|
+
return /* @__PURE__ */ jsx(
|
|
166
|
+
Autocomplete,
|
|
167
|
+
{
|
|
168
|
+
multiple: true,
|
|
169
|
+
options: state.options,
|
|
170
|
+
value: state.selectedOptions,
|
|
171
|
+
loading: state.loading,
|
|
172
|
+
disabled,
|
|
173
|
+
isOptionEqualToValue,
|
|
174
|
+
getOptionLabel,
|
|
175
|
+
filterSelectedOptions: true,
|
|
176
|
+
onChange: handleChange,
|
|
177
|
+
onInputChange: handleInputChange,
|
|
178
|
+
loadingText,
|
|
179
|
+
noOptionsText,
|
|
180
|
+
renderInput: renderInput || defaultRenderInput,
|
|
181
|
+
...rest
|
|
182
|
+
}
|
|
183
|
+
);
|
|
184
|
+
};
|
|
185
|
+
var AsyncMultiSelect2 = ({
|
|
186
|
+
gridProps,
|
|
187
|
+
...props
|
|
188
|
+
}) => {
|
|
189
|
+
if (gridProps) {
|
|
190
|
+
return /* @__PURE__ */ jsx(Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx(AsyncMultiSelect2Component, { ...props }) });
|
|
191
|
+
}
|
|
192
|
+
return /* @__PURE__ */ jsx(AsyncMultiSelect2Component, { ...props });
|
|
193
|
+
};
|
|
194
|
+
AsyncMultiSelect2.displayName = "AsyncMultiSelect2";
|
|
195
|
+
|
|
196
|
+
// src/wrappers/CheckboxElement/CheckboxElement.tsx
|
|
197
|
+
import {
|
|
198
|
+
Checkbox,
|
|
199
|
+
FormControl,
|
|
200
|
+
FormControlLabel,
|
|
201
|
+
FormGroup,
|
|
202
|
+
FormHelperText,
|
|
203
|
+
Grid as Grid2,
|
|
204
|
+
useTheme as useTheme2
|
|
205
|
+
} from "@mui/material";
|
|
206
|
+
import {
|
|
207
|
+
useController as useController2
|
|
208
|
+
} from "react-hook-form";
|
|
209
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
210
|
+
var Component = function CheckboxElement(props) {
|
|
211
|
+
const {
|
|
212
|
+
name,
|
|
213
|
+
control,
|
|
214
|
+
label,
|
|
215
|
+
labelProps,
|
|
216
|
+
helperText,
|
|
217
|
+
parseError,
|
|
218
|
+
transform,
|
|
219
|
+
disabled,
|
|
220
|
+
sx,
|
|
221
|
+
onChange: customOnChange,
|
|
222
|
+
...rest
|
|
223
|
+
} = props;
|
|
224
|
+
const theme = useTheme2();
|
|
225
|
+
const {
|
|
226
|
+
field,
|
|
227
|
+
fieldState: { error }
|
|
228
|
+
} = useController2({
|
|
229
|
+
name,
|
|
230
|
+
control,
|
|
231
|
+
disabled
|
|
232
|
+
});
|
|
233
|
+
const { value, onChange } = useTransform({
|
|
234
|
+
value: field.value,
|
|
235
|
+
onChange: field.onChange,
|
|
236
|
+
transform: {
|
|
237
|
+
input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
|
|
238
|
+
output: typeof transform?.output === "function" ? transform.output : (checked) => checked
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
const handleChange = (event, checked) => {
|
|
242
|
+
onChange(event, checked);
|
|
243
|
+
if (typeof customOnChange === "function") {
|
|
244
|
+
customOnChange(event, checked);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
|
|
248
|
+
return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
|
|
249
|
+
/* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
|
|
250
|
+
FormControlLabel,
|
|
251
|
+
{
|
|
252
|
+
label: label || "",
|
|
253
|
+
...labelProps,
|
|
254
|
+
disabled,
|
|
255
|
+
control: /* @__PURE__ */ jsx2(
|
|
256
|
+
Checkbox,
|
|
257
|
+
{
|
|
258
|
+
...rest,
|
|
259
|
+
color: rest.color || "primary",
|
|
260
|
+
sx: [
|
|
261
|
+
...Array.isArray(sx) ? sx : [sx],
|
|
262
|
+
{
|
|
263
|
+
color: error ? theme.palette.error.main : disabled ? theme.palette.action.disabled : void 0,
|
|
264
|
+
"&.Mui-disabled": {
|
|
265
|
+
color: theme.palette.action.disabled
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
],
|
|
269
|
+
checked: value,
|
|
270
|
+
disabled,
|
|
271
|
+
onChange: handleChange,
|
|
272
|
+
ref: field.ref
|
|
273
|
+
}
|
|
274
|
+
)
|
|
275
|
+
}
|
|
276
|
+
) }),
|
|
277
|
+
(displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
|
|
278
|
+
] });
|
|
279
|
+
};
|
|
280
|
+
var CheckboxElement2 = ({
|
|
281
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
282
|
+
...props
|
|
283
|
+
}) => {
|
|
284
|
+
if (gridProps) {
|
|
285
|
+
return /* @__PURE__ */ jsx2(
|
|
286
|
+
Grid2,
|
|
287
|
+
{
|
|
288
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
289
|
+
children: /* @__PURE__ */ jsx2(Component, { ...props })
|
|
290
|
+
}
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
return /* @__PURE__ */ jsx2(Component, { ...props });
|
|
294
|
+
};
|
|
295
|
+
CheckboxElement2.displayName = "CheckboxElement";
|
|
296
|
+
|
|
297
|
+
// src/wrappers/CheckboxGroup/CheckboxGroup.tsx
|
|
298
|
+
import {
|
|
299
|
+
Checkbox as Checkbox2,
|
|
300
|
+
FormControl as FormControl2,
|
|
301
|
+
FormControlLabel as FormControlLabel2,
|
|
302
|
+
FormGroup as FormGroup2,
|
|
303
|
+
FormHelperText as FormHelperText2,
|
|
304
|
+
Grid as Grid3
|
|
305
|
+
} from "@mui/material";
|
|
306
|
+
import { useEffect as useEffect2, useState } from "react";
|
|
307
|
+
import {
|
|
308
|
+
useController as useController3
|
|
309
|
+
} from "react-hook-form";
|
|
310
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
311
|
+
var Component2 = function CheckboxGroup(props) {
|
|
312
|
+
const { name, control, label, labelProps, inputRef, options, ...rest } = props;
|
|
313
|
+
const {
|
|
314
|
+
field,
|
|
315
|
+
fieldState: { error }
|
|
316
|
+
} = useController3({
|
|
317
|
+
name,
|
|
318
|
+
control,
|
|
319
|
+
disabled: rest.disabled
|
|
320
|
+
});
|
|
321
|
+
const [selectedValues, setSelectedValues] = useState(
|
|
322
|
+
options.filter((c) => field.value?.includes(c.Value)).map((c) => c.Value) || []
|
|
323
|
+
);
|
|
324
|
+
useEffect2(() => {
|
|
325
|
+
field.onChange(selectedValues ? [...selectedValues] : []);
|
|
326
|
+
}, [selectedValues]);
|
|
327
|
+
const handleChange = (event) => {
|
|
328
|
+
const value = parseInt(event.target.value, 10);
|
|
329
|
+
if (event.target.checked) {
|
|
330
|
+
setSelectedValues([...selectedValues, value]);
|
|
331
|
+
} else {
|
|
332
|
+
setSelectedValues(selectedValues.filter((item) => item !== value));
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
|
|
336
|
+
/* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options.map((option) => /* @__PURE__ */ jsx3(
|
|
337
|
+
FormControlLabel2,
|
|
338
|
+
{
|
|
339
|
+
label: option.Label,
|
|
340
|
+
...labelProps,
|
|
341
|
+
control: /* @__PURE__ */ jsx3(
|
|
342
|
+
Checkbox2,
|
|
343
|
+
{
|
|
344
|
+
...rest,
|
|
345
|
+
color: rest.color || "primary",
|
|
346
|
+
sx: [
|
|
347
|
+
...Array.isArray(rest.sx) ? rest.sx : [rest.sx],
|
|
348
|
+
{
|
|
349
|
+
color: error ? "error.main" : void 0
|
|
350
|
+
}
|
|
351
|
+
],
|
|
352
|
+
value: option.Value,
|
|
353
|
+
checked: selectedValues.includes(option.Value),
|
|
354
|
+
onChange: handleChange
|
|
355
|
+
}
|
|
356
|
+
)
|
|
357
|
+
},
|
|
358
|
+
`${option.Value}`
|
|
359
|
+
)) }),
|
|
360
|
+
error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
|
|
361
|
+
] });
|
|
362
|
+
};
|
|
363
|
+
var CheckboxGroup2 = ({
|
|
364
|
+
gridProps,
|
|
365
|
+
...props
|
|
366
|
+
}) => {
|
|
367
|
+
if (gridProps) {
|
|
368
|
+
return /* @__PURE__ */ jsx3(Grid3, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx3(Component2, { ...props }) });
|
|
369
|
+
}
|
|
370
|
+
return /* @__PURE__ */ jsx3(Component2, { ...props });
|
|
371
|
+
};
|
|
372
|
+
CheckboxGroup2.displayName = "CheckboxGroup";
|
|
373
|
+
|
|
374
|
+
// src/wrappers/DatePickerElement/DatePickerElement.tsx
|
|
375
|
+
import { Grid as Grid4 } from "@mui/material";
|
|
376
|
+
import { forwardRef as forwardRef2 } from "react";
|
|
377
|
+
|
|
378
|
+
// src/wrappers/DatePickerElement/DatePickerElementCore.tsx
|
|
379
|
+
import { useForkRef } from "@mui/material";
|
|
380
|
+
import { DatePicker } from "@mui/x-date-pickers";
|
|
381
|
+
import { forwardRef, useCallback as useCallback3, useMemo as useMemo5 } from "react";
|
|
382
|
+
import { useController as useController4 } from "react-hook-form";
|
|
383
|
+
|
|
384
|
+
// src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
|
|
385
|
+
import { useLocalizationContext } from "@mui/x-date-pickers/internals";
|
|
386
|
+
import { useCallback as useCallback2, useMemo as useMemo2 } from "react";
|
|
387
|
+
function readDatePickerValueAsDate(adapter, value) {
|
|
388
|
+
if (value === null || value === void 0) {
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
if (typeof value === "string") {
|
|
392
|
+
if (value === "") {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
const parsedDate = adapter.utils.date(value);
|
|
396
|
+
return parsedDate;
|
|
397
|
+
}
|
|
398
|
+
return value;
|
|
399
|
+
}
|
|
400
|
+
function useDatePickerValue(options) {
|
|
401
|
+
const { field, transform } = options;
|
|
402
|
+
const adapter = useLocalizationContext();
|
|
403
|
+
const value = useMemo2(() => {
|
|
404
|
+
if (typeof transform?.input === "function") {
|
|
405
|
+
return transform.input(field.value);
|
|
406
|
+
}
|
|
407
|
+
return readDatePickerValueAsDate(adapter, field.value);
|
|
408
|
+
}, [field.value, transform?.input, adapter]);
|
|
409
|
+
const onChange = useCallback2(
|
|
410
|
+
(newValue, context) => {
|
|
411
|
+
if (typeof transform?.output === "function") {
|
|
412
|
+
const transformedValue = transform.output(newValue, context);
|
|
413
|
+
field.onChange(transformedValue);
|
|
414
|
+
} else {
|
|
415
|
+
field.onChange(newValue);
|
|
416
|
+
}
|
|
417
|
+
},
|
|
418
|
+
[field.onChange, transform?.output]
|
|
419
|
+
);
|
|
420
|
+
return {
|
|
421
|
+
value,
|
|
422
|
+
onChange
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
|
|
427
|
+
import { useMemo as useMemo3 } from "react";
|
|
428
|
+
var DEFAULT_ERROR_MESSAGES = {
|
|
429
|
+
invalidDate: "Please enter a valid date",
|
|
430
|
+
minDate: "Date must be after the minimum allowed date",
|
|
431
|
+
maxDate: "Date must be before the maximum allowed date",
|
|
432
|
+
disabledDate: "This date is not allowed",
|
|
433
|
+
required: "This field is required"
|
|
434
|
+
};
|
|
435
|
+
function useDatePickerValidation(options) {
|
|
436
|
+
const { fieldState, validation, parseError, value } = options;
|
|
437
|
+
const validationResult = useMemo3(() => {
|
|
438
|
+
const { error: fieldError, invalid } = fieldState;
|
|
439
|
+
let currentError = fieldError;
|
|
440
|
+
if (!fieldError && value && validation) {
|
|
441
|
+
const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
|
|
442
|
+
if (minDate && value < minDate) {
|
|
443
|
+
currentError = {
|
|
444
|
+
type: "minDate",
|
|
445
|
+
message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
|
|
446
|
+
};
|
|
447
|
+
} else if (maxDate && value > maxDate) {
|
|
448
|
+
currentError = {
|
|
449
|
+
type: "maxDate",
|
|
450
|
+
message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
|
|
451
|
+
};
|
|
452
|
+
} else if (shouldDisableDate && shouldDisableDate(value)) {
|
|
453
|
+
currentError = {
|
|
454
|
+
type: "disabledDate",
|
|
455
|
+
message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
const hasError = Boolean(currentError);
|
|
460
|
+
return {
|
|
461
|
+
hasError,
|
|
462
|
+
error: currentError,
|
|
463
|
+
invalid: invalid || hasError
|
|
464
|
+
};
|
|
465
|
+
}, [fieldState, validation, value]);
|
|
466
|
+
const errorMessage = useMemo3(() => {
|
|
467
|
+
if (!validationResult.error) {
|
|
468
|
+
return null;
|
|
469
|
+
}
|
|
470
|
+
if (parseError) {
|
|
471
|
+
return parseError(validationResult.error);
|
|
472
|
+
}
|
|
473
|
+
if (typeof validationResult.error === "string") {
|
|
474
|
+
return validationResult.error;
|
|
475
|
+
}
|
|
476
|
+
if ("message" in validationResult.error && validationResult.error.message) {
|
|
477
|
+
return validationResult.error.message;
|
|
478
|
+
}
|
|
479
|
+
if ("type" in validationResult.error) {
|
|
480
|
+
const errorType = validationResult.error.type;
|
|
481
|
+
switch (errorType) {
|
|
482
|
+
case "required":
|
|
483
|
+
return DEFAULT_ERROR_MESSAGES.required;
|
|
484
|
+
case "minDate":
|
|
485
|
+
return DEFAULT_ERROR_MESSAGES.minDate;
|
|
486
|
+
case "maxDate":
|
|
487
|
+
return DEFAULT_ERROR_MESSAGES.maxDate;
|
|
488
|
+
case "disabledDate":
|
|
489
|
+
return DEFAULT_ERROR_MESSAGES.disabledDate;
|
|
490
|
+
case "invalidDate":
|
|
491
|
+
default:
|
|
492
|
+
return DEFAULT_ERROR_MESSAGES.invalidDate;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
return DEFAULT_ERROR_MESSAGES.invalidDate;
|
|
496
|
+
}, [validationResult.error, parseError]);
|
|
497
|
+
return {
|
|
498
|
+
...validationResult,
|
|
499
|
+
errorMessage
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
|
|
504
|
+
import { useTheme as useTheme3 } from "@mui/material";
|
|
505
|
+
import { useMemo as useMemo4 } from "react";
|
|
506
|
+
function useDatePickerStyles(options = {}) {
|
|
507
|
+
const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
|
|
508
|
+
const theme = useTheme3();
|
|
509
|
+
const computedSx = useMemo4(() => {
|
|
510
|
+
const baseStyles = {
|
|
511
|
+
// Input field styling
|
|
512
|
+
"& .MuiOutlinedInput-root": {
|
|
513
|
+
backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
514
|
+
// Transition for smooth state changes
|
|
515
|
+
transition: theme.transitions.create([
|
|
516
|
+
"background-color",
|
|
517
|
+
"border-color",
|
|
518
|
+
"color"
|
|
519
|
+
], {
|
|
520
|
+
duration: theme.transitions.duration.short
|
|
521
|
+
}),
|
|
522
|
+
// Error state styling
|
|
523
|
+
...hasError && {
|
|
524
|
+
borderColor: theme.palette.error.main,
|
|
525
|
+
"&:hover": {
|
|
526
|
+
borderColor: theme.palette.error.main
|
|
527
|
+
},
|
|
528
|
+
"&.Mui-focused": {
|
|
529
|
+
borderColor: theme.palette.error.main,
|
|
530
|
+
boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
|
|
531
|
+
// 25 is 15% opacity in hex
|
|
532
|
+
}
|
|
533
|
+
},
|
|
534
|
+
// Loading state styling
|
|
535
|
+
...loading && {
|
|
536
|
+
opacity: 0.7,
|
|
537
|
+
pointerEvents: "none"
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
// Input element styling
|
|
541
|
+
"& .MuiInputBase-input": {
|
|
542
|
+
cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
|
|
543
|
+
// Read-only specific styling
|
|
544
|
+
...textReadOnly && !disabled && {
|
|
545
|
+
cursor: "pointer",
|
|
546
|
+
userSelect: "none",
|
|
547
|
+
caretColor: "transparent"
|
|
548
|
+
// Hide text cursor in read-only mode
|
|
549
|
+
},
|
|
550
|
+
// Loading state
|
|
551
|
+
...loading && {
|
|
552
|
+
cursor: "wait"
|
|
553
|
+
}
|
|
554
|
+
},
|
|
555
|
+
// Required field asterisk styling
|
|
556
|
+
"& .MuiInputLabel-asterisk": {
|
|
557
|
+
color: theme.palette.error.main,
|
|
558
|
+
fontSize: "1.2em"
|
|
559
|
+
},
|
|
560
|
+
// Label styling with better contrast
|
|
561
|
+
"& .MuiInputLabel-root": {
|
|
562
|
+
color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
|
|
563
|
+
// Ensure proper contrast for disabled state
|
|
564
|
+
...disabled && {
|
|
565
|
+
color: theme.palette.text.disabled
|
|
566
|
+
}
|
|
567
|
+
},
|
|
568
|
+
// Helper text styling
|
|
569
|
+
"& .MuiFormHelperText-root": {
|
|
570
|
+
marginLeft: theme.spacing(1),
|
|
571
|
+
marginRight: theme.spacing(1),
|
|
572
|
+
// Error state
|
|
573
|
+
...hasError && {
|
|
574
|
+
color: theme.palette.error.main
|
|
575
|
+
}
|
|
576
|
+
},
|
|
577
|
+
// Calendar icon styling
|
|
578
|
+
"& .MuiInputAdornment-root": {
|
|
579
|
+
color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
|
|
580
|
+
},
|
|
581
|
+
// Focus ring for accessibility
|
|
582
|
+
"& .MuiOutlinedInput-root.Mui-focused": {
|
|
583
|
+
outline: `2px solid ${theme.palette.primary.main}50`,
|
|
584
|
+
// 50 is 31% opacity
|
|
585
|
+
outlineOffset: "2px"
|
|
586
|
+
},
|
|
587
|
+
// Enhanced contrast for dark themes
|
|
588
|
+
...theme.palette.mode === "dark" && {
|
|
589
|
+
"& .MuiOutlinedInput-root": {
|
|
590
|
+
borderWidth: 2
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
return customSx ? [baseStyles, customSx] : baseStyles;
|
|
595
|
+
}, [
|
|
596
|
+
theme,
|
|
597
|
+
disabled,
|
|
598
|
+
hasError,
|
|
599
|
+
loading,
|
|
600
|
+
textReadOnly,
|
|
601
|
+
customSx
|
|
602
|
+
]);
|
|
603
|
+
const className = useMemo4(() => {
|
|
604
|
+
const classes = [];
|
|
605
|
+
if (disabled) classes.push("DatePickerElement--disabled");
|
|
606
|
+
if (hasError) classes.push("DatePickerElement--error");
|
|
607
|
+
if (loading) classes.push("DatePickerElement--loading");
|
|
608
|
+
if (textReadOnly) classes.push("DatePickerElement--readOnly");
|
|
609
|
+
return classes.length > 0 ? classes.join(" ") : void 0;
|
|
610
|
+
}, [disabled, hasError, loading, textReadOnly]);
|
|
611
|
+
return {
|
|
612
|
+
sx: computedSx,
|
|
613
|
+
className
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
// src/wrappers/DatePickerElement/DatePickerElementCore.tsx
|
|
618
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
619
|
+
var DatePickerElementCore = forwardRef((props, ref) => {
|
|
620
|
+
const {
|
|
621
|
+
name,
|
|
622
|
+
required = false,
|
|
623
|
+
rules,
|
|
624
|
+
control,
|
|
625
|
+
parseError,
|
|
626
|
+
transform,
|
|
627
|
+
validation,
|
|
628
|
+
label,
|
|
629
|
+
placeholder,
|
|
630
|
+
textReadOnly = false,
|
|
631
|
+
helperText,
|
|
632
|
+
inputProps = {},
|
|
633
|
+
slotProps = {},
|
|
634
|
+
datePickerProps = {},
|
|
635
|
+
variant = "outlined",
|
|
636
|
+
sx: customSx,
|
|
637
|
+
loading = false,
|
|
638
|
+
LoadingComponent,
|
|
639
|
+
...restProps
|
|
640
|
+
} = props;
|
|
641
|
+
const {
|
|
642
|
+
disabled,
|
|
643
|
+
inputRef: externalInputRef,
|
|
644
|
+
onClose,
|
|
645
|
+
...restDatePickerProps
|
|
646
|
+
} = datePickerProps;
|
|
647
|
+
const {
|
|
648
|
+
field,
|
|
649
|
+
fieldState
|
|
650
|
+
} = useController4({
|
|
651
|
+
name,
|
|
652
|
+
control,
|
|
653
|
+
rules,
|
|
654
|
+
defaultValue: null
|
|
655
|
+
// Let react-hook-form handle the default value typing
|
|
656
|
+
});
|
|
657
|
+
const { value, onChange: onValueChange } = useDatePickerValue({
|
|
658
|
+
field,
|
|
659
|
+
transform
|
|
660
|
+
});
|
|
661
|
+
const { hasError, errorMessage, invalid } = useDatePickerValidation({
|
|
662
|
+
fieldState,
|
|
663
|
+
validation,
|
|
664
|
+
parseError,
|
|
665
|
+
value
|
|
666
|
+
});
|
|
667
|
+
const { sx: computedSx, className } = useDatePickerStyles({
|
|
668
|
+
disabled,
|
|
669
|
+
hasError,
|
|
670
|
+
loading,
|
|
671
|
+
textReadOnly,
|
|
672
|
+
sx: customSx
|
|
673
|
+
});
|
|
674
|
+
const handleInputRef = useForkRef(field.ref, externalInputRef);
|
|
675
|
+
const handleChange = useCallback3(
|
|
676
|
+
(newValue, context) => {
|
|
677
|
+
onValueChange(newValue, context);
|
|
678
|
+
},
|
|
679
|
+
[onValueChange]
|
|
680
|
+
);
|
|
681
|
+
const handleClose = useCallback3(
|
|
682
|
+
(...args) => {
|
|
683
|
+
field.onBlur();
|
|
684
|
+
if (onClose) {
|
|
685
|
+
onClose(...args);
|
|
686
|
+
}
|
|
687
|
+
},
|
|
688
|
+
[field.onBlur, onClose]
|
|
689
|
+
);
|
|
690
|
+
const handleTextFieldBlur = useCallback3(
|
|
691
|
+
(event) => {
|
|
692
|
+
field.onBlur();
|
|
693
|
+
if (typeof inputProps.onBlur === "function") {
|
|
694
|
+
inputProps.onBlur(event);
|
|
695
|
+
}
|
|
696
|
+
},
|
|
697
|
+
[field.onBlur, inputProps.onBlur]
|
|
698
|
+
);
|
|
699
|
+
const memoizedSlotProps = useMemo5(() => ({
|
|
700
|
+
...slotProps,
|
|
701
|
+
actionBar: {
|
|
702
|
+
actions: ["clear", "today", "cancel", "accept"],
|
|
703
|
+
...slotProps.actionBar
|
|
704
|
+
},
|
|
705
|
+
textField: {
|
|
706
|
+
...inputProps,
|
|
707
|
+
required,
|
|
708
|
+
placeholder,
|
|
709
|
+
fullWidth: true,
|
|
710
|
+
variant,
|
|
711
|
+
onBlur: handleTextFieldBlur,
|
|
712
|
+
error: hasError,
|
|
713
|
+
helperText: hasError ? errorMessage : helperText,
|
|
714
|
+
inputProps: {
|
|
715
|
+
readOnly: textReadOnly,
|
|
716
|
+
"aria-invalid": invalid,
|
|
717
|
+
"aria-describedby": hasError ? `${name}-error` : void 0,
|
|
718
|
+
...inputProps.inputProps
|
|
719
|
+
},
|
|
720
|
+
// Add loading indicator if provided
|
|
721
|
+
...loading && LoadingComponent && {
|
|
722
|
+
InputProps: {
|
|
723
|
+
endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
|
|
724
|
+
...inputProps.InputProps
|
|
725
|
+
}
|
|
726
|
+
},
|
|
727
|
+
...slotProps.textField
|
|
728
|
+
}
|
|
729
|
+
}), [
|
|
730
|
+
slotProps,
|
|
731
|
+
inputProps,
|
|
732
|
+
required,
|
|
733
|
+
placeholder,
|
|
734
|
+
variant,
|
|
735
|
+
handleTextFieldBlur,
|
|
736
|
+
hasError,
|
|
737
|
+
errorMessage,
|
|
738
|
+
helperText,
|
|
739
|
+
textReadOnly,
|
|
740
|
+
invalid,
|
|
741
|
+
name,
|
|
742
|
+
loading,
|
|
743
|
+
LoadingComponent
|
|
744
|
+
]);
|
|
745
|
+
return /* @__PURE__ */ jsx4(
|
|
746
|
+
DatePicker,
|
|
747
|
+
{
|
|
748
|
+
...restProps,
|
|
749
|
+
...restDatePickerProps,
|
|
750
|
+
ref,
|
|
751
|
+
name,
|
|
752
|
+
value,
|
|
753
|
+
onChange: handleChange,
|
|
754
|
+
onClose: handleClose,
|
|
755
|
+
inputRef: handleInputRef,
|
|
756
|
+
label,
|
|
757
|
+
disabled,
|
|
758
|
+
sx: computedSx,
|
|
759
|
+
className,
|
|
760
|
+
slotProps: memoizedSlotProps,
|
|
761
|
+
"aria-invalid": invalid,
|
|
762
|
+
"aria-describedby": hasError ? `${name}-error` : void 0
|
|
763
|
+
}
|
|
764
|
+
);
|
|
765
|
+
});
|
|
766
|
+
DatePickerElementCore.displayName = "DatePickerElementCore";
|
|
767
|
+
|
|
768
|
+
// src/wrappers/DatePickerElement/DatePickerElement.tsx
|
|
769
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
770
|
+
var DatePickerElement = forwardRef2((props, ref) => {
|
|
771
|
+
const {
|
|
772
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
773
|
+
...coreProps
|
|
774
|
+
} = props;
|
|
775
|
+
if (gridProps === false) {
|
|
776
|
+
return /* @__PURE__ */ jsx5(
|
|
777
|
+
DatePickerElementCore,
|
|
778
|
+
{
|
|
779
|
+
ref,
|
|
780
|
+
...coreProps
|
|
781
|
+
}
|
|
782
|
+
);
|
|
783
|
+
}
|
|
784
|
+
return /* @__PURE__ */ jsx5(
|
|
785
|
+
Grid4,
|
|
786
|
+
{
|
|
787
|
+
ref,
|
|
788
|
+
...gridProps,
|
|
789
|
+
children: /* @__PURE__ */ jsx5(
|
|
790
|
+
DatePickerElementCore,
|
|
791
|
+
{
|
|
792
|
+
...coreProps
|
|
793
|
+
}
|
|
794
|
+
)
|
|
795
|
+
}
|
|
796
|
+
);
|
|
797
|
+
});
|
|
798
|
+
DatePickerElement.displayName = "DatePickerElement";
|
|
799
|
+
|
|
800
|
+
// src/wrappers/DatePickerElement/utils.ts
|
|
801
|
+
function isValidDate(value) {
|
|
802
|
+
if (value === null || value === void 0) {
|
|
803
|
+
return false;
|
|
804
|
+
}
|
|
805
|
+
if (value instanceof Date) {
|
|
806
|
+
return !isNaN(value.getTime());
|
|
807
|
+
}
|
|
808
|
+
if (typeof value === "object" && value !== null) {
|
|
809
|
+
if ("isValid" in value && typeof value.isValid === "function") {
|
|
810
|
+
return value.isValid();
|
|
811
|
+
}
|
|
812
|
+
if ("isValid" in value && typeof value.isValid === "boolean") {
|
|
813
|
+
return value.isValid;
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
return false;
|
|
817
|
+
}
|
|
818
|
+
function isParsableDateString(value) {
|
|
819
|
+
if (typeof value !== "string" || value === "") {
|
|
820
|
+
return false;
|
|
821
|
+
}
|
|
822
|
+
const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
|
|
823
|
+
if (isoDateRegex.test(value)) {
|
|
824
|
+
return true;
|
|
825
|
+
}
|
|
826
|
+
const parsed = new Date(value);
|
|
827
|
+
return !isNaN(parsed.getTime());
|
|
828
|
+
}
|
|
829
|
+
function createDateInputTransform(adapter) {
|
|
830
|
+
return (value) => {
|
|
831
|
+
if (value === null || value === void 0) {
|
|
832
|
+
return null;
|
|
833
|
+
}
|
|
834
|
+
if (typeof value === "string") {
|
|
835
|
+
if (value === "") {
|
|
836
|
+
return null;
|
|
837
|
+
}
|
|
838
|
+
try {
|
|
839
|
+
const parsed = adapter.utils.date(value);
|
|
840
|
+
return isValidDate(parsed) ? parsed : null;
|
|
841
|
+
} catch {
|
|
842
|
+
return null;
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
if (isValidDate(value)) {
|
|
846
|
+
return value;
|
|
847
|
+
}
|
|
848
|
+
return null;
|
|
849
|
+
};
|
|
850
|
+
}
|
|
851
|
+
function createDateOutputTransform(format) {
|
|
852
|
+
return (value) => {
|
|
853
|
+
if (value === null || value === void 0) {
|
|
854
|
+
return null;
|
|
855
|
+
}
|
|
856
|
+
if (!isValidDate(value)) {
|
|
857
|
+
return null;
|
|
858
|
+
}
|
|
859
|
+
if (!format) {
|
|
860
|
+
return value;
|
|
861
|
+
}
|
|
862
|
+
try {
|
|
863
|
+
if (value instanceof Date) {
|
|
864
|
+
if (format === "iso") {
|
|
865
|
+
return value.toISOString();
|
|
866
|
+
}
|
|
867
|
+
if (format === "date-only") {
|
|
868
|
+
return value.toISOString().split("T")[0];
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
if (typeof value.format === "function") {
|
|
872
|
+
return value.format(format);
|
|
873
|
+
}
|
|
874
|
+
if (typeof value.format === "function") {
|
|
875
|
+
return value.format(format);
|
|
876
|
+
}
|
|
877
|
+
if (typeof value.toFormat === "function") {
|
|
878
|
+
return value.toFormat(format);
|
|
879
|
+
}
|
|
880
|
+
return value;
|
|
881
|
+
} catch {
|
|
882
|
+
return null;
|
|
883
|
+
}
|
|
884
|
+
};
|
|
885
|
+
}
|
|
886
|
+
function createDefaultDatePickerConfig() {
|
|
887
|
+
return {
|
|
888
|
+
// Default slot props for consistent behavior
|
|
889
|
+
slotProps: {
|
|
890
|
+
actionBar: {
|
|
891
|
+
actions: ["clear", "today", "cancel", "accept"]
|
|
892
|
+
},
|
|
893
|
+
textField: {
|
|
894
|
+
fullWidth: true,
|
|
895
|
+
variant: "outlined"
|
|
896
|
+
}
|
|
897
|
+
},
|
|
898
|
+
// Default grid props for layout consistency
|
|
899
|
+
gridProps: {
|
|
900
|
+
size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
|
|
901
|
+
},
|
|
902
|
+
// Default validation configuration
|
|
903
|
+
validation: {
|
|
904
|
+
errorMessages: {
|
|
905
|
+
invalidDate: "Please enter a valid date",
|
|
906
|
+
minDate: "Date must be after the minimum allowed date",
|
|
907
|
+
maxDate: "Date must be before the maximum allowed date",
|
|
908
|
+
disabledDate: "This date is not allowed"
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
};
|
|
912
|
+
}
|
|
913
|
+
function extractErrorMessage(error) {
|
|
914
|
+
if (error === null || error === void 0) {
|
|
915
|
+
return "";
|
|
916
|
+
}
|
|
917
|
+
if (typeof error === "string") {
|
|
918
|
+
return error;
|
|
919
|
+
}
|
|
920
|
+
if (typeof error === "object" && error !== null) {
|
|
921
|
+
if ("message" in error && typeof error.message === "string") {
|
|
922
|
+
return error.message;
|
|
923
|
+
}
|
|
924
|
+
if ("type" in error && typeof error.type === "string") {
|
|
925
|
+
const errorType = error.type;
|
|
926
|
+
switch (errorType) {
|
|
927
|
+
case "invalidDate":
|
|
928
|
+
return "Please enter a valid date";
|
|
929
|
+
case "minDate":
|
|
930
|
+
return "Date is too early";
|
|
931
|
+
case "maxDate":
|
|
932
|
+
return "Date is too late";
|
|
933
|
+
case "disabledDate":
|
|
934
|
+
return "This date is not available";
|
|
935
|
+
default:
|
|
936
|
+
return "Invalid date selection";
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
return "Invalid input";
|
|
941
|
+
}
|
|
942
|
+
function createStableKey(config) {
|
|
943
|
+
try {
|
|
944
|
+
return JSON.stringify(config, (key, value) => {
|
|
945
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
946
|
+
const sorted = {};
|
|
947
|
+
Object.keys(value).sort().forEach((k) => {
|
|
948
|
+
sorted[k] = value[k];
|
|
949
|
+
});
|
|
950
|
+
return sorted;
|
|
951
|
+
}
|
|
952
|
+
return value;
|
|
953
|
+
});
|
|
954
|
+
} catch {
|
|
955
|
+
return Object.keys(config).sort().join("-");
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
// src/wrappers/PasswordElement/PasswordElement.tsx
|
|
960
|
+
import Visibility from "@mui/icons-material/Visibility";
|
|
961
|
+
import VisibilityOff from "@mui/icons-material/VisibilityOff";
|
|
962
|
+
import {
|
|
963
|
+
IconButton,
|
|
964
|
+
InputAdornment,
|
|
965
|
+
TextField as TextField2,
|
|
966
|
+
useForkRef as useForkRef2,
|
|
967
|
+
Grid as Grid5
|
|
968
|
+
} from "@mui/material";
|
|
969
|
+
import { useState as useState2 } from "react";
|
|
970
|
+
import {
|
|
971
|
+
useController as useController5
|
|
972
|
+
} from "react-hook-form";
|
|
973
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
974
|
+
var Component3 = function PasswordEl(props) {
|
|
975
|
+
const {
|
|
976
|
+
type,
|
|
977
|
+
required,
|
|
978
|
+
iconColor,
|
|
979
|
+
renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
|
|
980
|
+
slotProps,
|
|
981
|
+
name,
|
|
982
|
+
control,
|
|
983
|
+
component: TextFieldComponent = TextField2,
|
|
984
|
+
inputRef,
|
|
985
|
+
onBlur,
|
|
986
|
+
...rest
|
|
987
|
+
} = props;
|
|
988
|
+
const [password, setPassword] = useState2(true);
|
|
989
|
+
const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
|
|
990
|
+
IconButton,
|
|
991
|
+
{
|
|
992
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
993
|
+
onClick: () => setPassword(!password),
|
|
994
|
+
tabIndex: -1,
|
|
995
|
+
color: iconColor ?? "default",
|
|
996
|
+
children: renderIcon(password)
|
|
997
|
+
}
|
|
998
|
+
) });
|
|
999
|
+
const {
|
|
1000
|
+
field,
|
|
1001
|
+
fieldState: { error }
|
|
1002
|
+
} = useController5({
|
|
1003
|
+
name,
|
|
1004
|
+
control
|
|
1005
|
+
});
|
|
1006
|
+
const handleInputRef = useForkRef2(field.ref, inputRef);
|
|
1007
|
+
return /* @__PURE__ */ jsx6(
|
|
1008
|
+
TextField2,
|
|
1009
|
+
{
|
|
1010
|
+
...rest,
|
|
1011
|
+
inputRef: handleInputRef,
|
|
1012
|
+
type: password ? "password" : "text",
|
|
1013
|
+
value: field.value,
|
|
1014
|
+
fullWidth: true,
|
|
1015
|
+
onChange: (event) => {
|
|
1016
|
+
field.onChange(event);
|
|
1017
|
+
if (typeof rest.onChange === "function") {
|
|
1018
|
+
rest.onChange(event);
|
|
1019
|
+
}
|
|
1020
|
+
},
|
|
1021
|
+
onBlur: (event) => {
|
|
1022
|
+
field.onBlur();
|
|
1023
|
+
if (typeof onBlur === "function") {
|
|
1024
|
+
onBlur(event);
|
|
1025
|
+
}
|
|
1026
|
+
},
|
|
1027
|
+
...typeof slotProps === "undefined" ? {
|
|
1028
|
+
InputProps: {
|
|
1029
|
+
endAdornment
|
|
1030
|
+
}
|
|
1031
|
+
} : {
|
|
1032
|
+
slotProps: {
|
|
1033
|
+
...slotProps,
|
|
1034
|
+
input: {
|
|
1035
|
+
endAdornment,
|
|
1036
|
+
...slotProps?.input
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
},
|
|
1040
|
+
error: !!error,
|
|
1041
|
+
helperText: error ? error.message : ""
|
|
1042
|
+
}
|
|
1043
|
+
);
|
|
1044
|
+
};
|
|
1045
|
+
var PasswordElement = ({
|
|
1046
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1047
|
+
...props
|
|
1048
|
+
}) => {
|
|
1049
|
+
if (gridProps) {
|
|
1050
|
+
return /* @__PURE__ */ jsx6(
|
|
1051
|
+
Grid5,
|
|
1052
|
+
{
|
|
1053
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1054
|
+
children: /* @__PURE__ */ jsx6(Component3, { ...props })
|
|
1055
|
+
}
|
|
1056
|
+
);
|
|
1057
|
+
}
|
|
1058
|
+
return /* @__PURE__ */ jsx6(Component3, { ...props });
|
|
1059
|
+
};
|
|
1060
|
+
PasswordElement.displayName = "PasswordElement";
|
|
1061
|
+
var PasswordElement_default = PasswordElement;
|
|
1062
|
+
|
|
1063
|
+
// src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
|
|
1064
|
+
import {
|
|
1065
|
+
FormControl as FormControl3,
|
|
1066
|
+
FormControlLabel as FormControlLabel3,
|
|
1067
|
+
FormHelperText as FormHelperText3,
|
|
1068
|
+
FormLabel,
|
|
1069
|
+
Radio,
|
|
1070
|
+
RadioGroup,
|
|
1071
|
+
useTheme as useTheme4,
|
|
1072
|
+
Grid as Grid6
|
|
1073
|
+
} from "@mui/material";
|
|
1074
|
+
import {
|
|
1075
|
+
useController as useController6
|
|
1076
|
+
} from "react-hook-form";
|
|
1077
|
+
import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1078
|
+
var Component4 = function RadioButtonGroup(props) {
|
|
1079
|
+
const {
|
|
1080
|
+
options,
|
|
1081
|
+
label,
|
|
1082
|
+
name,
|
|
1083
|
+
labelKey = "label",
|
|
1084
|
+
valueKey = "id",
|
|
1085
|
+
disabledKey = "disabled",
|
|
1086
|
+
required,
|
|
1087
|
+
emptyOptionLabel,
|
|
1088
|
+
returnObject,
|
|
1089
|
+
row,
|
|
1090
|
+
control,
|
|
1091
|
+
type,
|
|
1092
|
+
labelProps,
|
|
1093
|
+
disabled,
|
|
1094
|
+
formLabelProps,
|
|
1095
|
+
radioProps,
|
|
1096
|
+
transform,
|
|
1097
|
+
...rest
|
|
1098
|
+
} = props;
|
|
1099
|
+
const theme = useTheme4();
|
|
1100
|
+
const {
|
|
1101
|
+
field,
|
|
1102
|
+
fieldState: { error }
|
|
1103
|
+
} = useController6({
|
|
1104
|
+
name,
|
|
1105
|
+
disabled,
|
|
1106
|
+
control
|
|
1107
|
+
});
|
|
1108
|
+
const { value, onChange } = useTransform({
|
|
1109
|
+
value: field.value,
|
|
1110
|
+
onChange: field.onChange,
|
|
1111
|
+
transform: {
|
|
1112
|
+
input: typeof transform?.input === "function" ? transform.input : (value2) => {
|
|
1113
|
+
return value2 || "";
|
|
1114
|
+
},
|
|
1115
|
+
output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
|
|
1116
|
+
if (value2 && type === "number") {
|
|
1117
|
+
return Number(value2);
|
|
1118
|
+
}
|
|
1119
|
+
if (value2 && type === "boolean") {
|
|
1120
|
+
return Boolean(value2);
|
|
1121
|
+
}
|
|
1122
|
+
return value2;
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
});
|
|
1126
|
+
const onRadioChange = (event, radioValue) => {
|
|
1127
|
+
const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
|
|
1128
|
+
onChange(event, returnValue);
|
|
1129
|
+
if (typeof rest.onChange === "function") {
|
|
1130
|
+
rest.onChange(returnValue);
|
|
1131
|
+
}
|
|
1132
|
+
};
|
|
1133
|
+
return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
|
|
1134
|
+
label && /* @__PURE__ */ jsx7(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
|
|
1135
|
+
/* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
|
|
1136
|
+
emptyOptionLabel && /* @__PURE__ */ jsx7(
|
|
1137
|
+
FormControlLabel3,
|
|
1138
|
+
{
|
|
1139
|
+
...labelProps,
|
|
1140
|
+
control: /* @__PURE__ */ jsx7(
|
|
1141
|
+
Radio,
|
|
1142
|
+
{
|
|
1143
|
+
...radioProps,
|
|
1144
|
+
sx: {
|
|
1145
|
+
color: error ? theme.palette.error.main : void 0
|
|
1146
|
+
},
|
|
1147
|
+
checked: !value
|
|
1148
|
+
}
|
|
1149
|
+
),
|
|
1150
|
+
label: emptyOptionLabel,
|
|
1151
|
+
value: ""
|
|
1152
|
+
}
|
|
1153
|
+
),
|
|
1154
|
+
options.map((option) => {
|
|
1155
|
+
const optionKey = option[valueKey];
|
|
1156
|
+
const optionDisabled = option[disabledKey] || false;
|
|
1157
|
+
let val = returnObject ? value?.[valueKey] : value;
|
|
1158
|
+
if (type === "number" && val !== void 0) {
|
|
1159
|
+
val = Number(val);
|
|
1160
|
+
} else if (type === "boolean" && val !== void 0) {
|
|
1161
|
+
val = Boolean(val);
|
|
1162
|
+
}
|
|
1163
|
+
const isChecked = val === optionKey;
|
|
1164
|
+
return /* @__PURE__ */ jsx7(
|
|
1165
|
+
FormControlLabel3,
|
|
1166
|
+
{
|
|
1167
|
+
...labelProps,
|
|
1168
|
+
control: /* @__PURE__ */ jsx7(
|
|
1169
|
+
Radio,
|
|
1170
|
+
{
|
|
1171
|
+
...radioProps,
|
|
1172
|
+
sx: {
|
|
1173
|
+
color: error ? theme.palette.error.main : void 0
|
|
1174
|
+
},
|
|
1175
|
+
disabled: disabled || optionDisabled,
|
|
1176
|
+
checked: isChecked
|
|
1177
|
+
}
|
|
1178
|
+
),
|
|
1179
|
+
value: optionKey,
|
|
1180
|
+
label: option[labelKey]
|
|
1181
|
+
},
|
|
1182
|
+
String(optionKey)
|
|
1183
|
+
);
|
|
1184
|
+
})
|
|
1185
|
+
] }),
|
|
1186
|
+
error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
|
|
1187
|
+
] });
|
|
1188
|
+
};
|
|
1189
|
+
var RadioButtonGroup2 = ({
|
|
1190
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1191
|
+
...props
|
|
1192
|
+
}) => {
|
|
1193
|
+
if (gridProps) {
|
|
1194
|
+
return /* @__PURE__ */ jsx7(
|
|
1195
|
+
Grid6,
|
|
1196
|
+
{
|
|
1197
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1198
|
+
children: /* @__PURE__ */ jsx7(Component4, { ...props })
|
|
1199
|
+
}
|
|
1200
|
+
);
|
|
1201
|
+
}
|
|
1202
|
+
return /* @__PURE__ */ jsx7(Component4, { ...props });
|
|
1203
|
+
};
|
|
1204
|
+
RadioButtonGroup2.displayName = "RadioButtonGroup";
|
|
1205
|
+
var RadioButtonGroup_default = RadioButtonGroup2;
|
|
1206
|
+
|
|
1207
|
+
// src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
|
|
1208
|
+
import {
|
|
1209
|
+
Grid as Grid7,
|
|
1210
|
+
useTheme as useTheme5,
|
|
1211
|
+
TextField as TextField3,
|
|
1212
|
+
Autocomplete as Autocomplete2
|
|
1213
|
+
} from "@mui/material";
|
|
1214
|
+
import { useRef, useState as useState3, useEffect as useEffect3, useCallback as useCallback4 } from "react";
|
|
1215
|
+
import {
|
|
1216
|
+
useController as useController7
|
|
1217
|
+
} from "react-hook-form";
|
|
1218
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
1219
|
+
var Component5 = function SelectCascadeElement(props) {
|
|
1220
|
+
const {
|
|
1221
|
+
labelKey = "Label",
|
|
1222
|
+
valueKey = "Value",
|
|
1223
|
+
name,
|
|
1224
|
+
onBlur,
|
|
1225
|
+
onChange,
|
|
1226
|
+
disabled,
|
|
1227
|
+
options,
|
|
1228
|
+
control,
|
|
1229
|
+
loading = false,
|
|
1230
|
+
placeholder,
|
|
1231
|
+
label,
|
|
1232
|
+
dependsOn,
|
|
1233
|
+
textFieldProps = {},
|
|
1234
|
+
variant,
|
|
1235
|
+
sx,
|
|
1236
|
+
isEdit = false,
|
|
1237
|
+
...rest
|
|
1238
|
+
} = props;
|
|
1239
|
+
const { required } = textFieldProps;
|
|
1240
|
+
const getOptionKey = useCallback4(
|
|
1241
|
+
(option) => {
|
|
1242
|
+
if (typeof option === "string" || typeof option === "number") return option;
|
|
1243
|
+
const key = option ? option[valueKey] : void 0;
|
|
1244
|
+
return key !== void 0 && key !== null ? String(key) : "";
|
|
1245
|
+
},
|
|
1246
|
+
[valueKey]
|
|
1247
|
+
);
|
|
1248
|
+
const getOptionLabel = useCallback4(
|
|
1249
|
+
(option) => {
|
|
1250
|
+
if (typeof option === "string") return option;
|
|
1251
|
+
return option ? String(option[labelKey]) : "";
|
|
1252
|
+
},
|
|
1253
|
+
[labelKey]
|
|
1254
|
+
);
|
|
1255
|
+
const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
|
|
1256
|
+
const {
|
|
1257
|
+
field,
|
|
1258
|
+
fieldState: { error }
|
|
1259
|
+
} = useController7({
|
|
1260
|
+
name,
|
|
1261
|
+
control
|
|
1262
|
+
});
|
|
1263
|
+
const theme = useTheme5();
|
|
1264
|
+
const { field: dependentField } = useController7({
|
|
1265
|
+
name: dependsOn,
|
|
1266
|
+
control
|
|
1267
|
+
});
|
|
1268
|
+
const parentValueRef = useRef(dependentField.value ?? null);
|
|
1269
|
+
const [hasAutoSelected, setHasAutoSelected] = useState3(false);
|
|
1270
|
+
useEffect3(() => {
|
|
1271
|
+
if (!!dependentField.value && parentValueRef?.current !== dependentField.value || dependentField.value === null) {
|
|
1272
|
+
field.onChange(null);
|
|
1273
|
+
setHasAutoSelected(false);
|
|
1274
|
+
}
|
|
1275
|
+
}, [dependentField.value]);
|
|
1276
|
+
useEffect3(() => {
|
|
1277
|
+
if (isEdit && !disabled && options.length === 1 && field.value == null && !hasAutoSelected) {
|
|
1278
|
+
field.onChange(getOptionKey(options[0]));
|
|
1279
|
+
setHasAutoSelected(true);
|
|
1280
|
+
} else {
|
|
1281
|
+
if (options.length === 1 && field.value == null && !hasAutoSelected) {
|
|
1282
|
+
field.onChange(getOptionKey(options[0]));
|
|
1283
|
+
setHasAutoSelected(true);
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
}, [
|
|
1287
|
+
options,
|
|
1288
|
+
field.value,
|
|
1289
|
+
field.onChange,
|
|
1290
|
+
hasAutoSelected,
|
|
1291
|
+
isEdit,
|
|
1292
|
+
disabled,
|
|
1293
|
+
field,
|
|
1294
|
+
getOptionKey,
|
|
1295
|
+
dependentField.onChange
|
|
1296
|
+
]);
|
|
1297
|
+
return /* @__PURE__ */ jsx8(
|
|
1298
|
+
Autocomplete2,
|
|
1299
|
+
{
|
|
1300
|
+
...rest,
|
|
1301
|
+
value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
|
|
1302
|
+
size: "small",
|
|
1303
|
+
loading,
|
|
1304
|
+
options,
|
|
1305
|
+
getOptionKey,
|
|
1306
|
+
getOptionLabel,
|
|
1307
|
+
isOptionEqualToValue,
|
|
1308
|
+
ref: field.ref,
|
|
1309
|
+
disabled: dependentField.value == null || disabled,
|
|
1310
|
+
onChange: (event, newValue, reason) => {
|
|
1311
|
+
field.onChange(newValue ? getOptionKey(newValue) : null);
|
|
1312
|
+
if (onChange && typeof onChange === "function") {
|
|
1313
|
+
onChange(event, newValue, reason);
|
|
1314
|
+
}
|
|
1315
|
+
},
|
|
1316
|
+
onBlur: (event) => {
|
|
1317
|
+
field.onBlur();
|
|
1318
|
+
if (typeof onBlur === "function") {
|
|
1319
|
+
onBlur(event);
|
|
1320
|
+
}
|
|
1321
|
+
},
|
|
1322
|
+
fullWidth: true,
|
|
1323
|
+
renderInput: (params) => (
|
|
1324
|
+
// @ts-ignore
|
|
1325
|
+
/* @__PURE__ */ jsx8(
|
|
1326
|
+
TextField3,
|
|
1327
|
+
{
|
|
1328
|
+
...params,
|
|
1329
|
+
fullWidth: true,
|
|
1330
|
+
error: !!error,
|
|
1331
|
+
required,
|
|
1332
|
+
helperText: error ? error.message : "",
|
|
1333
|
+
placeholder,
|
|
1334
|
+
label,
|
|
1335
|
+
variant: variant ? variant : "outlined",
|
|
1336
|
+
sx: {
|
|
1337
|
+
"& .MuiOutlinedInput-root": {
|
|
1338
|
+
bgcolor: disabled || dependentField.value == null ? theme.palette.action.disabledBackground : "transparent"
|
|
1339
|
+
},
|
|
1340
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1341
|
+
"& .MuiInputBase-input": {
|
|
1342
|
+
cursor: disabled || dependentField.value == null ? "not-allowed" : "default"
|
|
1343
|
+
},
|
|
1344
|
+
...sx
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
1347
|
+
)
|
|
1348
|
+
)
|
|
1349
|
+
}
|
|
1350
|
+
);
|
|
1351
|
+
};
|
|
1352
|
+
var SelectCascadeElement2 = ({
|
|
1353
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1354
|
+
...props
|
|
1355
|
+
}) => {
|
|
1356
|
+
if (gridProps) {
|
|
1357
|
+
return /* @__PURE__ */ jsx8(Grid7, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx8(Component5, { ...props }) });
|
|
1358
|
+
}
|
|
1359
|
+
return /* @__PURE__ */ jsx8(Component5, { ...props });
|
|
1360
|
+
};
|
|
1361
|
+
SelectCascadeElement2.displayName = "SelectCascadeElement";
|
|
1362
|
+
var SelectCascadeElement_default = SelectCascadeElement2;
|
|
1363
|
+
|
|
1364
|
+
// src/wrappers/SelectElement/SelectElement.tsx
|
|
1365
|
+
import { Grid as Grid8, useTheme as useTheme6, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
|
|
1366
|
+
import {
|
|
1367
|
+
useMemo as useMemo6,
|
|
1368
|
+
useEffect as useEffect4,
|
|
1369
|
+
useCallback as useCallback5
|
|
1370
|
+
} from "react";
|
|
1371
|
+
import {
|
|
1372
|
+
useController as useController8
|
|
1373
|
+
} from "react-hook-form";
|
|
1374
|
+
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
1375
|
+
var Component6 = function SelectElement(props) {
|
|
1376
|
+
const {
|
|
1377
|
+
name,
|
|
1378
|
+
control,
|
|
1379
|
+
onChange,
|
|
1380
|
+
isEdit,
|
|
1381
|
+
options,
|
|
1382
|
+
label,
|
|
1383
|
+
sx,
|
|
1384
|
+
variant,
|
|
1385
|
+
disabled,
|
|
1386
|
+
labelKey = "Label",
|
|
1387
|
+
valueKey = "Value",
|
|
1388
|
+
placeholder,
|
|
1389
|
+
textFieldProps = {},
|
|
1390
|
+
...rest
|
|
1391
|
+
} = props;
|
|
1392
|
+
const { required } = textFieldProps;
|
|
1393
|
+
const {
|
|
1394
|
+
field,
|
|
1395
|
+
fieldState: { error }
|
|
1396
|
+
} = useController8({
|
|
1397
|
+
name,
|
|
1398
|
+
control
|
|
1399
|
+
});
|
|
1400
|
+
const theme = useTheme6();
|
|
1401
|
+
const getOptionValue = useCallback5(
|
|
1402
|
+
(option) => {
|
|
1403
|
+
if (typeof option === "string") return option;
|
|
1404
|
+
return option ? option[valueKey] : null;
|
|
1405
|
+
},
|
|
1406
|
+
[valueKey]
|
|
1407
|
+
);
|
|
1408
|
+
const getOptionLabel = useCallback5(
|
|
1409
|
+
(option) => {
|
|
1410
|
+
if (typeof option === "string") return option;
|
|
1411
|
+
return option ? String(option[labelKey]) : "";
|
|
1412
|
+
},
|
|
1413
|
+
[labelKey]
|
|
1414
|
+
);
|
|
1415
|
+
const handleChange = (event, newValue, reason) => {
|
|
1416
|
+
const option = newValue;
|
|
1417
|
+
field.onChange(option ? getOptionValue(option) : null);
|
|
1418
|
+
onChange?.(event, newValue, reason);
|
|
1419
|
+
};
|
|
1420
|
+
useEffect4(() => {
|
|
1421
|
+
if (!isEdit && options.length === 1 && (field.value == null || field.value == void 0 || field.value === "")) {
|
|
1422
|
+
const defaultOption = options[0];
|
|
1423
|
+
const defaultValue = getOptionValue(defaultOption);
|
|
1424
|
+
field.onChange(defaultValue);
|
|
1425
|
+
}
|
|
1426
|
+
}, [isEdit, options]);
|
|
1427
|
+
const autocompleteValue = useMemo6(
|
|
1428
|
+
() => options.find((option) => getOptionValue(option) === field.value) ?? null,
|
|
1429
|
+
[field.value, options, getOptionValue]
|
|
1430
|
+
);
|
|
1431
|
+
return /* @__PURE__ */ jsx9(
|
|
1432
|
+
Autocomplete3,
|
|
1433
|
+
{
|
|
1434
|
+
...rest,
|
|
1435
|
+
filterSelectedOptions: false,
|
|
1436
|
+
options,
|
|
1437
|
+
value: autocompleteValue,
|
|
1438
|
+
onChange: handleChange,
|
|
1439
|
+
disabled,
|
|
1440
|
+
getOptionLabel: (option) => getOptionLabel(option),
|
|
1441
|
+
ref: field.ref,
|
|
1442
|
+
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
1443
|
+
renderInput: (params) => /* @__PURE__ */ jsx9(
|
|
1444
|
+
TextField4,
|
|
1445
|
+
{
|
|
1446
|
+
...params,
|
|
1447
|
+
fullWidth: true,
|
|
1448
|
+
required,
|
|
1449
|
+
error: !!error,
|
|
1450
|
+
helperText: error ? error.message : "",
|
|
1451
|
+
label,
|
|
1452
|
+
placeholder,
|
|
1453
|
+
variant: variant ? variant : "outlined",
|
|
1454
|
+
sx: {
|
|
1455
|
+
"& .MuiOutlinedInput-root": {
|
|
1456
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
|
|
1457
|
+
},
|
|
1458
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1459
|
+
"& .MuiInputBase-input": {
|
|
1460
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
1461
|
+
},
|
|
1462
|
+
...sx
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
)
|
|
1466
|
+
}
|
|
1467
|
+
);
|
|
1468
|
+
};
|
|
1469
|
+
var SelectElement2 = ({
|
|
1470
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1471
|
+
...props
|
|
1472
|
+
}) => {
|
|
1473
|
+
if (gridProps) {
|
|
1474
|
+
return /* @__PURE__ */ jsx9(
|
|
1475
|
+
Grid8,
|
|
1476
|
+
{
|
|
1477
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1478
|
+
children: /* @__PURE__ */ jsx9(Component6, { ...props })
|
|
1479
|
+
}
|
|
1480
|
+
);
|
|
1481
|
+
}
|
|
1482
|
+
return /* @__PURE__ */ jsx9(Component6, { ...props });
|
|
1483
|
+
};
|
|
1484
|
+
SelectElement2.displayName = "SelectElement";
|
|
1485
|
+
var SelectElement_default = SelectElement2;
|
|
1486
|
+
|
|
1487
|
+
// src/wrappers/SelectMultiElement/SelectMultiElement.tsx
|
|
1488
|
+
import CheckBoxIcon from "@mui/icons-material/CheckBox";
|
|
1489
|
+
import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
|
|
1490
|
+
import { Grid as Grid9, Checkbox as Checkbox3, TextField as TextField5, Autocomplete as Autocomplete4, CircularProgress as CircularProgress2 } from "@mui/material";
|
|
1491
|
+
import { Fragment as Fragment2 } from "react";
|
|
1492
|
+
import { useController as useController9 } from "react-hook-form";
|
|
1493
|
+
import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1494
|
+
var Component7 = function SelectMultiElement(props) {
|
|
1495
|
+
const {
|
|
1496
|
+
name,
|
|
1497
|
+
control,
|
|
1498
|
+
onBlur,
|
|
1499
|
+
disabled,
|
|
1500
|
+
options,
|
|
1501
|
+
loading = false,
|
|
1502
|
+
placeholder,
|
|
1503
|
+
label,
|
|
1504
|
+
variant,
|
|
1505
|
+
sx,
|
|
1506
|
+
labelKey = "Label",
|
|
1507
|
+
valueKey = "Value",
|
|
1508
|
+
...rest
|
|
1509
|
+
} = props;
|
|
1510
|
+
const {
|
|
1511
|
+
field,
|
|
1512
|
+
fieldState: { error }
|
|
1513
|
+
} = useController9({
|
|
1514
|
+
name,
|
|
1515
|
+
control
|
|
1516
|
+
});
|
|
1517
|
+
const getOptionValue = (option) => {
|
|
1518
|
+
if (typeof option === "string") return option;
|
|
1519
|
+
return option ? option[valueKey] : null;
|
|
1520
|
+
};
|
|
1521
|
+
const getOptionLabel = (option) => {
|
|
1522
|
+
if (typeof option === "string") return option;
|
|
1523
|
+
return option ? option[labelKey] : "";
|
|
1524
|
+
};
|
|
1525
|
+
const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
|
|
1526
|
+
const handleChange = (_, selectedOptions, reason) => {
|
|
1527
|
+
if (reason === "clear") {
|
|
1528
|
+
field.onChange([]);
|
|
1529
|
+
} else if (reason === "selectOption" || reason === "removeOption") {
|
|
1530
|
+
const newValues = selectedOptions.map((option) => getOptionValue(option));
|
|
1531
|
+
field.onChange(newValues);
|
|
1532
|
+
}
|
|
1533
|
+
};
|
|
1534
|
+
const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
|
|
1535
|
+
const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
|
|
1536
|
+
return /* @__PURE__ */ jsx10(
|
|
1537
|
+
Autocomplete4,
|
|
1538
|
+
{
|
|
1539
|
+
multiple: true,
|
|
1540
|
+
value: selectedValue,
|
|
1541
|
+
loading,
|
|
1542
|
+
options,
|
|
1543
|
+
getOptionLabel,
|
|
1544
|
+
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
1545
|
+
filterSelectedOptions: true,
|
|
1546
|
+
disableCloseOnSelect: true,
|
|
1547
|
+
ref: field.ref,
|
|
1548
|
+
disabled: disabled ?? field.disabled,
|
|
1549
|
+
onChange: handleChange,
|
|
1550
|
+
onBlur: (event) => {
|
|
1551
|
+
field.onBlur();
|
|
1552
|
+
if (typeof onBlur === "function") {
|
|
1553
|
+
onBlur(event);
|
|
1554
|
+
}
|
|
1555
|
+
},
|
|
1556
|
+
fullWidth: true,
|
|
1557
|
+
renderOption: (props1, option, { selected }) => {
|
|
1558
|
+
const { key, ...optionProps } = props1;
|
|
1559
|
+
return /* @__PURE__ */ jsxs5("li", { ...optionProps, children: [
|
|
1560
|
+
/* @__PURE__ */ jsx10(Checkbox3, { icon, checkedIcon, checked: selected }),
|
|
1561
|
+
getOptionLabel(option)
|
|
1562
|
+
] }, key);
|
|
1563
|
+
},
|
|
1564
|
+
renderInput: (params) => /* @__PURE__ */ jsx10(
|
|
1565
|
+
TextField5,
|
|
1566
|
+
{
|
|
1567
|
+
...params,
|
|
1568
|
+
label,
|
|
1569
|
+
error: !!error,
|
|
1570
|
+
helperText: error ? error.message : "",
|
|
1571
|
+
placeholder,
|
|
1572
|
+
slotProps: {
|
|
1573
|
+
input: {
|
|
1574
|
+
...params.InputProps,
|
|
1575
|
+
endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
|
|
1576
|
+
loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
|
|
1577
|
+
params.InputProps.endAdornment
|
|
1578
|
+
] })
|
|
1579
|
+
}
|
|
1580
|
+
},
|
|
1581
|
+
variant: variant ? variant : "outlined",
|
|
1582
|
+
sx: {
|
|
1583
|
+
...sx
|
|
1584
|
+
}
|
|
1585
|
+
}
|
|
1586
|
+
),
|
|
1587
|
+
...rest
|
|
1588
|
+
}
|
|
1589
|
+
);
|
|
1590
|
+
};
|
|
1591
|
+
var SelectMultiElement2 = ({
|
|
1592
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1593
|
+
...props
|
|
1594
|
+
}) => {
|
|
1595
|
+
if (gridProps) {
|
|
1596
|
+
return /* @__PURE__ */ jsx10(Grid9, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx10(Component7, { ...props }) });
|
|
1597
|
+
}
|
|
1598
|
+
return /* @__PURE__ */ jsx10(Component7, { ...props });
|
|
1599
|
+
};
|
|
1600
|
+
SelectMultiElement2.displayName = "SelectMultiElement";
|
|
1601
|
+
var SelectMultiElement_default = SelectMultiElement2;
|
|
1602
|
+
|
|
1603
|
+
// src/wrappers/TextFieldElement/TextFieldElement.tsx
|
|
1604
|
+
import {
|
|
1605
|
+
Grid as Grid10,
|
|
1606
|
+
TextField as TextField6,
|
|
1607
|
+
useForkRef as useForkRef3,
|
|
1608
|
+
useTheme as useTheme7
|
|
1609
|
+
} from "@mui/material";
|
|
1610
|
+
import {
|
|
1611
|
+
useController as useController10
|
|
1612
|
+
} from "react-hook-form";
|
|
1613
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
1614
|
+
var Component8 = function TextFieldElement(props) {
|
|
1615
|
+
const {
|
|
1616
|
+
rules = {},
|
|
1617
|
+
parseError,
|
|
1618
|
+
name,
|
|
1619
|
+
control,
|
|
1620
|
+
component: TextFieldComponent = TextField6,
|
|
1621
|
+
gridProps,
|
|
1622
|
+
transform,
|
|
1623
|
+
label,
|
|
1624
|
+
placeholder,
|
|
1625
|
+
textFieldProps = {},
|
|
1626
|
+
variant,
|
|
1627
|
+
sx,
|
|
1628
|
+
...rest
|
|
1629
|
+
} = props;
|
|
1630
|
+
const {
|
|
1631
|
+
type,
|
|
1632
|
+
required,
|
|
1633
|
+
helperText,
|
|
1634
|
+
inputRef,
|
|
1635
|
+
onBlur,
|
|
1636
|
+
disabled,
|
|
1637
|
+
...restTextProps
|
|
1638
|
+
} = textFieldProps;
|
|
1639
|
+
const {
|
|
1640
|
+
field,
|
|
1641
|
+
fieldState: { error }
|
|
1642
|
+
} = useController10({
|
|
1643
|
+
name,
|
|
1644
|
+
control
|
|
1645
|
+
});
|
|
1646
|
+
const theme = useTheme7();
|
|
1647
|
+
const { value, onChange } = useTransform({
|
|
1648
|
+
value: field.value,
|
|
1649
|
+
onChange: field.onChange,
|
|
1650
|
+
transform: {
|
|
1651
|
+
input: typeof transform?.input === "function" ? transform.input : (value2) => {
|
|
1652
|
+
return value2 ?? "";
|
|
1653
|
+
},
|
|
1654
|
+
output: typeof transform?.output === "function" ? transform.output : (event) => {
|
|
1655
|
+
const value2 = event.target.value;
|
|
1656
|
+
if (type !== "number") {
|
|
1657
|
+
return value2;
|
|
1658
|
+
}
|
|
1659
|
+
if (value2 === "") {
|
|
1660
|
+
return null;
|
|
1661
|
+
}
|
|
1662
|
+
if (value2 == null) {
|
|
1663
|
+
return value2;
|
|
1664
|
+
}
|
|
1665
|
+
return Number(value2);
|
|
1666
|
+
}
|
|
1667
|
+
}
|
|
1668
|
+
});
|
|
1669
|
+
const handleInputRef = useForkRef3(field.ref, inputRef);
|
|
1670
|
+
return /* @__PURE__ */ jsx11(
|
|
1671
|
+
TextFieldComponent,
|
|
1672
|
+
{
|
|
1673
|
+
...rest,
|
|
1674
|
+
...restTextProps,
|
|
1675
|
+
name: field.name,
|
|
1676
|
+
value,
|
|
1677
|
+
onChange: (event) => {
|
|
1678
|
+
field.onChange(event);
|
|
1679
|
+
if (typeof onChange === "function") {
|
|
1680
|
+
onChange(event);
|
|
1681
|
+
}
|
|
1682
|
+
},
|
|
1683
|
+
onBlur: (event) => {
|
|
1684
|
+
field.onBlur();
|
|
1685
|
+
if (typeof onBlur === "function") {
|
|
1686
|
+
onBlur(event);
|
|
1687
|
+
}
|
|
1688
|
+
},
|
|
1689
|
+
disabled,
|
|
1690
|
+
label,
|
|
1691
|
+
placeholder,
|
|
1692
|
+
fullWidth: true,
|
|
1693
|
+
required,
|
|
1694
|
+
type,
|
|
1695
|
+
error: !!error,
|
|
1696
|
+
helperText: error ? error.message : helperText,
|
|
1697
|
+
inputRef: handleInputRef,
|
|
1698
|
+
variant: variant ? variant : "outlined",
|
|
1699
|
+
size: "small",
|
|
1700
|
+
sx: {
|
|
1701
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1702
|
+
"& .MuiInputBase-input": {
|
|
1703
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
1704
|
+
},
|
|
1705
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
1706
|
+
...sx
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
);
|
|
1710
|
+
};
|
|
1711
|
+
var TextFieldElement2 = ({
|
|
1712
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1713
|
+
...props
|
|
1714
|
+
}) => {
|
|
1715
|
+
if (gridProps) {
|
|
1716
|
+
return /* @__PURE__ */ jsx11(
|
|
1717
|
+
Grid10,
|
|
1718
|
+
{
|
|
1719
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1720
|
+
children: /* @__PURE__ */ jsx11(Component8, { ...props })
|
|
1721
|
+
}
|
|
1722
|
+
);
|
|
1723
|
+
}
|
|
1724
|
+
return /* @__PURE__ */ jsx11(Component8, { ...props });
|
|
1725
|
+
};
|
|
1726
|
+
TextFieldElement2.displayName = "TextFieldElement";
|
|
1727
|
+
var TextFieldElement_default = TextFieldElement2;
|
|
1728
|
+
|
|
1729
|
+
// src/wrappers/TextFieldElement/EnhancedTextFieldElement.tsx
|
|
1730
|
+
import {
|
|
1731
|
+
Grid as Grid11,
|
|
1732
|
+
TextField as TextField7,
|
|
1733
|
+
useForkRef as useForkRef4,
|
|
1734
|
+
useTheme as useTheme8
|
|
1735
|
+
} from "@mui/material";
|
|
1736
|
+
import {
|
|
1737
|
+
useController as useController11
|
|
1738
|
+
} from "react-hook-form";
|
|
1739
|
+
import { jsx as jsx12 } from "react/jsx-runtime";
|
|
1740
|
+
var Component9 = function EnhancedTextFieldElement(props) {
|
|
1741
|
+
const {
|
|
1742
|
+
rules = {},
|
|
1743
|
+
parseError,
|
|
1744
|
+
name,
|
|
1745
|
+
control,
|
|
1746
|
+
component: TextFieldComponent = TextField7,
|
|
1747
|
+
gridProps,
|
|
1748
|
+
transform,
|
|
1749
|
+
fieldType = "text",
|
|
1750
|
+
// Default to text type
|
|
1751
|
+
defaultValue,
|
|
1752
|
+
label,
|
|
1753
|
+
placeholder,
|
|
1754
|
+
textFieldProps = {},
|
|
1755
|
+
variant,
|
|
1756
|
+
sx,
|
|
1757
|
+
onChange: customOnChange,
|
|
1758
|
+
enableWarnings = process.env.NODE_ENV === "development",
|
|
1759
|
+
...rest
|
|
1760
|
+
} = props;
|
|
1761
|
+
const {
|
|
1762
|
+
type,
|
|
1763
|
+
required,
|
|
1764
|
+
helperText,
|
|
1765
|
+
inputRef,
|
|
1766
|
+
onBlur,
|
|
1767
|
+
disabled,
|
|
1768
|
+
...restTextProps
|
|
1769
|
+
} = textFieldProps;
|
|
1770
|
+
const {
|
|
1771
|
+
field,
|
|
1772
|
+
fieldState: { error }
|
|
1773
|
+
} = useController11({
|
|
1774
|
+
name,
|
|
1775
|
+
control,
|
|
1776
|
+
rules
|
|
1777
|
+
});
|
|
1778
|
+
const theme = useTheme8();
|
|
1779
|
+
const { value, onChange } = useEnhancedTransform({
|
|
1780
|
+
value: field.value,
|
|
1781
|
+
onChange: field.onChange,
|
|
1782
|
+
transform: transform ? {
|
|
1783
|
+
input: transform.input,
|
|
1784
|
+
output: transform.output
|
|
1785
|
+
} : void 0,
|
|
1786
|
+
fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
|
|
1787
|
+
// Auto-detect number type
|
|
1788
|
+
defaultValue,
|
|
1789
|
+
enableWarnings
|
|
1790
|
+
});
|
|
1791
|
+
const handleInputRef = useForkRef4(field.ref, inputRef);
|
|
1792
|
+
return /* @__PURE__ */ jsx12(
|
|
1793
|
+
TextFieldComponent,
|
|
1794
|
+
{
|
|
1795
|
+
...rest,
|
|
1796
|
+
...restTextProps,
|
|
1797
|
+
name: field.name,
|
|
1798
|
+
value,
|
|
1799
|
+
onChange: (event) => {
|
|
1800
|
+
onChange(event);
|
|
1801
|
+
if (typeof customOnChange === "function") {
|
|
1802
|
+
customOnChange(event);
|
|
1803
|
+
}
|
|
1804
|
+
},
|
|
1805
|
+
onBlur: (event) => {
|
|
1806
|
+
field.onBlur();
|
|
1807
|
+
if (typeof onBlur === "function") {
|
|
1808
|
+
onBlur(event);
|
|
1809
|
+
}
|
|
1810
|
+
},
|
|
1811
|
+
disabled,
|
|
1812
|
+
label,
|
|
1813
|
+
placeholder,
|
|
1814
|
+
fullWidth: true,
|
|
1815
|
+
required,
|
|
1816
|
+
type,
|
|
1817
|
+
error: !!error,
|
|
1818
|
+
helperText: error ? parseError ? parseError(error) : error.message : helperText,
|
|
1819
|
+
inputRef: handleInputRef,
|
|
1820
|
+
variant: variant ? variant : "outlined",
|
|
1821
|
+
size: "small",
|
|
1822
|
+
sx: {
|
|
1823
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1824
|
+
"& .MuiInputBase-input": {
|
|
1825
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
1826
|
+
},
|
|
1827
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
1828
|
+
...sx
|
|
1829
|
+
}
|
|
1830
|
+
}
|
|
1831
|
+
);
|
|
1832
|
+
};
|
|
1833
|
+
var EnhancedTextFieldElement2 = ({
|
|
1834
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1835
|
+
...props
|
|
1836
|
+
}) => {
|
|
1837
|
+
if (gridProps) {
|
|
1838
|
+
return /* @__PURE__ */ jsx12(
|
|
1839
|
+
Grid11,
|
|
1840
|
+
{
|
|
1841
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1842
|
+
children: /* @__PURE__ */ jsx12(Component9, { ...props })
|
|
1843
|
+
}
|
|
1844
|
+
);
|
|
1845
|
+
}
|
|
1846
|
+
return /* @__PURE__ */ jsx12(Component9, { ...props });
|
|
1847
|
+
};
|
|
1848
|
+
EnhancedTextFieldElement2.displayName = "EnhancedTextFieldElement";
|
|
1849
|
+
|
|
1850
|
+
// src/wrappers/TimePickerElement/TimePickerElement.tsx
|
|
1851
|
+
import { Grid as Grid12, useForkRef as useForkRef5, useTheme as useTheme9 } from "@mui/material";
|
|
1852
|
+
import { TimePicker } from "@mui/x-date-pickers";
|
|
1853
|
+
import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
|
|
1854
|
+
import { useCallback as useCallback6 } from "react";
|
|
1855
|
+
import { useController as useController12 } from "react-hook-form";
|
|
1856
|
+
import { jsx as jsx13 } from "react/jsx-runtime";
|
|
1857
|
+
function readValueAsDate(adapter, value) {
|
|
1858
|
+
if (typeof value === "string") {
|
|
1859
|
+
if (value === "") {
|
|
1860
|
+
return null;
|
|
1861
|
+
}
|
|
1862
|
+
return adapter.utils.date(value);
|
|
1863
|
+
}
|
|
1864
|
+
return value;
|
|
1865
|
+
}
|
|
1866
|
+
function useTransform2(options) {
|
|
1867
|
+
const value = typeof options.transform?.input === "function" ? options.transform.input(options.value) : options.value;
|
|
1868
|
+
const onChange = useCallback6(
|
|
1869
|
+
(...event) => {
|
|
1870
|
+
if (typeof options.transform?.output === "function") {
|
|
1871
|
+
options.onChange(options.transform.output(...event));
|
|
1872
|
+
} else {
|
|
1873
|
+
options.onChange(...event);
|
|
1874
|
+
}
|
|
1875
|
+
},
|
|
1876
|
+
[options]
|
|
1877
|
+
);
|
|
1878
|
+
return {
|
|
1879
|
+
value,
|
|
1880
|
+
onChange
|
|
1881
|
+
};
|
|
1882
|
+
}
|
|
1883
|
+
var Component10 = function TimePickerElement(props) {
|
|
1884
|
+
const {
|
|
1885
|
+
name,
|
|
1886
|
+
required,
|
|
1887
|
+
inputProps,
|
|
1888
|
+
control,
|
|
1889
|
+
textReadOnly,
|
|
1890
|
+
label,
|
|
1891
|
+
placeholder,
|
|
1892
|
+
slotProps,
|
|
1893
|
+
timePickerProps = {},
|
|
1894
|
+
transform,
|
|
1895
|
+
sx,
|
|
1896
|
+
...rest
|
|
1897
|
+
} = props;
|
|
1898
|
+
const adapter = useLocalizationContext2();
|
|
1899
|
+
const theme = useTheme9();
|
|
1900
|
+
const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
|
|
1901
|
+
const {
|
|
1902
|
+
field,
|
|
1903
|
+
fieldState: { error }
|
|
1904
|
+
} = useController12({
|
|
1905
|
+
name,
|
|
1906
|
+
control,
|
|
1907
|
+
defaultValue: null
|
|
1908
|
+
});
|
|
1909
|
+
const { value, onChange } = useTransform2({
|
|
1910
|
+
value: field.value,
|
|
1911
|
+
onChange: field.onChange,
|
|
1912
|
+
transform: {
|
|
1913
|
+
input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
|
|
1914
|
+
output: (outputValue, context) => {
|
|
1915
|
+
if (outputValue === null) return null;
|
|
1916
|
+
return outputValue;
|
|
1917
|
+
}
|
|
1918
|
+
}
|
|
1919
|
+
});
|
|
1920
|
+
const handleInputRef = useForkRef5(field.ref, inputRef);
|
|
1921
|
+
return /* @__PURE__ */ jsx13(
|
|
1922
|
+
TimePicker,
|
|
1923
|
+
{
|
|
1924
|
+
...rest,
|
|
1925
|
+
...restTimePickerProps,
|
|
1926
|
+
...field,
|
|
1927
|
+
value,
|
|
1928
|
+
label,
|
|
1929
|
+
disabled,
|
|
1930
|
+
...timePickerProps,
|
|
1931
|
+
inputRef: handleInputRef,
|
|
1932
|
+
onClose: (...args) => {
|
|
1933
|
+
field.onBlur();
|
|
1934
|
+
if (onClose) {
|
|
1935
|
+
onClose(...args);
|
|
1936
|
+
}
|
|
1937
|
+
},
|
|
1938
|
+
onChange: (newValue, context) => {
|
|
1939
|
+
onChange(newValue, context);
|
|
1940
|
+
if (typeof timePickerProps.onChange === "function") {
|
|
1941
|
+
timePickerProps.onChange(newValue, context);
|
|
1942
|
+
}
|
|
1943
|
+
},
|
|
1944
|
+
sx: {
|
|
1945
|
+
"& .MuiOutlinedInput-root": {
|
|
1946
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
|
|
1947
|
+
},
|
|
1948
|
+
"& .MuiInputLabel-asterisk": { color: "red" },
|
|
1949
|
+
"& .MuiInputBase-input": {
|
|
1950
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
1951
|
+
},
|
|
1952
|
+
...sx
|
|
1953
|
+
},
|
|
1954
|
+
slotProps: {
|
|
1955
|
+
...slotProps,
|
|
1956
|
+
actionBar: {
|
|
1957
|
+
actions: ["clear", "cancel", "accept"]
|
|
1958
|
+
},
|
|
1959
|
+
textField: {
|
|
1960
|
+
...inputProps,
|
|
1961
|
+
required,
|
|
1962
|
+
placeholder,
|
|
1963
|
+
fullWidth: true,
|
|
1964
|
+
onBlur: (event) => {
|
|
1965
|
+
field.onBlur();
|
|
1966
|
+
if (typeof inputProps?.onBlur === "function") {
|
|
1967
|
+
inputProps.onBlur(event);
|
|
1968
|
+
}
|
|
1969
|
+
},
|
|
1970
|
+
error: !!error,
|
|
1971
|
+
helperText: error ? error.message : inputProps?.helperText || rest.helperText,
|
|
1972
|
+
inputProps: {
|
|
1973
|
+
readOnly: !!textReadOnly,
|
|
1974
|
+
...inputProps?.inputProps
|
|
1975
|
+
}
|
|
1976
|
+
}
|
|
1977
|
+
}
|
|
1978
|
+
}
|
|
1979
|
+
);
|
|
1980
|
+
};
|
|
1981
|
+
var TimePickerElement2 = ({
|
|
1982
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
1983
|
+
...props
|
|
1984
|
+
}) => {
|
|
1985
|
+
if (gridProps) {
|
|
1986
|
+
return /* @__PURE__ */ jsx13(
|
|
1987
|
+
Grid12,
|
|
1988
|
+
{
|
|
1989
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
1990
|
+
children: /* @__PURE__ */ jsx13(Component10, { ...props })
|
|
1991
|
+
}
|
|
1992
|
+
);
|
|
1993
|
+
}
|
|
1994
|
+
return /* @__PURE__ */ jsx13(Component10, { ...props });
|
|
1995
|
+
};
|
|
1996
|
+
TimePickerElement2.displayName = "TimePickerElement";
|
|
1997
|
+
var TimePickerElement_default = TimePickerElement2;
|
|
1998
|
+
|
|
1999
|
+
// src/wrappers/AsyncSelect/AsyncSelectElement.tsx
|
|
2000
|
+
import { Autocomplete as Autocomplete5, CircularProgress as CircularProgress3, Grid as Grid13, TextField as TextField8, useTheme as useTheme10 } from "@mui/material";
|
|
2001
|
+
import { debounce as debounce2 } from "@mui/material/utils";
|
|
2002
|
+
import * as React7 from "react";
|
|
2003
|
+
import {
|
|
2004
|
+
Fragment as Fragment3,
|
|
2005
|
+
useCallback as useCallback7,
|
|
2006
|
+
useEffect as useEffect6,
|
|
2007
|
+
useMemo as useMemo7,
|
|
2008
|
+
useRef as useRef2,
|
|
2009
|
+
useState as useState4
|
|
2010
|
+
} from "react";
|
|
2011
|
+
import { useController as useController13 } from "react-hook-form";
|
|
2012
|
+
import { jsx as jsx14, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
2013
|
+
var Component11 = function AsyncSelectElement(props) {
|
|
2014
|
+
const {
|
|
2015
|
+
name,
|
|
2016
|
+
disabled,
|
|
2017
|
+
control,
|
|
2018
|
+
placeholder,
|
|
2019
|
+
initialValue,
|
|
2020
|
+
label,
|
|
2021
|
+
queryFn,
|
|
2022
|
+
variant,
|
|
2023
|
+
labelKey = "Label",
|
|
2024
|
+
valueKey = "Value",
|
|
2025
|
+
sx,
|
|
2026
|
+
...rest
|
|
2027
|
+
} = props;
|
|
2028
|
+
const {
|
|
2029
|
+
field,
|
|
2030
|
+
fieldState: { error }
|
|
2031
|
+
} = useController13({
|
|
2032
|
+
name,
|
|
2033
|
+
control
|
|
2034
|
+
});
|
|
2035
|
+
const theme = useTheme10();
|
|
2036
|
+
const [loading, setLoading] = useState4(false);
|
|
2037
|
+
const [selectedOption, setSelectedOption] = useState4(null);
|
|
2038
|
+
const [inputValue, setInputValue] = useState4("");
|
|
2039
|
+
const inputValue2 = useMemo7(() => inputValue, [inputValue]);
|
|
2040
|
+
const setInputValue2 = useCallback7(
|
|
2041
|
+
(newValue) => setInputValue(newValue),
|
|
2042
|
+
[]
|
|
2043
|
+
);
|
|
2044
|
+
const [options, setOptions] = useState4([]);
|
|
2045
|
+
const initialValueLoaded = useRef2(
|
|
2046
|
+
!initialValue ? true : !(initialValue != null)
|
|
2047
|
+
);
|
|
2048
|
+
const fieldValue = useRef2(field.value);
|
|
2049
|
+
const fetchData = useMemo7(
|
|
2050
|
+
() => debounce2(
|
|
2051
|
+
(payload, callback) => {
|
|
2052
|
+
queryFn(payload).then((c) => callback(c));
|
|
2053
|
+
},
|
|
2054
|
+
400
|
|
2055
|
+
),
|
|
2056
|
+
[queryFn]
|
|
2057
|
+
);
|
|
2058
|
+
const fillOptions = useCallback7((results) => {
|
|
2059
|
+
let newOptions = [];
|
|
2060
|
+
if (selectedOption) {
|
|
2061
|
+
newOptions = [selectedOption];
|
|
2062
|
+
}
|
|
2063
|
+
if (results) {
|
|
2064
|
+
newOptions = [...newOptions, ...results];
|
|
2065
|
+
}
|
|
2066
|
+
setOptions(newOptions);
|
|
2067
|
+
setLoading(false);
|
|
2068
|
+
}, [selectedOption]);
|
|
2069
|
+
useEffect6(() => {
|
|
2070
|
+
if (initialValueLoaded.current) return void 0;
|
|
2071
|
+
let active = true;
|
|
2072
|
+
const payload = {
|
|
2073
|
+
query: null,
|
|
2074
|
+
initialValue
|
|
2075
|
+
};
|
|
2076
|
+
setLoading(true);
|
|
2077
|
+
fetchData(payload, (results) => {
|
|
2078
|
+
if (active) {
|
|
2079
|
+
if (!!results && results.length > 0) {
|
|
2080
|
+
fillOptions(results?.filter((c) => c[valueKey] == initialValue));
|
|
2081
|
+
setSelectedOption(results[0]);
|
|
2082
|
+
field.onChange(results[0][valueKey]);
|
|
2083
|
+
fieldValue.current = results[0][valueKey];
|
|
2084
|
+
}
|
|
2085
|
+
initialValueLoaded.current = true;
|
|
2086
|
+
setLoading(false);
|
|
2087
|
+
}
|
|
2088
|
+
});
|
|
2089
|
+
return () => {
|
|
2090
|
+
active = false;
|
|
2091
|
+
};
|
|
2092
|
+
}, [initialValue, fetchData, field, fillOptions, valueKey]);
|
|
2093
|
+
React7.useEffect(() => {
|
|
2094
|
+
let active = true;
|
|
2095
|
+
if (inputValue2 === "" || initialValueLoaded.current === false) {
|
|
2096
|
+
setOptions(selectedOption ? [selectedOption] : []);
|
|
2097
|
+
setLoading(false);
|
|
2098
|
+
return void 0;
|
|
2099
|
+
}
|
|
2100
|
+
if (fieldValue.current) {
|
|
2101
|
+
if (field.value === fieldValue.current) {
|
|
2102
|
+
return void 0;
|
|
2103
|
+
}
|
|
2104
|
+
}
|
|
2105
|
+
setLoading(true);
|
|
2106
|
+
const payload = {
|
|
2107
|
+
query: inputValue2,
|
|
2108
|
+
initialValue: null
|
|
2109
|
+
};
|
|
2110
|
+
fetchData(payload, (results) => {
|
|
2111
|
+
if (active) {
|
|
2112
|
+
fillOptions(results);
|
|
2113
|
+
}
|
|
2114
|
+
});
|
|
2115
|
+
return () => {
|
|
2116
|
+
active = false;
|
|
2117
|
+
};
|
|
2118
|
+
}, [initialValue, inputValue2, fetchData, field.value, fillOptions, selectedOption]);
|
|
2119
|
+
const selectRef = useRef2(null);
|
|
2120
|
+
const handleChange = (_, newSelectedOption, reason) => {
|
|
2121
|
+
if (reason === "clear") {
|
|
2122
|
+
setSelectedOption(null);
|
|
2123
|
+
field.onChange(null);
|
|
2124
|
+
setLoading(false);
|
|
2125
|
+
} else if (reason === "selectOption" || reason === "removeOption") {
|
|
2126
|
+
if (newSelectedOption) {
|
|
2127
|
+
setSelectedOption(newSelectedOption);
|
|
2128
|
+
field.onChange(newSelectedOption[valueKey]);
|
|
2129
|
+
fieldValue.current = newSelectedOption[valueKey];
|
|
2130
|
+
setLoading(false);
|
|
2131
|
+
}
|
|
2132
|
+
}
|
|
2133
|
+
setOptions([]);
|
|
2134
|
+
setLoading(false);
|
|
2135
|
+
};
|
|
2136
|
+
useEffect6(() => {
|
|
2137
|
+
if (!field.value) {
|
|
2138
|
+
setInputValue("");
|
|
2139
|
+
setSelectedOption(null);
|
|
2140
|
+
setLoading(false);
|
|
2141
|
+
}
|
|
2142
|
+
}, [field.value]);
|
|
2143
|
+
const getOptionValue = (option) => {
|
|
2144
|
+
return option ? String(option[valueKey]) : "";
|
|
2145
|
+
};
|
|
2146
|
+
const getOptionLabel = (option) => {
|
|
2147
|
+
return option ? String(option[labelKey]) : "";
|
|
2148
|
+
};
|
|
2149
|
+
return /* @__PURE__ */ jsx14(
|
|
2150
|
+
Autocomplete5,
|
|
2151
|
+
{
|
|
2152
|
+
...rest,
|
|
2153
|
+
ref: selectRef,
|
|
2154
|
+
fullWidth: true,
|
|
2155
|
+
loading,
|
|
2156
|
+
getOptionLabel,
|
|
2157
|
+
getOptionKey: getOptionValue,
|
|
2158
|
+
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
2159
|
+
autoComplete: true,
|
|
2160
|
+
disabled,
|
|
2161
|
+
includeInputInList: true,
|
|
2162
|
+
options,
|
|
2163
|
+
filterOptions: (x) => x,
|
|
2164
|
+
value: selectedOption,
|
|
2165
|
+
filterSelectedOptions: true,
|
|
2166
|
+
onChange: handleChange,
|
|
2167
|
+
onInputChange: (_, newInputValue) => {
|
|
2168
|
+
setInputValue2(newInputValue);
|
|
2169
|
+
},
|
|
2170
|
+
noOptionsText: "Type Something...",
|
|
2171
|
+
renderInput: (params) => /* @__PURE__ */ jsx14(
|
|
2172
|
+
TextField8,
|
|
2173
|
+
{
|
|
2174
|
+
...params,
|
|
2175
|
+
label,
|
|
2176
|
+
error: !!error,
|
|
2177
|
+
helperText: error ? error.message : "",
|
|
2178
|
+
placeholder,
|
|
2179
|
+
slotProps: {
|
|
2180
|
+
input: {
|
|
2181
|
+
...params.InputProps,
|
|
2182
|
+
endAdornment: /* @__PURE__ */ jsxs6(Fragment3, { children: [
|
|
2183
|
+
loading ? /* @__PURE__ */ jsx14(CircularProgress3, { color: "inherit", size: 20 }) : null,
|
|
2184
|
+
params.InputProps.endAdornment
|
|
2185
|
+
] })
|
|
2186
|
+
}
|
|
2187
|
+
},
|
|
2188
|
+
variant: variant ? variant : "outlined",
|
|
2189
|
+
sx: {
|
|
2190
|
+
"& .MuiInputBase-input": {
|
|
2191
|
+
cursor: disabled ? "not-allowed" : "default"
|
|
2192
|
+
},
|
|
2193
|
+
bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
2194
|
+
...sx
|
|
2195
|
+
}
|
|
2196
|
+
}
|
|
2197
|
+
),
|
|
2198
|
+
renderOption: (renderProps, option) => {
|
|
2199
|
+
const { key, ...optionProps } = renderProps;
|
|
2200
|
+
return /* @__PURE__ */ jsx14("li", { ...optionProps, children: option[labelKey] }, key);
|
|
2201
|
+
}
|
|
2202
|
+
}
|
|
2203
|
+
);
|
|
2204
|
+
};
|
|
2205
|
+
var AsyncSelectElement2 = ({
|
|
2206
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
2207
|
+
...props
|
|
2208
|
+
}) => {
|
|
2209
|
+
if (gridProps) {
|
|
2210
|
+
return /* @__PURE__ */ jsx14(
|
|
2211
|
+
Grid13,
|
|
2212
|
+
{
|
|
2213
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
2214
|
+
children: /* @__PURE__ */ jsx14(Component11, { ...props })
|
|
2215
|
+
}
|
|
2216
|
+
);
|
|
2217
|
+
}
|
|
2218
|
+
return /* @__PURE__ */ jsx14(Component11, { ...props });
|
|
2219
|
+
};
|
|
2220
|
+
AsyncSelectElement2.displayName = "AsyncSelectElement";
|
|
2221
|
+
|
|
2222
|
+
// src/wrappers/Field/index.ts
|
|
2223
|
+
var Field = {
|
|
2224
|
+
Text: TextFieldElement_default,
|
|
2225
|
+
Checkbox: CheckboxElement2,
|
|
2226
|
+
Date: DatePickerElement,
|
|
2227
|
+
RadioGroup: RadioButtonGroup_default,
|
|
2228
|
+
Password: PasswordElement_default,
|
|
2229
|
+
Time: TimePickerElement_default,
|
|
2230
|
+
Select: SelectElement_default,
|
|
2231
|
+
SelectMulti: SelectMultiElement_default,
|
|
2232
|
+
SelectCascade: SelectCascadeElement_default,
|
|
2233
|
+
AsyncSelect,
|
|
2234
|
+
AsyncMultiSelect: AsyncMultiSelect2,
|
|
2235
|
+
CheckboxGroup: CheckboxGroup2
|
|
2236
|
+
};
|
|
2237
|
+
|
|
2238
|
+
export {
|
|
2239
|
+
AsyncMultiSelect2,
|
|
2240
|
+
CheckboxElement2 as CheckboxElement,
|
|
2241
|
+
CheckboxGroup2 as CheckboxGroup,
|
|
2242
|
+
readDatePickerValueAsDate,
|
|
2243
|
+
useDatePickerValue,
|
|
2244
|
+
useDatePickerValidation,
|
|
2245
|
+
useDatePickerStyles,
|
|
2246
|
+
DatePickerElementCore,
|
|
2247
|
+
DatePickerElement,
|
|
2248
|
+
isValidDate,
|
|
2249
|
+
isParsableDateString,
|
|
2250
|
+
createDateInputTransform,
|
|
2251
|
+
createDateOutputTransform,
|
|
2252
|
+
createDefaultDatePickerConfig,
|
|
2253
|
+
extractErrorMessage,
|
|
2254
|
+
createStableKey,
|
|
2255
|
+
PasswordElement_default,
|
|
2256
|
+
RadioButtonGroup_default,
|
|
2257
|
+
SelectCascadeElement_default,
|
|
2258
|
+
SelectElement_default,
|
|
2259
|
+
SelectMultiElement_default,
|
|
2260
|
+
TextFieldElement_default,
|
|
2261
|
+
EnhancedTextFieldElement2 as EnhancedTextFieldElement,
|
|
2262
|
+
TimePickerElement_default,
|
|
2263
|
+
Field
|
|
2264
|
+
};
|
|
2265
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL0FzeW5jTXVsdGlTZWxlY3QyL0FzeW5jTXVsdGlTZWxlY3QyLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hFbGVtZW50L0NoZWNrYm94RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnRDb3JlLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclN0eWxlcy50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCAiLi4vc3JjL3dyYXBwZXJzL1Bhc3N3b3JkRWxlbWVudC9QYXNzd29yZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdEVsZW1lbnQvU2VsZWN0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdE11bHRpRWxlbWVudC9TZWxlY3RNdWx0aUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L0VuaGFuY2VkVGV4dEZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1RpbWVQaWNrZXJFbGVtZW50L1RpbWVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNTZWxlY3QvQXN5bmNTZWxlY3RFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRmllbGQvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIEF1dG9jb21wbGV0ZSxcbiAgQ2lyY3VsYXJQcm9ncmVzcyxcbiAgR3JpZCxcbiAgVGV4dEZpZWxkLFxuICB1c2VUaGVtZSxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZHVjZXIsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNNdWx0aVNlbGVjdDJQcm9wcywgQXN5bmNTZWxlY3QyUGF5bG9hZCwgT3B0aW9uMkl0ZW0gfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5pbnRlcmZhY2UgQ29tcG9uZW50U3RhdGUge1xuICBvcHRpb25zOiBPcHRpb24ySXRlbVtdO1xuICBzZWxlY3RlZE9wdGlvbnM6IE9wdGlvbjJJdGVtW107XG4gIGlucHV0VmFsdWU6IHN0cmluZztcbiAgbG9hZGluZzogYm9vbGVhbjtcbiAgaW5pdGlhbExvYWRlZDogYm9vbGVhbjtcbn1cblxudHlwZSBDb21wb25lbnRBY3Rpb24gPVxuICB8IHsgdHlwZTogXCJTRVRfT1BUSU9OU1wiOyBwYXlsb2FkOiBPcHRpb24ySXRlbVtdIH1cbiAgfCB7IHR5cGU6IFwiU0VUX1NFTEVDVEVEX09QVElPTlNcIjsgcGF5bG9hZDogT3B0aW9uMkl0ZW1bXSB9XG4gIHwgeyB0eXBlOiBcIlNFVF9JTlBVVF9WQUxVRVwiOyBwYXlsb2FkOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJTRVRfTE9BRElOR1wiOyBwYXlsb2FkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6IFwiU0VUX0lOSVRJQUxfTE9BREVEXCI7IHBheWxvYWQ6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJSRVNFVF9PUFRJT05TXCIgfTtcblxuY29uc3QgaW5pdGlhbFN0YXRlOiBDb21wb25lbnRTdGF0ZSA9IHtcbiAgb3B0aW9uczogW10sXG4gIHNlbGVjdGVkT3B0aW9uczogW10sXG4gIGlucHV0VmFsdWU6IFwiXCIsXG4gIGxvYWRpbmc6IGZhbHNlLFxuICBpbml0aWFsTG9hZGVkOiBmYWxzZSxcbn07XG5cbmZ1bmN0aW9uIGNvbXBvbmVudFJlZHVjZXIoc3RhdGU6IENvbXBvbmVudFN0YXRlLCBhY3Rpb246IENvbXBvbmVudEFjdGlvbik6IENvbXBvbmVudFN0YXRlIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgXCJTRVRfT1BUSU9OU1wiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIG9wdGlvbnM6IGFjdGlvbi5wYXlsb2FkLCBsb2FkaW5nOiBmYWxzZSB9O1xuICAgIGNhc2UgXCJTRVRfU0VMRUNURURfT1BUSU9OU1wiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHNlbGVjdGVkT3B0aW9uczogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlIFwiU0VUX0lOUFVUX1ZBTFVFXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgaW5wdXRWYWx1ZTogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlIFwiU0VUX0xPQURJTkdcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBsb2FkaW5nOiBhY3Rpb24ucGF5bG9hZCB9O1xuICAgIGNhc2UgXCJTRVRfSU5JVElBTF9MT0FERURcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBpbml0aWFsTG9hZGVkOiBhY3Rpb24ucGF5bG9hZCB9O1xuICAgIGNhc2UgXCJSRVNFVF9PUFRJT05TXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgb3B0aW9uczogc3RhdGUuc2VsZWN0ZWRPcHRpb25zIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5jb25zdCBBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+XG4+KHtcbiAgbmFtZSxcbiAgY29udHJvbCxcbiAgcGxhY2Vob2xkZXIsXG4gIGluaXRpYWxWYWx1ZXMsXG4gIGxhYmVsLFxuICBxdWVyeUZuLFxuICB2YXJpYW50ID0gXCJvdXRsaW5lZFwiLFxuICBzeCxcbiAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgZGVib3VuY2VNcyA9IDQwMCxcbiAgbG9hZGluZ1RleHQgPSBcIkxvYWRpbmcuLi5cIixcbiAgbm9PcHRpb25zVGV4dCA9IFwiTm8gb3B0aW9uc1wiLFxuICByZW5kZXJJbnB1dCxcbiAgLi4ucmVzdFxufTogQXN5bmNNdWx0aVNlbGVjdDJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICBjb25zdCBbc3RhdGUsIGRpc3BhdGNoXSA9IHVzZVJlZHVjZXIoY29tcG9uZW50UmVkdWNlciwgaW5pdGlhbFN0YXRlKTtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGRlYm91bmNlZEZldGNoID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoYXN5bmMgKHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnlGbihwYXlsb2FkKTtcblxuICAgICAgICAgIC8vIE1lcmdlIHNlbGVjdGVkIG9wdGlvbnMgd2l0aCBzZWFyY2ggcmVzdWx0cywgYXZvaWRpbmcgZHVwbGljYXRlc1xuICAgICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSBbXG4gICAgICAgICAgICAuLi5zdGF0ZS5zZWxlY3RlZE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5yZXN1bHRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKG9wdGlvbikgPT4gIXN0YXRlLnNlbGVjdGVkT3B0aW9ucy5zb21lKChzZWxlY3RlZCkgPT4gc2VsZWN0ZWQudmFsdWUgPT09IG9wdGlvbi52YWx1ZSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfT1BUSU9OU1wiLCBwYXlsb2FkOiBtZXJnZWRPcHRpb25zIH0pO1xuICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGRlYm91bmNlTXMpLFxuICAgIFtxdWVyeUZuLCBzdGF0ZS5zZWxlY3RlZE9wdGlvbnMsIGRlYm91bmNlTXNdXG4gICk7XG5cbiAgLy8gTG9hZCBpbml0aWFsIHZhbHVlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaW5pdGlhbFZhbHVlcz8ubGVuZ3RoIHx8IHN0YXRlLmluaXRpYWxMb2FkZWQpIHJldHVybjtcblxuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfTE9BRElOR1wiLCBwYXlsb2FkOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNTZWxlY3QyUGF5bG9hZCA9IHtcbiAgICAgIHF1ZXJ5OiBudWxsLFxuICAgICAgaW5pdGlhbFZhbHVlcyxcbiAgICB9O1xuXG4gICAgcXVlcnlGbihwYXlsb2FkKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX1NFTEVDVEVEX09QVElPTlNcIiwgcGF5bG9hZDogcmVzdWx0cyB9KTtcbiAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9PUFRJT05TXCIsIHBheWxvYWQ6IHJlc3VsdHMgfSk7XG4gICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfSU5JVElBTF9MT0FERURcIiwgcGF5bG9hZDogdHJ1ZSB9KTtcbiAgICAgICAgZmllbGQub25DaGFuZ2UocmVzdWx0cy5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKSk7XG4gICAgICB9XG5cbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfTE9BRElOR1wiLCBwYXlsb2FkOiBmYWxzZSB9KTtcbiAgICB9KS5jYXRjaCgoX2Vycm9yKSA9PiB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH0sIFtpbml0aWFsVmFsdWVzLCBzdGF0ZS5pbml0aWFsTG9hZGVkLCBxdWVyeUZuLCBmaWVsZF0pO1xuXG4gIC8vIEhhbmRsZSBzZWFyY2ggaW5wdXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc3RhdGUuaW5pdGlhbExvYWRlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YXRlLmlucHV0VmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJSRVNFVF9PUFRJT05TXCIgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogc3RhdGUuaW5wdXRWYWx1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZXM6IG51bGwsXG4gICAgfTtcblxuICAgIGRlYm91bmNlZEZldGNoKHBheWxvYWQpO1xuICB9LCBbc3RhdGUuaW5wdXRWYWx1ZSwgc3RhdGUuaW5pdGlhbExvYWRlZCwgZGVib3VuY2VkRmV0Y2hdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdWYWx1ZTogT3B0aW9uMkl0ZW1bXSkgPT4ge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9TRUxFQ1RFRF9PUFRJT05TXCIsIHBheWxvYWQ6IG5ld1ZhbHVlIH0pO1xuICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSkpO1xuICAgIH0sXG4gICAgW2ZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3SW5wdXRWYWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0lOUFVUX1ZBTFVFXCIsIHBheWxvYWQ6IG5ld0lucHV0VmFsdWUgfSk7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGlzT3B0aW9uRXF1YWxUb1ZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogT3B0aW9uMkl0ZW0sIHZhbHVlOiBPcHRpb24ySXRlbSkgPT4gb3B0aW9uLnZhbHVlID09PSB2YWx1ZS52YWx1ZSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soKG9wdGlvbjogT3B0aW9uMkl0ZW0pID0+IG9wdGlvbi5sYWJlbCwgW10pO1xuXG4gIGNvbnN0IGRlZmF1bHRSZW5kZXJJbnB1dCA9IHVzZUNhbGxiYWNrKFxuICAgIChwYXJhbXM6IFBhcmFtZXRlcnM8UmVxdWlyZWQ8QXN5bmNNdWx0aVNlbGVjdDJQcm9wcz5bXCJyZW5kZXJJbnB1dFwiXT5bMF0pID0+IChcbiAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnR9XG4gICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICBoZWxwZXJUZXh0PXtlcnJvcj8ubWVzc2FnZX1cbiAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAge3N0YXRlLmxvYWRpbmcgJiYgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+fVxuICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9fVxuICAgICAgICBzeD17e1xuICAgICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyBcIm5vdC1hbGxvd2VkXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgLi4uc3gsXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgICksXG4gICAgW2xhYmVsLCBwbGFjZWhvbGRlciwgdmFyaWFudCwgZXJyb3IsIHN0YXRlLmxvYWRpbmcsIGRpc2FibGVkLCB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsIHN4XVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgbXVsdGlwbGVcbiAgICAgIG9wdGlvbnM9e3N0YXRlLm9wdGlvbnN9XG4gICAgICB2YWx1ZT17c3RhdGUuc2VsZWN0ZWRPcHRpb25zfVxuICAgICAgbG9hZGluZz17c3RhdGUubG9hZGluZ31cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXtpc09wdGlvbkVxdWFsVG9WYWx1ZX1cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgbG9hZGluZ1RleHQ9e2xvYWRpbmdUZXh0fVxuICAgICAgbm9PcHRpb25zVGV4dD17bm9PcHRpb25zVGV4dH1cbiAgICAgIHJlbmRlcklucHV0PXtyZW5kZXJJbnB1dCB8fCBkZWZhdWx0UmVuZGVySW5wdXR9XG4gICAgICB7Li4ucmVzdH1cbiAgICAvPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNNdWx0aVNlbGVjdDIgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPlxuPih7XG4gIGdyaWRQcm9wcyxcbiAgLi4ucHJvcHNcbn06IEFzeW5jTXVsdGlTZWxlY3QyUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fT5cbiAgICAgICAgPEFzeW5jTXVsdGlTZWxlY3QyQ29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuQXN5bmNNdWx0aVNlbGVjdDIuZGlzcGxheU5hbWUgPSBcIkFzeW5jTXVsdGlTZWxlY3QyXCI7XG5cbmV4cG9ydCB7IEFzeW5jTXVsdGlTZWxlY3QyIH07XG4iLCAiaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxuICB1c2VUaGVtZSxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZVxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihcbiAgcHJvcHM6IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBsYWJlbFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgZGlzYWJsZWQsXG4gICAgc3gsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkLFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIGJvb2xlYW4+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogKHZhbHVlKSA9PiAhIXZhbHVlLFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdHJhbnNmb3JtLm91dHB1dFxuICAgICAgICAgIDogKGNoZWNrZWQpID0+IGNoZWNrZWQgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4sIGNoZWNrZWQ6IGJvb2xlYW4pID0+IHtcbiAgICBvbkNoYW5nZShldmVudCwgY2hlY2tlZCk7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjdXN0b21PbkNoYW5nZShldmVudCwgY2hlY2tlZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRpc3BsYXlFcnJvcjogUmVhY3ROb2RlID0gZXJyb3JcbiAgICA/IHR5cGVvZiBwYXJzZUVycm9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gcGFyc2VFcnJvcihlcnJvcilcbiAgICAgIDogZXJyb3IubWVzc2FnZVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0gZGlzYWJsZWQ9e2Rpc2FibGVkfT5cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgIGxhYmVsPXtsYWJlbCB8fCBcIlwifVxuICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgY29sb3I9e3Jlc3QuY29sb3IgfHwgXCJwcmltYXJ5XCJ9XG4gICAgICAgICAgICAgIHN4PXtbXG4gICAgICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc3gpID8gc3ggOiBbc3hdKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW5cbiAgICAgICAgICAgICAgICAgICAgOiBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIFwiJi5NdWktZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF19XG4gICAgICAgICAgICAgIGNoZWNrZWQ9e3ZhbHVlfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIHsoZGlzcGxheUVycm9yIHx8IGhlbHBlclRleHQpICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7ZGlzcGxheUVycm9yIHx8IGhlbHBlclRleHR9XG4gICAgICAgIDwvRm9ybUhlbHBlclRleHQ+XG4gICAgICApfVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQ2hlY2tib3ggY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24gYW5kIGdyaWQgbGF5b3V0LlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBjaGVja2JveCBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIG9wdGlvbmFsIEdyaWQgd3JhcHBlciBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvbiB3aXRoIHVzZUNvbnRyb2xsZXJcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZyBzdXBwb3J0XG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHdpdGggdXNlVHJhbnNmb3JtIGhvb2sgZm9yIGJvb2xlYW4gdmFsdWVzXG4gKiAtIEN1c3RvbWl6YWJsZSBsYWJlbCBhbmQgcG9zaXRpb25pbmdcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlciB3aXRoIHJlc3BvbnNpdmUgZGVzaWduXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHkgd2l0aCBnZW5lcmljIGNvbnN0cmFpbnRzXG4gKiAtIERpc2FibGVkIHN0YXRlIHN1cHBvcnQgd2l0aCBwcm9wZXIgdGhlbWluZ1xuICogLSBIZWxwZXIgdGV4dCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIGNvbnRleHRcbiAqIC0gQ3VzdG9tIGVycm9yIHBhcnNpbmcgZm9yIGludGVybmF0aW9uYWxpemF0aW9uXG4gKiAtIFNpbXBsZSBib29sZWFuIHZhbHVlIGhhbmRsaW5nIHdpdGggb3B0aW9uYWwgY3VzdG9tIHRyYW5zZm9ybXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFjY2VwdFRlcm1zXCJcbiAqICAgbGFiZWw9XCJJIGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1wiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggdmFsaWRhdGlvbiBhbmQgaGVscGVyIHRleHQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cIm5ld3NsZXR0ZXJcIlxuICogICBsYWJlbD1cIlN1YnNjcmliZSB0byBuZXdzbGV0dGVyXCJcbiAqICAgaGVscGVyVGV4dD1cIllvdSBjYW4gdW5zdWJzY3JpYmUgYXQgYW55IHRpbWVcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ1BsZWFzZSBhY2NlcHQgdG8gY29udGludWUnIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBncmlkIGxheW91dCBhbmQgc3R5bGluZzpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiaXNQdWJsaWNcIlxuICogICBsYWJlbD1cIk1ha2UgdGhpcyBwdWJsaWNcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgbGFiZWxQcm9wcz17eyBzeDogeyBmb250V2VpZ2h0OiAnYm9sZCcgfSB9fVxuICogICBzeD17eyBjb2xvcjogJ3ByaW1hcnkubWFpbicgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiAoc3RyaW5nIHRvIGJvb2xlYW4pOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJzdGF0dXNcIlxuICogICBsYWJlbD1cIkFjdGl2ZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID09PSAnYWN0aXZlJyxcbiAqICAgICBvdXRwdXQ6IChjaGVja2VkKSA9PiBjaGVja2VkID8gJ2FjdGl2ZScgOiAnaW5hY3RpdmUnXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFNpbXBsZSBib29sZWFuIGZpZWxkOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc0VuYWJsZWRcIlxuICogICBsYWJlbD1cIkVuYWJsZSBmZWF0dXJlXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGVycm9yIHBhcnNpbmcgZm9yIGludGVybmF0aW9uYWxpemF0aW9uOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ0ZXJtc1wiXG4gKiAgIGxhYmVsPVwiQWNjZXB0IFRlcm1zXCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiB0KGB2YWxpZGF0aW9uLiR7ZXJyb3IudHlwZX1gLCB7IGZpZWxkOiAnVGVybXMnIH0pfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2hlY2tib3hFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lPiB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWU+IHsuLi5wcm9wc30gLz47XG59O1xuXG5DaGVja2JveEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIkNoZWNrYm94RWxlbWVudFwiO1xuXG5leHBvcnQgeyBDaGVja2JveEVsZW1lbnQgfTtcblxuZXhwb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBDaGVja2JveFByb3BzLFxuICBGb3JtQ29udHJvbExhYmVsUHJvcHMsXG4gIEdyaWRQcm9wc1xufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlc1xufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmV4cG9ydCB0eXBlIENoZWNrYm94R3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBudW1iZXJbXSA9IG51bWJlcltdXG4+ID0gT21pdDxDaGVja2JveFByb3BzLCBcIm5hbWVcIj4gJiB7XG4gIG5hbWU6IFROYW1lO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBsYWJlbD86IEZvcm1Db250cm9sTGFiZWxQcm9wc1tcImxhYmVsXCJdO1xuICBsYWJlbFByb3BzPzogT21pdDxGb3JtQ29udHJvbExhYmVsUHJvcHMsIFwibGFiZWxcIiB8IFwiY29udHJvbFwiPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBvcHRpb25zOiBBcnJheTx7IFZhbHVlOiBudW1iZXI7IExhYmVsOiBzdHJpbmcgfT47XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBDaGVja2JveEdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIG51bWJlcltdID0gbnVtYmVyW11cbj4ocHJvcHM6IENoZWNrYm94R3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHsgbmFtZSwgY29udHJvbCwgbGFiZWwsIGxhYmVsUHJvcHMsIGlucHV0UmVmLCBvcHRpb25zLCAuLi5yZXN0IH0gPVxuICAgIHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQ6IHJlc3QuZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGNvbnN0IFtzZWxlY3RlZFZhbHVlcywgc2V0U2VsZWN0ZWRWYWx1ZXNdID0gdXNlU3RhdGU8bnVtYmVyW10+KFxuICAgIG9wdGlvbnMuZmlsdGVyKChjKSA9PiBmaWVsZC52YWx1ZT8uaW5jbHVkZXMoYy5WYWx1ZSkpLm1hcCgoYykgPT4gYy5WYWx1ZSkgfHxcbiAgICBbXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZmllbGQub25DaGFuZ2Uoc2VsZWN0ZWRWYWx1ZXMgPyBbLi4uc2VsZWN0ZWRWYWx1ZXNdIDogW10pO1xuICB9LCBbc2VsZWN0ZWRWYWx1ZXNdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChldmVudC50YXJnZXQudmFsdWUsIDEwKTtcblxuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZXMoWy4uLnNlbGVjdGVkVmFsdWVzLCB2YWx1ZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTZWxlY3RlZFZhbHVlcyhzZWxlY3RlZFZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHZhbHVlKSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICB7b3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICBrZXk9e2Ake29wdGlvbi5WYWx1ZX1gfVxuICAgICAgICAgICAgbGFiZWw9e29wdGlvbi5MYWJlbH1cbiAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICAgIGNvbG9yPXtyZXN0LmNvbG9yIHx8IFwicHJpbWFyeVwifVxuICAgICAgICAgICAgICAgIHN4PXtbXG4gICAgICAgICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShyZXN0LnN4KSA/IHJlc3Quc3ggOiBbcmVzdC5zeF0pLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPyBcImVycm9yLm1haW5cIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uLlZhbHVlfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkVmFsdWVzLmluY2x1ZGVzKG9wdGlvbi5WYWx1ZSl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT57ZXJyb3IubWVzc2FnZX08L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuY29uc3QgQ2hlY2tib3hHcm91cCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBudW1iZXJbXSA9IG51bWJlcltdXG4+KHtcbiAgZ3JpZFByb3BzLFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hHcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5DaGVja2JveEdyb3VwLmRpc3BsYXlOYW1lID0gXCJDaGVja2JveEdyb3VwXCI7XG5cbmV4cG9ydCB7IENoZWNrYm94R3JvdXAgfTtcblxuIiwgImltcG9ydCB7IEdyaWQgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9IGZyb20gXCIuL0RhdGVQaWNrZXJFbGVtZW50Q29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBBIGZ1bGx5LWZlYXR1cmVkLCB0eXBlLXNhZmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IGZvciByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgY29tYmluZXMgdGhlIGNvcmUgZGF0ZSBwaWNrZXIgZnVuY3Rpb25hbGl0eSB3aXRoIG9wdGlvbmFsIEdyaWQgbGF5b3V0IHdyYXBwaW5nLFxuICogcHJvdmlkaW5nIGEgY29tcGxldGUgc29sdXRpb24gZm9yIGZvcm0tYmFzZWQgZGF0ZSBzZWxlY3Rpb24gd2l0aCBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydC5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIFx1RDgzQ1x1REZBRiAqKlR5cGUgU2FmZXR5Kio6IEZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIGZvcm0gZmllbGQgdHlwZXMgYW5kIGRhdGUgdmFsdWVzXG4gKiAtIFx1RDgzRFx1REQyNyAqKlJlYWN0IEhvb2sgRm9ybSBJbnRlZ3JhdGlvbioqOiBTZWFtbGVzcyBpbnRlZ3JhdGlvbiB3aXRoIHJlYWN0LWhvb2stZm9ybSB2YWxpZGF0aW9uXG4gKiAtIFx1RDgzQ1x1REZBOCAqKlRoZW1pbmcqKjogQXV0b21hdGljIGFkYXB0YXRpb24gdG8gTVVJIHRoZW1lIHdpdGggY3VzdG9taXphYmxlIHN0eWxlc1xuICogLSBcdTI2N0YgKipBY2Nlc3NpYmlsaXR5Kio6IFdDQUctY29tcGxpYW50IHdpdGggcHJvcGVyIEFSSUEgYXR0cmlidXRlcyBhbmQga2V5Ym9hcmQgbmF2aWdhdGlvblxuICogLSBcdUQ4M0RcdURFODAgKipQZXJmb3JtYW5jZSoqOiBPcHRpbWl6ZWQgd2l0aCBtZW1vaXphdGlvbiBhbmQgZWZmaWNpZW50IHJlLXJlbmRlcmluZ1xuICogLSBcdUQ4M0RcdURDRjEgKipSZXNwb25zaXZlKio6IEJ1aWx0LWluIEdyaWQgbGF5b3V0IHdpdGggY29uZmlndXJhYmxlIGJyZWFrcG9pbnRzXG4gKiAtIFx1RDgzRFx1REVFMVx1RkUwRiAqKlZhbGlkYXRpb24qKjogQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIFx1RDgzRFx1REQwNCAqKlRyYW5zZm9ybWF0aW9uKio6IEZsZXhpYmxlIHZhbHVlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gZm9ybSBhbmQgcGlja2VyIGZvcm1hdHNcbiAqIC0gXHVEODNEXHVEQ0RBICoqRGV2ZWxvcGVyIEV4cGVyaWVuY2UqKjogUmljaCBUeXBlU2NyaXB0IEludGVsbGlTZW5zZSBhbmQgY29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIEdyaWQgd3JhcHBlcjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlRm9ybSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG4gKiBpbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gJ0BnbndlYnNvZnQvdWkvd3JhcHBlcnMnO1xuICpcbiAqIGZ1bmN0aW9uIE15Rm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgYmlydGhEYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICBuYW1lPVwiYmlydGhEYXRlXCJcbiAqICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICAgICAgcmVxdWlyZWRcbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uIGFuZCB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBZHZhbmNlZEZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IHN0YXJ0RGF0ZTogRGF0ZSB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiUHJvamVjdCBTdGFydCBEYXRlXCJcbiAqICAgICAgIHRyYW5zZm9ybT17e1xuICogICAgICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgICAgICB9fVxuICogICAgICAgdmFsaWRhdGlvbj17e1xuICogICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgICAgICBtYXhEYXRlOiBhZGRZZWFycyhuZXcgRGF0ZSgpLCAyKSxcbiAqICAgICAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInLFxuICogICAgICAgICAgIG1heERhdGU6ICdTdGFydCBkYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMiB5ZWFycyBpbiB0aGUgZnV0dXJlJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgICAgICBzeD17e1xuICogICAgICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aG91dCBHcmlkIHdyYXBwZXIgZm9yIGN1c3RvbSBsYXlvdXRzOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBDdXN0b21MYXlvdXQoKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IGV2ZW50RGF0ZTogc3RyaW5nIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxCb3ggZGlzcGxheT1cImZsZXhcIiBnYXA9ezJ9PlxuICogICAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICAgIG5hbWU9XCJldmVudERhdGVcIlxuICogICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgICBsYWJlbD1cIkV2ZW50IERhdGVcIlxuICogICAgICAgICBncmlkUHJvcHM9e2ZhbHNlfSAvLyBEaXNhYmxlcyBHcmlkIHdyYXBwZXJcbiAqICAgICAgIC8+XG4gKiAgICAgICA8QnV0dG9uIHR5cGU9XCJzdWJtaXRcIj5TdWJtaXQ8L0J1dHRvbj5cbiAqICAgICA8L0JveD5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGxvYWRpbmcgc3RhdGUgYW5kIGN1c3RvbSBlcnJvciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gTG9hZGluZ0Zvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybSgpO1xuICogICBjb25zdCBbaXNWYWxpZGF0aW5nLCBzZXRJc1ZhbGlkYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJhcHBvaW50bWVudERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiQXBwb2ludG1lbnQgRGF0ZVwiXG4gKiAgICAgICBsb2FkaW5nPXtpc1ZhbGlkYXRpbmd9XG4gKiAgICAgICBMb2FkaW5nQ29tcG9uZW50PXsoKSA9PiA8Q2lyY3VsYXJQcm9ncmVzcyBzaXplPXsyMH0gLz59XG4gKiAgICAgICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHtcbiAqICAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3I/LnR5cGUgPT09ICdjdXN0b20nKSB7XG4gKiAgICAgICAgICAgcmV0dXJuICdUaGlzIGRhdGUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBhcHBvaW50bWVudCc7XG4gKiAgICAgICAgIH1cbiAqICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBkYXRlJztcbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZSAoaW5mZXJyZWQgZnJvbSBjb250cm9sKVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZSAoaW5mZXJyZWQgZnJvbSBuYW1lIHByb3ApXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGUgKGluZmVycmVkIGZyb20gdHJhbnNmb3JtIGZ1bmN0aW9ucylcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyB3aXRoIGZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2VcbiAqIEBwYXJhbSByZWYgLSBGb3J3YXJkIHJlZiBmb3IgdGhlIHJvb3QgZWxlbWVudCAoR3JpZCBvciBEYXRlUGlja2VyIGNvbnRhaW5lcilcbiAqIEByZXR1cm5zIFJlbmRlcmVkIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudCA9IGZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBEYXRlUGlja2VyRWxlbWVudFByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSwgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAgIC4uLmNvcmVQcm9wc1xuICB9ID0gcHJvcHM7XG5cbiAgLy8gSWYgZ3JpZFByb3BzIGlzIGV4cGxpY2l0bHkgZmFsc2UsIHJlbmRlciB3aXRob3V0IEdyaWQgd3JhcHBlclxuICBpZiAoZ3JpZFByb3BzID09PSBmYWxzZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICApO1xuICB9XG5cbiAgLy8gUmVuZGVyIHdpdGggR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dFxuICByZXR1cm4gKFxuICAgIDxHcmlkXG4gICAgICByZWY9e3JlZn1cbiAgICAgIHsuLi5ncmlkUHJvcHN9XG4gICAgPlxuICAgICAgPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59KTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgUmVhY3QgRGV2ZWxvcGVyIFRvb2xzXG5EYXRlUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiRGF0ZVBpY2tlckVsZW1lbnRcIjtcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlckVsZW1lbnQ7XG4iLCAiaW1wb3J0IHsgdXNlRm9ya1JlZiB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyBEYXRlUGlja2VyIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG4gIFBpY2tlclZhbGlkRGF0ZSxcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIEZpZWxkUGF0aCB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHtcbiAgdXNlRGF0ZVBpY2tlclZhbHVlLFxuICB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbixcbiAgdXNlRGF0ZVBpY2tlclN0eWxlcyxcbn0gZnJvbSBcIi4vaG9va3NcIjtcbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFRoZSBjb3JlIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRob3V0IEdyaWQgd3JhcHBlci5cbiAqXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQsIHBlcmZvcm1hbnQgZGF0ZSBwaWNrZXIgY29tcG9uZW50IHRoYXQgaW50ZWdyYXRlcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSB3aGlsZSBwcm92aWRpbmcgY29tcHJlaGVuc2l2ZSBUeXBlU2NyaXB0IHN1cHBvcnQgYW5kXG4gKiBhY2Nlc3NpYmlsaXR5IGZlYXR1cmVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzXG4gKiAtIEF1dG9tYXRpYyB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIENvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlc1xuICogLSBUaGVtZS1hd2FyZSBzdHlsaW5nIHdpdGggYWNjZXNzaWJpbGl0eSBzdXBwb3J0XG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXplZCB3aXRoIHByb3BlciBtZW1vaXphdGlvblxuICogLSBGb3J3YXJkIHJlZiBzdXBwb3J0IGZvciBhZHZhbmNlZCB1c2UgY2FzZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAqICAgbmFtZT1cImJpcnRoRGF0ZVwiXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgIHJlcXVpcmVkXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIlN0YXJ0IERhdGVcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfX1cbiAqICAgdmFsaWRhdGlvbj17e1xuICogICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcidcbiAqICAgICB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudENvcmUgPSBmb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPig8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSwgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIHJlcXVpcmVkID0gZmFsc2UsXG4gICAgcnVsZXMsXG4gICAgY29udHJvbCxcbiAgICBwYXJzZUVycm9yLFxuICAgIHRyYW5zZm9ybSxcbiAgICB2YWxpZGF0aW9uLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRSZWFkT25seSA9IGZhbHNlLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRQcm9wcyA9IHt9LFxuICAgIHNsb3RQcm9wcyA9IHt9LFxuICAgIGRhdGVQaWNrZXJQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQgPSBcIm91dGxpbmVkXCIsXG4gICAgc3g6IGN1c3RvbVN4LFxuICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICBMb2FkaW5nQ29tcG9uZW50LFxuICAgIC4uLnJlc3RQcm9wc1xuICB9ID0gcHJvcHM7XG5cbiAgLy8gRXh0cmFjdCBEYXRlUGlja2VyLXNwZWNpZmljIHByb3BzXG4gIGNvbnN0IHtcbiAgICBkaXNhYmxlZCxcbiAgICBpbnB1dFJlZjogZXh0ZXJuYWxJbnB1dFJlZixcbiAgICBvbkNsb3NlLFxuICAgIC4uLnJlc3REYXRlUGlja2VyUHJvcHNcbiAgfSA9IGRhdGVQaWNrZXJQcm9wcztcblxuICAvLyBTZXQgdXAgZm9ybSBjb250cm9sbGVyXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlLFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIHJ1bGVzLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbCBhcyBhbnksIC8vIExldCByZWFjdC1ob29rLWZvcm0gaGFuZGxlIHRoZSBkZWZhdWx0IHZhbHVlIHR5cGluZ1xuICB9KTtcblxuICAvLyBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBob29rXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlOiBvblZhbHVlQ2hhbmdlIH0gPSB1c2VEYXRlUGlja2VyVmFsdWUoe1xuICAgIGZpZWxkLFxuICAgIHRyYW5zZm9ybSxcbiAgfSk7XG5cbiAgLy8gVmFsaWRhdGlvbiBob29rXG4gIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSwgaW52YWxpZCB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICAgIGZpZWxkU3RhdGUsXG4gICAgdmFsaWRhdGlvbixcbiAgICBwYXJzZUVycm9yLFxuICAgIHZhbHVlLFxuICB9KTtcblxuICAvLyBTdHlsaW5nIGhvb2tcbiAgY29uc3QgeyBzeDogY29tcHV0ZWRTeCwgY2xhc3NOYW1lIH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAgICBkaXNhYmxlZCxcbiAgICBoYXNFcnJvcixcbiAgICBsb2FkaW5nLFxuICAgIHRleHRSZWFkT25seSxcbiAgICBzeDogY3VzdG9tU3gsXG4gIH0pO1xuXG4gIC8vIE1lcmdlIGlucHV0IHJlZnNcbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgZXh0ZXJuYWxJbnB1dFJlZik7XG5cbiAgLy8gTWVtb2l6ZWQgY2hhbmdlIGhhbmRsZXIgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCwgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj4pID0+IHtcbiAgICAgIG9uVmFsdWVDaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgIH0sXG4gICAgW29uVmFsdWVDaGFuZ2VdXG4gICk7XG5cbiAgLy8gTWVtb2l6ZWQgY2xvc2UgaGFuZGxlclxuICBjb25zdCBoYW5kbGVDbG9zZSA9IHVzZUNhbGxiYWNrKFxuICAgICguLi5hcmdzOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPHR5cGVvZiBvbkNsb3NlPj4pID0+IHtcbiAgICAgIC8vIFRyaWdnZXIgZm9ybSBmaWVsZCBibHVyIGZvciB2YWxpZGF0aW9uXG4gICAgICBmaWVsZC5vbkJsdXIoKTtcblxuICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkNsb3NlIGlmIHByb3ZpZGVkXG4gICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICBvbkNsb3NlKC4uLmFyZ3MpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLm9uQmx1ciwgb25DbG9zZV1cbiAgKTtcblxuICAvLyBNZW1vaXplZCBibHVyIGhhbmRsZXIgZm9yIHRleHQgZmllbGRcbiAgY29uc3QgaGFuZGxlVGV4dEZpZWxkQmx1ciA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25CbHVyIGlmIHByb3ZpZGVkXG4gICAgICBpZiAodHlwZW9mIGlucHV0UHJvcHMub25CbHVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLm9uQmx1ciwgaW5wdXRQcm9wcy5vbkJsdXJdXG4gICk7XG5cbiAgLy8gTWVtb2l6ZWQgc2xvdCBwcm9wcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgY29uc3QgbWVtb2l6ZWRTbG90UHJvcHMgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgLi4uc2xvdFByb3BzLFxuICAgIGFjdGlvbkJhcjoge1xuICAgICAgYWN0aW9uczogW1wiY2xlYXJcIiwgXCJ0b2RheVwiLCBcImNhbmNlbFwiLCBcImFjY2VwdFwiXSBhcyBBcnJheTxcImFjY2VwdFwiIHwgXCJjYW5jZWxcIiB8IFwiY2xlYXJcIiB8IFwibmV4dFwiIHwgXCJuZXh0T3JBY2NlcHRcIiB8IFwidG9kYXlcIj4sXG4gICAgICAuLi5zbG90UHJvcHMuYWN0aW9uQmFyLFxuICAgIH0sXG4gICAgdGV4dEZpZWxkOiB7XG4gICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgcmVxdWlyZWQsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgIHZhcmlhbnQsXG4gICAgICBvbkJsdXI6IGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgICBlcnJvcjogaGFzRXJyb3IsXG4gICAgICBoZWxwZXJUZXh0OiBoYXNFcnJvciA/IGVycm9yTWVzc2FnZSA6IGhlbHBlclRleHQsXG4gICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgIHJlYWRPbmx5OiB0ZXh0UmVhZE9ubHksXG4gICAgICAgIFwiYXJpYS1pbnZhbGlkXCI6IGludmFsaWQsXG4gICAgICAgIFwiYXJpYS1kZXNjcmliZWRieVwiOiBoYXNFcnJvciA/IGAke25hbWV9LWVycm9yYCA6IHVuZGVmaW5lZCxcbiAgICAgICAgLi4uaW5wdXRQcm9wcy5pbnB1dFByb3BzLFxuICAgICAgfSxcbiAgICAgIC8vIEFkZCBsb2FkaW5nIGluZGljYXRvciBpZiBwcm92aWRlZFxuICAgICAgLi4uKGxvYWRpbmcgJiYgTG9hZGluZ0NvbXBvbmVudCAmJiB7XG4gICAgICAgIElucHV0UHJvcHM6IHtcbiAgICAgICAgICBlbmRBZG9ybm1lbnQ6IDxMb2FkaW5nQ29tcG9uZW50IC8+LFxuICAgICAgICAgIC4uLmlucHV0UHJvcHMuSW5wdXRQcm9wcyxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgLi4uc2xvdFByb3BzLnRleHRGaWVsZCxcbiAgICB9LFxuICB9KSwgW1xuICAgIHNsb3RQcm9wcyxcbiAgICBpbnB1dFByb3BzLFxuICAgIHJlcXVpcmVkLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHZhcmlhbnQsXG4gICAgaGFuZGxlVGV4dEZpZWxkQmx1cixcbiAgICBoYXNFcnJvcixcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgaGVscGVyVGV4dCxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgaW52YWxpZCxcbiAgICBuYW1lLFxuICAgIGxvYWRpbmcsXG4gICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGF0ZVBpY2tlclxuICAgICAgLy8gU3ByZWFkIHJlc3QgcHJvcHMgZmlyc3Qgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlblxuICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgIHsuLi5yZXN0RGF0ZVBpY2tlclByb3BzfVxuXG4gICAgICAvLyBDb3JlIHByb3BzXG4gICAgICByZWY9e3JlZn1cbiAgICAgIG5hbWU9e25hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG5cbiAgICAgIC8vIFVJIHByb3BzXG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBzeD17Y29tcHV0ZWRTeH1cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuXG4gICAgICAvLyBTbG90IHByb3BzXG4gICAgICBzbG90UHJvcHM9e21lbW9pemVkU2xvdFByb3BzfVxuXG4gICAgICAvLyBBY2Nlc3NpYmlsaXR5IHByb3BzXG4gICAgICBhcmlhLWludmFsaWQ9e2ludmFsaWR9XG4gICAgICBhcmlhLWRlc2NyaWJlZGJ5PXtoYXNFcnJvciA/IGAke25hbWV9LWVycm9yYCA6IHVuZGVmaW5lZH1cbiAgICAvPlxuICApO1xufSk7XG5cbi8vIFNldCBkaXNwbGF5IG5hbWUgZm9yIGRlYnVnZ2luZ1xuRGF0ZVBpY2tlckVsZW1lbnRDb3JlLmRpc3BsYXlOYW1lID0gXCJEYXRlUGlja2VyRWxlbWVudENvcmVcIjtcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXJFbGVtZW50Q29yZTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJSZXR1cm4sXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBEYXRlVHJhbnNmb3JtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogVHlwZS1zYWZlIGRhdGUgdmFsdWUgcmVhZGVyIHRoYXQgaGFuZGxlcyBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIGZyb20gdGhlIGRhdGUgYWRhcHRlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSBNVUkgZGF0ZSBwaWNrZXJzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoc3RyaW5nLCBkYXRlLCBvciBudWxsKVxuICogQHJldHVybnMgUHJvcGVybHkgdHlwZWQgZGF0ZSB2YWx1ZSBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGUgfCB1bmRlZmluZWRcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIGEgZGF0ZVxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgcmV0dXJuIHBhcnNlZERhdGUgYXMgVERhdGU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgY29udHJvbGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBmaWVsZDogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdO1xuICAvKiogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zICovXG4gIHRyYW5zZm9ybT86IERhdGVUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPiB7XG4gIC8qKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlciAqL1xuICB2YWx1ZTogVFZhbHVlIHwgbnVsbDtcbiAgLyoqIENoYW5nZSBoYW5kbGVyIGZvciBwaWNrZXIgdmFsdWUgdXBkYXRlcyAqL1xuICBvbkNoYW5nZTogKFxuICAgIHZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+XG4gICkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWx1ZSB0cmFuc2Zvcm1hdGlvbnMgd2l0aCB0eXBlIHNhZmV0eVxuICogXG4gKiBUaGlzIGhvb2sgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIGZvcm0gZmllbGQgdmFsdWVzIGFuZCBkYXRlIHBpY2tlciB2YWx1ZXMsXG4gKiBhcHBseWluZyBjdXN0b20gdHJhbnNmb3JtYXRpb25zIHdoaWxlIG1haW50YWluaW5nIHN0cmljdCBUeXBlU2NyaXB0IHR5cGluZy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFVzYWdlIHdpdGggRGF5LmpzIGRhdGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IGRheWpzKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB2YWx1ZSB0cmFuc2Zvcm1hdGlvblxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdHJhbnNmb3JtZWQgdmFsdWUgYW5kIGNoYW5nZSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlPiB7XG4gIGNvbnN0IHsgZmllbGQsIHRyYW5zZm9ybSB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICAvLyBUcmFuc2Zvcm0gdGhlIGZpZWxkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXJcbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKCgpOiBUVmFsdWUgfCBudWxsID0+IHtcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybS5pbnB1dChmaWVsZC52YWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IGhhbmRsZSBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gICAgcmV0dXJuIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGUoYWRhcHRlciwgZmllbGQudmFsdWUpIGFzIFRWYWx1ZSB8IG51bGw7XG4gIH0sIFtmaWVsZC52YWx1ZSwgdHJhbnNmb3JtPy5pbnB1dCwgYWRhcHRlcl0pO1xuXG4gIC8vIENyZWF0ZSBhIHN0YWJsZSBjaGFuZ2UgaGFuZGxlclxuICBjb25zdCBvbkNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCwgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdHJhbnNmb3JtLm91dHB1dChuZXdWYWx1ZSwgY29udGV4dCk7XG5cbiAgICAgICAgZmllbGQub25DaGFuZ2UodHJhbnNmb3JtZWRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRyYW5zZm9ybWF0aW9uOiBzdG9yZSB0aGUgZGF0ZSBhcy1pc1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLm9uQ2hhbmdlLCB0cmFuc2Zvcm0/Lm91dHB1dF1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsdWU7IiwgImltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRFcnJvcixcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbiAgVXNlQ29udHJvbGxlclJldHVybixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25PcHRpb25zPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ge1xuICAvKiogVGhlIGZpZWxkIHN0YXRlIGZyb20gcmVhY3QtaG9vay1mb3JtIGNvbnRyb2xsZXIgKi9cbiAgZmllbGRTdGF0ZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkU3RhdGVcIl07XG4gIC8qKiBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkYXRlIHBpY2tlciAqL1xuICB2YWxpZGF0aW9uPzogRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWc8VFZhbHVlPjtcbiAgLyoqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlciAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgRGF0ZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKiogVGhlIGN1cnJlbnQgZGF0ZSB2YWx1ZSBmb3IgdmFsaWRhdGlvbiAqL1xuICB2YWx1ZT86IFRWYWx1ZSB8IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbiBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICAvKiogV2hldGhlciB0aGUgZmllbGQgaGFzIGFueSB2YWxpZGF0aW9uIGVycm9ycyAqL1xuICBoYXNFcnJvcjogYm9vbGVhbjtcbiAgLyoqIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gZXJyb3IgKGZvcm0gb3IgZGF0ZS1zcGVjaWZpYykgKi9cbiAgZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkO1xuICAvKiogRm9ybWF0dGVkIGVycm9yIG1lc3NhZ2UgZm9yIGRpc3BsYXkgKi9cbiAgZXJyb3JNZXNzYWdlOiBSZWFjdE5vZGU7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlICovXG4gIGludmFsaWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBtZXNzYWdlcyBmb3IgY29tbW9uIGRhdGUgdmFsaWRhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gIHJlcXVpcmVkOiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgZGF0ZSBwaWNrZXIgdmFsaWRhdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgZXJyb3IgaGFuZGxpbmdcbiAqIFxuICogVGhpcyBob29rIGNlbnRyYWxpemVzIHZhbGlkYXRpb24gbG9naWMgZm9yIGRhdGUgcGlja2VycywgaGFuZGxpbmcgYm90aFxuICogcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb24gZXJyb3JzXG4gKiBmcm9tIE1VSSBkYXRlIHBpY2tlcnMuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGZvcm0gdmFsaWRhdGlvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlLCBpbnZhbGlkIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gKiAgIGZpZWxkU3RhdGUsXG4gKiAgIHZhbGlkYXRpb246IHtcbiAqICAgICBtaW5EYXRlOiBkYXlqcygpLnN1YnRyYWN0KDEsICd5ZWFyJyksXG4gKiAgICAgbWF4RGF0ZTogZGF5anMoKS5hZGQoMSwgJ3llYXInKSxcbiAqICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICBtaW5EYXRlOiAnRGF0ZSBtdXN0IGJlIHdpdGhpbiB0aGUgbGFzdCB5ZWFyJyxcbiAqICAgICAgIG1heERhdGU6ICdEYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMSB5ZWFyIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogVXNhZ2Ugd2l0aCBjdXN0b20gZXJyb3IgcGFyc2VyOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgcGFyc2VFcnJvcjogKGVycm9yKSA9PiB7XG4gKiAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAqICAgICAgIHJldHVybiBgRGF0ZSBFcnJvcjogJHtlcnJvcn1gO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnSW52YWxpZCBkYXRlJztcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gc3RhdGUgYW5kIGVycm9yIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKTogVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICBjb25zdCB7IGZpZWxkU3RhdGUsIHZhbGlkYXRpb24sIHBhcnNlRXJyb3IsIHZhbHVlIH0gPSBvcHRpb25zO1xuXG4gIC8vIE1lbW9pemUgdmFsaWRhdGlvbiByZXN1bHRzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBlcnJvcjogZmllbGRFcnJvciwgaW52YWxpZCB9ID0gZmllbGRTdGF0ZTtcbiAgICBcbiAgICAvLyBTdGFydCB3aXRoIGZvcm0gdmFsaWRhdGlvbiBlcnJvclxuICAgIGxldCBjdXJyZW50RXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkID0gZmllbGRFcnJvcjtcbiAgICBcbiAgICAvLyBDaGVjayBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb25zIGlmIG5vIGZvcm0gZXJyb3IgYW5kIHdlIGhhdmUgYSB2YWx1ZVxuICAgIGlmICghZmllbGRFcnJvciAmJiB2YWx1ZSAmJiB2YWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCB7IG1pbkRhdGUsIG1heERhdGUsIHNob3VsZERpc2FibGVEYXRlLCBlcnJvck1lc3NhZ2VzIH0gPSB2YWxpZGF0aW9uO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBtaW5pbXVtIGRhdGVcbiAgICAgIGlmIChtaW5EYXRlICYmIHZhbHVlIDwgbWluRGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21pbkRhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1pbkRhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgbWF4aW11bSBkYXRlXG4gICAgICBlbHNlIGlmIChtYXhEYXRlICYmIHZhbHVlID4gbWF4RGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21heERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1heERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZGlzYWJsZWQgZGF0ZVxuICAgICAgZWxzZSBpZiAoc2hvdWxkRGlzYWJsZURhdGUgJiYgc2hvdWxkRGlzYWJsZURhdGUodmFsdWUpKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnZGlzYWJsZWREYXRlJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzPy5kaXNhYmxlZERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBoYXNFcnJvciA9IEJvb2xlYW4oY3VycmVudEVycm9yKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaGFzRXJyb3IsXG4gICAgICBlcnJvcjogY3VycmVudEVycm9yLFxuICAgICAgaW52YWxpZDogaW52YWxpZCB8fCBoYXNFcnJvcixcbiAgICB9O1xuICB9LCBbZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgdmFsdWVdKTtcblxuICAvLyBNZW1vaXplIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZ1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSB1c2VNZW1vKCgpOiBSZWFjdE5vZGUgPT4ge1xuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlIGN1c3RvbSBlcnJvciBwYXJzZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAocGFyc2VFcnJvcikge1xuICAgICAgcmV0dXJuIHBhcnNlRXJyb3IodmFsaWRhdGlvblJlc3VsdC5lcnJvcik7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBlcnJvciBtZXNzYWdlIGhhbmRsaW5nXG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCdtZXNzYWdlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yICYmIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBlcnJvciBtZXNzYWdlcyBiYXNlZCBvbiBlcnJvciB0eXBlXG4gICAgaWYgKCd0eXBlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5yZXF1aXJlZDtcbiAgICAgICAgY2FzZSAnbWluRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWluRGF0ZTtcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWF4RGF0ZTtcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGU7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgfSwgW3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IsIHBhcnNlRXJyb3JdKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnZhbGlkYXRpb25SZXN1bHQsXG4gICAgZXJyb3JNZXNzYWdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjsiLCAiaW1wb3J0IHR5cGUgeyBTeFByb3BzLCBUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNPcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGEgdmFsaWRhdGlvbiBlcnJvciAqL1xuICBoYXNFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZSAqL1xuICBsb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRleHQgaW5wdXQgaXMgcmVhZC1vbmx5ICovXG4gIHRleHRSZWFkT25seT86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gc3R5bGVzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHMgKi9cbiAgc3g/OiBTeFByb3BzPFRoZW1lPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNSZXR1cm4ge1xuICAvKiogQ29tcHV0ZWQgc3R5bGVzIGZvciB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50ICovXG4gIHN4OiBTeFByb3BzPFRoZW1lPjtcbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIHN0eWxpbmcgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvb2sgZm9yIG1hbmFnaW5nIHRoZW1lLWF3YXJlIGRhdGUgcGlja2VyIHN0eWxlcyB3aXRoIGNvbnNpc3RlbnQgZGVzaWduIHN5c3RlbSBpbnRlZ3JhdGlvblxuICogXG4gKiBUaGlzIGhvb2sgcHJvdmlkZXMgb3B0aW1pemVkLCBtZW1vaXplZCBzdHlsZXMgZm9yIGRhdGUgcGlja2VyIGNvbXBvbmVudHMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gKiBhZGFwdCB0byB0aGUgY3VycmVudCBNVUkgdGhlbWUgYW5kIGNvbXBvbmVudCBzdGF0ZSAoZGlzYWJsZWQsIGVycm9yLCBsb2FkaW5nLCBldGMuKS5cbiAqIEl0IGVuc3VyZXMgY29uc2lzdGVudCBzdHlsaW5nIGFjcm9zcyBhbGwgZGF0ZSBwaWNrZXIgaW5zdGFuY2VzIHdoaWxlIGFsbG93aW5nIGN1c3RvbWl6YXRpb24uXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGRpc2FibGVkOiBpc0Rpc2FibGVkLFxuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgbG9hZGluZzogaXNMb2FkaW5nXG4gKiB9KTtcbiAqIFxuICogcmV0dXJuIDxEYXRlUGlja2VyIHN4PXtzeH0gLi4uIC8+O1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsZXM6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc3ggfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgc3g6IHtcbiAqICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgY29sb3I6ICdwcmltYXJ5Lm1haW4nXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFN0eWxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgQ29tcHV0ZWQgc3R5bGVzIGFuZCBjbGFzcyBuYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF0ZVBpY2tlclN0eWxlcyhcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMgPSB7fVxuKTogVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIGNvbnN0IHsgZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHksIHN4OiBjdXN0b21TeCB9ID0gb3B0aW9ucztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIC8vIE1lbW9pemUgY29tcHV0ZWQgc3R5bGVzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCBjb21wdXRlZFN4ID0gdXNlTWVtbygoKTogU3hQcm9wczxUaGVtZT4gPT4ge1xuICAgIGNvbnN0IGJhc2VTdHlsZXM6IFN4UHJvcHM8VGhlbWU+ID0ge1xuICAgICAgLy8gSW5wdXQgZmllbGQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kIFxuICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gVHJhbnNpdGlvbiBmb3Igc21vb3RoIHN0YXRlIGNoYW5nZXNcbiAgICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFtcbiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICAgICAgJ2JvcmRlci1jb2xvcicsXG4gICAgICAgICAgJ2NvbG9yJ1xuICAgICAgICBdLCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBFcnJvciBzdGF0ZSBzdHlsaW5nXG4gICAgICAgIC4uLihoYXNFcnJvciAmJiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi5NdWktZm9jdXNlZCc6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgICBib3hTaGFkb3c6IGAwIDAgMCAycHggJHt0aGVtZS5wYWxldHRlLmVycm9yLm1haW59MjVgLCAvLyAyNSBpcyAxNSUgb3BhY2l0eSBpbiBoZXhcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIG9wYWNpdHk6IDAuNyxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSW5wdXQgZWxlbWVudCBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgIGN1cnNvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyBcIm5vdC1hbGxvd2VkXCIgXG4gICAgICAgICAgOiB0ZXh0UmVhZE9ubHkgXG4gICAgICAgICAgICA/IFwicG9pbnRlclwiIFxuICAgICAgICAgICAgOiBcInRleHRcIixcbiAgICAgICAgXG4gICAgICAgIC8vIFJlYWQtb25seSBzcGVjaWZpYyBzdHlsaW5nXG4gICAgICAgIC4uLih0ZXh0UmVhZE9ubHkgJiYgIWRpc2FibGVkICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiLFxuICAgICAgICAgIGNhcmV0Q29sb3I6IFwidHJhbnNwYXJlbnRcIiwgLy8gSGlkZSB0ZXh0IGN1cnNvciBpbiByZWFkLW9ubHkgbW9kZVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlXG4gICAgICAgIC4uLihsb2FkaW5nICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwid2FpdFwiLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIFJlcXVpcmVkIGZpZWxkIGFzdGVyaXNrIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IFxuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICBmb250U2l6ZTogXCIxLjJlbVwiLFxuICAgICAgfSxcblxuICAgICAgLy8gTGFiZWwgc3R5bGluZyB3aXRoIGJldHRlciBjb250cmFzdFxuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogaGFzRXJyb3IgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgOiB0aGVtZS5wYWxldHRlLnRleHQuc2Vjb25kYXJ5LFxuICAgICAgICBcbiAgICAgICAgLy8gRW5zdXJlIHByb3BlciBjb250cmFzdCBmb3IgZGlzYWJsZWQgc3RhdGVcbiAgICAgICAgLi4uKGRpc2FibGVkICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LmRpc2FibGVkLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEhlbHBlciB0ZXh0IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpRm9ybUhlbHBlclRleHQtcm9vdFwiOiB7XG4gICAgICAgIG1hcmdpbkxlZnQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIG1hcmdpblJpZ2h0OiB0aGVtZS5zcGFjaW5nKDEpLFxuICAgICAgICBcbiAgICAgICAgLy8gRXJyb3Igc3RhdGVcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIENhbGVuZGFyIGljb24gc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dEFkb3JubWVudC1yb290XCI6IHtcbiAgICAgICAgY29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWQgXG4gICAgICAgICAgOiBoYXNFcnJvciBcbiAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIFxuICAgICAgICAgICAgOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5hY3RpdmUsXG4gICAgICB9LFxuXG4gICAgICAvLyBGb2N1cyByaW5nIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZm9jdXNlZFwiOiB7XG4gICAgICAgIG91dGxpbmU6IGAycHggc29saWQgJHt0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbn01MGAsIC8vIDUwIGlzIDMxJSBvcGFjaXR5XG4gICAgICAgIG91dGxpbmVPZmZzZXQ6IFwiMnB4XCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBFbmhhbmNlZCBjb250cmFzdCBmb3IgZGFyayB0aGVtZXNcbiAgICAgIC4uLih0aGVtZS5wYWxldHRlLm1vZGUgPT09ICdkYXJrJyAmJiB7XG4gICAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgICBib3JkZXJXaWR0aDogMixcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICAvLyBNZXJnZSB3aXRoIGN1c3RvbSBzdHlsZXNcbiAgICByZXR1cm4gY3VzdG9tU3ggPyBbYmFzZVN0eWxlcywgY3VzdG9tU3hdIGFzIFN4UHJvcHM8VGhlbWU+IDogYmFzZVN0eWxlcztcbiAgfSwgW1xuICAgIHRoZW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGhhc0Vycm9yLFxuICAgIGxvYWRpbmcsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGN1c3RvbVN4LFxuICBdKTtcblxuICAvLyBHZW5lcmF0ZSBhZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciBleHRlcm5hbCBzdHlsaW5nIGhvb2tzXG4gIGNvbnN0IGNsYXNzTmFtZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgaWYgKGRpc2FibGVkKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1kaXNhYmxlZCcpO1xuICAgIGlmIChoYXNFcnJvcikgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tZXJyb3InKTtcbiAgICBpZiAobG9hZGluZykgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tbG9hZGluZycpO1xuICAgIGlmICh0ZXh0UmVhZE9ubHkpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLXJlYWRPbmx5Jyk7XG4gICAgXG4gICAgcmV0dXJuIGNsYXNzZXMubGVuZ3RoID4gMCA/IGNsYXNzZXMuam9pbignICcpIDogdW5kZWZpbmVkO1xuICB9LCBbZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHldKTtcblxuICByZXR1cm4ge1xuICAgIHN4OiBjb21wdXRlZFN4LFxuICAgIGNsYXNzTmFtZSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlRGF0ZVBpY2tlclN0eWxlczsiLCAiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGgsIFBhdGhWYWx1ZSB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgZm9yIGNyZWF0aW5nIGJyYW5kZWQgZGF0ZSB0eXBlcyB0byBwcmV2ZW50IG1peGluZyBkaWZmZXJlbnQgZGF0ZSBmb3JtYXRzXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgYmFzZSBkYXRlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUQnJhbmQgLSBUaGUgYnJhbmQgc3RyaW5nIGZvciB0eXBlIHNhZmV0eVxuICovXG5leHBvcnQgdHlwZSBCcmFuZGVkRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSwgVEJyYW5kIGV4dGVuZHMgc3RyaW5nPiA9IFxuICBURGF0ZSAmIHsgcmVhZG9ubHkgX19icmFuZDogVEJyYW5kIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGRhdGUtbGlrZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGlja2VyVmFsaWREYXRlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgRGF0ZSBvYmplY3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBkYXRlLWxpa2Ugb2JqZWN0cyB3aXRoIGNvbW1vbiBkYXRlIGxpYnJhcnkgbWV0aG9kc1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIC8vIERheS5qcywgTW9tZW50LmpzLCBvciBzaW1pbGFyXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTHV4b24gRGF0ZVRpbWVcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBhcnNlYWJsZSBkYXRlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzYWJsZURhdGVTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBCYXNpYyBJU08gZGF0ZSBmb3JtYXQgY2hlY2tcbiAgY29uc3QgaXNvRGF0ZVJlZ2V4ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSg/OlRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHszfSk/KD86WnxbKy1dXFxkezJ9OlxcZHsyfSk/KT8kLztcblxuICBpZiAoaXNvRGF0ZVJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiBEYXRlIGNvbnN0cnVjdG9yIGNhbiBwYXJzZSBpdFxuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgcmV0dXJuICFpc05hTihwYXJzZWQuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlIHBpY2tlciB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSB1c2VkIGJ5IHRoZSBwaWNrZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGRhdGUgYWRhcHRlciBmcm9tIE1VSSBsb2NhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgQSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IHNhZmVseSBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0ZUlucHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+KSB7XG4gIHJldHVybiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik6IFREYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZShwYXJzZWQpID8gKHBhcnNlZCBhcyBURGF0ZSkgOiBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBURGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRlIHBpY2tlciB2YWx1ZXMgYmFjayB0byBmb3JtIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBmb3JtYXQgdG8gdXNlIGZvciBzdHJpbmcgY29udmVyc2lvbiAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGRhdGVzIHRvIGZvcm0gdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlT3V0cHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGZvcm1hdD86IHN0cmluZykge1xuICByZXR1cm4gKHZhbHVlOiBURGF0ZSB8IG51bGwpOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBmb3JtYXQgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGRhdGUgYXMtaXNcbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBkYXRlIGxpYnJhcnkgZm9ybWF0c1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaXNvJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkYXRlLW9ubHknKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGF5LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTW9tZW50LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTHV4b24gZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS50b0Zvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2s6IHJldHVybiBhcy1pc1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBjcmVhdGUgZGVmYXVsdCBkYXRlIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlXG4gKiBAcmV0dXJucyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0RGF0ZVBpY2tlckNvbmZpZzxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4oKSB7XG4gIHJldHVybiB7XG4gICAgLy8gRGVmYXVsdCBzbG90IHByb3BzIGZvciBjb25zaXN0ZW50IGJlaGF2aW9yXG4gICAgc2xvdFByb3BzOiB7XG4gICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgY29uc3QsXG4gICAgICB9LFxuICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgdmFyaWFudDogJ291dGxpbmVkJyBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IGdyaWQgcHJvcHMgZm9yIGxheW91dCBjb25zaXN0ZW5jeVxuICAgIGdyaWRQcm9wczoge1xuICAgICAgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IGFzIGNvbnN0LFxuICAgIH0sXG4gICAgXG4gICAgLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICB2YWxpZGF0aW9uOiB7XG4gICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gICAgICAgIGludmFsaWREYXRlOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGVcIixcbiAgICAgICAgbWluRGF0ZTogXCJEYXRlIG11c3QgYmUgYWZ0ZXIgdGhlIG1pbmltdW0gYWxsb3dlZCBkYXRlXCIsXG4gICAgICAgIG1heERhdGU6IFwiRGF0ZSBtdXN0IGJlIGJlZm9yZSB0aGUgbWF4aW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgZGlzYWJsZWREYXRlOiBcIlRoaXMgZGF0ZSBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9IGFzIGNvbnN0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gc2FmZWx5IGV4dHJhY3QgZXJyb3IgbWVzc2FnZSBmcm9tIHZhcmlvdXMgZXJyb3IgdHlwZXNcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciBvYmplY3QgKGNvdWxkIGJlIGZyb20gcmVhY3QtaG9vay1mb3JtIG9yIE1VSSBkYXRlIHBpY2tlcilcbiAqIEByZXR1cm5zIEEgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCkge1xuICAgIC8vIFJlYWN0IEhvb2sgRm9ybSBGaWVsZEVycm9yXG4gICAgaWYgKCdtZXNzYWdlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIE1VSSBEYXRlVmFsaWRhdGlvbkVycm9yXG4gICAgaWYgKCd0eXBlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IChlcnJvciBhcyBhbnkpLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUnO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGVhcmx5JztcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdEYXRlIGlzIHRvbyBsYXRlJztcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBpcyBub3QgYXZhaWxhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSBzZWxlY3Rpb24nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnSW52YWxpZCBpbnB1dCc7XG59XG5cbi8qKlxuICogUGVyZm9ybWFuY2UgdXRpbGl0eSB0byBjcmVhdGUgc3RhYmxlIHJlZmVyZW5jZXMgZm9yIGNvbXBsZXggcHJvcHNcbiAqIFRoaXMgaGVscHMgcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzIHdoZW4gdXNpbmcgY29tcGxleCBjb25maWd1cmF0aW9uIG9iamVjdHNcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBBIEpTT04gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IGluIHVzZU1lbW8vdXNlQ2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWJsZUtleTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGNvbmZpZzogVCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIC8vIFNvcnQgb2JqZWN0IGtleXMgZm9yIGNvbnNpc3RlbnQgc2VyaWFsaXphdGlvblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgc29ydGVkW2tdID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0c1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnNvcnQoKS5qb2luKCctJyk7XG4gIH1cbn0iLCAiaW1wb3J0IFZpc2liaWxpdHkgZnJvbSBcIkBtdWkvaWNvbnMtbWF0ZXJpYWwvVmlzaWJpbGl0eVwiO1xuaW1wb3J0IFZpc2liaWxpdHlPZmYgZnJvbSBcIkBtdWkvaWNvbnMtbWF0ZXJpYWwvVmlzaWJpbGl0eU9mZlwiO1xuaW1wb3J0IHR5cGUge1xuICBJY29uQnV0dG9uUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBHcmlkUHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEljb25CdXR0b24sXG4gIElucHV0QWRvcm5tZW50LFxuICBUZXh0RmllbGQsXG4gIHVzZUZvcmtSZWYsXG4gIEdyaWRcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgTW91c2VFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlc1xufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBQYXNzd29yZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBQYXNzd29yZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+ID0gT21pdDxUZXh0RmllbGRQcm9wcywgXCJuYW1lXCI+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJwYXNzd29yZFwiIHwgXCJ1c2VyLmN1cnJlbnRQYXNzd29yZFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgdmlzaWJpbGl0eSB0b2dnbGUgaWNvbiBidXR0b25cbiAgICogQGRlZmF1bHRWYWx1ZSBcImRlZmF1bHRcIlxuICAgKi9cbiAgaWNvbkNvbG9yPzogSWNvbkJ1dHRvblByb3BzW1wiY29sb3JcIl07XG4gIC8qKlxuICAgKiBDdXN0b20gcmVuZGVyIGZ1bmN0aW9uIGZvciB0aGUgdmlzaWJpbGl0eSB0b2dnbGUgaWNvblxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBXaGV0aGVyIHBhc3N3b3JkIGlzIGN1cnJlbnRseSBoaWRkZW5cbiAgICogQHJldHVybnMgUmVhY3ROb2RlIHRvIHJlbmRlciBhcyB0aGUgaWNvblxuICAgKiBAZGVmYXVsdFZhbHVlIERlZmF1bHQgdmlzaWJpbGl0eS92aXNpYmlsaXR5LW9mZiBpY29uc1xuICAgKi9cbiAgcmVuZGVySWNvbj86IChwYXNzd29yZDogYm9vbGVhbikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufTtcblxudHlwZSBQYXNzd29yZEVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgcHJvcHM6IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBQYXNzd29yZEVsPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4ocHJvcHM6IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgaWNvbkNvbG9yLFxuICAgIHJlbmRlckljb24gPSAocGFzc3dvcmQpID0+IChwYXNzd29yZCA/IDxWaXNpYmlsaXR5IC8+IDogPFZpc2liaWxpdHlPZmYgLz4pLFxuICAgIHNsb3RQcm9wcyxcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQgPSBUZXh0RmllbGQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25CbHVyLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gdXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgY29uc3QgZW5kQWRvcm5tZW50ID0gKFxuICAgIDxJbnB1dEFkb3JubWVudCBwb3NpdGlvbj17XCJlbmRcIn0+XG4gICAgICA8SWNvbkJ1dHRvblxuICAgICAgICBvbk1vdXNlRG93bj17KGU6IE1vdXNlRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiBlLnByZXZlbnREZWZhdWx0KCl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFBhc3N3b3JkKCFwYXNzd29yZCl9XG4gICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgY29sb3I9e2ljb25Db2xvciA/PyBcImRlZmF1bHRcIn1cbiAgICAgID5cbiAgICAgICAge3JlbmRlckljb24ocGFzc3dvcmQpfVxuICAgICAgPC9JY29uQnV0dG9uPlxuICAgIDwvSW5wdXRBZG9ybm1lbnQ+XG4gICk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZFxuICAgICAgey4uLnJlc3R9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB0eXBlPXtwYXNzd29yZCA/IFwicGFzc3dvcmRcIiA6IFwidGV4dFwifVxuICAgICAgdmFsdWU9e2ZpZWxkLnZhbHVlfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIHRoaXMgd2lsbCBiZSBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYW55b25lIHVzaW5nIHRyYW5zZm9ybS5vdXRwdXRcbiAgICAgICAgLy8gYmVjYXVzZSBub3cgd2UgYXJlIHBhc3NpbmcgZXZlbnQgaW5zdGVhZCBvZiBldmVudC50YXJnZXQudmFsdWUgb3IgK2V2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICBmaWVsZC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdC5vbkNoYW5nZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmVzdC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9eyhldmVudCkgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICB7Li4uKHR5cGVvZiBzbG90UHJvcHMgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyB7XG4gICAgICAgICAgSW5wdXRQcm9wczoge1xuICAgICAgICAgICAgZW5kQWRvcm5tZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgc2xvdFByb3BzOiB7XG4gICAgICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgICAgIC4uLnNsb3RQcm9wcz8uaW5wdXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgVGV4dEZpZWxkUHJvcHNbXCJzbG90UHJvcHNcIl0sXG4gICAgICAgIH0pfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlwifVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgcGFzc3dvcmQgVGV4dEZpZWxkIHdpdGggc2hvdy9oaWRlIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHBhc3N3b3JkIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBhIGJ1aWx0LWluIHZpc2liaWxpdHkgdG9nZ2xlIGJ1dHRvbi4gVGhlIHBhc3N3b3JkXG4gKiBjYW4gYmUgc2hvd24gb3IgaGlkZGVuIGJ5IGNsaWNraW5nIHRoZSBleWUgaWNvbiBpbiB0aGUgaW5wdXQncyBlbmQgYWRvcm5tZW50LlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBQYXNzd29yZCB2aXNpYmlsaXR5IHRvZ2dsZVxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgdmlzaWJpbGl0eSBpY29uc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydFxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicGFzc3dvcmRcIlxuICogICBsYWJlbD1cIlBhc3N3b3JkXCJcbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyxcbiAqICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IDgsIG1lc3NhZ2U6ICdNaW5pbXVtIDggY2hhcmFjdGVycycgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBpY29uIGNvbG9yOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjb25maXJtUGFzc3dvcmRcIlxuICogICBsYWJlbD1cIkNvbmZpcm0gUGFzc3dvcmRcIlxuICogICBpY29uQ29sb3I9XCJwcmltYXJ5XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJSZS1lbnRlciB5b3VyIHBhc3N3b3JkXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJuZXdQYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiTmV3IFBhc3N3b3JkXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJlbmRlckljb249eyhoaWRkZW4pID0+IGhpZGRlbiA/IDxDdXN0b21IaWRlSWNvbiAvPiA6IDxDdXN0b21TaG93SWNvbiAvPn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgUGFzc3dvcmRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikgPT4ge1xuICBpZiAoZ3JpZFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxHcmlkXG4gICAgICAgIHsuLi57IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSwgLi4uZ3JpZFByb3BzIH19XG4gICAgICA+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuUGFzc3dvcmRFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJQYXNzd29yZEVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgUGFzc3dvcmRFbGVtZW50O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBGb3JtTGFiZWxQcm9wcyxcbiAgUmFkaW9Hcm91cFByb3BzLFxuICBSYWRpb1Byb3BzLFxuICBHcmlkUHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgRm9ybUxhYmVsLFxuICBSYWRpbyxcbiAgUmFkaW9Hcm91cCxcbiAgdXNlVGhlbWUsXG4gIEdyaWRcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlclxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm1cIjtcblxuLy8gVHlwZSBmb3IgcHJpbWl0aXZlIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIHJhZGlvIGJ1dHRvbiB2YWx1ZXNcbnR5cGUgUHJpbWl0aXZlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBDb25zdHJhaW50IHRvIGVuc3VyZSBvcHRpb24gb2JqZWN0cyBoYXZlIHRoZSByZXF1aXJlZCBrZXlzXG50eXBlIE9wdGlvbk9iamVjdDxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZ1xuPiA9IFJlY29yZDxUVmFsdWVLZXksIFByaW1pdGl2ZVZhbHVlPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PiAmXG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBrZXlvZiBUT3B0aW9uICYgc3RyaW5nID0gXCJpZFwiLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBrZXlvZiBUT3B0aW9uICYgc3RyaW5nID0gXCJsYWJlbFwiLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBrZXlvZiBUT3B0aW9uICYgc3RyaW5nID0gXCJkaXNhYmxlZFwiXG4+IHtcbiAgb3B0aW9uczogVE9wdGlvbltdO1xuICBoZWxwZXJUZXh0PzogUmVhY3ROb2RlO1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBsYWJlbEtleT86IFRMYWJlbEtleTtcbiAgdmFsdWVLZXk/OiBUVmFsdWVLZXk7XG4gIGRpc2FibGVkS2V5PzogVERpc2FibGVkS2V5O1xuICB0eXBlPzogXCJudW1iZXJcIiB8IFwic3RyaW5nXCIgfCBcImJvb2xlYW5cIjtcbiAgZW1wdHlPcHRpb25MYWJlbD86IHN0cmluZztcbiAgb25DaGFuZ2U/OiAodmFsdWU6IFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb24gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIHJldHVybk9iamVjdD86IGJvb2xlYW47XG4gIHJvdz86IGJvb2xlYW47XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGxhYmVsUHJvcHM/OiBPbWl0PEZvcm1Db250cm9sTGFiZWxQcm9wcywgXCJsYWJlbFwiIHwgXCJjb250cm9sXCIgfCBcInZhbHVlXCI+O1xuICBmb3JtTGFiZWxQcm9wcz86IE9taXQ8Rm9ybUxhYmVsUHJvcHMsIFwicmVxdWlyZWRcIiB8IFwiZXJyb3JcIj47XG4gIHJhZGlvUHJvcHM/OiBSYWRpb1Byb3BzO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHRyYW5zZm9ybT86IHtcbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUT3B0aW9uW1RWYWx1ZUtleV07XG4gICAgb3V0cHV0PzogKFxuICAgICAgdmFsdWU6IFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb24gfCB1bmRlZmluZWRcbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBSYWRpb0J1dHRvbkdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImlkXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImxhYmVsXCIsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImRpc2FibGVkXCJcbj4ocHJvcHM6IFJhZGlvQnV0dG9uR3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5Pikge1xuICBjb25zdCB7XG4gICAgb3B0aW9ucyxcbiAgICBsYWJlbCxcbiAgICBuYW1lLFxuICAgIGxhYmVsS2V5ID0gXCJsYWJlbFwiIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUtleSA9IFwiaWRcIiBhcyBUVmFsdWVLZXksXG4gICAgZGlzYWJsZWRLZXkgPSBcImRpc2FibGVkXCIgYXMgVERpc2FibGVkS2V5LFxuICAgIHJlcXVpcmVkLFxuICAgIGVtcHR5T3B0aW9uTGFiZWwsXG4gICAgcmV0dXJuT2JqZWN0LFxuICAgIHJvdyxcbiAgICBjb250cm9sLFxuICAgIHR5cGUsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBkaXNhYmxlZCxcbiAgICBmb3JtTGFiZWxQcm9wcyxcbiAgICByYWRpb1Byb3BzLFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb25cbiAgPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIHx8IChcIlwiIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG4gICAgICAgICAgfSxcbiAgICAgIG91dHB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybT8ub3V0cHV0XG4gICAgICAgICAgOiAoX2V2ZW50LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG9uUmFkaW9DaGFuZ2U6IFJhZGlvR3JvdXBQcm9wc1tcIm9uQ2hhbmdlXCJdID0gKGV2ZW50LCByYWRpb1ZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSByZXR1cm5PYmplY3RcbiAgICAgID8gKG9wdGlvbnMgYXMgVE9wdGlvbltdKS5maW5kKChvcHRpb24pID0+IG9wdGlvblt2YWx1ZUtleV0gPT09IHJhZGlvVmFsdWUpXG4gICAgICA6IHJhZGlvVmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuXG4gICAgb25DaGFuZ2UoZXZlbnQsIHJldHVyblZhbHVlKTtcbiAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmVzdC5vbkNoYW5nZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxGb3JtTGFiZWwgey4uLmZvcm1MYWJlbFByb3BzfSByZXF1aXJlZD17cmVxdWlyZWR9IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvRm9ybUxhYmVsPlxuICAgICAgKX1cbiAgICAgIDxSYWRpb0dyb3VwIG9uQ2hhbmdlPXtvblJhZGlvQ2hhbmdlfSBuYW1lPXtuYW1lfSByb3c9e3Jvd30gdmFsdWU9e3ZhbHVlfT5cbiAgICAgICAge2VtcHR5T3B0aW9uTGFiZWwgJiYgKFxuICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgICAgY29sb3I6IGVycm9yID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17IXZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFiZWw9e2VtcHR5T3B0aW9uTGFiZWx9XG4gICAgICAgICAgICB2YWx1ZT1cIlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb25bdmFsdWVLZXldO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbkRpc2FibGVkID0gb3B0aW9uW2Rpc2FibGVkS2V5XSB8fCBmYWxzZTtcbiAgICAgICAgICBsZXQgdmFsOiBUT3B0aW9uW1RWYWx1ZUtleV0gfCB1bmRlZmluZWQgPSByZXR1cm5PYmplY3RcbiAgICAgICAgICAgID8gKHZhbHVlIGFzIFRPcHRpb24pPy5bdmFsdWVLZXldXG4gICAgICAgICAgICA6IHZhbHVlIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlID09PSBcIm51bWJlclwiICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBOdW1iZXIodmFsKSBhcyBUT3B0aW9uW1RWYWx1ZUtleV07XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImJvb2xlYW5cIiAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gQm9vbGVhbih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NoZWNrZWQgPSB2YWwgPT09IG9wdGlvbktleTtcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBrZXk9e1N0cmluZyhvcHRpb25LZXkpfVxuICAgICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgb3B0aW9uRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0NoZWNrZWR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uS2V5fVxuICAgICAgICAgICAgICBsYWJlbD17b3B0aW9uW2xhYmVsS2V5XX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICB7ZXJyb3IgJiYgPEZvcm1IZWxwZXJUZXh0PntlcnJvci5tZXNzYWdlfTwvRm9ybUhlbHBlclRleHQ+fVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG5jb25zdCBSYWRpb0J1dHRvbkdyb3VwID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImlkXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImxhYmVsXCIsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImRpc2FibGVkXCJcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogUmFkaW9CdXR0b25Hcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5PiB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+IHsuLi5wcm9wc30gLz47XG59O1xuXG5SYWRpb0J1dHRvbkdyb3VwLmRpc3BsYXlOYW1lID0gXCJSYWRpb0J1dHRvbkdyb3VwXCI7XG5cbmV4cG9ydCBkZWZhdWx0IFJhZGlvQnV0dG9uR3JvdXA7XG4iLCAiaW1wb3J0IHtcbiAgR3JpZCxcbiAgdXNlVGhlbWUsXG4gIFRleHRGaWVsZCxcbiAgdHlwZSBTeFByb3BzLFxuICBBdXRvY29tcGxldGUsXG4gIHR5cGUgR3JpZFByb3BzLFxuICB0eXBlIENoaXBUeXBlTWFwLFxuICB0eXBlIFRleHRGaWVsZFByb3BzLFxuICB0eXBlIFRleHRGaWVsZFZhcmlhbnRzLFxuICB0eXBlIEF1dG9jb21wbGV0ZVByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgSlNYIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIHR5cGUgQ29udHJvbCxcbiAgdXNlQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRWYWx1ZXMsXG4gIHR5cGUgVXNlQ29udHJvbGxlclByb3BzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5leHBvcnQgdHlwZSBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxUT3B0aW9uLCBNdWx0aXBsZSwgRGlzYWJsZUNsZWFyYWJsZSwgRnJlZVNvbG8sIENoaXBDb21wb25lbnQ+LFxuICAnbmFtZScgfCAncmVuZGVySW5wdXQnIHwgJ2lzT3B0aW9uRXF1YWxUb1ZhbHVlJyB8ICdnZXRPcHRpb25MYWJlbCcgfCAnZGlzYWJsZWQnXG4+ICYge1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPlsncnVsZXMnXTtcbiAgbmFtZTogVE5hbWU7XG4gIGRlcGVuZHNPbjogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgc3g/OiBTeFByb3BzO1xuICBpc0VkaXQ/OiBib29sZWFuO1xuICBsYWJlbEtleT86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlS2V5Pzoga2V5b2YgVE9wdGlvbjtcbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xufTtcblxudHlwZSBTZWxlY3RDYXNjYWRlRWxlbWVudENvbXBvbmVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KFxuICBwcm9wczogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPlxuKSA9PiBSZWFjdC5KU1guRWxlbWVudDtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0Q2FzY2FkZUVsZW1lbnQ8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8VE9wdGlvbiwgVEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIGxhYmVsS2V5ID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUtleSA9ICdWYWx1ZScsXG4gICAgbmFtZSxcbiAgICBvbkJsdXIsXG4gICAgb25DaGFuZ2UsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9ucyxcbiAgICBjb250cm9sLFxuICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBsYWJlbCxcbiAgICBkZXBlbmRzT24sXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIHN4LFxuICAgIGlzRWRpdCA9IGZhbHNlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IGdldE9wdGlvbktleSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb24gPT09ICdudW1iZXInKSByZXR1cm4gb3B0aW9uO1xuICAgICAgY29uc3Qga2V5ID0gb3B0aW9uID8gb3B0aW9uW3ZhbHVlS2V5IGFzIGtleW9mIFRPcHRpb25dIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5ICE9PSBudWxsID8gU3RyaW5nKGtleSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUtleV1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxLZXkgYXMga2V5b2YgVE9wdGlvbl0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxLZXldXG4gICk7XG5cbiAgY29uc3QgaXNPcHRpb25FcXVhbFRvVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uLCB2YWx1ZTogVE9wdGlvbikgPT5cbiAgICBnZXRPcHRpb25LZXkob3B0aW9uKSA9PT0gZ2V0T3B0aW9uS2V5KHZhbHVlKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgeyBmaWVsZDogZGVwZW5kZW50RmllbGQgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWU6IGRlcGVuZHNPbixcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBwYXJlbnRWYWx1ZVJlZiA9IHVzZVJlZjxUT3B0aW9uPihkZXBlbmRlbnRGaWVsZC52YWx1ZSA/PyBudWxsKTtcbiAgY29uc3QgW2hhc0F1dG9TZWxlY3RlZCwgc2V0SGFzQXV0b1NlbGVjdGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgICghIWRlcGVuZGVudEZpZWxkLnZhbHVlICYmIHBhcmVudFZhbHVlUmVmPy5jdXJyZW50ICE9PSBkZXBlbmRlbnRGaWVsZC52YWx1ZSkgfHxcbiAgICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlID09PSBudWxsXG4gICAgKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgIHNldEhhc0F1dG9TZWxlY3RlZChmYWxzZSk7XG4gICAgfVxuICB9LCBbZGVwZW5kZW50RmllbGQudmFsdWVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc0VkaXQgJiYgIWRpc2FibGVkICYmIG9wdGlvbnMubGVuZ3RoID09PSAxICYmIGZpZWxkLnZhbHVlID09IG51bGwgJiYgIWhhc0F1dG9TZWxlY3RlZCkge1xuICAgICAgZmllbGQub25DaGFuZ2UoZ2V0T3B0aW9uS2V5KG9wdGlvbnNbMF0pKTtcbiAgICAgIHNldEhhc0F1dG9TZWxlY3RlZCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmIGZpZWxkLnZhbHVlID09IG51bGwgJiYgIWhhc0F1dG9TZWxlY3RlZCkge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShnZXRPcHRpb25LZXkob3B0aW9uc1swXSkpO1xuICAgICAgICBzZXRIYXNBdXRvU2VsZWN0ZWQodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbXG4gICAgb3B0aW9ucyxcbiAgICBmaWVsZC52YWx1ZSxcbiAgICBmaWVsZC5vbkNoYW5nZSxcbiAgICBoYXNBdXRvU2VsZWN0ZWQsXG4gICAgaXNFZGl0LFxuICAgIGRpc2FibGVkLFxuICAgIGZpZWxkLFxuICAgIGdldE9wdGlvbktleSxcbiAgICBkZXBlbmRlbnRGaWVsZC5vbkNoYW5nZSxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHZhbHVlPXtcbiAgICAgICAgb3B0aW9uc1xuICAgICAgICAgIC5tYXAoKG9wdGlvbikgPT4gKGdldE9wdGlvbktleShvcHRpb24pID09PSBmaWVsZC52YWx1ZSA/IG9wdGlvbiA6IG51bGwpKVxuICAgICAgICAgIC5maW5kKEJvb2xlYW4pIHx8IG51bGxcbiAgICAgIH1cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uS2V5fVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9e2lzT3B0aW9uRXF1YWxUb1ZhbHVlfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17ZGVwZW5kZW50RmllbGQudmFsdWUgPT0gbnVsbCB8fCBkaXNhYmxlZH1cbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pID0+IHtcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUgPyBnZXRPcHRpb25LZXkobmV3VmFsdWUpIDogbnVsbCk7XG4gICAgICAgIGlmIChvbkNoYW5nZSAmJiB0eXBlb2Ygb25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkNoYW5nZShldmVudCwgbmV3VmFsdWUsIHJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9eyhldmVudCkgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZW5kZXJJbnB1dD17KHBhcmFtcykgPT4gKFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QnOiB7XG4gICAgICAgICAgICAgIGJnY29sb3I6XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgfHwgZGVwZW5kZW50RmllbGQudmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlzayc6IHsgY29sb3I6ICdyZWQnIH0sXG4gICAgICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLWlucHV0Jzoge1xuICAgICAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkIHx8IGRlcGVuZGVudEZpZWxkLnZhbHVlID09IG51bGwgPyAnbm90LWFsbG93ZWQnIDogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2VsZWN0Q2FzY2FkZUVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuU2VsZWN0Q2FzY2FkZUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0Q2FzY2FkZUVsZW1lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RDYXNjYWRlRWxlbWVudDtcbiIsICJpbXBvcnQgeyBHcmlkLCB1c2VUaGVtZSwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBTeFByb3BzLFxuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVWYWx1ZSxcbiAgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uLFxuICBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZyxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIHVzZU1lbW8sXG4gIHR5cGUgSlNYLFxuICB1c2VFZmZlY3QsXG4gIHVzZUNhbGxiYWNrLFxuICB0eXBlIFN5bnRoZXRpY0V2ZW50LFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29udHJvbCxcbiAgdXNlQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRWYWx1ZXMsXG4gIHR5cGUgVXNlQ29udHJvbGxlclByb3BzLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBTZWxlY3RFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVE9wdGlvbiAtIFRoZSBvcHRpb24gb2JqZWN0IHR5cGVcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIE11bHRpcGxlIC0gV2hldGhlciBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIERpc2FibGVDbGVhcmFibGUgLSBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gaXMgZGlzYWJsZWRcbiAqIEB0ZW1wbGF0ZSBGcmVlU29sbyAtIFdoZXRoZXIgZnJlZSB0ZXh0IGlucHV0IGlzIGFsbG93ZWRcbiAqIEB0ZW1wbGF0ZSBDaGlwQ29tcG9uZW50IC0gVGhlIGNoaXAgY29tcG9uZW50IHR5cGUgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbXCJkZWZhdWx0Q29tcG9uZW50XCJdXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPixcbiAgfCBcIm5hbWVcIlxuICB8IFwicmVuZGVySW5wdXRcIlxuICB8IFwiaXNPcHRpb25FcXVhbFRvVmFsdWVcIlxuICB8IFwiZ2V0T3B0aW9uTGFiZWxcIlxuICB8IFwiZGlzYWJsZWRcIlxuPiAmIHtcbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmaWVsZFxuICAgKiBAZXhhbXBsZSB7IHJlcXVpcmVkOiAnUGxlYXNlIHNlbGVjdCBhbiBvcHRpb24nIH1cbiAgICovXG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wicnVsZXNcIl07XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImNhdGVnb3J5XCIgfCBcInVzZXIuZGVwYXJ0bWVudFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgc2VsZWN0IGlucHV0XG4gICAqIEBleGFtcGxlIFwiQ2hvb3NlIGFuIG9wdGlvbi4uLlwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiQ2F0ZWdvcnlcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnRcbiAgICovXG4gIHN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBlZGl0IG1vZGUgKGFmZmVjdHMgYXV0by1zZWxlY3Rpb24gYmVoYXZpb3IpXG4gICAqIFdoZW4gZmFsc2UgYW5kIG9ubHkgb25lIG9wdGlvbiBleGlzdHMsIHRoYXQgb3B0aW9uIGlzIGF1dG8tc2VsZWN0ZWRcbiAgICogQGRlZmF1bHRWYWx1ZSBmYWxzZVxuICAgKi9cbiAgaXNFZGl0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlbGVjdCBpcyBkaXNhYmxlZFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG5hbWUgaW4gb3B0aW9uIG9iamVjdHMgdG8gdXNlIGFzIGRpc3BsYXkgbGFiZWxcbiAgICogQGRlZmF1bHRWYWx1ZSBcIkxhYmVsXCJcbiAgICogQGV4YW1wbGUgXCJuYW1lXCIgfCBcInRpdGxlXCJcbiAgICovXG4gIGxhYmVsS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG5hbWUgaW4gb3B0aW9uIG9iamVjdHMgdG8gdXNlIGFzIHRoZSB2YWx1ZVxuICAgKiBAZGVmYXVsdFZhbHVlIFwiVmFsdWVcIlxuICAgKiBAZXhhbXBsZSBcImlkXCIgfCBcImNvZGVcIlxuICAgKi9cbiAgdmFsdWVLZXk/OiBrZXlvZiBUT3B0aW9uO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCBcIm5hbWVcIj47XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RFbGVtZW50PFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFtcImRlZmF1bHRDb21wb25lbnRcIl1cbj4oXG4gIHByb3BzOiBTZWxlY3RFbGVtZW50UHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQ2hhbmdlLFxuICAgIGlzRWRpdCxcbiAgICBvcHRpb25zLFxuICAgIGxhYmVsLFxuICAgIHN4LFxuICAgIHZhcmlhbnQsXG4gICAgZGlzYWJsZWQsXG4gICAgbGFiZWxLZXkgPSBcIkxhYmVsXCIsXG4gICAgdmFsdWVLZXkgPSBcIlZhbHVlXCIsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7IHJlcXVpcmVkIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvblt2YWx1ZUtleV0gOiBudWxsOyAvLyBSZXR1cm4gbnVsbCBmb3IgY29uc2lzdGVuY3lcbiAgICB9LFxuICAgIFt2YWx1ZUtleV1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz4pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcInN0cmluZ1wiKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEtleV0pIDogXCJcIjtcbiAgICB9LFxuICAgIFtsYWJlbEtleV1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgZXZlbnQ6IFN5bnRoZXRpY0V2ZW50LFxuICAgIG5ld1ZhbHVlOiBBdXRvY29tcGxldGVWYWx1ZTxUT3B0aW9uLCBNdWx0aXBsZSwgRGlzYWJsZUNsZWFyYWJsZSwgRnJlZVNvbG8+LFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IG5ld1ZhbHVlIGFzIFRPcHRpb24gfCBudWxsO1xuXG4gICAgZmllbGQub25DaGFuZ2Uob3B0aW9uID8gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA6IG51bGwpO1xuICAgIG9uQ2hhbmdlPy4oZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgIWlzRWRpdCAmJlxuICAgICAgb3B0aW9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgIChmaWVsZC52YWx1ZSA9PSBudWxsIHx8IGZpZWxkLnZhbHVlID09IHVuZGVmaW5lZCB8fCBmaWVsZC52YWx1ZSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb24gPSBvcHRpb25zWzBdO1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE9wdGlvbik7XG5cbiAgICAgIGZpZWxkLm9uQ2hhbmdlKGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICB9LCBbaXNFZGl0LCBvcHRpb25zXSk7XG5cbiAgY29uc3QgYXV0b2NvbXBsZXRlVmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBvcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZmllbGQudmFsdWUpID8/IG51bGwsXG4gICAgW2ZpZWxkLnZhbHVlLCBvcHRpb25zLCBnZXRPcHRpb25WYWx1ZV1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zPXtmYWxzZX1cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICB2YWx1ZT17XG4gICAgICAgIGF1dG9jb21wbGV0ZVZhbHVlIGFzIEF1dG9jb21wbGV0ZVZhbHVlPFxuICAgICAgICAgIFRPcHRpb24sXG4gICAgICAgICAgTXVsdGlwbGUsXG4gICAgICAgICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICAgICAgICBGcmVlU29sb1xuICAgICAgICA+XG4gICAgICB9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9eyhcbiAgICAgICAgb3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+XG4gICAgICApID0+IGdldE9wdGlvbkxhYmVsKG9wdGlvbil9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgICByZW5kZXJJbnB1dD17KHBhcmFtcykgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJcIn1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogXCJvdXRsaW5lZFwifVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgY29sb3I6IFwicmVkXCIgfSxcbiAgICAgICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/IFwibm90LWFsbG93ZWRcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQXV0b2NvbXBsZXRlIGNvbXBvbmVudCBmb3Igc2VsZWN0aW5nIGZyb20gcHJlZGVmaW5lZCBvcHRpb25zLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBzZWxlY3QvYXV0b2NvbXBsZXRlIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0sIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqIGZvciByZXNwb25zaXZlIGxheW91dHMuIEl0IHN1cHBvcnRzIGJvdGggc2luZ2xlIGFuZCBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZXMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9jb21wbGV0ZSB3aXRoIGZpbHRlcmluZ1xuICogLSBTaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBzdXBwb3J0XG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSBvcHRpb24gZGlzcGxheSAobGFiZWxLZXkvdmFsdWVLZXkpXG4gKiAtIEF1dG8tc2VsZWN0aW9uIHdoZW4gb25seSBvbmUgb3B0aW9uIGV4aXN0c1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImNhdGVnb3J5XCJcbiAqICAgbGFiZWw9XCJDYXRlZ29yeVwiXG4gKiAgIG9wdGlvbnM9e1tcbiAqICAgICB7IExhYmVsOiAnVGVjaG5vbG9neScsIFZhbHVlOiAndGVjaCcgfSxcbiAqICAgICB7IExhYmVsOiAnRmluYW5jZScsIFZhbHVlOiAnZmluYW5jZScgfVxuICogICBdfVxuICogICBydWxlcz17eyByZXF1aXJlZDogJ1BsZWFzZSBzZWxlY3QgYSBjYXRlZ29yeScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20ga2V5czpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJJZFwiXG4gKiAgIGxhYmVsPVwiQXNzaWduIHRvIFVzZXJcIlxuICogICBvcHRpb25zPXt1c2Vyc31cbiAqICAgbGFiZWxLZXk9XCJmdWxsTmFtZVwiXG4gKiAgIHZhbHVlS2V5PVwiaWRcIlxuICogICBwbGFjZWhvbGRlcj1cIkNob29zZSBhIHVzZXIuLi5cIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBNdWx0aXBsZSBzZWxlY3Rpb246XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ0YWdzXCJcbiAqICAgbGFiZWw9XCJUYWdzXCJcbiAqICAgb3B0aW9ucz17YXZhaWxhYmxlVGFnc31cbiAqICAgbXVsdGlwbGVcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogOCB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRPcHRpb24gLSBUaGUgb3B0aW9uIG9iamVjdCB0eXBlXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBNdWx0aXBsZSAtIFdoZXRoZXIgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBEaXNhYmxlQ2xlYXJhYmxlIC0gV2hldGhlciB0aGUgY2xlYXIgYnV0dG9uIGlzIGRpc2FibGVkXG4gKiBAdGVtcGxhdGUgRnJlZVNvbG8gLSBXaGV0aGVyIGZyZWUgdGV4dCBpbnB1dCBpcyBhbGxvd2VkXG4gKiBAdGVtcGxhdGUgQ2hpcENvbXBvbmVudCAtIFRoZSBjaGlwIGNvbXBvbmVudCB0eXBlIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3RFbGVtZW50ID0gPFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFtcImRlZmF1bHRDb21wb25lbnRcIl1cbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBNdWx0aXBsZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgRnJlZVNvbG8sXG4gIENoaXBDb21wb25lbnRcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICBpZiAoZ3JpZFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxHcmlkXG4gICAgICAgIHsuLi57IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSwgLi4uZ3JpZFByb3BzIH19XG4gICAgICA+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuU2VsZWN0RWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiU2VsZWN0RWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RFbGVtZW50O1xuIiwgImltcG9ydCBDaGVja0JveEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveCc7XG5pbXBvcnQgQ2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3hPdXRsaW5lQmxhbmsnO1xuaW1wb3J0IHR5cGUge1xuICBTeFByb3BzLFxuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBDaGVja2JveCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUsIENpcmN1bGFyUHJvZ3Jlc3MgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgSlNYLCBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBQYXRoLCBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzLCBVc2VDb250cm9sbGVyUHJvcHMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuLy9AdHMtbm9jaGVja1xuXG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxudHlwZSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnbXVsdGlwbGUnIHwgJ29uQ2hhbmdlJyB8ICd2YWx1ZSdcbj47XG5cbmV4cG9ydCB0eXBlIFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+ID0gQmFzZUF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4gJiB7XG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+WydydWxlcyddO1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgc3g/OiBTeFByb3BzO1xuICBsYWJlbEtleT86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlS2V5Pzoga2V5b2YgVE9wdGlvbjtcbn07XG5cbnR5cGUgU2VsZWN0TXVsdGlFbGVtZW50Q29tcG9uZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWUsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPihcbiAgcHJvcHM6IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RNdWx0aUVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPihwcm9wczogU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVE9wdGlvbj4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9ucyxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgdmFyaWFudCxcbiAgICBzeCxcbiAgICBsYWJlbEtleSA9ICdMYWJlbCcsXG4gICAgdmFsdWVLZXkgPSAnVmFsdWUnLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXldIDogbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW2xhYmVsS2V5XSA6ICcnO1xuICB9O1xuXG4gIGNvbnN0IHNlbGVjdGVkVmFsdWUgPVxuICAgIGZpZWxkLnZhbHVlICYmIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICA/IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IGZpZWxkLnZhbHVlLmluY2x1ZGVzKGdldE9wdGlvblZhbHVlKG9wdGlvbikpKVxuICAgICAgOiBbXTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogU3ludGhldGljRXZlbnQsXG4gICAgc2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10sXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgZmllbGQub25DaGFuZ2UoW10pO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSAnc2VsZWN0T3B0aW9uJyB8fCByZWFzb24gPT09ICdyZW1vdmVPcHRpb24nKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZXMgPSBzZWxlY3RlZE9wdGlvbnMubWFwKChvcHRpb24pID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikpO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBpY29uID0gPENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG4gIGNvbnN0IGNoZWNrZWRJY29uID0gPENoZWNrQm94SWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgdmFsdWU9e3NlbGVjdGVkVmFsdWV9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBkaXNhYmxlQ2xvc2VPblNlbGVjdFxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgPz8gZmllbGQuZGlzYWJsZWR9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25CbHVyPXsoZXZlbnQpID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVuZGVyT3B0aW9uPXsocHJvcHMxLCBvcHRpb24sIHsgc2VsZWN0ZWQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9IHByb3BzMTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIDxDaGVja2JveCBpY29uPXtpY29ufSBjaGVja2VkSWNvbj17Y2hlY2tlZEljb259IGNoZWNrZWQ9e3NlbGVjdGVkfSAvPlxuICAgICAgICAgICAge2dldE9wdGlvbkxhYmVsKG9wdGlvbiBhcyBUT3B0aW9uKX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAgIHJlbmRlcklucHV0PXsocGFyYW1zKSA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuU2VsZWN0TXVsdGlFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdE11bHRpRWxlbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdE11bHRpRWxlbWVudDtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgU3hQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQge1xuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZUZvcmtSZWYsXG4gIHVzZVRoZW1lLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbiAgVXNlQ29udHJvbGxlclByb3BzXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXJcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXh0RmllbGRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPiB7XG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIHJ1bGVzIGZvciB0aGUgZmllbGRcbiAgICogQGV4YW1wbGUgeyByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLCBtaW5MZW5ndGg6IHsgdmFsdWU6IDMsIG1lc3NhZ2U6ICdNaW5pbXVtIDMgY2hhcmFjdGVycycgfSB9XG4gICAqL1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPltcInJ1bGVzXCJdO1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqL1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgLyoqIFRyYW5zZm9ybSB2YWx1ZSBiZWZvcmUgZGlzcGxheWluZyBpbiBpbnB1dCAqL1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZTtcbiAgICAvKiogVHJhbnNmb3JtIGlucHV0IGV2ZW50IHRvIGZvcm0gdmFsdWUgKi9cbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbGFiZWwgdGV4dFxuICAgKiBAZXhhbXBsZSBcIkVtYWlsIEFkZHJlc3NcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgaW5wdXRcbiAgICogQGV4YW1wbGUgXCJFbnRlciB5b3VyIGVtYWlsXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCBcIm5hbWVcIj47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgZm9yIHRoZSBUZXh0RmllbGRcbiAgICovXG4gIHN4PzogU3hQcm9wcztcbn1cblxudHlwZSBUZXh0RmllbGRFbGVtZW50Q29tcG9uZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4oXG4gIHByb3BzOiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKSA9PiBSZWFjdC5KU1guRWxlbWVudDtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gVGV4dEZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+KHByb3BzOiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgcnVsZXMgPSB7fSxcbiAgICBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICBncmlkUHJvcHMsXG4gICAgdHJhbnNmb3JtLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBzeCxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPz8gKFwiXCIgYXMgVFZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdHJhbnNmb3JtLm91dHB1dFxuICAgICAgICAgIDogKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4ge1xuICAgICAgICAvLyB0aGlzIHdpbGwgYmUgYSBicmVha2luZyBjaGFuZ2UgZm9yIGFueW9uZSB1c2luZyB0cmFuc2Zvcm0ub3V0cHV0XG4gICAgICAgIC8vIGJlY2F1c2Ugbm93IHdlIGFyZSBwYXNzaW5nIGV2ZW50IGluc3RlYWQgb2YgZXZlbnQudGFyZ2V0LnZhbHVlIG9yICtldmVudC50YXJnZXQudmFsdWVcbiAgICAgICAgZmllbGQub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9eyhldmVudCkgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6IGhlbHBlclRleHR9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6IFwib3V0bGluZWRcIn1cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBzeD17e1xuICAgICAgICBcIiYgLk11aUlucHV0TGFiZWwtYXN0ZXJpc2tcIjogeyBjb2xvcjogXCJyZWRcIiB9LFxuICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/IFwibm90LWFsbG93ZWRcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICB9LFxuICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIC4uLnN4LFxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZ3JpZCBsYXlvdXQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIFRleHRGaWVsZCB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnRcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIE51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZmlyc3ROYW1lXCJcbiAqICAgbGFiZWw9XCJGaXJzdCBOYW1lXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdGaXJzdCBuYW1lIGlzIHJlcXVpcmVkJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImVtYWlsXCJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXG4gKiAgIHR5cGU9XCJlbWFpbFwiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICogICAgIHBhdHRlcm46IHsgdmFsdWU6IC9cXFMrQFxcUytcXC5cXFMrLywgbWVzc2FnZTogJ0ludmFsaWQgZW1haWwnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTnVtYmVyIGlucHV0IHdpdGggdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIHRleHRGaWVsZFByb3BzPXt7IHR5cGU6ICdudW1iZXInIH19XG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlPy50b1N0cmluZygpIHx8ICcnLFxuICogICAgIG91dHB1dDogKGV2ZW50KSA9PiBwYXJzZUludChldmVudC50YXJnZXQudmFsdWUpIHx8IG51bGxcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5UZXh0RmllbGRFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJUZXh0RmllbGRFbGVtZW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRGaWVsZEVsZW1lbnQ7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFN4UHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50c1xufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHtcbiAgR3JpZCxcbiAgVGV4dEZpZWxkLFxuICB1c2VGb3JrUmVmLFxuICB1c2VUaGVtZSxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJQcm9wc1xufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgdXNlRW5oYW5jZWRUcmFuc2Zvcm0sIHR5cGUgRmllbGRUeXBlIH0gZnJvbSBcIi4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybS9lbmhhbmNlZFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbj4ge1xuICAvKipcbiAgICogVmFsaWRhdGlvbiBydWxlcyBmb3IgdGhlIGZpZWxkXG4gICAqIEBleGFtcGxlIHsgcmVxdWlyZWQ6ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJywgbWluTGVuZ3RoOiB7IHZhbHVlOiAzLCBtZXNzYWdlOiAnTWluaW11bSAzIGNoYXJhY3RlcnMnIH0gfVxuICAgKi9cbiAgcnVsZXM/OiBVc2VDb250cm9sbGVyUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT5bXCJydWxlc1wiXTtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDdXN0b20gVGV4dEZpZWxkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBkZWZhdWx0IE1VSSBUZXh0RmllbGRcbiAgICovXG4gIGNvbXBvbmVudD86IHR5cGVvZiBUZXh0RmllbGQ7XG4gIC8qKlxuICAgKiBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIGlucHV0L291dHB1dFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZmllbGRUeXBlIGZvciBjb21tb24gcGF0dGVybnMgb3IgY3VzdG9tIHRyYW5zZm9ybXMgZm9yIGNvbXBsZXggY2FzZXNcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgLyoqXG4gICAqIEJ1aWx0LWluIGZpZWxkIHR5cGUgZm9yIGF1dG9tYXRpYyB0cmFuc2Zvcm1hdGlvblxuICAgKiBAZXhhbXBsZSAndGV4dCcgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICd0aW1lJyB8ICdzZWxlY3QnXG4gICAqL1xuICBmaWVsZFR5cGU/OiBGaWVsZFR5cGU7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlIHRvIGRpc3BsYXkgd2hlbiBmaWVsZCB2YWx1ZSBpcyBudWxsL3VuZGVmaW5lZFxuICAgKiBAZXhhbXBsZSBcIlwiXG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBUVmFsdWU7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbGFiZWwgdGV4dFxuICAgKiBAZXhhbXBsZSBcIkVtYWlsIEFkZHJlc3NcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgaW5wdXRcbiAgICogQGV4YW1wbGUgXCJFbnRlciB5b3VyIGVtYWlsXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCBcIm5hbWVcIj47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgZm9yIHRoZSBUZXh0RmllbGRcbiAgICovXG4gIHN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIEN1c3RvbSBvbkNoYW5nZSBoYW5kbGVyIGNhbGxlZCBhZnRlciB0cmFuc2Zvcm1hdGlvblxuICAgKi9cbiAgb25DaGFuZ2U/OiAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBkZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9uIGlzc3Vlc1xuICAgKiBAZGVmYXVsdFZhbHVlIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG59XG5cbnR5cGUgRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50Q29tcG9uZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuPihcbiAgcHJvcHM6IEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbikgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbj4ocHJvcHM6IEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHJ1bGVzID0ge30sXG4gICAgcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQgPSBUZXh0RmllbGQsXG4gICAgZ3JpZFByb3BzLFxuICAgIHRyYW5zZm9ybSxcbiAgICBmaWVsZFR5cGUgPSAndGV4dCcsIC8vIERlZmF1bHQgdG8gdGV4dCB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBzeCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgZW5hYmxlV2FybmluZ3MgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIHJ1bGVzLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gVXNlIHRoZSBlbmhhbmNlZCB0cmFuc2Zvcm0gaG9vayB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZUVuaGFuY2VkVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0gPyB7XG4gICAgICBpbnB1dDogdHJhbnNmb3JtLmlucHV0LFxuICAgICAgb3V0cHV0OiB0cmFuc2Zvcm0ub3V0cHV0LFxuICAgIH0gOiB1bmRlZmluZWQsXG4gICAgZmllbGRUeXBlOiAhdHJhbnNmb3JtID8gKHR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiBmaWVsZFR5cGUpIDogdW5kZWZpbmVkLCAvLyBBdXRvLWRldGVjdCBudW1iZXIgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBlbmFibGVXYXJuaW5ncyxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZENvbXBvbmVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB7XG4gICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXsoZXZlbnQpID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICB0eXBlPXt0eXBlfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IGhlbHBlclRleHR9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6IFwib3V0bGluZWRcIn1cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBzeD17e1xuICAgICAgICBcIiYgLk11aUlucHV0TGFiZWwtYXN0ZXJpc2tcIjogeyBjb2xvcjogXCJyZWRcIiB9LFxuICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/IFwibm90LWFsbG93ZWRcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICB9LFxuICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIC4uLnN4LFxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBbiBlbmhhbmNlZCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBUZXh0RmllbGQgY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24sXG4gKiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLCBhbmQgYnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZy5cbiAqXG4gKiBUaGlzIGVuaGFuY2VkIHZlcnNpb24gcHJvdmlkZXMgYWxsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBvcmlnaW5hbCBUZXh0RmllbGRFbGVtZW50XG4gKiBwbHVzIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCBtZW1vaXplZCB0cmFuc2Zvcm1hdGlvbnNcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZyAobnVtYmVyLCB0ZXh0LCBldGMuKVxuICogLSBCZXR0ZXIgVHlwZVNjcmlwdCBpbmZlcmVuY2UgYW5kIHR5cGUgc2FmZXR5XG4gKiAtIERldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmdcbiAqIC0gU3RhYmxlIHJlZmVyZW5jZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gKiAtIEVuaGFuY2VkIGVycm9yIGhhbmRsaW5nIHdpdGggY3VzdG9tIHBhcnNlRXJyb3Igc3VwcG9ydFxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nXG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnQgKGJhY2t3YXJkIGNvbXBhdGlibGUpXG4gKiAtIEJ1aWx0LWluIGZpZWxkIHR5cGVzIGZvciBjb21tb24gcGF0dGVybnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBFbmhhbmNlZCBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIE9wdGltaXplZCBudW1iZXIgaW5wdXQgaGFuZGxpbmdcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYnVpbHQtaW4gbnVtYmVyIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiA8RW5oYW5jZWRUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIGZpZWxkVHlwZT1cIm51bWJlclwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnQWdlIGlzIHJlcXVpcmVkJywgbWluOiB7IHZhbHVlOiAwLCBtZXNzYWdlOiAnQWdlIG11c3QgYmUgcG9zaXRpdmUnIH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImVtYWlsXCJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgZW1haWwgYWRkcmVzc1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICogICAgIHBhdHRlcm46IHsgdmFsdWU6IC9cXFMrQFxcUytcXC5cXFMrLywgbWVzc2FnZTogJ0ludmFsaWQgZW1haWwnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRyYW5zZm9ybWF0aW9uIChiYWNrd2FyZCBjb21wYXRpYmxlKTpcbiAqIGBgYHRzeFxuICogPEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicHJpY2VcIlxuICogICBsYWJlbD1cIlByaWNlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPyBgJCR7dmFsdWV9YCA6ICcnLFxuICogICAgIG91dHB1dDogKGV2ZW50KSA9PiBwYXJzZUZsb2F0KGV2ZW50LnRhcmdldC52YWx1ZS5yZXBsYWNlKCckJywgJycpKSB8fCBudWxsXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGVycm9yIHBhcnNpbmc6XG4gKiBgYGB0c3hcbiAqIDxFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJuYW1lXCJcbiAqICAgbGFiZWw9XCJVc2VybmFtZVwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IChcbiAqICAgICA8c3BhbiBzdHlsZT17eyBjb2xvcjogJ3JlZCcgfX0+XG4gKiAgICAgICBcdTI2QTBcdUZFMEYge2Vycm9yLm1lc3NhZ2V9XG4gKiAgICAgPC9zcGFuPlxuICogICApfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cbkVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudDtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHMsXG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgR3JpZCwgdXNlRm9ya1JlZiwgdXNlVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIFRpbWVQaWNrZXJQcm9wcyxcbiAgVGltZVBpY2tlclNsb3RQcm9wcyxcbiAgVGltZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdHlwZSBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxuICBVc2VDb250cm9sbGVyUHJvcHMsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgVXNlVHJhbnNmb3JtT3B0aW9ucywgVXNlVHJhbnNmb3JtUmV0dXJuIH0gZnJvbSBcIkAvaG9va3NcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKSBhcyBURGF0ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYW5zZm9ybTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+KFxuICBvcHRpb25zOiBVc2VUcmFuc2Zvcm1PcHRpb25zPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbik6IFVzZVRyYW5zZm9ybVJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+IHtcbiAgY29uc3QgdmFsdWUgPVxuICAgIHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBvcHRpb25zLnRyYW5zZm9ybS5pbnB1dChvcHRpb25zLnZhbHVlKVxuICAgICAgOiBvcHRpb25zLnZhbHVlO1xuXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKC4uLmV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9wdGlvbnMub25DaGFuZ2Uob3B0aW9ucy50cmFuc2Zvcm0ub3V0cHV0KC4uLmV2ZW50KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLm9uQ2hhbmdlKC4uLmV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvcHRpb25zXVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVBpY2tlckVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2Vcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBpc0RhdGU/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgVGltZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPltcInJ1bGVzXCJdO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBpbnB1dFByb3BzPzogVGV4dEZpZWxkUHJvcHM7XG4gIGhlbHBlclRleHQ/OiBUZXh0RmllbGRQcm9wc1tcImhlbHBlclRleHRcIl07XG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgc2xvdFByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyU2xvdFByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgIFwidGV4dEZpZWxkXCJcbiAgPjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZSB8IG51bGw7XG4gICAgb3V0cHV0PzogKFxuICAgICAgdmFsdWU6IFRWYWx1ZSB8IG51bGwsXG4gICAgICBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxUaW1lVmFsaWRhdGlvbkVycm9yPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHRpbWVQaWNrZXJQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgIFwidmFsdWVcIiB8IFwic2xvdFByb3BzXCJcbiAgPjtcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBzeD86IFN4UHJvcHM7XG59XG5cbnR5cGUgVGltZVBpY2tlckVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlXG4+KFxuICBwcm9wczogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUaW1lUGlja2VyRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGVcbj4ocHJvcHM6IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICByZXF1aXJlZCxcbiAgICBpbnB1dFByb3BzLFxuICAgIGNvbnRyb2wsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHNsb3RQcm9wcyxcbiAgICB0aW1lUGlja2VyUHJvcHMgPSB7fSxcbiAgICB0cmFuc2Zvcm0sXG4gICAgc3gsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgeyBkaXNhYmxlZCwgaW5wdXRSZWYsIG9uQ2xvc2UsIC4uLnJlc3RUaW1lUGlja2VyUHJvcHMgfSA9XG4gICAgdGltZVBpY2tlclByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbiAgfSk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUgfCBudWxsPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IChuZXdWYWx1ZSkgPT4gcmVhZFZhbHVlQXNEYXRlKGFkYXB0ZXIsIG5ld1ZhbHVlKSxcbiAgICAgIG91dHB1dDogKG91dHB1dFZhbHVlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIGlmIChvdXRwdXRWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFZhbHVlO1xuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGltZVBpY2tlclxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRpbWVQaWNrZXJQcm9wc31cbiAgICAgIHsuLi5maWVsZH1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIHsuLi50aW1lUGlja2VyUHJvcHN9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICBvbkNsb3NlPXsoLi4uYXJncykgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgICBvbkNsb3NlKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25DaGFuZ2U9eyhuZXdWYWx1ZSwgY29udGV4dCkgPT4ge1xuICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGltZVBpY2tlclByb3BzLm9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aW1lUGlja2VyUHJvcHMub25DaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgc3g9e3tcbiAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnN4LFxuICAgICAgfX1cbiAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICAgIGFjdGlvbnM6IFtcImNsZWFyXCIsIFwiY2FuY2VsXCIsIFwiYWNjZXB0XCJdLFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgICBvbkJsdXI6IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXRQcm9wcz8ub25CbHVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgaGVscGVyVGV4dDogZXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiBpbnB1dFByb3BzPy5oZWxwZXJUZXh0IHx8IHJlc3QuaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogISF0ZXh0UmVhZE9ubHksXG4gICAgICAgICAgICAuLi5pbnB1dFByb3BzPy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgVGltZVBpY2tlckVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5UaW1lUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiVGltZVBpY2tlckVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgVGltZVBpY2tlckVsZW1lbnQ7XG4iLCAiaW1wb3J0IHsgQXV0b2NvbXBsZXRlLCBDaXJjdWxhclByb2dyZXNzLCBHcmlkLCBUZXh0RmllbGQsIHVzZVRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWwvQXV0b2NvbXBsZXRlXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsL3V0aWxzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIEZyYWdtZW50LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIsIHR5cGUgRmllbGRQYXRoLCB0eXBlIEZpZWxkVmFsdWVzIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0UGF5bG9hZCB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzLCBPcHRpb25PYmplY3QgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBBc3luY1NlbGVjdEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gXCJWYWx1ZVwiLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBcIkxhYmVsXCIsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PlxuPihwcm9wczogQXN5bmNTZWxlY3RFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgaW5pdGlhbFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHF1ZXJ5Rm4sXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEtleSA9IFwiTGFiZWxcIiBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVLZXkgPSBcIlZhbHVlXCIgYXMgVFZhbHVlS2V5LFxuICAgIHN4LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtzZWxlY3RlZE9wdGlvbiwgc2V0U2VsZWN0ZWRPcHRpb25dID0gdXNlU3RhdGU8VE9wdGlvbiB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgaW5wdXRWYWx1ZTI6IHN0cmluZyA9IHVzZU1lbW8oKCkgPT4gaW5wdXRWYWx1ZSwgW2lucHV0VmFsdWVdKTtcbiAgY29uc3Qgc2V0SW5wdXRWYWx1ZTIgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3VmFsdWU6IHN0cmluZykgPT4gc2V0SW5wdXRWYWx1ZShuZXdWYWx1ZSksXG4gICAgW11cbiAgKTtcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8cmVhZG9ubHkgVE9wdGlvbltdPihbXSk7XG5cbiAgY29uc3QgaW5pdGlhbFZhbHVlTG9hZGVkID0gdXNlUmVmPGJvb2xlYW4+KFxuICAgICFpbml0aWFsVmFsdWUgPyB0cnVlIDogIShpbml0aWFsVmFsdWUgIT0gbnVsbClcbiAgKTtcblxuICBjb25zdCBmaWVsZFZhbHVlID0gdXNlUmVmPFRPcHRpb25bVFZhbHVlS2V5XSB8IG51bGw+KGZpZWxkLnZhbHVlKTtcblxuICBjb25zdCBmZXRjaERhdGEgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBkZWJvdW5jZShcbiAgICAgICAgKFxuICAgICAgICAgIHBheWxvYWQ6IEFzeW5jU2VsZWN0UGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHZvaWRcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgcXVlcnlGbihwYXlsb2FkKS50aGVuKChjKSA9PiBjYWxsYmFjayhjKSk7XG4gICAgICAgIH0sXG4gICAgICAgIDQwMFxuICAgICAgKSxcbiAgICBbcXVlcnlGbl1cbiAgKTtcblxuICBjb25zdCBmaWxsT3B0aW9ucyA9IHVzZUNhbGxiYWNrKChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgbGV0IG5ld09wdGlvbnM6IHJlYWRvbmx5IFRPcHRpb25bXSA9IFtdO1xuXG4gICAgaWYgKHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICBuZXdPcHRpb25zID0gW3NlbGVjdGVkT3B0aW9uXTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0cykge1xuICAgICAgbmV3T3B0aW9ucyA9IFsuLi5uZXdPcHRpb25zLCAuLi5yZXN1bHRzXTtcbiAgICB9XG5cbiAgICBzZXRPcHRpb25zKG5ld09wdGlvbnMpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICB9LCBbc2VsZWN0ZWRPcHRpb25dKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGxldCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNTZWxlY3RQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IG51bGwsXG4gICAgICBpbml0aWFsVmFsdWUsXG4gICAgfTtcblxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICBmZXRjaERhdGEocGF5bG9hZCwgKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgaWYgKCEhcmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmaWxsT3B0aW9ucyhyZXN1bHRzPy5maWx0ZXIoKGMpID0+IGNbdmFsdWVLZXldID09IGluaXRpYWxWYWx1ZSkpO1xuICAgICAgICAgIHNldFNlbGVjdGVkT3B0aW9uKHJlc3VsdHNbMF0pO1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKHJlc3VsdHNbMF1bdmFsdWVLZXldKTtcbiAgICAgICAgICBmaWVsZFZhbHVlLmN1cnJlbnQgPSByZXN1bHRzWzBdW3ZhbHVlS2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRpYWxWYWx1ZUxvYWRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW2luaXRpYWxWYWx1ZSwgZmV0Y2hEYXRhLCBmaWVsZCwgZmlsbE9wdGlvbnMsIHZhbHVlS2V5XSk7XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIGlmIChpbnB1dFZhbHVlMiA9PT0gXCJcIiB8fCBpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHNldE9wdGlvbnMoc2VsZWN0ZWRPcHRpb24gPyBbc2VsZWN0ZWRPcHRpb25dIDogW10pO1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuY3VycmVudCkge1xuICAgICAgaWYgKGZpZWxkLnZhbHVlID09PSBmaWVsZFZhbHVlLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNTZWxlY3RQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IGlucHV0VmFsdWUyLFxuICAgICAgaW5pdGlhbFZhbHVlOiBudWxsLFxuICAgIH07XG5cbiAgICBmZXRjaERhdGEocGF5bG9hZCwgKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgZmlsbE9wdGlvbnMocmVzdWx0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW2luaXRpYWxWYWx1ZSwgaW5wdXRWYWx1ZTIsIGZldGNoRGF0YSwgZmllbGQudmFsdWUsIGZpbGxPcHRpb25zLCBzZWxlY3RlZE9wdGlvbl0pO1xuXG4gIGNvbnN0IHNlbGVjdFJlZiA9IHVzZVJlZihudWxsKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogUmVhY3QuU3ludGhldGljRXZlbnQsXG4gICAgbmV3U2VsZWN0ZWRPcHRpb246IFRPcHRpb24gfCBudWxsLFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGlmIChyZWFzb24gPT09IFwiY2xlYXJcIikge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSBcInNlbGVjdE9wdGlvblwiIHx8IHJlYXNvbiA9PT0gXCJyZW1vdmVPcHRpb25cIikge1xuICAgICAgaWYgKG5ld1NlbGVjdGVkT3B0aW9uKSB7XG4gICAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG5ld1NlbGVjdGVkT3B0aW9uKTtcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3U2VsZWN0ZWRPcHRpb25bdmFsdWVLZXldKTtcbiAgICAgICAgZmllbGRWYWx1ZS5jdXJyZW50ID0gbmV3U2VsZWN0ZWRPcHRpb25bdmFsdWVLZXldO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRPcHRpb25zKFtdKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZmllbGQudmFsdWUpIHtcbiAgICAgIHNldElucHV0VmFsdWUoXCJcIik7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihudWxsKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2ZpZWxkLnZhbHVlXSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUtleV0pIDogXCJcIjtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsS2V5XSkgOiBcIlwiO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICByZWY9e3NlbGVjdFJlZn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uVmFsdWV9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgYXV0b0NvbXBsZXRlXG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBpbmNsdWRlSW5wdXRJbkxpc3RcbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICBmaWx0ZXJPcHRpb25zPXsoeCkgPT4geH1cbiAgICAgIHZhbHVlPXtzZWxlY3RlZE9wdGlvbn1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9eyhfLCBuZXdJbnB1dFZhbHVlKSA9PiB7XG4gICAgICAgIHNldElucHV0VmFsdWUyKG5ld0lucHV0VmFsdWUpO1xuICAgICAgfX1cbiAgICAgIG5vT3B0aW9uc1RleHQ9XCJUeXBlIFNvbWV0aGluZy4uLlwiXG4gICAgICByZW5kZXJJbnB1dD17KHBhcmFtcykgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJcIn1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiBcIm91dGxpbmVkXCJ9XG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/IFwibm90LWFsbG93ZWRcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgICAgLi4uc3gsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICByZW5kZXJPcHRpb249eyhyZW5kZXJQcm9wcywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCAuLi5vcHRpb25Qcm9wcyB9ID0gcmVuZGVyUHJvcHM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkga2V5PXtrZXl9IHsuLi5vcHRpb25Qcm9wc30+XG4gICAgICAgICAgICB7b3B0aW9uW2xhYmVsS2V5XX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNTZWxlY3RFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IFwiVmFsdWVcIixcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gXCJMYWJlbFwiLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT5cbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogQXN5bmNTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBUT3B0aW9uXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPiB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPiB7Li4ucHJvcHN9IC8+O1xufTtcblxuQXN5bmNTZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJBc3luY1NlbGVjdEVsZW1lbnRcIjtcblxuZXhwb3J0IHsgQXN5bmNTZWxlY3RFbGVtZW50IH07XG4iLCAiaW1wb3J0IHsgQXN5bmNNdWx0aVNlbGVjdDIgfSBmcm9tIFwiLi4vQXN5bmNNdWx0aVNlbGVjdDJcIjtcbmltcG9ydCB7IEFzeW5jU2VsZWN0IH0gZnJvbSBcIi4uL0FzeW5jU2VsZWN0XCI7XG5pbXBvcnQgeyBDaGVja2JveEVsZW1lbnQgfSBmcm9tIFwiLi4vQ2hlY2tib3hFbGVtZW50XCI7XG5pbXBvcnQgeyBDaGVja2JveEdyb3VwIH0gZnJvbSBcIi4uL0NoZWNrYm94R3JvdXBcIjtcbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSBcIi4uL0RhdGVQaWNrZXJFbGVtZW50XCI7XG5pbXBvcnQgeyBQYXNzd29yZEVsZW1lbnQgfSBmcm9tIFwiLi4vUGFzc3dvcmRFbGVtZW50XCI7XG5pbXBvcnQgeyBSYWRpb0J1dHRvbkdyb3VwIH0gZnJvbSBcIi4uL1JhZGlvQnV0dG9uR3JvdXBcIjtcbmltcG9ydCB7IFNlbGVjdENhc2NhZGVFbGVtZW50IH0gZnJvbSBcIi4uL1NlbGVjdENhc2NhZGVFbGVtZW50XCI7XG5pbXBvcnQgeyBTZWxlY3RFbGVtZW50IH0gZnJvbSBcIi4uL1NlbGVjdEVsZW1lbnRcIjtcbmltcG9ydCB7IFNlbGVjdE11bHRpRWxlbWVudCB9IGZyb20gXCIuLi9TZWxlY3RNdWx0aUVsZW1lbnRcIjtcbmltcG9ydCB7IFRleHRGaWVsZEVsZW1lbnQgfSBmcm9tIFwiLi4vVGV4dEZpZWxkRWxlbWVudFwiO1xuaW1wb3J0IHsgVGltZVBpY2tlckVsZW1lbnQgfSBmcm9tIFwiLi4vVGltZVBpY2tlckVsZW1lbnRcIjtcblxuY29uc3QgRmllbGQgPSB7XG4gIFRleHQ6IFRleHRGaWVsZEVsZW1lbnQsXG4gIENoZWNrYm94OiBDaGVja2JveEVsZW1lbnQsXG4gIERhdGU6IERhdGVQaWNrZXJFbGVtZW50LFxuICBSYWRpb0dyb3VwOiBSYWRpb0J1dHRvbkdyb3VwLFxuICBQYXNzd29yZDogUGFzc3dvcmRFbGVtZW50LFxuICBUaW1lOiBUaW1lUGlja2VyRWxlbWVudCxcbiAgU2VsZWN0OiBTZWxlY3RFbGVtZW50LFxuICBTZWxlY3RNdWx0aTogU2VsZWN0TXVsdGlFbGVtZW50LFxuICBTZWxlY3RDYXNjYWRlOiBTZWxlY3RDYXNjYWRlRWxlbWVudCxcbiAgQXN5bmNTZWxlY3QsXG4gIEFzeW5jTXVsdGlTZWxlY3Q6IEFzeW5jTXVsdGlTZWxlY3QyLFxuICBDaGVja2JveEdyb3VwLFxufTtcblxuZXhwb3J0IHsgRmllbGQgfTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7OztBQUFBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxnQkFB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LFVBQVVDO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQUEsRUFDWixVQUFVO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixhQUFhO0FBQUEsRUFDYixlQUFlO0FBQUEsRUFDZjtBQUFBLEVBQ0Esa0JBQWtCO0FBQUEsRUFDbEIsZUFBQUM7QUFDRjsiLAogICJuYW1lcyI6IFsiR3JpZCIsICJ1c2VUaGVtZSIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgInVzZVRoZW1lIiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiQ2hlY2tib3hFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtR3JvdXAiLCAiRm9ybUhlbHBlclRleHQiLCAiR3JpZCIsICJ1c2VFZmZlY3QiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQ2hlY2tib3hHcm91cCIsICJHcmlkIiwgImZvcndhcmRSZWYiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlTWVtbyIsICJ1c2VUaGVtZSIsICJ1c2VNZW1vIiwgImpzeCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAianN4IiwgImZvcndhcmRSZWYiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJHcmlkIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJwYXNzd29yZCIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgInVzZVRoZW1lIiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlVGhlbWUiLCAidXNlQ29udHJvbGxlciIsICJ2YWx1ZSIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIlJhZGlvQnV0dG9uR3JvdXAiLCAiR3JpZCIsICJHcmlkIiwgInVzZVRoZW1lIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlU3RhdGUiLCAidXNlRWZmZWN0IiwgInVzZUNhbGxiYWNrIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RDYXNjYWRlRWxlbWVudCIsICJHcmlkIiwgInVzZVRoZW1lIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlTWVtbyIsICJ1c2VFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiR3JpZCIsICJDaGVja2JveCIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAiRnJhZ21lbnQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlVGhlbWUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZVRoZW1lIiwgInZhbHVlIiwgInVzZUZvcmtSZWYiLCAiVGV4dEZpZWxkRWxlbWVudCIsICJHcmlkIiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlVGhlbWUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZVRoZW1lIiwgInVzZUZvcmtSZWYiLCAiRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJ1c2VGb3JrUmVmIiwgInVzZVRoZW1lIiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAidXNlVHJhbnNmb3JtIiwgIkNvbXBvbmVudCIsICJUaW1lUGlja2VyRWxlbWVudCIsICJBdXRvY29tcGxldGUiLCAiQ2lyY3VsYXJQcm9ncmVzcyIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VUaGVtZSIsICJkZWJvdW5jZSIsICJSZWFjdCIsICJGcmFnbWVudCIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VSZWYiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQXN5bmNTZWxlY3RFbGVtZW50IiwgIkNoZWNrYm94RWxlbWVudCIsICJDaGVja2JveEdyb3VwIl0KfQo=
|