@gnwebsoft/ui 4.0.2 → 4.0.3

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