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