@chocbite/ts-lib-form 1.0.0

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.
@@ -0,0 +1,901 @@
1
+
2
+ import { AccessTypes, Base } from "@chocbite/ts-lib-base";
3
+ import { ListField } from "@chocbite/ts-lib-list";
4
+ import { State, StateEnumRelated, StateNumberRelated, StateStringRelated } from "@chocbite/ts-lib-state";
5
+
6
+ //#region node_modules/@chocbite/ts-lib-result/dist/index.d.ts
7
+ /**Symbol used to identify Result objects, can be used to create result compliant objects */
8
+ declare const RESULT_KEY: unique symbol;
9
+ /**Symbol used to identify Option objects, can be used to create option compliant objects */
10
+ declare const OPTION_KEY: unique symbol;
11
+ interface OptionBase<T> {
12
+ /**Unique symbol to identify Option objects */
13
+ readonly [OPTION_KEY]: true;
14
+ /**Is true when a value is available*/
15
+ readonly some: boolean;
16
+ /**Is true when no value is available*/
17
+ readonly none: boolean;
18
+ /**The value*/
19
+ readonly value?: T;
20
+ /**Returns the contained value, if exists. Throws an error if not.
21
+ * @param msg the message to throw if no value exists.*/
22
+ expect(msg: string): T;
23
+ /**Returns the contained value, if exists. Throws an error if not.*/
24
+ unwrap(): T;
25
+ /**Returns the contained value or a provided default.
26
+ * @param value value to use as default*/
27
+ unwrap_or<T2>(value: T2): T | T2;
28
+ /**Calls mapper if the Option is `Some`, otherwise returns `None`.
29
+ * This function can be used for control flow based on `Optional` values.*/
30
+ and_then<T2>(mapper: (value: T) => OptionSome<T2>): Option<T2>;
31
+ and_then(mapper: (value: T) => OptionNone): Option<T>;
32
+ and_then<T2>(mapper: (value: T) => Option<T2>): Option<T2>;
33
+ /**Calls mapper if the Option is `None`, otherwise returns `Some`.
34
+ * This function can be used for control flow based on `Optional` values.*/
35
+ or_else<T2>(mapper: () => OptionSome<T2>): Option<T2>;
36
+ or_else(mapper: () => OptionNone): Option<T>;
37
+ or_else<T2>(mapper: () => Option<T2>): Option<T2>;
38
+ /**Maps an `Optional<T>` to `Optional<U>` by applying a function to a contained `Some` value, leaving a `None` value untouched.
39
+ * This function can be used to compose the Options of two functions.*/
40
+ map<U>(mapper: (value: T) => U): Option<U>;
41
+ /**Compares two `Optional<T>` values for equality.
42
+ * @returns true if equal, false otherwise. */
43
+ compare(other: Option<T>): boolean;
44
+ /**Maps an `Optional<T>` to a `Result<T, E>`.*/
45
+ to_result<E>(error: E): Result<T, E>;
46
+ }
47
+ declare class OptionSome<T> implements OptionBase<T> {
48
+ get [OPTION_KEY](): true;
49
+ readonly value: T;
50
+ constructor(value: T);
51
+ get some(): true;
52
+ get none(): false;
53
+ expect(): T;
54
+ unwrap(): T;
55
+ unwrap_or(): T;
56
+ and_then<T2>(mapper: (value: T) => OptionSome<T2>): OptionSome<T2>;
57
+ and_then(mapper: (value: T) => OptionNone): OptionNone;
58
+ and_then<T2>(mapper: (value: T) => Option<T2>): Option<T2>;
59
+ or_else(): OptionSome<T>;
60
+ map<U>(mapper: (value: T) => U): OptionSome<U>;
61
+ compare(other: Option<T>): boolean;
62
+ to_result(): ResultOk<T>;
63
+ }
64
+ declare class OptionNone implements OptionBase<never> {
65
+ get [OPTION_KEY](): true;
66
+ get some(): false;
67
+ get none(): true;
68
+ expect(msg: string): never;
69
+ unwrap(): never;
70
+ unwrap_or<T2>(val: T2): T2;
71
+ and_then(): OptionNone;
72
+ or_else<T2>(mapper: () => OptionSome<T2>): OptionSome<T2>;
73
+ or_else(mapper: () => OptionNone): OptionNone;
74
+ or_else<T2>(mapper: () => Option<T2>): Option<T2>;
75
+ map(): OptionNone;
76
+ compare(other: Option<never>): boolean;
77
+ to_result<E>(error: E): ResultErr<E>;
78
+ }
79
+ interface ResultBase<T, E> {
80
+ /**Unique symbol to identify Result objects */
81
+ readonly [RESULT_KEY]: true;
82
+ /**Is true when the result is valid and false when it is invalid*/
83
+ readonly ok: boolean;
84
+ /**Is false when the result is valid and true when it is invalid*/
85
+ readonly err: boolean;
86
+ /**The value for the result, only exists when it is valid*/
87
+ readonly value?: T;
88
+ /**The error for the result, only exists when it is invalid*/
89
+ readonly error?: E;
90
+ /**Returns the contained valid value, if exists. Throws an error if not.
91
+ * @param msg the message to throw if the value is invalid.*/
92
+ expect(msg: string): T;
93
+ /**Returns the contained valid value, if does not exist. Throws an error if it does.
94
+ * @param msg the message to throw if the value is valid.*/
95
+ expect_err(msg: string): E;
96
+ /**Returns the contained valid value.
97
+ * Throws if the value is invalid, with a message provided by the error's value.*/
98
+ unwrap(): T;
99
+ /**Returns the contained valid value or a provided default.*/
100
+ unwrap_or<T2>(value: T2): T | T2;
101
+ /**Returns the contained error value.
102
+ * Throws if the value is valid, with the value.*/
103
+ unwrap_err(): E;
104
+ unwrap_err_or<E2>(error: E2): E | E2;
105
+ /**Calls mapper function if the result is valid, otherwise returns the error value of self.
106
+ * This function can be used for control flow based on `Result` values.*/
107
+ and_then<T2>(mapper: (value: T) => ResultOk<T2>): Result<T2, E>;
108
+ and_then<E2>(mapper: (value: T) => ResultErr<E2>): Result<T, E2>;
109
+ and_then<T2, E2>(mapper: (value: T) => Result<T2, E2>): Result<T2, E2>;
110
+ /**Calls mapper function if the result is an error, otherwise returns the value self.
111
+ * This function can be used for control flow based on `Result` values.*/
112
+ or_else<T2>(mapper: (error: E) => ResultOk<T2>): Result<T2, E>;
113
+ or_else<E2>(mapper: (error: E) => ResultErr<E2>): Result<T, E2>;
114
+ or_else<T2, E2>(mapper: (error: E) => Result<T2, E2>): Result<T2, E2>;
115
+ /**Maps a `Result<T, E>` to `Result<U, E>` by applying a function to a contained valid value, leaving an error value untouched.
116
+ * This function can be used to compose the results of two functions.*/
117
+ map<U>(mapper: (value: T) => U): Result<U, E>;
118
+ /**Maps a `Result<T, E>` to `Result<T, F>` by applying a function to a contained error value, leaving a valid value untouched.
119
+ * This function can be used to pass through a successful result while handling an error.*/
120
+ map_err<F>(mapper: (error: E) => F): Result<T, F>;
121
+ /**Compares two `Result<T, E>` values for equality.
122
+ * @returns true if equal, false otherwise. */
123
+ compare(other: Result<T, E>): boolean;
124
+ /**Converts from `Result<T, E>` to `Optional<T>`, discarding the error if any*/
125
+ to_option(): Option<T>;
126
+ }
127
+ declare class ResultOk<T> implements ResultBase<T, never> {
128
+ get [RESULT_KEY](): true;
129
+ readonly value: T;
130
+ constructor(value: T);
131
+ get ok(): true;
132
+ get err(): false;
133
+ expect(): T;
134
+ expect_err(msg: string): never;
135
+ unwrap(): T;
136
+ unwrap_or(): T;
137
+ unwrap_err(): never;
138
+ unwrap_err_or<E2>(error: E2): E2;
139
+ and_then<T2>(mapper: (value: T) => ResultOk<T2>): ResultOk<T2>;
140
+ and_then<E2>(mapper: (value: T) => ResultErr<E2>): ResultErr<E2>;
141
+ and_then<T2, E2>(mapper: (value: T) => Result<T2, E2>): Result<T2, E2>;
142
+ or_else(): ResultOk<T>;
143
+ map<U>(func: (value: T) => U): ResultOk<U>;
144
+ map_err(): ResultOk<T>;
145
+ compare(other: Result<T, any>): boolean;
146
+ to_option(): OptionSome<T>;
147
+ }
148
+ declare class ResultErr<E> implements ResultBase<never, E> {
149
+ get [RESULT_KEY](): true;
150
+ readonly error: E;
151
+ constructor(error: E);
152
+ get valid(): false;
153
+ get ok(): false;
154
+ get err(): true;
155
+ expect(msg: string): never;
156
+ expect_err(): E;
157
+ unwrap(): never;
158
+ unwrap_or<T2>(val: T2): T2;
159
+ unwrap_err(): E;
160
+ unwrap_err_or(): E;
161
+ and_then(): ResultErr<E>;
162
+ or_else<T2>(mapper: (error: E) => ResultOk<T2>): ResultOk<T2>;
163
+ or_else<E2>(mapper: (error: E) => ResultErr<E2>): ResultErr<E2>;
164
+ or_else<T2, E2>(mapper: (error: E) => Result<T2, E2>): Result<T2, E2>;
165
+ map(): ResultErr<E>;
166
+ map_err<F>(mapper: (error: E) => F): ResultErr<F>;
167
+ compare(other: Result<any, E>): boolean;
168
+ to_option(): OptionNone;
169
+ }
170
+ type Result<T, E> = ResultOk<T> | ResultErr<E>;
171
+ type Option<T> = OptionSome<T> | OptionNone;
172
+ //#endregion
173
+ //#region node_modules/@chocbite/ts-lib-svg/dist/index.d.mts
174
+ type SVGFunc = () => SVGSVGElement; //#endregion
175
+ //#endregion
176
+ //#region src/base.d.ts
177
+ /**Colors for form elements that have selectable colors*/
178
+ declare const FormColors: {
179
+ readonly None: "none";
180
+ readonly Black: "black";
181
+ readonly Green: "green";
182
+ readonly Red: "red";
183
+ readonly Blue: "blue";
184
+ readonly Yellow: "yellow";
185
+ };
186
+ type FormColors = (typeof FormColors)[keyof typeof FormColors];
187
+ /**Shared component class for other components to inherit from*/
188
+ declare abstract class FormElement extends Base {
189
+ static element_name(): string;
190
+ static element_name_space(): string;
191
+ }
192
+ interface FormValueOptions<RT, ID extends string | undefined> {
193
+ /**ID form form element */
194
+ id?: ID;
195
+ /**Value for form element */
196
+ value?: RT;
197
+ value_by_state?: State<RT, Option<{}>, RT>;
198
+ /**Longer description what form element does */
199
+ description?: string;
200
+ /**Change listener function*/
201
+ change?: (val: RT) => void;
202
+ }
203
+ /**Shared class for all components with values*/
204
+ declare abstract class FormValue<RT, ID extends string | undefined> extends FormElement {
205
+ #private;
206
+ static element_name(): string;
207
+ static apply_options<RT, ID extends string | undefined>(element: FormValue<RT, ID>, options: FormValueOptions<RT, ID>): void;
208
+ readonly form_id: ID;
209
+ constructor(id?: ID);
210
+ protected _description?: string;
211
+ /**Sets the current label of the element*/
212
+ set description(text: string);
213
+ get description(): string;
214
+ protected _buffer?: RT;
215
+ get buffer(): RT | undefined;
216
+ protected _state?: State<RT, Option<{}>, RT>;
217
+ /**This sets the value of the component*/
218
+ set value_by_state(state: State<RT, Option<{}>, RT> | undefined);
219
+ /**This sets the value of the component*/
220
+ set value(val: RT);
221
+ /**Returns value of the component*/
222
+ get value(): Result<RT, string>;
223
+ set error(err: string | undefined);
224
+ /**Clears the value and error of the component if not state based*/
225
+ clear(): void;
226
+ /**Called when value is set by value setter or state*/
227
+ protected abstract new_value(val: RT): void;
228
+ /**Clears form element graphically*/
229
+ protected abstract clear_value(): void;
230
+ /**Called when error is set by error or state*/
231
+ protected abstract new_error(val: string): void;
232
+ /**Called when error is cleared by error or state*/
233
+ protected abstract clear_error(): void;
234
+ /**Called when state has related information */
235
+ protected abstract state_related(related: {}): void;
236
+ }
237
+ /**Shared class for all components with values*/
238
+ declare abstract class FormValueWrite<RT, ID extends string | undefined> extends FormValue<RT, ID> {
239
+ #private;
240
+ static element_name(): string;
241
+ protected warn_input: HTMLInputElement;
242
+ constructor(id?: ID);
243
+ set change(func: (val: RT) => void);
244
+ get change(): ((val: RT) => void) | undefined;
245
+ /**Returns the value of the component if it has changed*/
246
+ get changed(): boolean;
247
+ warn(message: string): void;
248
+ /**Function to limit value entered */
249
+ protected limit_value(val: RT): PromiseLike<Result<RT, string>>;
250
+ /**Function to check value */
251
+ protected check_value(val: RT): PromiseLike<Result<RT, string>>;
252
+ /**Function to update value*/
253
+ protected set_value_limit(val: RT): Promise<Result<RT, string>>;
254
+ /**Function to update value*/
255
+ protected set_value_check(val: RT): Promise<Result<RT, string>>;
256
+ }
257
+ //#endregion
258
+ //#region src/boolean/lamp/lamp.d.ts
259
+ interface FormLampOptions<T extends boolean | number, C extends FormColors[], ID extends string | undefined> extends FormValueOptions<T, ID> {
260
+ /**Sets the lamp colors */
261
+ colors: C;
262
+ /**Lamp text */
263
+ text?: string;
264
+ /**Icon for lamp */
265
+ icon?: SVGFunc;
266
+ }
267
+ declare class FormLamp<T extends boolean | number, C extends FormColors[], ID extends string | undefined> extends FormValue<T, ID> {
268
+ #private;
269
+ static element_name(): string;
270
+ static element_name_space(): string;
271
+ /**Sets the current text of the lamp*/
272
+ set text(label: string);
273
+ get text(): string;
274
+ /**Changes the icon of the lamp*/
275
+ set icon(icon: SVGFunc | undefined);
276
+ /** Sets the background color of the lamp*/
277
+ set colors(colors: C);
278
+ /**Called when value is changed */
279
+ protected new_value(value: number | boolean): void;
280
+ protected clear_value(): void;
281
+ protected new_error(err: string): void;
282
+ protected clear_error(): void;
283
+ protected state_related(_related: Option<{}>): void;
284
+ }
285
+ //#endregion
286
+ //#region src/boolean/button/button.d.ts
287
+ interface FormButtonOptions<ID extends string | undefined> extends FormValueOptions<boolean, ID> {
288
+ /**Buttons text */
289
+ text?: string;
290
+ /**Icon for button */
291
+ icon?: SVGFunc;
292
+ /**Function to call on button click */
293
+ on_click?: () => void;
294
+ /**Set true to make button toggle on click instead of normal */
295
+ toggle?: boolean;
296
+ /**Changes the buttons color */
297
+ color?: FormColors;
298
+ }
299
+ declare class FormButton<ID extends string | undefined> extends FormValueWrite<boolean, ID> {
300
+ #private;
301
+ static element_name(): string;
302
+ static element_name_space(): string;
303
+ constructor(id?: ID);
304
+ /**Sets the current text of the button*/
305
+ set text(label: string);
306
+ get text(): string;
307
+ /**Changes the icon of the button*/
308
+ set icon(icon: SVGFunc | undefined);
309
+ /**Function to call on button click*/
310
+ set on_click(func: (() => void) | undefined);
311
+ get on_click(): (() => void) | undefined;
312
+ /**Changes the color of the button*/
313
+ set color(color: FormColors);
314
+ /**Called when value is changed */
315
+ protected new_value(value: boolean): void;
316
+ protected clear_value(): void;
317
+ protected new_error(err: string): void;
318
+ protected clear_error(): void;
319
+ protected state_related(_related: Option<{}>): void;
320
+ /**Changes whether the button is maintained or momentary*/
321
+ set toggle(toggle: boolean | undefined);
322
+ get toggle(): boolean | undefined;
323
+ }
324
+ /**Creates a button form element */
325
+ declare function form_button<ID extends string | undefined>(options?: FormButtonOptions<ID>): FormButton<ID>;
326
+ //#endregion
327
+ //#region src/boolean/switch/switch.d.ts
328
+ interface FormSwitchOptions<ID extends string | undefined> extends FormValueOptions<boolean, ID> {
329
+ /**Icon to use for left side*/
330
+ icon?: SVGFunc;
331
+ /**Color when switch is on */
332
+ on_color?: FormColors;
333
+ /**Color when switch is off */
334
+ off_color?: FormColors;
335
+ }
336
+ declare class FormSwitch<ID extends string | undefined> extends FormValueWrite<boolean, ID> {
337
+ #private;
338
+ static element_name(): string;
339
+ static element_name_space(): string;
340
+ constructor(id?: ID);
341
+ /**Changes the icon of the switch*/
342
+ set icon(icon: SVGFunc | undefined);
343
+ set on_color(color: FormColors);
344
+ set off_color(color: FormColors);
345
+ set error_color(color: FormColors);
346
+ /**Called when value is changed */
347
+ protected new_value(value: boolean): void;
348
+ protected clear_value(): void;
349
+ protected new_error(_err: string): void;
350
+ protected clear_error(): void;
351
+ protected state_related(_related: Option<{}>): void;
352
+ }
353
+ /**Creates a switch form element */
354
+ declare function form_switch<ID extends string | undefined>(options?: FormSwitchOptions<ID>): FormSwitch<ID>;
355
+ //#endregion
356
+ //#region node_modules/@chocbite/ts-lib-common/dist/index.d.ts
357
+ /**Event types for base*/
358
+ declare const IPVersion: {
359
+ readonly V4: 4;
360
+ readonly V6: 6;
361
+ };
362
+ type IPVersion = (typeof IPVersion)[keyof typeof IPVersion];
363
+ declare class IPAddress {
364
+ private readonly value;
365
+ readonly version: IPVersion;
366
+ constructor(input: string | number | bigint | number[]);
367
+ private parse_v4_string;
368
+ private parse_v6_string;
369
+ private from_array;
370
+ get is_v4(): boolean;
371
+ get is_v6(): boolean;
372
+ get as_big_int(): bigint;
373
+ get as_array(): number[];
374
+ to_string(): string;
375
+ }
376
+ /*** Gets the current cursor position (offset) within the contenteditable element.
377
+ * @param element The contenteditable HTML element.
378
+ * @returns The offset number, or -1 if the element is not focused or no selection exists.*/
379
+ type Prettify<T> = { [K in keyof T]: T[K] } & {};
380
+ /**Checks of the given object is empty only checks for objects own properties*/
381
+ //#endregion
382
+ //#region src/group/group.d.ts
383
+ /**Different border styles for the component group*/
384
+ declare const FormGroupBorderStyle: {
385
+ readonly None: "none";
386
+ readonly Inset: "inset";
387
+ readonly Outset: "outset";
388
+ readonly Line: "line";
389
+ };
390
+ type FormGroupBorderStyle = (typeof FormGroupBorderStyle)[keyof typeof FormGroupBorderStyle];
391
+ type ExtractB<Arr extends any[]> = Arr extends [infer Head, ...infer Tail] ? Head extends FormValue<infer T, infer ID> ? [FormValue<T, ID>, ...ExtractB<Tail>] : [...ExtractB<Tail>] : [];
392
+ type ToKeyVal<Arr extends FormValue<any, any>[]> = { [K in Arr[number] as K["form_id"]]: K extends FormValue<infer T, any> ? T : never };
393
+ interface FormGroupOptions<L extends FormElement[], ID extends string | undefined, T> extends FormValueOptions<T, ID> {
394
+ /**Elements to add to the group*/
395
+ elements?: [...L];
396
+ /**Wether the group is collapsible, meaning it has a button to collapse and expand all content to the size of that button*/
397
+ collapsible?: boolean;
398
+ /**Wether the group is collapsed initially*/
399
+ collapsed?: boolean;
400
+ /**Text to show on the collapse button*/
401
+ collapse_text?: string;
402
+ /**Border style for group*/
403
+ border?: FormGroupBorderStyle;
404
+ /**Removes padding when true allows for putting groups in groups without padding building up */
405
+ embed?: boolean;
406
+ /**Group max height in rem, undefined means no limit*/
407
+ max_height?: number;
408
+ }
409
+ /**Component group class which allows to add elements and controls the flow of the elements*/
410
+ declare class FormGroup<RT extends object, ID extends string | undefined> extends FormValue<RT, ID> {
411
+ #private;
412
+ static element_name(): string;
413
+ static element_name_space(): string;
414
+ set elements(elements: FormElement[]);
415
+ get elements(): FormElement[];
416
+ /**This places the group at an absolute position in one of the corners of the container*/
417
+ set border(border: FormGroupBorderStyle | undefined);
418
+ set collapsible(collapsible: boolean);
419
+ get collapsible(): boolean;
420
+ set collapsed(collapsed: boolean);
421
+ get collapsed(): boolean;
422
+ set collapse_text(text: string);
423
+ set max_height(height: number | undefined);
424
+ set embed(embed: boolean);
425
+ set value(val: RT);
426
+ /**Returns value of the component*/
427
+ get value(): Result<RT, string>;
428
+ protected new_value(val: RT): void;
429
+ protected clear_value(): void;
430
+ protected new_error(err: string): void;
431
+ protected clear_error(): void;
432
+ protected state_related(_related: Option<{}>): void;
433
+ protected on_access(access: AccessTypes): void;
434
+ }
435
+ /**Creates a dropdown form element */
436
+ declare function form_group<L extends FormElement[], ID extends string | undefined, T extends object = Prettify<Partial<ToKeyVal<ExtractB<L>>>>>(options?: FormGroupOptions<L, ID, T>): FormGroup<T, ID>;
437
+ //#endregion
438
+ //#region src/list/list_field.d.ts
439
+ declare class ListFormField<T extends FormElement> extends ListField {
440
+ static element_name(): string;
441
+ static element_name_space(): string;
442
+ set element(component: T);
443
+ get element(): T;
444
+ }
445
+ declare function form_list_field<T extends FormElement>(element: T): ListFormField<T>;
446
+ //#endregion
447
+ //#region src/number/number_base.d.ts
448
+ interface FormNumberOptions<ID extends string | undefined, RT = number> extends FormValueOptions<RT, ID> {
449
+ /**Lower limit for slider value*/
450
+ min?: number;
451
+ /**Upper limit for slider value*/
452
+ max?: number;
453
+ /**Amount of decimals to show*/
454
+ decimals?: number;
455
+ /**Unit to use for slider*/
456
+ unit?: string;
457
+ }
458
+ interface FormNumberWriteOptions<ID extends string | undefined, RT = number> extends FormNumberOptions<ID, RT> {
459
+ /**Step size, use 0 for automatic step size*/
460
+ step?: number;
461
+ /**Start for step, use 0 for automatic */
462
+ start?: number;
463
+ }
464
+ interface FormStepperBaseOptions<ID extends string | undefined, RT = number> extends FormNumberWriteOptions<ID, RT> {
465
+ /**wether the events are live as the slider is moved or only when moving stops */
466
+ live?: boolean;
467
+ /**Icon to use for decreasing value*/
468
+ icon_decrease?: SVGFunc;
469
+ /**Icon to use for increasing value*/
470
+ icon_increase?: SVGFunc;
471
+ }
472
+ declare abstract class FormNumberWrite<ID extends string | undefined, RT = number> extends FormValueWrite<RT, ID> {
473
+ static apply_options<RT, ID extends string | undefined>(element: FormNumberWrite<ID, RT>, options: FormNumberWriteOptions<ID, RT>): void;
474
+ /**Set the minimum value*/
475
+ abstract set min(min: number | undefined);
476
+ /**Set the minimum value*/
477
+ abstract set max(max: number | undefined);
478
+ /**Sets the size of number change steps*/
479
+ abstract set step(step: number | undefined);
480
+ /**Sets the start offset for number steps*/
481
+ abstract set start(step: number | undefined);
482
+ /**Sets the amount of decimals the element can have*/
483
+ abstract set decimals(dec: number | undefined);
484
+ /**Sets the unit of the element*/
485
+ abstract set unit(unit: string | undefined);
486
+ protected state_related(related: Partial<StateNumberRelated>): void;
487
+ }
488
+ //#endregion
489
+ //#region src/number/numberInput/number_input.d.ts
490
+ /**Slide Selector, displays all options in a slider*/
491
+ declare class NumberInput<ID extends string | undefined> extends FormNumberWrite<ID> {
492
+ #private;
493
+ static element_name(): string;
494
+ static element_name_space(): string;
495
+ constructor(id?: ID);
496
+ focus(options?: FocusOptions): void;
497
+ set unit(unit: string | undefined);
498
+ set decimals(dec: number | undefined);
499
+ set min(min: number | undefined);
500
+ set max(max: number | undefined);
501
+ set step(step: number | undefined);
502
+ set start(step: number | undefined);
503
+ protected new_value(val: number): void;
504
+ protected clear_value(): void;
505
+ protected new_error(_val: string): void;
506
+ protected clear_error(): void;
507
+ protected limit_value(val: number): PromiseLike<Result<number, string>>;
508
+ protected check_value(val: number): PromiseLike<Result<number, string>>;
509
+ }
510
+ /**Creates a dropdown form element */
511
+ declare function form_number_input<ID extends string | undefined>(options?: FormNumberWriteOptions<ID>): NumberInput<ID>;
512
+ //#endregion
513
+ //#region src/number/progress/progress.d.ts
514
+ declare class FormProgress<ID extends string | undefined> extends FormValue<number, ID> {
515
+ #private;
516
+ static element_name(): string;
517
+ static element_name_space(): string;
518
+ /**Set the minimum value*/
519
+ set min(min: number);
520
+ /**Set the minimum value*/
521
+ set max(max: number);
522
+ /**Sets the amount of decimals the element can have*/
523
+ set decimals(dec: number | undefined);
524
+ /**Sets the unit of the element*/
525
+ set unit(unit: string | undefined);
526
+ protected new_value(value: number): void;
527
+ protected clear_value(): void;
528
+ protected new_error(err: string): void;
529
+ protected clear_error(): void;
530
+ protected state_related(related: Partial<StateNumberRelated>): void;
531
+ }
532
+ /**Creates a progress form element */
533
+ declare function form_progress<ID extends string | undefined>(options?: FormNumberOptions<ID>): FormProgress<ID>;
534
+ //#endregion
535
+ //#region src/number/slider/slider.d.ts
536
+ /**Slide Selector, displays all options in a slider*/
537
+ declare class FormSlider<ID extends string | undefined> extends FormNumberWrite<ID, number> {
538
+ #private;
539
+ static element_name(): string;
540
+ static element_name_space(): string;
541
+ constructor(id?: ID);
542
+ set unit(unit: string | undefined);
543
+ set min(min: number | undefined);
544
+ set max(max: number | undefined);
545
+ set decimals(dec: number | undefined);
546
+ set step(step: number | undefined);
547
+ set start(step: number | undefined);
548
+ /**Set wether the slider is in live mode*/
549
+ set live(live: boolean | undefined);
550
+ set icon_decrease(icon: SVGFunc | undefined);
551
+ set icon_increase(icon: SVGFunc | undefined);
552
+ protected new_value(value: number): void;
553
+ protected clear_value(): void;
554
+ protected new_error(err: string): void;
555
+ protected clear_error(): void;
556
+ protected limit_value(val: number): PromiseLike<Result<number, string>>;
557
+ protected check_value(val: number): PromiseLike<Result<number, string>>;
558
+ }
559
+ /**Creates a dropdown form element */
560
+ declare function form_slider<ID extends string | undefined>(options?: FormStepperBaseOptions<ID>): FormSlider<ID>;
561
+ //#endregion
562
+ //#region src/number/stepper/stepper.d.ts
563
+ /**Slide Selector, displays all options in a slider*/
564
+ declare class FormStepper<ID extends string | undefined> extends FormNumberWrite<ID, number> {
565
+ #private;
566
+ static element_name(): string;
567
+ static element_name_space(): string;
568
+ constructor(id?: ID);
569
+ set unit(unit: string | undefined);
570
+ set decimals(dec: number | undefined);
571
+ set min(min: number | undefined);
572
+ set max(max: number | undefined);
573
+ set step(step: number | undefined);
574
+ set start(step: number | undefined);
575
+ /**Set wether the slider is in live mode*/
576
+ set live(live: boolean | undefined);
577
+ set icon_decrease(icon: SVGFunc | undefined);
578
+ set icon_increase(icon: SVGFunc | undefined);
579
+ protected new_value(value: number): void;
580
+ protected clear_value(): void;
581
+ protected new_error(err: string): void;
582
+ protected clear_error(): void;
583
+ protected limit_value(val: number): PromiseLike<Result<number, string>>;
584
+ protected check_value(val: number): PromiseLike<Result<number, string>>;
585
+ }
586
+ /**Creates a dropdown form element */
587
+ declare function form_stepper<ID extends string | undefined>(options?: FormStepperBaseOptions<ID>): FormStepper<ID>;
588
+ //#endregion
589
+ //#region src/selectors/selector_base.d.ts
590
+ interface FormSelectorOption<RT> {
591
+ /**Value to set when option is selected */
592
+ value: RT;
593
+ /**Text for selection */
594
+ text: string;
595
+ /**Icon to display for option*/
596
+ icon?: SVGFunc;
597
+ }
598
+ interface FormSelectorBaseOptions<T, ID extends string | undefined> extends FormValueOptions<T, ID> {
599
+ /**Options for selector*/
600
+ selections?: FormSelectorOption<T>[];
601
+ }
602
+ /**Base for number elements elements*/
603
+ declare abstract class FormSelectorBase<RT, ID extends string | undefined> extends FormValueWrite<RT, ID> {
604
+ /**Sets the selection options for the selector */
605
+ abstract set selections(selections: FormSelectorOption<RT>[] | undefined);
606
+ static apply_options<RT, ID extends string | undefined>(element: FormSelectorBase<RT, ID>, options: FormSelectorBaseOptions<RT, ID>): void;
607
+ protected state_related(related: Partial<StateEnumRelated>): void;
608
+ }
609
+ //#endregion
610
+ //#region src/selectors/drop_down/drop_down.d.ts
611
+ interface FormDropDownOptions<RT, ID extends string | undefined> extends FormSelectorBaseOptions<RT, ID> {
612
+ /**Default text displayed*/
613
+ default?: string;
614
+ /**Default icon displayed*/
615
+ default_icon?: SVGFunc;
616
+ }
617
+ /**Dropdown box for selecting between multiple choices in a small space*/
618
+ declare class FormDropdown<RT, ID extends string | undefined> extends FormSelectorBase<RT, ID> {
619
+ #private;
620
+ static element_name(): string;
621
+ static element_name_space(): string;
622
+ private is_open;
623
+ constructor(id?: ID);
624
+ /**Gets the default text displayed when nothing has been selected yet */
625
+ get default(): string;
626
+ /**Sets the default text displayed when nothing has been selected yet */
627
+ set default(def: string);
628
+ /**Sets the default text displayed when nothing has been selected yet */
629
+ set default_icon(def: SVGFunc | undefined);
630
+ set selections(selections: FormSelectorOption<RT>[] | undefined);
631
+ set open(open: boolean);
632
+ /**Called when Value is changed */
633
+ protected new_value(value: RT): void;
634
+ protected clear_value(): void;
635
+ protected new_error(_val: string): void;
636
+ protected clear_error(): void;
637
+ warn(message: string): void;
638
+ }
639
+ /**Creates a dropdown form element */
640
+ declare function form_dropdown<RT, ID extends string | undefined>(options?: FormDropDownOptions<RT, ID>): FormDropdown<RT, ID>;
641
+ //#endregion
642
+ //#region src/selectors/toggle_button/toggle_button.d.ts
643
+ /**Toggle buttons, displays all options in a multi toggler*/
644
+ declare class FormToggleButton<RT, ID extends string | undefined> extends FormSelectorBase<RT, ID> {
645
+ #private;
646
+ /**Returns the name used to define the element*/
647
+ static element_name(): string;
648
+ static element_name_space(): string;
649
+ set selections(selections: FormSelectorOption<RT>[] | undefined);
650
+ protected new_value(value: RT): void;
651
+ protected clear_value(): void;
652
+ protected new_error(_val: string): void;
653
+ protected clear_error(): void;
654
+ }
655
+ /**Creates a toggle button form element */
656
+ declare function form_toggle_button<RT, ID extends string | undefined>(options?: FormSelectorBaseOptions<RT, ID>): FormToggleButton<RT, ID>;
657
+ //#endregion
658
+ //#region src/spacing/spacer.d.ts
659
+ interface FormSpacerOptions {
660
+ /**Spacing amount */
661
+ space?: number;
662
+ }
663
+ declare class FormSpacer extends FormElement {
664
+ static element_name(): string;
665
+ static element_name_space(): string;
666
+ constructor();
667
+ /**Sets the amount of space, in rem */
668
+ set space(space: number);
669
+ get space(): number;
670
+ }
671
+ /**Creates a spacer form element */
672
+ declare function form_spacer(options?: FormSpacerOptions): FormSpacer;
673
+ //#endregion
674
+ //#region src/special/color/color_input.d.ts
675
+ interface FormColorInputOptions<ID extends string | undefined, RT = string> extends FormValueOptions<RT, ID> {
676
+ /**Whether the color input should update live*/
677
+ live?: boolean;
678
+ }
679
+ declare class FormColorInput<ID extends string | undefined> extends FormValueWrite<string, ID> {
680
+ #private;
681
+ static element_name(): string;
682
+ static element_name_space(): string;
683
+ constructor(id?: ID);
684
+ set live(val: boolean);
685
+ get live(): boolean;
686
+ protected new_value(val: string): void;
687
+ protected clear_value(): void;
688
+ protected new_error(_val: string): void;
689
+ protected clear_error(): void;
690
+ protected state_related(_related: Option<{}>): void;
691
+ }
692
+ /**Creates a color input form element */
693
+ declare function form_color_input<ID extends string | undefined>(options?: FormColorInputOptions<ID, string>): FormColorInput<ID>;
694
+ //#endregion
695
+ //#region src/special/date_time/date_time_input.d.ts
696
+ interface DateTimeInputOptions<RT, ID extends string | undefined> extends FormValueOptions<RT, ID> {
697
+ /**Type of date time*/
698
+ type?: FormDateTimeType;
699
+ }
700
+ declare const FormDateTimeType: {
701
+ readonly DATE: "date";
702
+ readonly TIME: "time";
703
+ readonly DATETIME: "datetime";
704
+ };
705
+ type FormDateTimeType = (typeof FormDateTimeType)[keyof typeof FormDateTimeType];
706
+ declare class FormDateTimeInput<RT extends Date | string | number, ID extends string | undefined> extends FormValueWrite<RT, ID> {
707
+ #private;
708
+ static element_name(): string;
709
+ static element_name_space(): string;
710
+ constructor(id?: ID);
711
+ /**Returns the date time type*/
712
+ get type(): FormDateTimeType;
713
+ /**Sets the date time type*/
714
+ set type(type: FormDateTimeType);
715
+ /**Returns the date time type*/
716
+ get step(): number;
717
+ /**Sets the date time type*/
718
+ set step(step: number);
719
+ protected new_value(value: RT): void;
720
+ protected clear_value(): void;
721
+ protected new_error(_val: string): void;
722
+ protected clear_error(): void;
723
+ protected state_related(_related: Option<{}>): void;
724
+ }
725
+ /**Creates a color input form element */
726
+ declare function form_date_time_input<RT extends Date | string | number, ID extends string | undefined>(options?: DateTimeInputOptions<RT, ID>): FormDateTimeInput<RT, ID>;
727
+ //#endregion
728
+ //#region src/special/ip/ip_input.d.ts
729
+ interface IpInputOptions<ID extends string | undefined> extends FormValueOptions<IPAddress, ID> {
730
+ /**Ip address type, this is overwritten if supplied with an ipaddress with a different type*/
731
+ type: IPVersion;
732
+ }
733
+ declare class FormIpInput<ID extends string | undefined> extends FormValueWrite<IPAddress, ID> {
734
+ #private;
735
+ static element_name(): string;
736
+ static element_name_space(): string;
737
+ constructor(type: IPVersion, id?: ID);
738
+ get value_as_ip(): IPAddress;
739
+ set type(val: IPVersion);
740
+ protected new_value(val: IPAddress): void;
741
+ protected clear_value(): void;
742
+ protected new_error(_val: string): void;
743
+ protected clear_error(): void;
744
+ protected state_related(_related: Option<{}>): void;
745
+ }
746
+ /**Creates a color input form element */
747
+ declare function form_ip_input<ID extends string | undefined>(options: IpInputOptions<ID>): FormIpInput<ID>;
748
+ //#endregion
749
+ //#region src/special/password/password_input.d.ts
750
+ interface FormPasswordInputOptions<ID extends string | undefined> extends FormValueOptions<string, ID> {
751
+ /**Allowed characters for the password input */
752
+ filter?: RegExp;
753
+ }
754
+ declare class FormPasswordInput<ID extends string | undefined> extends FormValueWrite<string, ID> {
755
+ #private;
756
+ static element_name(): string;
757
+ static element_name_space(): string;
758
+ constructor(id?: ID);
759
+ set filter(val: RegExp | undefined);
760
+ protected new_value(val: string): void;
761
+ protected clear_value(): void;
762
+ protected new_error(_val: string): void;
763
+ protected clear_error(): void;
764
+ protected state_related(_related: Option<{}>): void;
765
+ }
766
+ /**Creates a dropdown form element */
767
+ declare function form_password_input<ID extends string | undefined>(options?: FormPasswordInputOptions<ID>): FormPasswordInput<ID>;
768
+ //#endregion
769
+ //#region src/text/input/text_input.d.ts
770
+ interface FormTextInputOptions$1<ID extends string | undefined, RT = string> extends FormValueOptions<RT, ID> {
771
+ /**Placeholder text when input is empty */
772
+ placeholder?: string;
773
+ /**Maximum length of the input */
774
+ max_length?: number;
775
+ /**Maximum bytes of the input */
776
+ max_bytes?: number;
777
+ /**Allowed characters for the text input */
778
+ filter?: RegExp;
779
+ }
780
+ declare class FormTextInput<ID extends string | undefined> extends FormValueWrite<string, ID> {
781
+ #private;
782
+ static element_name(): string;
783
+ static element_name_space(): string;
784
+ constructor(id?: ID);
785
+ set filter(val: RegExp | undefined);
786
+ get filter(): RegExp | undefined;
787
+ set placeholder(val: string);
788
+ get placeholder(): string;
789
+ set max_length(val: number | undefined);
790
+ get max_length(): number | undefined;
791
+ set max_bytes(val: number | undefined);
792
+ get max_bytes(): number | undefined;
793
+ protected new_value(val: string): void;
794
+ protected clear_value(): void;
795
+ protected new_error(_val: string): void;
796
+ protected clear_error(): void;
797
+ protected limit_value(val: string): PromiseLike<Result<string, string>>;
798
+ protected check_value(val: string): PromiseLike<Result<string, string>>;
799
+ protected state_related(related: Partial<StateStringRelated>): void;
800
+ }
801
+ /**Creates a single line text input form element */
802
+ declare function form_text_input<ID extends string | undefined>(options?: FormTextInputOptions$1<ID>): FormTextInput<ID>;
803
+ //#endregion
804
+ //#region src/text/multiLine/text_multi_line.d.ts
805
+ interface FormTextInputOptions<ID extends string | undefined, RT = string> extends FormValueOptions<RT, ID> {
806
+ /**Placeholder text when input is empty */
807
+ placeholder?: string;
808
+ /**Maximum length of the input */
809
+ max_length?: number;
810
+ /**Maximum bytes of the input */
811
+ max_bytes?: number;
812
+ /**Allowed characters for the text input */
813
+ filter?: RegExp;
814
+ }
815
+ declare class FormTextMultiline<ID extends string | undefined> extends FormValueWrite<string, ID> {
816
+ #private;
817
+ static element_name(): string;
818
+ static element_name_space(): string;
819
+ constructor(id?: ID);
820
+ set filter(val: RegExp | undefined);
821
+ get filter(): RegExp | undefined;
822
+ set placeholder(val: string);
823
+ get placeholder(): string;
824
+ set max_length(val: number | undefined);
825
+ get max_length(): number | undefined;
826
+ set max_bytes(val: number | undefined);
827
+ get max_bytes(): number | undefined;
828
+ protected new_value(val: string): void;
829
+ protected clear_value(): void;
830
+ protected new_error(_val: string): void;
831
+ protected clear_error(): void;
832
+ protected limit_value(val: string): PromiseLike<Result<string, string>>;
833
+ protected check_value(val: string): PromiseLike<Result<string, string>>;
834
+ protected state_related(related: Partial<StateStringRelated>): void;
835
+ }
836
+ /**Creates a multi line text input form element */
837
+ declare function form_text_multiline<ID extends string | undefined>(options?: FormTextInputOptions<ID>): FormTextMultiline<ID>;
838
+ //#endregion
839
+ //#region src/text/text/text.d.ts
840
+ interface FormTextOptions {
841
+ /**Buttons text */
842
+ text?: string;
843
+ /**Text size */
844
+ size?: number;
845
+ }
846
+ /**Component for simple text */
847
+ declare class FormText extends FormElement {
848
+ static element_name(): string;
849
+ static element_name_space(): string;
850
+ constructor(options: FormTextOptions);
851
+ /**Sets the current text of the element*/
852
+ set text(text: string);
853
+ get text(): string;
854
+ /**Sets the current text of the element*/
855
+ set size(size: number);
856
+ }
857
+ /**Creates a button form element */
858
+ declare function form_text(options: FormTextOptions): FormText;
859
+ //#endregion
860
+ //#region src/index.d.ts
861
+ /**Form elements with label */
862
+ declare const form: {
863
+ FormColors: {
864
+ readonly None: "none";
865
+ readonly Black: "black";
866
+ readonly Green: "green";
867
+ readonly Red: "red";
868
+ readonly Blue: "blue";
869
+ readonly Yellow: "yellow";
870
+ };
871
+ button: typeof form_button;
872
+ switch: typeof form_switch;
873
+ lamp: {
874
+ <ID extends string | undefined>(options?: FormLampOptions<number, [FormColors, FormColors, FormColors, ...FormColors[]], ID>): FormLamp<number, [FormColors, FormColors, FormColors, ...FormColors[]], ID>;
875
+ <ID extends string | undefined>(options?: FormLampOptions<boolean, [FormColors, FormColors], ID>): FormLamp<boolean, [FormColors, FormColors], ID>;
876
+ };
877
+ group: typeof form_group;
878
+ color_input: typeof form_color_input;
879
+ date_time_input: typeof form_date_time_input;
880
+ FormDateTimeType: {
881
+ readonly DATE: "date";
882
+ readonly TIME: "time";
883
+ readonly DATETIME: "datetime";
884
+ };
885
+ ip_input: typeof form_ip_input;
886
+ password_input: typeof form_password_input;
887
+ progress: typeof form_progress;
888
+ input_number: typeof form_number_input;
889
+ slider: typeof form_slider;
890
+ stepper: typeof form_stepper;
891
+ dropdown: typeof form_dropdown;
892
+ toggle_button: typeof form_toggle_button;
893
+ spacer: typeof form_spacer;
894
+ text: typeof form_text;
895
+ input_text: typeof form_text_input;
896
+ multiline_text: typeof form_text_multiline;
897
+ list_field: typeof form_list_field;
898
+ };
899
+ //#endregion
900
+ export { FormColors, FormDateTimeType, form as default, form };
901
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC5tdHMiLCJuYW1lcyI6WyJSRVNVTFRfS0VZIiwiT1BUSU9OX0tFWSIsIk9wdGlvbkJhc2UiLCJUMiIsIlUiLCJFIiwiVCIsIk9wdGlvblNvbWUiLCJPcHRpb24iLCJPcHRpb25Ob25lIiwiUmVzdWx0Iiwic29tZSIsIm5vbmUiLCJ2YWx1ZSIsImV4cGVjdCIsIm1zZyIsInVud3JhcCIsInVud3JhcF9vciIsImFuZF90aGVuIiwibWFwcGVyIiwib3JfZWxzZSIsIm1hcCIsImNvbXBhcmUiLCJvdGhlciIsInRvX3Jlc3VsdCIsImVycm9yIiwiUmVzdWx0T2siLCJjb25zdHJ1Y3RvciIsIlJlc3VsdEVyciIsInZhbCIsIlJlc3VsdEJhc2UiLCJFMiIsIkYiLCJvayIsImVyciIsImV4cGVjdF9lcnIiLCJ1bndyYXBfZXJyIiwidW53cmFwX2Vycl9vciIsIm1hcF9lcnIiLCJ0b19vcHRpb24iLCJmdW5jIiwidmFsaWQiLCJSZXN1bHRJbmZlck9rIiwiUlQiLCJSZXN1bHRJbmZlckVyciIsIlJFIiwiT3B0aW9uSW5mZXIiLCJPVCIsInJlc3VsdCIsImlzX3Jlc3VsdCIsInIiLCJpc19vcHRpb24iLCJkZWZhdWx0IiwiU1ZHQXR0cmlidXRlcyIsIlQiLCJTVkdFbGVtZW50IiwicHJpdmF0ZSIsImNvbnN0cnVjdG9yIiwiZWxlbSIsInN0cm9rZSIsInMiLCJmaWxsIiwiZiIsInN0cm9rZV93aWR0aCIsIndpZHRoIiwic3ciLCJjbGFzc19saXN0IiwiY2xhc3NfbmFtZSIsImNsIiwiYXR0cmlidXRlIiwibmFtZSIsInZhbHVlIiwiYSIsInRyYW5zbGF0ZSIsIngiLCJ5Iiwicm90YXRlIiwiYW5nbGUiLCJjeCIsImN5Iiwic2NhbGUiLCJzeCIsInN5Iiwic2tld1giLCJza2V3WSIsInRyYW5zZm9ybSIsImNpcmNsZSIsIlNWR0NpcmNsZUVsZW1lbnQiLCJjZW50ZXJfeCIsImNlbnRlcl95IiwicmFkaXVzIiwiY2lyY2xlX2FyYyIsIlNWR1BhdGhFbGVtZW50Iiwic3RhcnRfYW5nbGUiLCJlbmRfYW5nbGUiLCJlbGxpcHNlIiwiU1ZHRWxsaXBzZUVsZW1lbnQiLCJyYWRpdXNfeCIsInJhZGl1c195IiwiZWxsaXBzZV9hcmMiLCJncm91cCIsIlNWR0dFbGVtZW50IiwibGluZSIsIlNWR0xpbmVFbGVtZW50Iiwic3RhcnRfeCIsInN0YXJ0X3kiLCJlbmRfeCIsImVuZF95IiwicGF0aCIsInJlY3RhbmdsZV9mcm9tX2NlbnRlciIsIlNWR1JlY3RFbGVtZW50IiwiaGVpZ2h0IiwiY29ybmVyX3JhZGl1cyIsInJlY3RhbmdsZV9mcm9tX2Nvcm5lciIsIlNWR0VsZW1lbnRzIiwiU1ZHVGV4dEVsZW1lbnQiLCJTVkdTVkdFbGVtZW50IiwiU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQiLCJyZWN0IiwidGV4dCIsImciLCJzdmciLCJmb3JlaWduT2JqZWN0IiwiY3JlYXRlX3N2Z19lbGVtZW50IiwiSyIsInN2ZyQxIiwidmlld2JveCIsIlNWR0FuY2hvclBvaW50IiwiYm90dG9tTGVmdCIsIm1pZGRsZUxlZnQiLCJ0b3BMZWZ0IiwidG9wQ2VudGVyIiwidG9wUmlnaHQiLCJtaWRkbGVSaWdodCIsImJvdHRvbVJpZ2h0IiwiYm90dG9tQ2VudGVyIiwibWlkZGxlQ2VudGVyIiwic2l6ZSIsImFuY2hvciIsIm11bHRpX2xpbmVfdGV4dCIsImlzb3NjZWxlc190cmlhbmdsZSIsImNyZWF0ZSIsImF0dHIiLCJhbmdsZV90b19hbmNob3JfcG9pbnQiLCJTVkdGdW5jIiwiYXJyYXlfZnJvbV9yYW5nZSIsIlQiLCJzdGFydCIsImVuZCIsImkiLCJpbml0IiwiYXJyYXlfZnJvbV9yYW5nZV9pbmNsdXNpdmUiLCJhcnJheV9mcm9tX2xlbmd0aCIsImxlbiIsInByZXBlbmQiLCJhcHBlbmQiLCJpc19wcm9taXNlX2xpa2UiLCJQcm9taXNlTGlrZSIsInZhbHVlIiwic2xlZXAiLCJQcm9taXNlIiwibXMiLCJhcmciLCJzbGVlcF9sYXp5Iiwic3luY19yZXNvbHZlIiwic3luY19yZWplY3QiLCJlcnJvciIsImRlYm91bmNlIiwiUGFyYW1ldGVycyIsImFyZ3MiLCJmdW5jIiwid2FpdCIsImxlYWRpbmciLCJhbnlfZXF1YWxzX2RlZXAiLCJhbnkxIiwiYW55MiIsIm9iamVjdF9lcXVhbHNfZGVlcCIsIm9iamVjdDEiLCJvYmplY3QyIiwiYXJyYXlfZXF1YWxzX2RlZXAiLCJhcnJheTEiLCJhcnJheTIiLCJJUFZlcnNpb24iLCJWNCIsIlY2IiwiSVBBZGRyZXNzIiwidmVyc2lvbiIsImNvbnN0cnVjdG9yIiwiaW5wdXQiLCJwYXJzZV92NF9zdHJpbmciLCJwYXJzZV92Nl9zdHJpbmciLCJmcm9tX2FycmF5IiwiaXNfdjQiLCJpc192NiIsImFzX2JpZ19pbnQiLCJhc19hcnJheSIsInRvX3N0cmluZyIsImdldF9jdXJzb3JfcG9zaXRpb24iLCJIVE1MRWxlbWVudCIsImVsZW1lbnQiLCJzZXRfY3Vyc29yX3Bvc2l0aW9uIiwib2Zmc2V0Iiwic2V0X2N1cnNvcl9lbmQiLCJzZXRfc2VsZWN0aW9uX2FsbCIsInRocm90dGxlIiwibm9kZV9jbG9uZSIsIk5vZGUiLCJub2RlIiwiUHJldHRpZnkiLCJLIiwib2JqZWN0X2VtcHR5Iiwib2JqIiwiYXJyYXlfZGlmZiIsIm1haW4iLCJzZWNvbmQiLCJhZGRlZCIsInJlbW92ZWQiLCJvYmplY3Rfa2V5X2RpZmYiLCJUMSIsIlQyIl0sInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL0BjaG9jYml0ZS90cy1saWItcmVzdWx0L2Rpc3QvaW5kZXguZC50cyIsIi4uL25vZGVfbW9kdWxlcy9AY2hvY2JpdGUvdHMtbGliLXN2Zy9kaXN0L2luZGV4LmQubXRzIiwiLi4vc3JjL2Jhc2UudHMiLCIuLi9zcmMvYm9vbGVhbi9sYW1wL2xhbXAudHMiLCIuLi9zcmMvYm9vbGVhbi9idXR0b24vYnV0dG9uLnRzIiwiLi4vc3JjL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaC50cyIsIi4uL25vZGVfbW9kdWxlcy9AY2hvY2JpdGUvdHMtbGliLWNvbW1vbi9kaXN0L2luZGV4LmQudHMiLCIuLi9zcmMvZ3JvdXAvZ3JvdXAudHMiLCIuLi9zcmMvbGlzdC9saXN0X2ZpZWxkLnRzIiwiLi4vc3JjL251bWJlci9udW1iZXJfYmFzZS50cyIsIi4uL3NyYy9udW1iZXIvbnVtYmVySW5wdXQvbnVtYmVyX2lucHV0LnRzIiwiLi4vc3JjL251bWJlci9wcm9ncmVzcy9wcm9ncmVzcy50cyIsIi4uL3NyYy9udW1iZXIvc2xpZGVyL3NsaWRlci50cyIsIi4uL3NyYy9udW1iZXIvc3RlcHBlci9zdGVwcGVyLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy9zZWxlY3Rvcl9iYXNlLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy9kcm9wX2Rvd24vZHJvcF9kb3duLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy90b2dnbGVfYnV0dG9uL3RvZ2dsZV9idXR0b24udHMiLCIuLi9zcmMvc3BhY2luZy9zcGFjZXIudHMiLCIuLi9zcmMvc3BlY2lhbC9jb2xvci9jb2xvcl9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL2RhdGVfdGltZS9kYXRlX3RpbWVfaW5wdXQudHMiLCIuLi9zcmMvc3BlY2lhbC9pcC9pcF9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL3Bhc3N3b3JkL3Bhc3N3b3JkX2lucHV0LnRzIiwiLi4vc3JjL3RleHQvaW5wdXQvdGV4dF9pbnB1dC50cyIsIi4uL3NyYy90ZXh0L211bHRpTGluZS90ZXh0X211bHRpX2xpbmUudHMiLCIuLi9zcmMvdGV4dC90ZXh0L3RleHQudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqU3ltYm9sIHVzZWQgdG8gaWRlbnRpZnkgUmVzdWx0IG9iamVjdHMsIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSByZXN1bHQgY29tcGxpYW50IG9iamVjdHMgKi9cbmRlY2xhcmUgY29uc3QgUkVTVUxUX0tFWTogdW5pcXVlIHN5bWJvbDtcbi8qKlN5bWJvbCB1c2VkIHRvIGlkZW50aWZ5IE9wdGlvbiBvYmplY3RzLCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgb3B0aW9uIGNvbXBsaWFudCBvYmplY3RzICovXG5kZWNsYXJlIGNvbnN0IE9QVElPTl9LRVk6IHVuaXF1ZSBzeW1ib2w7XG5pbnRlcmZhY2UgT3B0aW9uQmFzZTxUPiB7XG4gICAgLyoqVW5pcXVlIHN5bWJvbCB0byBpZGVudGlmeSBPcHRpb24gb2JqZWN0cyAqL1xuICAgIHJlYWRvbmx5IFtPUFRJT05fS0VZXTogdHJ1ZTtcbiAgICAvKipJcyB0cnVlIHdoZW4gYSB2YWx1ZSBpcyBhdmFpbGFibGUqL1xuICAgIHJlYWRvbmx5IHNvbWU6IGJvb2xlYW47XG4gICAgLyoqSXMgdHJ1ZSB3aGVuIG5vIHZhbHVlIGlzIGF2YWlsYWJsZSovXG4gICAgcmVhZG9ubHkgbm9uZTogYm9vbGVhbjtcbiAgICAvKipUaGUgdmFsdWUqL1xuICAgIHJlYWRvbmx5IHZhbHVlPzogVDtcbiAgICAvKipSZXR1cm5zIHRoZSBjb250YWluZWQgdmFsdWUsIGlmIGV4aXN0cy4gVGhyb3dzIGFuIGVycm9yIGlmIG5vdC5cbiAgICAgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIHRvIHRocm93IGlmIG5vIHZhbHVlIGV4aXN0cy4qL1xuICAgIGV4cGVjdChtc2c6IHN0cmluZyk6IFQ7XG4gICAgLyoqUmV0dXJucyB0aGUgY29udGFpbmVkIHZhbHVlLCBpZiBleGlzdHMuIFRocm93cyBhbiBlcnJvciBpZiBub3QuKi9cbiAgICB1bndyYXAoKTogVDtcbiAgICAvKipSZXR1cm5zIHRoZSBjb250YWluZWQgdmFsdWUgb3IgYSBwcm92aWRlZCBkZWZhdWx0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB1c2UgYXMgZGVmYXVsdCovXG4gICAgdW53cmFwX29yPFQyPih2YWx1ZTogVDIpOiBUIHwgVDI7XG4gICAgLyoqQ2FsbHMgbWFwcGVyIGlmIHRoZSBPcHRpb24gaXMgYFNvbWVgLCBvdGhlcndpc2UgcmV0dXJucyBgTm9uZWAuXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgY29udHJvbCBmbG93IGJhc2VkIG9uIGBPcHRpb25hbGAgdmFsdWVzLiovXG4gICAgYW5kX3RoZW48VDI+KG1hcHBlcjogKHZhbHVlOiBUKSA9PiBPcHRpb25Tb21lPFQyPik6IE9wdGlvbjxUMj47XG4gICAgYW5kX3RoZW4obWFwcGVyOiAodmFsdWU6IFQpID0+IE9wdGlvbk5vbmUpOiBPcHRpb248VD47XG4gICAgYW5kX3RoZW48VDI+KG1hcHBlcjogKHZhbHVlOiBUKSA9PiBPcHRpb248VDI+KTogT3B0aW9uPFQyPjtcbiAgICAvKipDYWxscyBtYXBwZXIgaWYgdGhlIE9wdGlvbiBpcyBgTm9uZWAsIG90aGVyd2lzZSByZXR1cm5zIGBTb21lYC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBjb250cm9sIGZsb3cgYmFzZWQgb24gYE9wdGlvbmFsYCB2YWx1ZXMuKi9cbiAgICBvcl9lbHNlPFQyPihtYXBwZXI6ICgpID0+IE9wdGlvblNvbWU8VDI+KTogT3B0aW9uPFQyPjtcbiAgICBvcl9lbHNlKG1hcHBlcjogKCkgPT4gT3B0aW9uTm9uZSk6IE9wdGlvbjxUPjtcbiAgICBvcl9lbHNlPFQyPihtYXBwZXI6ICgpID0+IE9wdGlvbjxUMj4pOiBPcHRpb248VDI+O1xuICAgIC8qKk1hcHMgYW4gYE9wdGlvbmFsPFQ+YCB0byBgT3B0aW9uYWw8VT5gIGJ5IGFwcGx5aW5nIGEgZnVuY3Rpb24gdG8gYSBjb250YWluZWQgYFNvbWVgIHZhbHVlLCBsZWF2aW5nIGEgYE5vbmVgIHZhbHVlIHVudG91Y2hlZC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXBvc2UgdGhlIE9wdGlvbnMgb2YgdHdvIGZ1bmN0aW9ucy4qL1xuICAgIG1hcDxVPihtYXBwZXI6ICh2YWx1ZTogVCkgPT4gVSk6IE9wdGlvbjxVPjtcbiAgICAvKipDb21wYXJlcyB0d28gYE9wdGlvbmFsPFQ+YCB2YWx1ZXMgZm9yIGVxdWFsaXR5LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4gKi9cbiAgICBjb21wYXJlKG90aGVyOiBPcHRpb248VD4pOiBib29sZWFuO1xuICAgIC8qKk1hcHMgYW4gYE9wdGlvbmFsPFQ+YCB0byBhIGBSZXN1bHQ8VCwgRT5gLiovXG4gICAgdG9fcmVzdWx0PEU+KGVycm9yOiBFKTogUmVzdWx0PFQsIEU+O1xufVxuZGVjbGFyZSBjbGFzcyBPcHRpb25Tb21lPFQ+IGltcGxlbWVudHMgT3B0aW9uQmFzZTxUPiB7XG4gICAgZ2V0IFtPUFRJT05fS0VZXSgpOiB0cnVlO1xuICAgIHJlYWRvbmx5IHZhbHVlOiBUO1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBUKTtcbiAgICBnZXQgc29tZSgpOiB0cnVlO1xuICAgIGdldCBub25lKCk6IGZhbHNlO1xuICAgIGV4cGVjdCgpOiBUO1xuICAgIHVud3JhcCgpOiBUO1xuICAgIHVud3JhcF9vcigpOiBUO1xuICAgIGFuZF90aGVuPFQyPihtYXBwZXI6ICh2YWx1ZTogVCkgPT4gT3B0aW9uU29tZTxUMj4pOiBPcHRpb25Tb21lPFQyPjtcbiAgICBhbmRfdGhlbihtYXBwZXI6ICh2YWx1ZTogVCkgPT4gT3B0aW9uTm9uZSk6IE9wdGlvbk5vbmU7XG4gICAgYW5kX3RoZW48VDI+KG1hcHBlcjogKHZhbHVlOiBUKSA9PiBPcHRpb248VDI+KTogT3B0aW9uPFQyPjtcbiAgICBvcl9lbHNlKCk6IE9wdGlvblNvbWU8VD47XG4gICAgbWFwPFU+KG1hcHBlcjogKHZhbHVlOiBUKSA9PiBVKTogT3B0aW9uU29tZTxVPjtcbiAgICBjb21wYXJlKG90aGVyOiBPcHRpb248VD4pOiBib29sZWFuO1xuICAgIHRvX3Jlc3VsdCgpOiBSZXN1bHRPazxUPjtcbn1cbmRlY2xhcmUgY2xhc3MgT3B0aW9uTm9uZSBpbXBsZW1lbnRzIE9wdGlvbkJhc2U8bmV2ZXI+IHtcbiAgICBnZXQgW09QVElPTl9LRVldKCk6IHRydWU7XG4gICAgZ2V0IHNvbWUoKTogZmFsc2U7XG4gICAgZ2V0IG5vbmUoKTogdHJ1ZTtcbiAgICBleHBlY3QobXNnOiBzdHJpbmcpOiBuZXZlcjtcbiAgICB1bndyYXAoKTogbmV2ZXI7XG4gICAgdW53cmFwX29yPFQyPih2YWw6IFQyKTogVDI7XG4gICAgYW5kX3RoZW4oKTogT3B0aW9uTm9uZTtcbiAgICBvcl9lbHNlPFQyPihtYXBwZXI6ICgpID0+IE9wdGlvblNvbWU8VDI+KTogT3B0aW9uU29tZTxUMj47XG4gICAgb3JfZWxzZShtYXBwZXI6ICgpID0+IE9wdGlvbk5vbmUpOiBPcHRpb25Ob25lO1xuICAgIG9yX2Vsc2U8VDI+KG1hcHBlcjogKCkgPT4gT3B0aW9uPFQyPik6IE9wdGlvbjxUMj47XG4gICAgbWFwKCk6IE9wdGlvbk5vbmU7XG4gICAgY29tcGFyZShvdGhlcjogT3B0aW9uPG5ldmVyPik6IGJvb2xlYW47XG4gICAgdG9fcmVzdWx0PEU+KGVycm9yOiBFKTogUmVzdWx0RXJyPEU+O1xufVxuaW50ZXJmYWNlIFJlc3VsdEJhc2U8VCwgRT4ge1xuICAgIC8qKlVuaXF1ZSBzeW1ib2wgdG8gaWRlbnRpZnkgUmVzdWx0IG9iamVjdHMgKi9cbiAgICByZWFkb25seSBbUkVTVUxUX0tFWV06IHRydWU7XG4gICAgLyoqSXMgdHJ1ZSB3aGVuIHRoZSByZXN1bHQgaXMgdmFsaWQgYW5kIGZhbHNlIHdoZW4gaXQgaXMgaW52YWxpZCovXG4gICAgcmVhZG9ubHkgb2s6IGJvb2xlYW47XG4gICAgLyoqSXMgZmFsc2Ugd2hlbiB0aGUgcmVzdWx0IGlzIHZhbGlkIGFuZCB0cnVlIHdoZW4gaXQgaXMgaW52YWxpZCovXG4gICAgcmVhZG9ubHkgZXJyOiBib29sZWFuO1xuICAgIC8qKlRoZSB2YWx1ZSBmb3IgdGhlIHJlc3VsdCwgb25seSBleGlzdHMgd2hlbiBpdCBpcyB2YWxpZCovXG4gICAgcmVhZG9ubHkgdmFsdWU/OiBUO1xuICAgIC8qKlRoZSBlcnJvciBmb3IgdGhlIHJlc3VsdCwgb25seSBleGlzdHMgd2hlbiBpdCBpcyBpbnZhbGlkKi9cbiAgICByZWFkb25seSBlcnJvcj86IEU7XG4gICAgLyoqUmV0dXJucyB0aGUgY29udGFpbmVkIHZhbGlkIHZhbHVlLCBpZiBleGlzdHMuIFRocm93cyBhbiBlcnJvciBpZiBub3QuXG4gICAgICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSB0byB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgaW52YWxpZC4qL1xuICAgIGV4cGVjdChtc2c6IHN0cmluZyk6IFQ7XG4gICAgLyoqUmV0dXJucyB0aGUgY29udGFpbmVkIHZhbGlkIHZhbHVlLCBpZiBkb2VzIG5vdCBleGlzdC4gVGhyb3dzIGFuIGVycm9yIGlmIGl0IGRvZXMuXG4gICAgICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSB0byB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgdmFsaWQuKi9cbiAgICBleHBlY3RfZXJyKG1zZzogc3RyaW5nKTogRTtcbiAgICAvKipSZXR1cm5zIHRoZSBjb250YWluZWQgdmFsaWQgdmFsdWUuXG4gICAgICogVGhyb3dzIGlmIHRoZSB2YWx1ZSBpcyBpbnZhbGlkLCB3aXRoIGEgbWVzc2FnZSBwcm92aWRlZCBieSB0aGUgZXJyb3IncyB2YWx1ZS4qL1xuICAgIHVud3JhcCgpOiBUO1xuICAgIC8qKlJldHVybnMgdGhlIGNvbnRhaW5lZCB2YWxpZCB2YWx1ZSBvciBhIHByb3ZpZGVkIGRlZmF1bHQuKi9cbiAgICB1bndyYXBfb3I8VDI+KHZhbHVlOiBUMik6IFQgfCBUMjtcbiAgICAvKipSZXR1cm5zIHRoZSBjb250YWluZWQgZXJyb3IgdmFsdWUuXG4gICAgICogVGhyb3dzIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZCwgd2l0aCB0aGUgdmFsdWUuKi9cbiAgICB1bndyYXBfZXJyKCk6IEU7XG4gICAgdW53cmFwX2Vycl9vcjxFMj4oZXJyb3I6IEUyKTogRSB8IEUyO1xuICAgIC8qKkNhbGxzIG1hcHBlciBmdW5jdGlvbiBpZiB0aGUgcmVzdWx0IGlzIHZhbGlkLCBvdGhlcndpc2UgcmV0dXJucyB0aGUgZXJyb3IgdmFsdWUgb2Ygc2VsZi5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBjb250cm9sIGZsb3cgYmFzZWQgb24gYFJlc3VsdGAgdmFsdWVzLiovXG4gICAgYW5kX3RoZW48VDI+KG1hcHBlcjogKHZhbHVlOiBUKSA9PiBSZXN1bHRPazxUMj4pOiBSZXN1bHQ8VDIsIEU+O1xuICAgIGFuZF90aGVuPEUyPihtYXBwZXI6ICh2YWx1ZTogVCkgPT4gUmVzdWx0RXJyPEUyPik6IFJlc3VsdDxULCBFMj47XG4gICAgYW5kX3RoZW48VDIsIEUyPihtYXBwZXI6ICh2YWx1ZTogVCkgPT4gUmVzdWx0PFQyLCBFMj4pOiBSZXN1bHQ8VDIsIEUyPjtcbiAgICAvKipDYWxscyBtYXBwZXIgZnVuY3Rpb24gaWYgdGhlIHJlc3VsdCBpcyBhbiBlcnJvciwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIHZhbHVlIHNlbGYuXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgY29udHJvbCBmbG93IGJhc2VkIG9uIGBSZXN1bHRgIHZhbHVlcy4qL1xuICAgIG9yX2Vsc2U8VDI+KG1hcHBlcjogKGVycm9yOiBFKSA9PiBSZXN1bHRPazxUMj4pOiBSZXN1bHQ8VDIsIEU+O1xuICAgIG9yX2Vsc2U8RTI+KG1hcHBlcjogKGVycm9yOiBFKSA9PiBSZXN1bHRFcnI8RTI+KTogUmVzdWx0PFQsIEUyPjtcbiAgICBvcl9lbHNlPFQyLCBFMj4obWFwcGVyOiAoZXJyb3I6IEUpID0+IFJlc3VsdDxUMiwgRTI+KTogUmVzdWx0PFQyLCBFMj47XG4gICAgLyoqTWFwcyBhIGBSZXN1bHQ8VCwgRT5gIHRvIGBSZXN1bHQ8VSwgRT5gIGJ5IGFwcGx5aW5nIGEgZnVuY3Rpb24gdG8gYSBjb250YWluZWQgdmFsaWQgdmFsdWUsIGxlYXZpbmcgYW4gZXJyb3IgdmFsdWUgdW50b3VjaGVkLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29tcG9zZSB0aGUgcmVzdWx0cyBvZiB0d28gZnVuY3Rpb25zLiovXG4gICAgbWFwPFU+KG1hcHBlcjogKHZhbHVlOiBUKSA9PiBVKTogUmVzdWx0PFUsIEU+O1xuICAgIC8qKk1hcHMgYSBgUmVzdWx0PFQsIEU+YCB0byBgUmVzdWx0PFQsIEY+YCBieSBhcHBseWluZyBhIGZ1bmN0aW9uIHRvIGEgY29udGFpbmVkIGVycm9yIHZhbHVlLCBsZWF2aW5nIGEgdmFsaWQgdmFsdWUgdW50b3VjaGVkLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcGFzcyB0aHJvdWdoIGEgc3VjY2Vzc2Z1bCByZXN1bHQgd2hpbGUgaGFuZGxpbmcgYW4gZXJyb3IuKi9cbiAgICBtYXBfZXJyPEY+KG1hcHBlcjogKGVycm9yOiBFKSA9PiBGKTogUmVzdWx0PFQsIEY+O1xuICAgIC8qKkNvbXBhcmVzIHR3byBgUmVzdWx0PFQsIEU+YCB2YWx1ZXMgZm9yIGVxdWFsaXR5LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4gKi9cbiAgICBjb21wYXJlKG90aGVyOiBSZXN1bHQ8VCwgRT4pOiBib29sZWFuO1xuICAgIC8qKkNvbnZlcnRzIGZyb20gYFJlc3VsdDxULCBFPmAgdG8gYE9wdGlvbmFsPFQ+YCwgZGlzY2FyZGluZyB0aGUgZXJyb3IgaWYgYW55Ki9cbiAgICB0b19vcHRpb24oKTogT3B0aW9uPFQ+O1xufVxuZGVjbGFyZSBjbGFzcyBSZXN1bHRPazxUPiBpbXBsZW1lbnRzIFJlc3VsdEJhc2U8VCwgbmV2ZXI+IHtcbiAgICBnZXQgW1JFU1VMVF9LRVldKCk6IHRydWU7XG4gICAgcmVhZG9ubHkgdmFsdWU6IFQ7XG4gICAgY29uc3RydWN0b3IodmFsdWU6IFQpO1xuICAgIGdldCBvaygpOiB0cnVlO1xuICAgIGdldCBlcnIoKTogZmFsc2U7XG4gICAgZXhwZWN0KCk6IFQ7XG4gICAgZXhwZWN0X2Vycihtc2c6IHN0cmluZyk6IG5ldmVyO1xuICAgIHVud3JhcCgpOiBUO1xuICAgIHVud3JhcF9vcigpOiBUO1xuICAgIHVud3JhcF9lcnIoKTogbmV2ZXI7XG4gICAgdW53cmFwX2Vycl9vcjxFMj4oZXJyb3I6IEUyKTogRTI7XG4gICAgYW5kX3RoZW48VDI+KG1hcHBlcjogKHZhbHVlOiBUKSA9PiBSZXN1bHRPazxUMj4pOiBSZXN1bHRPazxUMj47XG4gICAgYW5kX3RoZW48RTI+KG1hcHBlcjogKHZhbHVlOiBUKSA9PiBSZXN1bHRFcnI8RTI+KTogUmVzdWx0RXJyPEUyPjtcbiAgICBhbmRfdGhlbjxUMiwgRTI+KG1hcHBlcjogKHZhbHVlOiBUKSA9PiBSZXN1bHQ8VDIsIEUyPik6IFJlc3VsdDxUMiwgRTI+O1xuICAgIG9yX2Vsc2UoKTogUmVzdWx0T2s8VD47XG4gICAgbWFwPFU+KGZ1bmM6ICh2YWx1ZTogVCkgPT4gVSk6IFJlc3VsdE9rPFU+O1xuICAgIG1hcF9lcnIoKTogUmVzdWx0T2s8VD47XG4gICAgY29tcGFyZShvdGhlcjogUmVzdWx0PFQsIGFueT4pOiBib29sZWFuO1xuICAgIHRvX29wdGlvbigpOiBPcHRpb25Tb21lPFQ+O1xufVxuZGVjbGFyZSBjbGFzcyBSZXN1bHRFcnI8RT4gaW1wbGVtZW50cyBSZXN1bHRCYXNlPG5ldmVyLCBFPiB7XG4gICAgZ2V0IFtSRVNVTFRfS0VZXSgpOiB0cnVlO1xuICAgIHJlYWRvbmx5IGVycm9yOiBFO1xuICAgIGNvbnN0cnVjdG9yKGVycm9yOiBFKTtcbiAgICBnZXQgdmFsaWQoKTogZmFsc2U7XG4gICAgZ2V0IG9rKCk6IGZhbHNlO1xuICAgIGdldCBlcnIoKTogdHJ1ZTtcbiAgICBleHBlY3QobXNnOiBzdHJpbmcpOiBuZXZlcjtcbiAgICBleHBlY3RfZXJyKCk6IEU7XG4gICAgdW53cmFwKCk6IG5ldmVyO1xuICAgIHVud3JhcF9vcjxUMj4odmFsOiBUMik6IFQyO1xuICAgIHVud3JhcF9lcnIoKTogRTtcbiAgICB1bndyYXBfZXJyX29yKCk6IEU7XG4gICAgYW5kX3RoZW4oKTogUmVzdWx0RXJyPEU+O1xuICAgIG9yX2Vsc2U8VDI+KG1hcHBlcjogKGVycm9yOiBFKSA9PiBSZXN1bHRPazxUMj4pOiBSZXN1bHRPazxUMj47XG4gICAgb3JfZWxzZTxFMj4obWFwcGVyOiAoZXJyb3I6IEUpID0+IFJlc3VsdEVycjxFMj4pOiBSZXN1bHRFcnI8RTI+O1xuICAgIG9yX2Vsc2U8VDIsIEUyPihtYXBwZXI6IChlcnJvcjogRSkgPT4gUmVzdWx0PFQyLCBFMj4pOiBSZXN1bHQ8VDIsIEUyPjtcbiAgICBtYXAoKTogUmVzdWx0RXJyPEU+O1xuICAgIG1hcF9lcnI8Rj4obWFwcGVyOiAoZXJyb3I6IEUpID0+IEYpOiBSZXN1bHRFcnI8Rj47XG4gICAgY29tcGFyZShvdGhlcjogUmVzdWx0PGFueSwgRT4pOiBib29sZWFuO1xuICAgIHRvX29wdGlvbigpOiBPcHRpb25Ob25lO1xufVxudHlwZSBSZXN1bHQ8VCwgRT4gPSBSZXN1bHRPazxUPiB8IFJlc3VsdEVycjxFPjtcbnR5cGUgT3B0aW9uPFQ+ID0gT3B0aW9uU29tZTxUPiB8IE9wdGlvbk5vbmU7XG50eXBlIFJlc3VsdEluZmVyT2s8VCBleHRlbmRzIFJlc3VsdDxhbnksIHN0cmluZz4+ID0gVCBleHRlbmRzIFJlc3VsdE9rPGluZmVyIFJUPiA/IFJUIDogbmV2ZXI7XG50eXBlIFJlc3VsdEluZmVyRXJyPFQgZXh0ZW5kcyBSZXN1bHQ8c3RyaW5nLCBhbnk+PiA9IFQgZXh0ZW5kcyBSZXN1bHRFcnI8aW5mZXIgUkU+ID8gUkUgOiBuZXZlcjtcbnR5cGUgT3B0aW9uSW5mZXI8VCBleHRlbmRzIE9wdGlvbjxhbnk+PiA9IFQgZXh0ZW5kcyBPcHRpb25Tb21lPGluZmVyIE9UPiA/IE9UIDogbmV2ZXI7XG4vKipDcmVhdGVzIGFuIG9rIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSAqL1xuZGVjbGFyZSBmdW5jdGlvbiBvazxUPih2YWx1ZTogVCk6IFJlc3VsdE9rPFQ+O1xuLyoqQ3JlYXRlcyBhbiBlcnJvciByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgKi9cbmRlY2xhcmUgZnVuY3Rpb24gZXJyPEU+KGVycm9yOiBFKTogUmVzdWx0RXJyPEU+O1xuLyoqQ3JlYXRlcyBhIHNvbWUgb3B0aW9uIHdpdGggdGhlIGdpdmVuIHZhbHVlICovXG5kZWNsYXJlIGZ1bmN0aW9uIHNvbWU8VD4odmFsdWU6IFQpOiBPcHRpb25Tb21lPFQ+O1xuLyoqQ3JlYXRlcyBhIG5vbmUgb3B0aW9uICovXG5kZWNsYXJlIGZ1bmN0aW9uIG5vbmUoKTogT3B0aW9uTm9uZTtcbmRlY2xhcmUgY29uc3QgcmVzdWx0OiB7XG4gICAgb2s6IHR5cGVvZiBvaztcbiAgICBlcnI6IHR5cGVvZiBlcnI7XG4gICAgc29tZTogdHlwZW9mIHNvbWU7XG4gICAgbm9uZTogdHlwZW9mIG5vbmU7XG4gICAgUkVTVUxUX0tFWTogc3ltYm9sO1xuICAgIE9QVElPTl9LRVk6IHN5bWJvbDtcbiAgICBpc19yZXN1bHQocjogYW55KTogciBpcyBSZXN1bHQ8YW55LCBhbnk+O1xuICAgIGlzX29wdGlvbihyOiBhbnkpOiByIGlzIE9wdGlvbjxhbnk+O1xufTtcblxuZXhwb3J0IHsgT1BUSU9OX0tFWSwgdHlwZSBPcHRpb24sIHR5cGUgT3B0aW9uSW5mZXIsIE9wdGlvbk5vbmUsIE9wdGlvblNvbWUsIFJFU1VMVF9LRVksIHR5cGUgUmVzdWx0LCBSZXN1bHRFcnIsIHR5cGUgUmVzdWx0SW5mZXJFcnIsIHR5cGUgUmVzdWx0SW5mZXJPaywgUmVzdWx0T2ssIHJlc3VsdCBhcyBkZWZhdWx0LCBlcnIsIG5vbmUsIG9rLCByZXN1bHQsIHNvbWUgfTtcbiIsIi8vI3JlZ2lvbiBzcmMvYXR0cmlidXRlcy5kLnRzXG5kZWNsYXJlIGNsYXNzIFNWR0F0dHJpYnV0ZXM8VCBleHRlbmRzIFNWR0VsZW1lbnQ+IHtcbiAgI3ByaXZhdGU7XG4gIGNvbnN0cnVjdG9yKGVsZW06IFQpO1xuICAvKipSZXR1cm5zIHRoZSBzdmcgZWxlbWVudCAqL1xuICBnZXQgZWxlbSgpOiBUO1xuICAvKiogU2V0cyB0aGUgc3Ryb2tlIGNvbG9yIG9mIHRoZSBTVkcgZWxlbWVudCAqL1xuICBzdHJva2Uoc3Ryb2tlOiBzdHJpbmcpOiB0aGlzO1xuICAvKiogU2V0cyB0aGUgc3Ryb2tlIGNvbG9yIG9mIHRoZSBTVkcgZWxlbWVudCAqL1xuICBzKHN0cm9rZTogc3RyaW5nKTogdGhpcztcbiAgLyoqIFNldHMgdGhlIGZpbGwgY29sb3Igb2YgdGhlIFNWRyBlbGVtZW50ICovXG4gIGZpbGwoZmlsbDogc3RyaW5nKTogdGhpcztcbiAgLyoqIFNldHMgdGhlIGZpbGwgY29sb3Igb2YgdGhlIFNWRyBlbGVtZW50ICovXG4gIGYoZmlsbDogc3RyaW5nKTogdGhpcztcbiAgLyoqIFNldHMgdGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgU1ZHIGVsZW1lbnQgKi9cbiAgc3Ryb2tlX3dpZHRoKHdpZHRoOiBudW1iZXIpOiB0aGlzO1xuICAvKiogU2V0cyB0aGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBTVkcgZWxlbWVudCAqL1xuICBzdyh3aWR0aDogbnVtYmVyKTogdGhpcztcbiAgLyoqIEFkZHMgb25lIG9yIG1vcmUgY2xhc3MgbmFtZXMgdG8gdGhlIFNWRyBlbGVtZW50ICovXG4gIGNsYXNzX2xpc3QoLi4uY2xhc3NfbmFtZTogc3RyaW5nW10pOiB0aGlzO1xuICAvKiogQWRkcyBvbmUgb3IgbW9yZSBjbGFzcyBuYW1lcyB0byB0aGUgU1ZHIGVsZW1lbnQgKi9cbiAgY2woLi4uY2xhc3NfbmFtZTogc3RyaW5nW10pOiB0aGlzO1xuICAvKiogU2V0cyBhbiBhcmJpdHJhcnkgYXR0cmlidXRlIG9uIHRoZSBTVkcgZWxlbWVudCAqL1xuICBhdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdGhpcztcbiAgLyoqIFNldHMgYW4gYXJiaXRyYXJ5IGF0dHJpYnV0ZSBvbiB0aGUgU1ZHIGVsZW1lbnQgKi9cbiAgYShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB0aGlzO1xuICAvKiogQXBwbGllcyBhIHRyYW5zbGF0aW9uIHRyYW5zZm9ybSB0byB0aGUgU1ZHIGVsZW1lbnQgKi9cbiAgdHJhbnNsYXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogdGhpcztcbiAgLyoqIEFwcGxpZXMgYSByb3RhdGlvbiB0cmFuc2Zvcm0gdG8gdGhlIFNWRyBlbGVtZW50ICovXG4gIHJvdGF0ZShhbmdsZTogbnVtYmVyLCBjeD86IG51bWJlciwgY3k/OiBudW1iZXIpOiB0aGlzO1xuICAvKiogQXBwbGllcyBhIHNjYWxpbmcgdHJhbnNmb3JtIHRvIHRoZSBTVkcgZWxlbWVudCAqL1xuICBzY2FsZShzeDogbnVtYmVyLCBzeT86IG51bWJlcik6IHRoaXM7XG4gIC8qKiBBcHBsaWVzIGEgc2tld1ggdHJhbnNmb3JtIHRvIHRoZSBTVkcgZWxlbWVudCAqL1xuICBza2V3WChhbmdsZTogbnVtYmVyKTogdGhpcztcbiAgLyoqIEFwcGxpZXMgYSBza2V3WSB0cmFuc2Zvcm0gdG8gdGhlIFNWRyBlbGVtZW50ICovXG4gIHNrZXdZKGFuZ2xlOiBudW1iZXIpOiB0aGlzO1xuICAvKiogQXBwbGllcyBhIGN1c3RvbSB0cmFuc2Zvcm0gdG8gdGhlIFNWRyBlbGVtZW50ICovXG4gIHRyYW5zZm9ybSh0cmFuc2Zvcm06IHN0cmluZyk6IHRoaXM7XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvcHJpbWl0aXZlcy9jaXJjbGUuZC50c1xuLyoqVGhpcyBjcmVhdGVzIGEgc3ZnIGNpcmNsZVxuICogQHBhcmFtIGNlbnRlcl94IHggY29vcmRpbmF0ZSBvZiBjZW50ZXJcbiAqIEBwYXJhbSBjZW50ZXJfeSB5IGNvb3JkaW5hdGUgb2YgY2VudGVyXG4gKiBAcGFyYW0gcmFkaXVzIHJhZGl1cyBvZiBjaXJjbGUqL1xuZGVjbGFyZSBmdW5jdGlvbiBjaXJjbGUoY2VudGVyX3g6IG51bWJlciwgY2VudGVyX3k6IG51bWJlciwgcmFkaXVzOiBudW1iZXIpOiBTVkdBdHRyaWJ1dGVzPFNWR0NpcmNsZUVsZW1lbnQ+O1xuLyoqVGhpcyBkcmF3cyBwYXJ0cyBvZiBhIGNpcmNsZS9lbGxpcHNlLCB0aGUgY2lyY2xlIGRpcmVjdGlvbiBpcyByZXZlcnNlZFxuICogQHBhcmFtIGNlbnRlcl94IHRoZSBjZW50ZXIgcG9pbnQgb24gdGhlIHggYXhpc1xuICogQHBhcmFtIGNlbnRlcl95IHRoZSBjZW50ZXIgcG9pbnQgb24gdGhlIHkgYXhpc1xuICogQHBhcmFtIHJhZGl1cyByYWRpdXMgaW4geCBheGlzXG4gKiBAcGFyYW0gc3RhcnRfYW5nbGUgc3RhcnQgYW5nbGUgaW4gcmFkaWFuc1xuICogQHBhcmFtIGVuZF9hbmdsZSBlbmQgYW5nbGVpbiAgcmFkaWFucyovXG5kZWNsYXJlIGZ1bmN0aW9uIGNpcmNsZV9hcmMoY2VudGVyX3g6IG51bWJlciwgY2VudGVyX3k6IG51bWJlciwgcmFkaXVzOiBudW1iZXIsIHN0YXJ0X2FuZ2xlOiBudW1iZXIsIGVuZF9hbmdsZTogbnVtYmVyKTogU1ZHQXR0cmlidXRlczxTVkdQYXRoRWxlbWVudD47XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvcHJpbWl0aXZlcy9lbGxpcHNlLmQudHNcbi8qKlRoaXMgY3JlYXRlcyBhIHN2ZyBlbGxpcHNlXG4gKiBAcGFyYW0gY2VudGVyX3ggeCBjb29yZGluYXRlIG9mIGNlbnRlclxuICogQHBhcmFtIGNlbnRlcl95IHkgY29vcmRpbmF0ZSBvZiBjZW50ZXJcbiAqIEBwYXJhbSByYWRpdXNfeCB4IHJhZGl1cyBvZiBjaXJjbGVcbiAqIEBwYXJhbSByYWRpdXNfeSB5IHJhZGl1cyBvZiBjaXJjbGUqL1xuZGVjbGFyZSBmdW5jdGlvbiBlbGxpcHNlKGNlbnRlcl94OiBudW1iZXIsIGNlbnRlcl95OiBudW1iZXIsIHJhZGl1c194OiBudW1iZXIsIHJhZGl1c195OiBudW1iZXIpOiBTVkdBdHRyaWJ1dGVzPFNWR0VsbGlwc2VFbGVtZW50Pjtcbi8qKlRoaXMgZHJhd3MgcGFydHMgb2YgYSBjaXJjbGUvZWxsaXBzZSwgdGhlIGNpcmNsZSBkaXJlY3Rpb24gaXMgcmV2ZXJzZWRcbiAqIEBwYXJhbSBjZW50ZXJfeCB0aGUgY2VudGVyIHBvaW50IG9uIHRoZSB4IGF4aXNcbiAqIEBwYXJhbSBjZW50ZXJfeSB0aGUgY2VudGVyIHBvaW50IG9uIHRoZSB5IGF4aXNcbiAqIEBwYXJhbSByYWRpdXNfeCByYWRpdXMgaW4geCBheGlzXG4gKiBAcGFyYW0gcmFkaXVzX3kgcmFkaXVzIGluIHkgYXhpc1xuICogQHBhcmFtIHN0YXJ0X2FuZ2xlIHN0YXJ0IGFuZ2xlIGluIHJhZGlhbnNcbiAqIEBwYXJhbSBlbmRfYW5nbGUgZW5kIGFuZ2xlaW4gIHJhZGlhbnMqL1xuZGVjbGFyZSBmdW5jdGlvbiBlbGxpcHNlX2FyYyhjZW50ZXJfeDogbnVtYmVyLCBjZW50ZXJfeTogbnVtYmVyLCByYWRpdXNfeDogbnVtYmVyLCByYWRpdXNfeTogbnVtYmVyLCBzdGFydF9hbmdsZTogbnVtYmVyLCBlbmRfYW5nbGU6IG51bWJlcik6IFNWR0F0dHJpYnV0ZXM8U1ZHUGF0aEVsZW1lbnQ+O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3ByaW1pdGl2ZXMvZ3JvdXAuZC50c1xuLyoqVGhpcyBkcmF3cyBhIHRyaWFuZ2xlKi9cbmRlY2xhcmUgZnVuY3Rpb24gZ3JvdXAoKTogU1ZHQXR0cmlidXRlczxTVkdHRWxlbWVudD47XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvcHJpbWl0aXZlcy9saW5lLmQudHNcbi8qKlRoaXMgY3JlYXRlcyBhIGxpbmUgZWxlbWVudFxuICogQHBhcmFtIHN0YXJ0X3ggc3RhcnQgcG9pbnQgb24geCBheGlzXG4gKiBAcGFyYW0gc3RhcnRfeSBzdGFydCBwb2ludCBvbiB5IGF4aXNcbiAqIEBwYXJhbSBlbmRfeCBlbmQgcG9pbnQgb24geCBheGlzXG4gKiBAcGFyYW0gZW5kX3kgZW5kIHBvaW50IG9uIHkgYXhpcyovXG5kZWNsYXJlIGZ1bmN0aW9uIGxpbmUoc3RhcnRfeDogbnVtYmVyLCBzdGFydF95OiBudW1iZXIsIGVuZF94OiBudW1iZXIsIGVuZF95OiBudW1iZXIpOiBTVkdBdHRyaWJ1dGVzPFNWR0xpbmVFbGVtZW50Pjtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9wcmltaXRpdmVzL3BhdGguZC50c1xuLyoqVGhpcyBjcmVhdGVzIGEgcGF0aCBlbGVtZW50Ki9cbmRlY2xhcmUgZnVuY3Rpb24gcGF0aChwYXRoOiBzdHJpbmcpOiBTVkdBdHRyaWJ1dGVzPFNWR1BhdGhFbGVtZW50Pjtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9wcmltaXRpdmVzL3JlY3RhbmdsZS5kLnRzXG4vKipUaGlzIGNyZWF0ZXMgYSByZWN0YW5nbGUgd2l0aCB0ZWggY2VudGVyIGFzIG9yaWdpblxuICogQHBhcmFtIGNlbnRlcl94IHggY29vcmRpbmF0ZSBvZiBjZW50ZXJcbiAqIEBwYXJhbSBjZW50ZXJfeSB5IGNvb3JkaW5hdGUgb2YgY2VudGVyXG4gKiBAcGFyYW0gd2lkdGggd2lkdGhcbiAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0XG4gKiBAcGFyYW0gY29ybmVyX3JhZGl1cyByYWRpdXMgb2YgY29ybmVyKi9cbmRlY2xhcmUgZnVuY3Rpb24gcmVjdGFuZ2xlX2Zyb21fY2VudGVyKGNlbnRlcl94OiBudW1iZXIsIGNlbnRlcl95OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBjb3JuZXJfcmFkaXVzOiBudW1iZXIpOiBTVkdBdHRyaWJ1dGVzPFNWR1JlY3RFbGVtZW50Pjtcbi8qKlRoaXMgY3JlYXRlcyBhIHJlY3RhbmdsZSB3aXRoIHRlaCBjZW50ZXIgYXMgb3JpZ2luXG4gKiBAcGFyYW0gc3RhcnRfeCB4IGNvb3JkaW5hdGUgb2YgY2VudGVyXG4gKiBAcGFyYW0gc3RhcnRfeSB5IGNvb3JkaW5hdGUgb2YgY2VudGVyXG4gKiBAcGFyYW0gd2lkdGggd2lkdGhcbiAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0XG4gKiBAcGFyYW0gY29ybmVyX3JhZGl1cyByYWRpdXMgb2YgY29ybmVyKi9cbmRlY2xhcmUgZnVuY3Rpb24gcmVjdGFuZ2xlX2Zyb21fY29ybmVyKHN0YXJ0X3g6IG51bWJlciwgc3RhcnRfeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgY29ybmVyX3JhZGl1czogbnVtYmVyKTogU1ZHQXR0cmlidXRlczxTVkdSZWN0RWxlbWVudD47XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvcHJpbWl0aXZlcy9zaGFyZWQuZC50c1xudHlwZSBTVkdFbGVtZW50cyA9IHtcbiAgZWxsaXBzZTogU1ZHRWxsaXBzZUVsZW1lbnQ7XG4gIGNpcmNsZTogU1ZHQ2lyY2xlRWxlbWVudDtcbiAgcGF0aDogU1ZHUGF0aEVsZW1lbnQ7XG4gIGxpbmU6IFNWR0xpbmVFbGVtZW50O1xuICByZWN0OiBTVkdSZWN0RWxlbWVudDtcbiAgdGV4dDogU1ZHVGV4dEVsZW1lbnQ7XG4gIGc6IFNWR0dFbGVtZW50O1xuICBzdmc6IFNWR1NWR0VsZW1lbnQ7XG4gIGZvcmVpZ25PYmplY3Q6IFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50O1xufTtcbmRlY2xhcmUgZnVuY3Rpb24gY3JlYXRlX3N2Z19lbGVtZW50PEsgZXh0ZW5kcyBrZXlvZiBTVkdFbGVtZW50cz4obmFtZTogSyk6IFNWR0F0dHJpYnV0ZXM8U1ZHRWxlbWVudHNbS10+O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3ByaW1pdGl2ZXMvc3ZnLmQudHNcbi8qKiBUaGlzIHJldHVybnMgYW4gZW1wdHkgc3ZnIGVsZW1lbnRcbiAqIEBwYXJhbSAgd2lkdGggd2lkdGggb2Ygc3ZnXG4gKiBAcGFyYW0gIGhlaWdodCBoZWlnaHQgb2Ygc3ZnXG4gKiBAcGFyYW0gIHZpZXdib3ggdmlld2JveCBvZiBzdmcqL1xuZGVjbGFyZSBmdW5jdGlvbiBzdmckMSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgdmlld2JveD86IHN0cmluZyk6IFNWR0F0dHJpYnV0ZXM8U1ZHU1ZHRWxlbWVudD47XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvdXRpbC9hbmNob3JQb2ludC5kLnRzXG5kZWNsYXJlIGNvbnN0IFNWR0FuY2hvclBvaW50OiB7XG4gIHJlYWRvbmx5IGJvdHRvbUxlZnQ6IDA7XG4gIHJlYWRvbmx5IG1pZGRsZUxlZnQ6IDE7XG4gIHJlYWRvbmx5IHRvcExlZnQ6IDI7XG4gIHJlYWRvbmx5IHRvcENlbnRlcjogMztcbiAgcmVhZG9ubHkgdG9wUmlnaHQ6IDQ7XG4gIHJlYWRvbmx5IG1pZGRsZVJpZ2h0OiA1O1xuICByZWFkb25seSBib3R0b21SaWdodDogNjtcbiAgcmVhZG9ubHkgYm90dG9tQ2VudGVyOiA3O1xuICByZWFkb25seSBtaWRkbGVDZW50ZXI6IDg7XG59O1xudHlwZSBTVkdBbmNob3JQb2ludCA9ICh0eXBlb2YgU1ZHQW5jaG9yUG9pbnQpW2tleW9mIHR5cGVvZiBTVkdBbmNob3JQb2ludF07XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvcHJpbWl0aXZlcy90ZXh0LmQudHNcbi8qKkNyZWF0ZXMgYSB0ZXh0IG5vZGVzIGZvciBhbiBzdmdcbiAqIEBwYXJhbSB4IHggY29vcmRpbmF0ZSBvZiB0ZXh0XG4gKiBAcGFyYW0geSB5IGNvb3JkaW5hdGUgb2YgdGV4dFxuICogQHBhcmFtIHRleHQgdGV4dFxuICogQHBhcmFtIHNpemUgc2l6ZSBvZiB0ZXh0IGluIHB4XG4gKiBAcGFyYW0gYW5jaG9yIGFuY2hvciBwb2ludCBvZiB0ZXh0Ki9cbmRlY2xhcmUgZnVuY3Rpb24gdGV4dCh4OiBudW1iZXIsIHk6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzaXplOiBudW1iZXIsIGFuY2hvcjogU1ZHQW5jaG9yUG9pbnQpOiBTVkdBdHRyaWJ1dGVzPFNWR1RleHRFbGVtZW50Pjtcbi8qKkNyZWF0ZXMgYSB0ZXh0IG5vZGVzIGZvciBhbiBzdmdcbiAqIEBwYXJhbSB4IHggY29vcmRpbmF0ZSBvZiB0ZXh0XG4gKiBAcGFyYW0geSB5IGNvb3JkaW5hdGUgb2YgdGV4dFxuICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRleHRcbiAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIHRleHRcbiAqIEBwYXJhbSB0ZXh0IHRleHRcbiAqIEBwYXJhbSBzaXplIHNpemUgb2YgdGV4dCBpbiBweFxuICogQHBhcmFtIGFuY2hvciBhbmNob3IgcG9pbnQgb2YgKi9cbmRlY2xhcmUgZnVuY3Rpb24gbXVsdGlfbGluZV90ZXh0KHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzaXplOiBudW1iZXIsIGFuY2hvcjogU1ZHQW5jaG9yUG9pbnQpOiBTVkdBdHRyaWJ1dGVzPFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50Pjtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9wcmltaXRpdmVzL3RyaWFuZ2xlLmQudHNcbi8qKlRoaXMgZHJhd3MgYSB0cmlhbmdsZVxuICogQHBhcmFtIGNlbnRlcl94IHggY29vcmRpbmF0ZSBvZiBjZW50ZXJcbiAqIEBwYXJhbSBjZW50ZXJfeSB5IGNvb3JkaW5hdGUgb2YgY2VudGVyXG4gKiBAcGFyYW0gd2lkdGggd2lkdGhcbiAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0Ki9cbmRlY2xhcmUgZnVuY3Rpb24gaXNvc2NlbGVzX3RyaWFuZ2xlKGNlbnRlcl94OiBudW1iZXIsIGNlbnRlcl95OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogU1ZHQXR0cmlidXRlczxTVkdQYXRoRWxlbWVudD47XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvaW5kZXguZC50c1xuZGVjbGFyZSBjb25zdCBzdmc6IHtcbiAgY3JlYXRlOiB0eXBlb2YgY3JlYXRlX3N2Z19lbGVtZW50O1xuICBhdHRyOiAoZWxlbTogU1ZHRWxlbWVudCkgPT4gU1ZHQXR0cmlidXRlczxTVkdFbGVtZW50PjtcbiAgY2lyY2xlOiB0eXBlb2YgY2lyY2xlO1xuICBjaXJjbGVfYXJjOiB0eXBlb2YgY2lyY2xlX2FyYztcbiAgZWxsaXBzZTogdHlwZW9mIGVsbGlwc2U7XG4gIGVsbGlwc2VfYXJjOiB0eXBlb2YgZWxsaXBzZV9hcmM7XG4gIGdyb3VwOiB0eXBlb2YgZ3JvdXA7XG4gIGxpbmU6IHR5cGVvZiBsaW5lO1xuICBwYXRoOiB0eXBlb2YgcGF0aDtcbiAgcmVjdGFuZ2xlX2Zyb21fY2VudGVyOiB0eXBlb2YgcmVjdGFuZ2xlX2Zyb21fY2VudGVyO1xuICByZWN0YW5nbGVfZnJvbV9jb3JuZXI6IHR5cGVvZiByZWN0YW5nbGVfZnJvbV9jb3JuZXI7XG4gIHN2ZzogdHlwZW9mIHN2ZyQxO1xuICB0ZXh0OiB0eXBlb2YgdGV4dDtcbiAgbXVsdGlfbGluZV90ZXh0OiB0eXBlb2YgbXVsdGlfbGluZV90ZXh0O1xuICBpc29zY2VsZXNfdHJpYW5nbGU6IHR5cGVvZiBpc29zY2VsZXNfdHJpYW5nbGU7XG4gIGFuZ2xlX3RvX2FuY2hvcl9wb2ludDogKGFuZ2xlOiBudW1iZXIpID0+IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3O1xufTtcbnR5cGUgU1ZHRnVuYyA9ICgpID0+IFNWR1NWR0VsZW1lbnQ7XG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IFNWR0FuY2hvclBvaW50LCBTVkdGdW5jLCBzdmcgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmQubXRzLm1hcCIsIi8qKiBDcmVhdGVzIGFuIGFycmF5IG9mIGEgc3BlY2lmaWVkIHJhbmdlLCBwb3B1bGF0aW5nIGl0IHZpYSBhbiBpbml0aWFsaXplciBmdW5jdGlvbi5cbiAqICogQHBhcmFtIHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIGluZGV4LlxuICogQHBhcmFtIGVuZCAtIFRoZSBlbmRpbmcgaW5kZXggKGV4Y2x1c2l2ZSkuXG4gKiBAcGFyYW0gaW5pdCAtIEEgY2FsbGJhY2sgdGhhdCByZXR1cm5zIGEgdmFsdWUgb2YgdHlwZSBUIGZvciBlYWNoIGluZGV4IGkuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiB0eXBlIFRbXSBjb250YWluaW5nIHRoZSBpbml0aWFsaXplZCB2YWx1ZXMuKi9cbmRlY2xhcmUgZnVuY3Rpb24gYXJyYXlfZnJvbV9yYW5nZTxUPihzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgaW5pdDogKGk6IG51bWJlcikgPT4gVCk6IFRbXTtcbi8qKiBHZW5lcmF0ZXMgYW4gYXJyYXkgb2YgdHlwZSBUIGZyb20gYW4gaW5jbHVzaXZlIHJhbmdlIFtzdGFydCwgZW5kXS5cbiAqICogQHBhcmFtIHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIGludGVnZXIgaW5kZXguXG4gKiBAcGFyYW0gZW5kIC0gVGhlIGVuZGluZyBpbnRlZ2VyIGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIGluaXQgLSBBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhbiBlbGVtZW50IG9mIHR5cGUgVCBnaXZlbiB0aGUgY3VycmVudCBpbmRleCBpLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgbGVuZ3RoIChlbmQgLSBzdGFydCArIDEpLCBvciBhbiBlbXB0eSBhcnJheSBpZiBlbmQgPCBzdGFydC4qL1xuZGVjbGFyZSBmdW5jdGlvbiBhcnJheV9mcm9tX3JhbmdlX2luY2x1c2l2ZTxUPihzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgaW5pdDogKGk6IG51bWJlcikgPT4gVCk6IFRbXTtcbi8qKkNyZWF0ZXMgYW4gYXJyYXkgb2YgYSBzcGVjaWZpZWQgbGVuZ3RoLCBwb3B1bGF0aW5nIGVhY2ggaW5kZXhcbiAqIHVzaW5nIGEgcHJvdmlkZWQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uXG4gKiAqIEBwYXJhbSBsZW4gLSBUaGUgZGVzaXJlZCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LlxuICogQHBhcmFtIGluaXQgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGN1cnJlbnQgaW5kZXggKGkpIGFuZCByZXR1cm5zIGEgdmFsdWUgb2YgdHlwZSBULlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgbGVuZ3RoICdsZW4nLCBvciBhbiBlbXB0eSBhcnJheSBpZiAnbGVuJyBpcyB6ZXJvIG9yIG5lZ2F0aXZlLiAqL1xuZGVjbGFyZSBmdW5jdGlvbiBhcnJheV9mcm9tX2xlbmd0aDxUPihsZW46IG51bWJlciwgaW5pdDogKGk6IG51bWJlcikgPT4gVCwgcHJlcGVuZD86IFRbXSwgYXBwZW5kPzogVFtdKTogVFtdO1xuXG4vKipSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIHByb21pc2UgbGlrZSAqL1xuZGVjbGFyZSBmdW5jdGlvbiBpc19wcm9taXNlX2xpa2U8VD4odmFsdWU6IGFueSk6IHZhbHVlIGlzIFByb21pc2VMaWtlPFQ+O1xuLyoqUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudCAoaWYgYW55KS4qL1xuZGVjbGFyZSBmdW5jdGlvbiBzbGVlcDxUID0gdm9pZD4obXM6IG51bWJlciwgYXJnPzogVCk6IFByb21pc2U8VD47XG4vKipSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gKGlmIGFueSkuKi9cbmRlY2xhcmUgZnVuY3Rpb24gc2xlZXBfbGF6eTxUID0gdm9pZD4obXM6IG51bWJlciwgYXJnPzogKCkgPT4gVCk6IFByb21pc2U8VD47XG4vKipSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGV4ZWN1dGVzIHN5bmNocm9ub3VzbHkgd2hlbiB1c2luZyAudGhlbigpIGFuZCByZXNvbHZlcyBpbW1lZGlhdGVseSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4qL1xuZGVjbGFyZSBmdW5jdGlvbiBzeW5jX3Jlc29sdmU8VD4odmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPik6IFByb21pc2VMaWtlPFQ+O1xuLyoqUmV0dXJucyBhIHByb21pc2UgdGhhdCBleGVjdXRlcyBzeW5jaHJvbm91c2x5IHdoZW4gdXNpbmcgLmNhdGNoKCkgYW5kIHJlamVjdHMgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuKi9cbmRlY2xhcmUgZnVuY3Rpb24gc3luY19yZWplY3Q8VD4oZXJyb3I6IFQgfCBQcm9taXNlTGlrZTxUPik6IFByb21pc2VMaWtlPFQ+O1xuXG4vKiogQ3JlYXRlcyBhIGRlYm91bmNlZCB2ZXJzaW9uIG9mIGEgZnVuY3Rpb24gdGhhdCBkZWxheXMgZXhlY3V0aW9uIHVudGlsIGFmdGVyXG4gKiAnd2FpdCcgbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIGl0IHdhcyBpbnZva2VkLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgdHlwZSBvZiB0aGUgYXJndW1lbnRzIGFycmF5LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0gZnVuYyAtIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB3YWl0IC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcywgd2hlbiAwIG9yIHVuc3BlY2lmaWVkIGl0IG9ubHkgcmVtb3ZlcyBjYWxscyB0byB0aGUgZnVuY3Rpb24gaW4gdGhlIHNhbWUgY3ljbGUuXG4gKiBAcGFyYW0gbGVhZGluZyAtIElmIHRydWUsIHRyaWdnZXJzIHRoZSBmdW5jdGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMgIEEgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi4gKi9cbmRlY2xhcmUgZnVuY3Rpb24gZGVib3VuY2U8VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55PihmdW5jOiBULCB3YWl0PzogbnVtYmVyLCBsZWFkaW5nPzogYm9vbGVhbik6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiB2b2lkO1xuXG4vKipUaGlzIGNvbXBhcmVzIHR3byB2YWx1ZXMgb2YgYW55IHR5cGUsIHJldHVybnMgdHJ1ZSBpZiB0aGV5IGFyZSBlcXVhbFxuICogRm9yIGFueSBvYmplY3QgdHlwZSBpdCB3aWxsIGRlZXAgY29tcGFyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIG9iamVjdHMgd2hpY2ggaGF2ZSBhbiBvYmplY3RFcXVhbHMgbWV0aG9kLCB3aGljaCBjYW4gcHJvdmlkZSBhIGN1c3RvbSBjb21wYXJpc3NvblxuICogV2lsbCByZXR1cm4gdHJ1ZSBmb3IgTmFOIGVxdWFsIHRvIE5hTiovXG5kZWNsYXJlIGZ1bmN0aW9uIGFueV9lcXVhbHNfZGVlcChhbnkxOiBhbnksIGFueTI6IGFueSk6IGJvb2xlYW47XG4vKipUaGlzIGRlZXAgY29tcGFyZXMgdHdvIG9iamVjdHMsIHJldHVybnMgdHJ1ZSBpZiB0aGV5IGFyZSBlcXVhbFxuICogSXQgY29tcGFyZXMgYWxsIGtleXMgaW4gdGhlIG9iamVjdCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIG9iamVjdHMgd2hpY2ggaGF2ZSBhbiBvYmplY3RFcXVhbHMgbWV0aG9kLCB3aGljaCBjYW4gcHJvdmlkZSBhIGN1c3RvbSBjb21wYXJpc3NvbiovXG5kZWNsYXJlIGZ1bmN0aW9uIG9iamVjdF9lcXVhbHNfZGVlcChvYmplY3QxOiBvYmplY3QsIG9iamVjdDI6IG9iamVjdCk6IGJvb2xlYW47XG4vKipUaGlzIGRlZXAgY29tcGFyZXMgdHdvIGFycmF5cywgcmV0dXJucyB0cnVlIGlmIHRoZXkgYXJlIGVxdWFsXG4gKiBJdCBjb21wYXJlcyBhbGwgaW5kZXhlcyBpbiB0aGUgYXJyYXksIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhcnJheXMgd2hpY2ggaGF2ZSBhbiBvYmplY3RFcXVhbHMgbWV0aG9kLCB3aGljaCBjYW4gcHJvdmlkZSBhIGN1c3RvbSBjb21wYXJpc3NvbiovXG5kZWNsYXJlIGZ1bmN0aW9uIGFycmF5X2VxdWFsc19kZWVwKGFycmF5MTogdW5rbm93bltdLCBhcnJheTI6IHVua25vd25bXSk6IGJvb2xlYW47XG5cbi8qKkV2ZW50IHR5cGVzIGZvciBiYXNlKi9cbmRlY2xhcmUgY29uc3QgSVBWZXJzaW9uOiB7XG4gICAgcmVhZG9ubHkgVjQ6IDQ7XG4gICAgcmVhZG9ubHkgVjY6IDY7XG59O1xudHlwZSBJUFZlcnNpb24gPSAodHlwZW9mIElQVmVyc2lvbilba2V5b2YgdHlwZW9mIElQVmVyc2lvbl07XG5kZWNsYXJlIGNsYXNzIElQQWRkcmVzcyB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWx1ZTtcbiAgICByZWFkb25seSB2ZXJzaW9uOiBJUFZlcnNpb247XG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB8IG51bWJlcltdKTtcbiAgICBwcml2YXRlIHBhcnNlX3Y0X3N0cmluZztcbiAgICBwcml2YXRlIHBhcnNlX3Y2X3N0cmluZztcbiAgICBwcml2YXRlIGZyb21fYXJyYXk7XG4gICAgZ2V0IGlzX3Y0KCk6IGJvb2xlYW47XG4gICAgZ2V0IGlzX3Y2KCk6IGJvb2xlYW47XG4gICAgZ2V0IGFzX2JpZ19pbnQoKTogYmlnaW50O1xuICAgIGdldCBhc19hcnJheSgpOiBudW1iZXJbXTtcbiAgICB0b19zdHJpbmcoKTogc3RyaW5nO1xufVxuXG4vKioqIEdldHMgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIChvZmZzZXQpIHdpdGhpbiB0aGUgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXG4gKiBAcGFyYW0gZWxlbWVudCBUaGUgY29udGVudGVkaXRhYmxlIEhUTUwgZWxlbWVudC5cbiAqIEByZXR1cm5zIFRoZSBvZmZzZXQgbnVtYmVyLCBvciAtMSBpZiB0aGUgZWxlbWVudCBpcyBub3QgZm9jdXNlZCBvciBubyBzZWxlY3Rpb24gZXhpc3RzLiovXG5kZWNsYXJlIGZ1bmN0aW9uIGdldF9jdXJzb3JfcG9zaXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQpOiBudW1iZXI7XG4vKiogU2V0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIChjYXJldCkgaW5zaWRlIHRoZSBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBiYXNlZCBvbiBhIGNoYXJhY3RlciBvZmZzZXQuXG4gKiBAcGFyYW0gZWxlbWVudCBUaGUgY29udGVudGVkaXRhYmxlIEhUTUwgZWxlbWVudC5cbiAqIEBwYXJhbSBvZmZzZXQgVGhlIGNoYXJhY3RlciBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlbGVtZW50J3MgdGV4dCBjb250ZW50LiovXG5kZWNsYXJlIGZ1bmN0aW9uIHNldF9jdXJzb3JfcG9zaXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQsIG9mZnNldDogbnVtYmVyKTogdm9pZDtcbi8qKlNldHMgdGhlIGN1cnNvciAoY2FyZXQpIHBvc2l0aW9uIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXG4gKiBAcGFyYW0gZWxlbWVudCBUaGUgY29udGVudGVkaXRhYmxlIEhUTUwgZWxlbWVudC4qL1xuZGVjbGFyZSBmdW5jdGlvbiBzZXRfY3Vyc29yX2VuZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQ7XG4vKiogU2VsZWN0cyBhbGwgY29udGVudCAodGV4dCBhbmQgZWxlbWVudHMpIHdpdGhpbiB0aGUgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXG4gKiBAcGFyYW0gZWxlbWVudCBUaGUgY29udGVudGVkaXRhYmxlIEhUTUwgZWxlbWVudC4qL1xuZGVjbGFyZSBmdW5jdGlvbiBzZXRfc2VsZWN0aW9uX2FsbChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQ7XG5cbi8qKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLlxuICogKiBGZWF0dXJlczpcbiAqIC0gSW1tZWRpYXRlIGV4ZWN1dGlvbiBvbiB0aGUgZmlyc3QgY2FsbC5cbiAqIC0gTGVhZGluZy1lZGdlIGFuZCB0cmFpbGluZy1lZGdlIGV4ZWN1dGlvbiAoZW5zdXJlcyB0aGUgbGFzdCBjYWxsIGlzIG5vdCBsb3N0KS5cbiAqICogQHBhcmFtIGZ1bmMgLSBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gKiBAcGFyYW0gd2FpdCAtIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIGludm9jYXRpb25zIHRvLlxuICogQHJldHVybnMgQSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLiovXG5kZWNsYXJlIGZ1bmN0aW9uIHRocm90dGxlPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oZnVuYzogVCwgd2FpdD86IG51bWJlcik6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiB2b2lkO1xuXG5kZWNsYXJlIGZ1bmN0aW9uIG5vZGVfY2xvbmU8VCBleHRlbmRzIE5vZGU+KG5vZGU6IFQpOiBUO1xudHlwZSBQcmV0dGlmeTxUPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXTtcbn0gJiB7fTtcbi8qKkNoZWNrcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGVtcHR5IG9ubHkgY2hlY2tzIGZvciBvYmplY3RzIG93biBwcm9wZXJ0aWVzKi9cbmRlY2xhcmUgY29uc3Qgb2JqZWN0X2VtcHR5OiAob2JqOiBvYmplY3QpID0+IGJvb2xlYW47XG5kZWNsYXJlIGZ1bmN0aW9uIGFycmF5X2RpZmY8VD4obWFpbjogVFtdLCBzZWNvbmQ6IFRbXSk6IHtcbiAgICBhZGRlZDogVFtdO1xuICAgIHJlbW92ZWQ6IFRbXTtcbn07XG5kZWNsYXJlIGZ1bmN0aW9uIG9iamVjdF9rZXlfZGlmZjxUMSBleHRlbmRzIG9iamVjdCwgVDIgZXh0ZW5kcyBvYmplY3Q+KG1haW46IFQxLCBzZWNvbmQ6IFQyKToge1xuICAgIGFkZGVkOiBzdHJpbmdbXTtcbiAgICByZW1vdmVkOiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB7IElQQWRkcmVzcywgSVBWZXJzaW9uLCB0eXBlIFByZXR0aWZ5LCBhbnlfZXF1YWxzX2RlZXAsIGFycmF5X2RpZmYsIGFycmF5X2VxdWFsc19kZWVwLCBhcnJheV9mcm9tX2xlbmd0aCwgYXJyYXlfZnJvbV9yYW5nZSwgYXJyYXlfZnJvbV9yYW5nZV9pbmNsdXNpdmUsIGRlYm91bmNlLCBnZXRfY3Vyc29yX3Bvc2l0aW9uLCBpc19wcm9taXNlX2xpa2UsIG5vZGVfY2xvbmUsIG9iamVjdF9lbXB0eSwgb2JqZWN0X2VxdWFsc19kZWVwLCBvYmplY3Rfa2V5X2RpZmYsIHNldF9jdXJzb3JfZW5kLCBzZXRfY3Vyc29yX3Bvc2l0aW9uLCBzZXRfc2VsZWN0aW9uX2FsbCwgc2xlZXAsIHNsZWVwX2xhenksIHN5bmNfcmVqZWN0LCBzeW5jX3Jlc29sdmUsIHRocm90dGxlIH07XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSw2XSwibWFwcGluZ3MiOiI7Ozs7Ozs7Y0FDY0EsVUFBQUE7O2NBRUFDLFVBQUFBO0FBQUFBLFVBQ0pDLFVBQUFBO0VBSElGO0VBQUFBLFVBS0FDLFVBQUFBOztXQUVEVSxJQUFBQTtFQVAwQjtFQUFBLFNBUzFCQyxJQUFBQTtFQVAwQjtFQUFBLFNBUzFCQyxLQUFBQSxHQUFRUCxDQUFBQTtFQVRrQjs7RUFZbkNRLE1BQUFBLENBQU9DLEdBQUFBLFdBQWNULENBQUFBO0VBWEw7RUFhaEJVLE1BQUFBLElBQVVWLENBQUFBO0VBWEFMOztFQWNWZ0IsU0FBQUEsS0FBY0osS0FBQUEsRUFBT1YsRUFBQUEsR0FBS0csQ0FBQUEsR0FBSUgsRUFBQUE7RUFIcEJHOztFQU1WWSxRQUFBQSxLQUFhQyxNQUFBQSxHQUFTTixLQUFBQSxFQUFPUCxDQUFBQSxLQUFNQyxVQUFBQSxDQUFXSixFQUFBQSxJQUFNSyxNQUFBQSxDQUFPTCxFQUFBQTtFQUMzRGUsUUFBQUEsQ0FBU0MsTUFBQUEsR0FBU04sS0FBQUEsRUFBT1AsQ0FBQUEsS0FBTUcsVUFBQUEsR0FBYUQsTUFBQUEsQ0FBT0YsQ0FBQUE7RUFDbkRZLFFBQUFBLEtBQWFDLE1BQUFBLEdBQVNOLEtBQUFBLEVBQU9QLENBQUFBLEtBQU1FLE1BQUFBLENBQU9MLEVBQUFBLElBQU1LLE1BQUFBLENBQU9MLEVBQUFBO0VBRlRBOztFQUs5Q2lCLE9BQUFBLEtBQVlELE1BQUFBLFFBQWNaLFVBQUFBLENBQVdKLEVBQUFBLElBQU1LLE1BQUFBLENBQU9MLEVBQUFBO0VBQ2xEaUIsT0FBQUEsQ0FBUUQsTUFBQUEsUUFBY1YsVUFBQUEsR0FBYUQsTUFBQUEsQ0FBT0YsQ0FBQUE7RUFDMUNjLE9BQUFBLEtB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