checkbox-selection-input 15.0.4 → 15.0.5

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,151 @@
1
+ import * as i0 from '@angular/core';
2
+ import { PipeTransform, OnInit, EventEmitter } from '@angular/core';
3
+ import * as _angular_forms from '@angular/forms';
4
+ import { FormBuilder, ControlValueAccessor, AbstractControl, ValidationErrors } from '@angular/forms';
5
+ import * as i3 from '@angular/common';
6
+ import * as i5 from '@angular/material/slider';
7
+ import * as i6 from '@angular/material/button';
8
+ import * as i7 from '@angular/material/icon';
9
+ import * as i8 from '@angular/material/form-field';
10
+ import * as i9 from '@angular/material/toolbar';
11
+ import * as i10 from '@angular/material/checkbox';
12
+ import * as i11 from '@angular/material/menu';
13
+ import * as i12 from '@angular/material/button-toggle';
14
+ import * as i13 from '@angular/material/divider';
15
+ import * as i14 from '@angular/material/radio';
16
+ import * as i15 from '@angular/material/input';
17
+ import * as i16 from '@angular/material/autocomplete';
18
+ import * as i18 from '@angular/material/select';
19
+ import * as i19 from '@angular/material/core';
20
+ import * as i20 from '@angular/material/slide-toggle';
21
+
22
+ interface SelectionBasicInterface {
23
+ id: number | string;
24
+ value: string;
25
+ }
26
+ declare class SelectionBasic implements SelectionBasicInterface {
27
+ id: number;
28
+ value: string;
29
+ constructor(id?: number, value?: string);
30
+ static adapt(item?: any): SelectionBasic;
31
+ }
32
+
33
+ interface SelectionItemInterface {
34
+ id: number | string;
35
+ value: string;
36
+ disabled?: boolean;
37
+ selected?: boolean;
38
+ }
39
+ declare class SelectionItem implements SelectionItemInterface {
40
+ id: `${string}-${string}-${string}-${string}-${string}`;
41
+ value: string;
42
+ disabled?: boolean | undefined;
43
+ selected?: boolean | undefined;
44
+ constructor(id?: `${string}-${string}-${string}-${string}-${string}`, value?: string, disabled?: boolean | undefined, selected?: boolean | undefined);
45
+ static adapt(item?: any): SelectionItem;
46
+ }
47
+
48
+ declare class RemoveUnderscorePipe implements PipeTransform {
49
+ transform(value: string): string;
50
+ static ɵfac: i0.ɵɵFactoryDeclaration<RemoveUnderscorePipe, never>;
51
+ static ɵpipe: i0.ɵɵPipeDeclaration<RemoveUnderscorePipe, "removeUnderscore", true>;
52
+ }
53
+
54
+ declare class CheckboxSelectionDemoComponent implements OnInit {
55
+ fb: FormBuilder;
56
+ data_1: ({
57
+ id: number;
58
+ value: string;
59
+ selected: boolean;
60
+ disabled?: undefined;
61
+ } | {
62
+ id: number;
63
+ value: string;
64
+ disabled: boolean;
65
+ selected?: undefined;
66
+ })[];
67
+ data_2: string[];
68
+ data: any;
69
+ selectionControl_1: _angular_forms.FormControl<any[] | null>;
70
+ selectionControl_2: _angular_forms.FormControl<any[] | null>;
71
+ selectionControl_3: _angular_forms.FormControl<any[] | null>;
72
+ selectionControl_4: _angular_forms.FormControl<any[] | null>;
73
+ selectionControl_5: _angular_forms.FormControl<any[] | null>;
74
+ selectionControl_6: _angular_forms.FormControl<any[] | null>;
75
+ changeDetection_1: _angular_forms.FormControl<any[] | null>;
76
+ changeDetection_2: _angular_forms.FormControl<any[] | null>;
77
+ changeDetection_3: _angular_forms.FormControl<any[] | null>;
78
+ changeDetection_4: _angular_forms.FormControl<any[] | null>;
79
+ changeDetection_5: _angular_forms.FormControl<any[] | null>;
80
+ changeDetection_6: _angular_forms.FormControl<any[] | null>;
81
+ constructor();
82
+ ngOnInit(): void;
83
+ onDisabled_1(disable: boolean): void;
84
+ onDisabled_2(disable: boolean): void;
85
+ onDisabled_3(disable: boolean): void;
86
+ onDisabled_4(disable: boolean): void;
87
+ onDisabled_5(disable: boolean): void;
88
+ onDisabled_6(disable: boolean): void;
89
+ onPerformPatch(): void;
90
+ onChangeDataType(type: string): void;
91
+ static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxSelectionDemoComponent, never>;
92
+ static ɵcmp: i0.ɵɵComponentDeclaration<CheckboxSelectionDemoComponent, "app-checkbox-selection-demo", never, {}, {}, never, never, false, never>;
93
+ }
94
+
95
+ declare class CheckboxSelectionInputComponent implements OnInit, ControlValueAccessor {
96
+ fb: FormBuilder;
97
+ selectionControl: _angular_forms.FormGroup<{
98
+ [x: string]: _angular_forms.FormControl<unknown>;
99
+ }>;
100
+ label?: string;
101
+ placeholder?: string;
102
+ error?: string;
103
+ disableMax: boolean;
104
+ useDefaultReset: boolean;
105
+ private _minSelection;
106
+ set minSelection(value: number);
107
+ get minSelection(): number;
108
+ _maxSelection: number;
109
+ set maxSelection(value: number);
110
+ get maxSelection(): number;
111
+ isObjects: boolean;
112
+ formInitialized: boolean;
113
+ raw: any[];
114
+ private _data;
115
+ set data(value: any[]);
116
+ get data(): any[];
117
+ selectionChange: EventEmitter<string[]>;
118
+ onChange: any;
119
+ onTouch: any;
120
+ disabled: boolean;
121
+ isArray: (obj: any) => obj is any[];
122
+ isObject: (obj: any) => boolean;
123
+ hasObjects: (obj: any) => boolean;
124
+ objectIsEmpty: (obj: any) => boolean;
125
+ selectedCheckboxes: (obj: any) => string[];
126
+ constructor();
127
+ ngOnInit(): void;
128
+ ngAfterViewInit(): void;
129
+ initSelection(): void;
130
+ writeValue(value: string[]): void;
131
+ validate(control: AbstractControl): ValidationErrors | null;
132
+ registerOnChange(fn: any): void;
133
+ registerOnTouched(fn: any): void;
134
+ setDisabledState(isDisabled: boolean): void;
135
+ onSelectionChange(): void;
136
+ selectedValues(obj: any, state?: boolean): string[];
137
+ removeLast(obj: any, index: number): {
138
+ [k: string]: unknown;
139
+ };
140
+ static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxSelectionInputComponent, never>;
141
+ static ɵcmp: i0.ɵɵComponentDeclaration<CheckboxSelectionInputComponent, "app-checkbox-selection-input", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "error": { "alias": "error"; "required": false; }; "disableMax": { "alias": "disableMax"; "required": false; }; "useDefaultReset": { "alias": "useDefaultReset"; "required": false; }; "minSelection": { "alias": "minSelection"; "required": false; }; "maxSelection": { "alias": "maxSelection"; "required": false; }; "data": { "alias": "data"; "required": false; }; }, { "selectionChange": "selectionChange"; }, never, ["*"], false, never>;
142
+ }
143
+
144
+ declare class CheckboxSelectionInputModule {
145
+ static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxSelectionInputModule, never>;
146
+ static ɵmod: i0.ɵɵNgModuleDeclaration<CheckboxSelectionInputModule, [typeof CheckboxSelectionInputComponent, typeof CheckboxSelectionDemoComponent], [typeof i3.CommonModule, typeof _angular_forms.FormsModule, typeof _angular_forms.ReactiveFormsModule, typeof i5.MatSliderModule, typeof i6.MatButtonModule, typeof i7.MatIconModule, typeof i8.MatFormFieldModule, typeof i9.MatToolbarModule, typeof i10.MatCheckboxModule, typeof i11.MatMenuModule, typeof i12.MatButtonToggleModule, typeof i13.MatDividerModule, typeof i14.MatRadioModule, typeof i15.MatInputModule, typeof i16.MatAutocompleteModule, typeof RemoveUnderscorePipe, typeof i18.MatSelectModule, typeof i19.MatOptionModule, typeof i20.MatSlideToggleModule], [typeof CheckboxSelectionInputComponent, typeof CheckboxSelectionDemoComponent]>;
147
+ static ɵinj: i0.ɵɵInjectorDeclaration<CheckboxSelectionInputModule>;
148
+ }
149
+
150
+ export { CheckboxSelectionDemoComponent, CheckboxSelectionInputComponent, CheckboxSelectionInputModule, RemoveUnderscorePipe, SelectionBasic, SelectionItem };
151
+ export type { SelectionBasicInterface, SelectionItemInterface };
Binary file
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0L3NyYy9jaGVja2JveC1zZWxlY3Rpb24taW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,137 +0,0 @@
1
- import { Component, inject } from '@angular/core';
2
- import { FormBuilder, Validators } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/forms";
6
- import * as i3 from "@angular/material/button";
7
- import * as i4 from "@angular/material/form-field";
8
- import * as i5 from "@angular/material/button-toggle";
9
- import * as i6 from "@angular/material/divider";
10
- import * as i7 from "@angular/material/slide-toggle";
11
- import * as i8 from "../checkbox-selection-input/checkbox-selection-input.component";
12
- export class CheckboxSelectionDemoComponent {
13
- constructor() {
14
- this.fb = inject(FormBuilder);
15
- this.data_1 = [
16
- { id: 11, value: 'Telus', selected: true },
17
- { id: 12, value: 'AT&T', disabled: true },
18
- { id: 14, value: 'Bell', selected: true },
19
- { id: 63, value: 'Rogers', selected: true }
20
- ];
21
- this.data_2 = ['Telus', 'AT&T', 'Bell', 'Rogers'];
22
- this.data = this.data_2;
23
- // CHECKBOX
24
- this.selectionControl_1 = this.fb.control(null);
25
- this.selectionControl_2 = this.fb.control(null, Validators.required);
26
- this.selectionControl_3 = this.fb.control(null, Validators.required);
27
- this.selectionControl_4 = this.fb.control(null, Validators.required);
28
- this.selectionControl_5 = this.fb.control(null, Validators.required);
29
- this.selectionControl_6 = this.fb.control(null, Validators.required);
30
- //CHANGE
31
- this.changeDetection_1 = this.fb.control(null);
32
- this.changeDetection_2 = this.fb.control(null);
33
- this.changeDetection_3 = this.fb.control(null);
34
- this.changeDetection_4 = this.fb.control(null);
35
- this.changeDetection_5 = this.fb.control(null);
36
- this.changeDetection_6 = this.fb.control(null);
37
- }
38
- ngOnInit() {
39
- // CHECKBOX
40
- this.selectionControl_1.valueChanges.subscribe(data => {
41
- if (this.changeDetection_1.value)
42
- console.log('CHANGE:', data);
43
- });
44
- this.selectionControl_2.valueChanges.subscribe(data => {
45
- if (this.changeDetection_2.value)
46
- console.log('CHANGE:', data);
47
- });
48
- this.selectionControl_3.valueChanges.subscribe(data => {
49
- if (this.changeDetection_3.value)
50
- console.log('CHANGE:', data);
51
- });
52
- this.selectionControl_4.valueChanges.subscribe(data => {
53
- if (this.changeDetection_4.value)
54
- console.log('CHANGE:', data);
55
- });
56
- this.selectionControl_5.valueChanges.subscribe(data => {
57
- if (this.changeDetection_5.value)
58
- console.log('CHANGE:', data);
59
- });
60
- this.selectionControl_6.valueChanges.subscribe(data => {
61
- if (this.changeDetection_6.value)
62
- console.log('CHANGE:', data);
63
- });
64
- }
65
- // DISABLE
66
- onDisabled_1(disable) {
67
- if (disable) {
68
- this.selectionControl_1.disable();
69
- }
70
- else {
71
- this.selectionControl_1.enable();
72
- }
73
- }
74
- onDisabled_2(disable) {
75
- if (disable) {
76
- this.selectionControl_2.disable();
77
- }
78
- else {
79
- this.selectionControl_2.enable();
80
- }
81
- }
82
- onDisabled_3(disable) {
83
- if (disable) {
84
- this.selectionControl_3.disable();
85
- }
86
- else {
87
- this.selectionControl_3.enable();
88
- }
89
- }
90
- onDisabled_4(disable) {
91
- if (disable) {
92
- this.selectionControl_4.disable();
93
- }
94
- else {
95
- this.selectionControl_4.enable();
96
- }
97
- }
98
- onDisabled_5(disable) {
99
- if (disable) {
100
- this.selectionControl_5.disable();
101
- }
102
- else {
103
- this.selectionControl_5.enable();
104
- }
105
- }
106
- onDisabled_6(disable) {
107
- if (disable) {
108
- this.selectionControl_6.disable();
109
- }
110
- else {
111
- this.selectionControl_6.enable();
112
- }
113
- }
114
- onPerformPatch() {
115
- this.selectionControl_1.patchValue(['Bell', 'Rogers']);
116
- this.selectionControl_2.patchValue(['Bell', 'Telus']);
117
- this.selectionControl_3.patchValue(['Telus', 'Bell']);
118
- this.selectionControl_4.patchValue(['Rogers']);
119
- this.selectionControl_5.patchValue(['Rogers']);
120
- this.selectionControl_6.patchValue(['Telus', 'Bell', 'Rogers']);
121
- }
122
- onChangeDataType(type) {
123
- if (type === 'strings') {
124
- this.data = this.data_2;
125
- }
126
- else {
127
- this.data = this.data_1;
128
- }
129
- }
130
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CheckboxSelectionDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
131
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CheckboxSelectionDemoComponent, selector: "app-checkbox-selection-demo", ngImport: i0, template: "<div style=\"display: flex;\">\n <h1>Checkbox FormControl</h1>\n <div style=\"flex:1; text-align: right;\">\n <div style=\"display: flex; gap: 2rem; flex-direction: row-reverse;\">\n <mat-button-toggle (click)=\"onPerformPatch()\">Patch</mat-button-toggle>\n <mat-button-toggle-group #varTypes=\"matButtonToggleGroup\" (change)=\"onChangeDataType(varTypes.value)\">\n <mat-button-toggle value=\"strings\" checked=\"true\">Strings</mat-button-toggle>\n <mat-button-toggle value=\"objects\" checked=\"false\">Objects</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n </div>\n</div>\n\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n </div>\n <app-checkbox-selection-input error=\"No Data Provided\">\n <h3 style=\"color: red; margin-top: 0; margin-bottom: 0;\">No Data</h3>\n </app-checkbox-selection-input>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n<div>\n <h3 style=\"margin-bottom: 0;\">Checkbox Selection - {{ varTypes.value | uppercase }}</h3>\n\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_1.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n [formControl]=\"selectionControl_1\"\n ></app-checkbox-selection-input>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_1\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #disable1 (change)=\"onDisabled_1(disable1.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n No Label and Placeholder<br>\n Not Required<br>\n Valid {{ selectionControl_1.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_2.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Selections\"\n placeholder=\"My placeholder\"\n [formControl]=\"selectionControl_2\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error2.checked\">\n <mat-error *ngIf=\"selectionControl_2.hasError('required')\">This field is Required</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_2\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error2>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable2 (change)=\"onDisabled_2(disable2.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label and Placeholder<br>\n Required<br>\n Valid {{ selectionControl_2.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_3.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Providers\"\n [formControl]=\"selectionControl_3\"\n [minSelection]=\"2\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error3.checked\">\n <mat-error *ngIf=\"selectionControl_3.hasError('minRequired')\">Minimum of 1 required</mat-error>\n <mat-error *ngIf=\"selectionControl_3.hasError('required')\">This field is Required</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_3\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error3>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable3 (change)=\"onDisabled_3(disable3.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label<br>\n Minimum of 2 Required<br>\n Valid {{ selectionControl_3.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_4.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Providers\"\n [formControl]=\"selectionControl_4\"\n [maxSelection]=\"2\"\n [disableMax]=\"false\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error4.checked\">\n <mat-error *ngIf=\"selectionControl_4.hasError('maxExceeded')\">Maximum reached</mat-error>\n <mat-error *ngIf=\"selectionControl_4.hasError('required')\">This field is Required</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_4\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error4>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable4 (change)=\"onDisabled_4(disable4.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label<br>\n Maximum of 2 Required<br>\n Valid {{ selectionControl_4.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_5.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Providers\"\n [formControl]=\"selectionControl_5\"\n [maxSelection]=\"2\"\n [disableMax]=\"true\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error5.checked\">\n <mat-error *ngIf=\"selectionControl_5.hasError('maxExceeded')\">Maximum reached</mat-error>\n <mat-error *ngIf=\"selectionControl_5.hasError('required')\">This field is Required</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_5\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error5>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable5 (change)=\"onDisabled_5(disable5.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label<br>\n Maximum of 2 Required<br>\n Disable if Max Reached<br>\n Valid {{ selectionControl_5.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_6.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Providers\"\n [formControl]=\"selectionControl_6\"\n [minSelection]=\"1\"\n [maxSelection]=\"2\"\n [disableMax]=\"true\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error6.checked\">\n <mat-error *ngIf=\"selectionControl_6.hasError('minRequired')\">Minimum of 1 required</mat-error>\n <mat-error *ngIf=\"selectionControl_6.hasError('maxExceeded')\">Maximum reached</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_6\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error6>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable6 (change)=\"onDisabled_6(disable6.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label<br>\n Minimum of 1 Required<br>\n Maximum of 2 Required<br>\n Disable if Max Reached<br>\n Valid {{ selectionControl_6.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i5.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i5.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i8.CheckboxSelectionInputComponent, selector: "app-checkbox-selection-input", inputs: ["label", "placeholder", "error", "disableMax", "useDefaultReset", "minSelection", "maxSelection", "data"], outputs: ["selectionChange"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }] }); }
132
- }
133
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CheckboxSelectionDemoComponent, decorators: [{
134
- type: Component,
135
- args: [{ selector: 'app-checkbox-selection-demo', template: "<div style=\"display: flex;\">\n <h1>Checkbox FormControl</h1>\n <div style=\"flex:1; text-align: right;\">\n <div style=\"display: flex; gap: 2rem; flex-direction: row-reverse;\">\n <mat-button-toggle (click)=\"onPerformPatch()\">Patch</mat-button-toggle>\n <mat-button-toggle-group #varTypes=\"matButtonToggleGroup\" (change)=\"onChangeDataType(varTypes.value)\">\n <mat-button-toggle value=\"strings\" checked=\"true\">Strings</mat-button-toggle>\n <mat-button-toggle value=\"objects\" checked=\"false\">Objects</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n </div>\n</div>\n\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n </div>\n <app-checkbox-selection-input error=\"No Data Provided\">\n <h3 style=\"color: red; margin-top: 0; margin-bottom: 0;\">No Data</h3>\n </app-checkbox-selection-input>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n<div>\n <h3 style=\"margin-bottom: 0;\">Checkbox Selection - {{ varTypes.value | uppercase }}</h3>\n\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_1.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n [formControl]=\"selectionControl_1\"\n ></app-checkbox-selection-input>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_1\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #disable1 (change)=\"onDisabled_1(disable1.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n No Label and Placeholder<br>\n Not Required<br>\n Valid {{ selectionControl_1.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_2.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Selections\"\n placeholder=\"My placeholder\"\n [formControl]=\"selectionControl_2\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error2.checked\">\n <mat-error *ngIf=\"selectionControl_2.hasError('required')\">This field is Required</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_2\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error2>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable2 (change)=\"onDisabled_2(disable2.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label and Placeholder<br>\n Required<br>\n Valid {{ selectionControl_2.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_3.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Providers\"\n [formControl]=\"selectionControl_3\"\n [minSelection]=\"2\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error3.checked\">\n <mat-error *ngIf=\"selectionControl_3.hasError('minRequired')\">Minimum of 1 required</mat-error>\n <mat-error *ngIf=\"selectionControl_3.hasError('required')\">This field is Required</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_3\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error3>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable3 (change)=\"onDisabled_3(disable3.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label<br>\n Minimum of 2 Required<br>\n Valid {{ selectionControl_3.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_4.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Providers\"\n [formControl]=\"selectionControl_4\"\n [maxSelection]=\"2\"\n [disableMax]=\"false\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error4.checked\">\n <mat-error *ngIf=\"selectionControl_4.hasError('maxExceeded')\">Maximum reached</mat-error>\n <mat-error *ngIf=\"selectionControl_4.hasError('required')\">This field is Required</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_4\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error4>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable4 (change)=\"onDisabled_4(disable4.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label<br>\n Maximum of 2 Required<br>\n Valid {{ selectionControl_4.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_5.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Providers\"\n [formControl]=\"selectionControl_5\"\n [maxSelection]=\"2\"\n [disableMax]=\"true\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error5.checked\">\n <mat-error *ngIf=\"selectionControl_5.hasError('maxExceeded')\">Maximum reached</mat-error>\n <mat-error *ngIf=\"selectionControl_5.hasError('required')\">This field is Required</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_5\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error5>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable5 (change)=\"onDisabled_5(disable5.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label<br>\n Maximum of 2 Required<br>\n Disable if Max Reached<br>\n Valid {{ selectionControl_5.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n\n\n<div>\n <div style=\"display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-button (click)=\"selectionControl_6.reset()\">Reset</button>\n </div>\n <app-checkbox-selection-input\n [data]=\"data\"\n label=\"Providers\"\n [formControl]=\"selectionControl_6\"\n [minSelection]=\"1\"\n [maxSelection]=\"2\"\n [disableMax]=\"true\"\n ></app-checkbox-selection-input>\n <div *ngIf=\"error6.checked\">\n <mat-error *ngIf=\"selectionControl_6.hasError('minRequired')\">Minimum of 1 required</mat-error>\n <mat-error *ngIf=\"selectionControl_6.hasError('maxExceeded')\">Maximum reached</mat-error>\n </div>\n <div style=\"display: flex; gap: 2rem; margin-top: 2rem;\">\n <mat-slide-toggle [formControl]=\"changeDetection_6\">Change Detection</mat-slide-toggle>\n <mat-slide-toggle #error6>Display Error</mat-slide-toggle>\n <mat-slide-toggle #disable6 (change)=\"onDisabled_6(disable6.checked)\">Disable</mat-slide-toggle>\n <span style=\"flex:1\"></span>\n </div>\n <div style=\"margin-top: 2rem;\">\n Label<br>\n Minimum of 1 Required<br>\n Maximum of 2 Required<br>\n Disable if Max Reached<br>\n Valid {{ selectionControl_6.valid }}<br>\n </div>\n <div style=\"margin-top: .5rem; margin-bottom: 1rem;\">\n <mat-divider></mat-divider>\n </div>\n</div>\n" }]
136
- }], ctorParameters: function () { return []; } });
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gtZGVtby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGVja2JveC1zZWxlY3Rpb24taW5wdXQvc3JjL2xpYi9jaGVja2JveC1kZW1vL2NoZWNrYm94LWRlbW8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0L3NyYy9saWIvY2hlY2tib3gtZGVtby9jaGVja2JveC1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFPekQsTUFBTSxPQUFPLDhCQUE4QjtJQWdDekM7UUE5QkEsT0FBRSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUV4QixXQUFNLEdBQUc7WUFDUCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBQzFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFDekMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQztZQUN4QyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1NBQzNDLENBQUE7UUFFRCxXQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUU1QyxTQUFJLEdBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQTtRQUV4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cnQgeyBDb21wb25lbnQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNoZWNrYm94LXNlbGVjdGlvbi1kZW1vJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrYm94LWRlbW8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGVja2JveC1kZW1vLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hTZWxlY3Rpb25EZW1vQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBmYiA9IGluamVjdChGb3JtQnVpbGRlcilcblxuICBkYXRhXzEgPSBbXG4gICAgeyBpZDogMTEsIHZhbHVlOiAnVGVsdXMnLCBzZWxlY3RlZDogdHJ1ZSB9LFxuICAgIHsgaWQ6IDEyLCB2YWx1ZTogJ0FUJlQnLCBkaXNhYmxlZDogdHJ1ZSB9LFxuICAgIHsgaWQ6IDE0LCB2YWx1ZTogJ0JlbGwnLCBzZWxlY3RlZDogdHJ1ZX0sXG4gICAgeyBpZDogNjMsIHZhbHVlOiAnUm9nZXJzJywgc2VsZWN0ZWQ6IHRydWUgfVxuICAgXVxuXG4gICBkYXRhXzIgPSBbJ1RlbHVzJywgJ0FUJlQnLCAnQmVsbCcsICdSb2dlcnMnXVxuXG4gICBkYXRhOiBhbnkgPSB0aGlzLmRhdGFfMlxuXG4gIC8vICBDSEVDS0JPWFxuICBzZWxlY3Rpb25Db250cm9sXzEgPSB0aGlzLmZiLmNvbnRyb2w8YW55W118bnVsbD4obnVsbClcbiAgc2VsZWN0aW9uQ29udHJvbF8yID0gdGhpcy5mYi5jb250cm9sPGFueVtdfG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gIHNlbGVjdGlvbkNvbnRyb2xfMyA9IHRoaXMuZmIuY29udHJvbDxhbnlbXXxudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICBzZWxlY3Rpb25Db250cm9sXzQgPSB0aGlzLmZiLmNvbnRyb2w8YW55W118bnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgc2VsZWN0aW9uQ29udHJvbF81ID0gdGhpcy5mYi5jb250cm9sPGFueVtdfG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gIHNlbGVjdGlvbkNvbnRyb2xfNiA9IHRoaXMuZmIuY29udHJvbDxhbnlbXXxudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuXG4gIC8vQ0hBTkdFXG4gIGNoYW5nZURldGVjdGlvbl8xID0gdGhpcy5mYi5jb250cm9sPGFueVtdfG51bGw+KG51bGwpXG4gIGNoYW5nZURldGVjdGlvbl8yID0gdGhpcy5mYi5jb250cm9sPGFueVtdfG51bGw+KG51bGwpXG4gIGNoYW5nZURldGVjdGlvbl8zID0gdGhpcy5mYi5jb250cm9sPGFueVtdfG51bGw+KG51bGwpXG4gIGNoYW5nZURldGVjdGlvbl80ID0gdGhpcy5mYi5jb250cm9sPGFueVtdfG51bGw+KG51bGwpXG4gIGNoYW5nZURldGVjdGlvbl81ID0gdGhpcy5mYi5jb250cm9sPGFueVtdfG51bGw+KG51bGwpXG4gIGNoYW5nZURldGVjdGlvbl82ID0gdGhpcy5mYi5jb250cm9sPGFueVtdfG51bGw+KG51bGwpXG5cblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgLy8gQ0hFQ0tCT1hcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRyb2xfMS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgaWYodGhpcy5jaGFuZ2VEZXRlY3Rpb25fMS52YWx1ZSkgY29uc29sZS5sb2coJ0NIQU5HRTonLGRhdGEpXG4gICAgfSlcblxuICAgIHRoaXMuc2VsZWN0aW9uQ29udHJvbF8yLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBpZih0aGlzLmNoYW5nZURldGVjdGlvbl8yLnZhbHVlKSBjb25zb2xlLmxvZygnQ0hBTkdFOicsZGF0YSlcbiAgICB9KVxuXG4gICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzMudmFsdWVDaGFuZ2VzLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIGlmKHRoaXMuY2hhbmdlRGV0ZWN0aW9uXzMudmFsdWUpIGNvbnNvbGUubG9nKCdDSEFOR0U6JyxkYXRhKVxuICAgIH0pXG5cbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRyb2xfNC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgaWYodGhpcy5jaGFuZ2VEZXRlY3Rpb25fNC52YWx1ZSkgY29uc29sZS5sb2coJ0NIQU5HRTonLGRhdGEpXG4gICAgfSlcblxuICAgIHRoaXMuc2VsZWN0aW9uQ29udHJvbF81LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBpZih0aGlzLmNoYW5nZURldGVjdGlvbl81LnZhbHVlKSBjb25zb2xlLmxvZygnQ0hBTkdFOicsZGF0YSlcbiAgICB9KVxuXG4gICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzYudmFsdWVDaGFuZ2VzLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIGlmKHRoaXMuY2hhbmdlRGV0ZWN0aW9uXzYudmFsdWUpIGNvbnNvbGUubG9nKCdDSEFOR0U6JyxkYXRhKVxuICAgIH0pXG4gIH1cblxuICAvLyBESVNBQkxFXG4gIG9uRGlzYWJsZWRfMShkaXNhYmxlOiBib29sZWFuKSB7XG5cbiAgICBpZihkaXNhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRyb2xfMS5kaXNhYmxlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzEuZW5hYmxlKClcbiAgICB9XG5cbiAgfVxuXG4gIG9uRGlzYWJsZWRfMihkaXNhYmxlOiBib29sZWFuKSB7XG5cbiAgICBpZihkaXNhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRyb2xfMi5kaXNhYmxlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzIuZW5hYmxlKClcbiAgICB9XG5cbiAgfVxuXG4gIG9uRGlzYWJsZWRfMyhkaXNhYmxlOiBib29sZWFuKSB7XG5cbiAgICBpZihkaXNhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRyb2xfMy5kaXNhYmxlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzMuZW5hYmxlKClcbiAgICB9XG5cbiAgfVxuXG4gIG9uRGlzYWJsZWRfNChkaXNhYmxlOiBib29sZWFuKSB7XG5cbiAgICBpZihkaXNhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRyb2xfNC5kaXNhYmxlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzQuZW5hYmxlKClcbiAgICB9XG5cbiAgfVxuXG4gIG9uRGlzYWJsZWRfNShkaXNhYmxlOiBib29sZWFuKSB7XG5cbiAgICBpZihkaXNhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRyb2xfNS5kaXNhYmxlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzUuZW5hYmxlKClcbiAgICB9XG5cbiAgfVxuXG4gIG9uRGlzYWJsZWRfNihkaXNhYmxlOiBib29sZWFuKSB7XG5cbiAgICBpZihkaXNhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRyb2xfNi5kaXNhYmxlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzYuZW5hYmxlKClcbiAgICB9XG5cbiAgfVxuXG4gIG9uUGVyZm9ybVBhdGNoKCkge1xuICAgIHRoaXMuc2VsZWN0aW9uQ29udHJvbF8xLnBhdGNoVmFsdWUoWydCZWxsJywgJ1JvZ2VycyddKVxuICAgIHRoaXMuc2VsZWN0aW9uQ29udHJvbF8yLnBhdGNoVmFsdWUoWydCZWxsJywgJ1RlbHVzJ10pXG4gICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzMucGF0Y2hWYWx1ZShbJ1RlbHVzJywgJ0JlbGwnXSlcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRyb2xfNC5wYXRjaFZhbHVlKFsnUm9nZXJzJ10pXG4gICAgdGhpcy5zZWxlY3Rpb25Db250cm9sXzUucGF0Y2hWYWx1ZShbJ1JvZ2VycyddKVxuICAgIHRoaXMuc2VsZWN0aW9uQ29udHJvbF82LnBhdGNoVmFsdWUoWydUZWx1cycsICdCZWxsJywgJ1JvZ2VycyddKVxuICB9XG5cbiAgb25DaGFuZ2VEYXRhVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBpZih0eXBlID09PSAnc3RyaW5ncycpIHtcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YV8yXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YV8xXG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICA8aDE+Q2hlY2tib3ggRm9ybUNvbnRyb2w8L2gxPlxuICA8ZGl2IHN0eWxlPVwiZmxleDoxOyB0ZXh0LWFsaWduOiByaWdodDtcIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycmVtOyBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XCI+XG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgKGNsaWNrKT1cIm9uUGVyZm9ybVBhdGNoKClcIj5QYXRjaDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgI3ZhclR5cGVzPVwibWF0QnV0dG9uVG9nZ2xlR3JvdXBcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlRGF0YVR5cGUodmFyVHlwZXMudmFsdWUpXCI+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cInN0cmluZ3NcIiBjaGVja2VkPVwidHJ1ZVwiPlN0cmluZ3M8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJvYmplY3RzXCIgY2hlY2tlZD1cImZhbHNlXCI+T2JqZWN0czwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxkaXY+XG4gIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxXCI+PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGFwcC1jaGVja2JveC1zZWxlY3Rpb24taW5wdXQgZXJyb3I9XCJObyBEYXRhIFByb3ZpZGVkXCI+XG4gICAgPGgzIHN0eWxlPVwiY29sb3I6IHJlZDsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMDtcIj5ObyBEYXRhPC9oMz5cbiAgPC9hcHAtY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0PlxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07IG1hcmdpbi1ib3R0b206IDFyZW07XCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXY+XG4gIDxoMyBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDA7XCI+Q2hlY2tib3ggU2VsZWN0aW9uIC0ge3sgdmFyVHlwZXMudmFsdWUgfCB1cHBlcmNhc2UgfX08L2gzPlxuXG4gIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxXCI+PC9zcGFuPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic2VsZWN0aW9uQ29udHJvbF8xLnJlc2V0KClcIj5SZXNldDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGFwcC1jaGVja2JveC1zZWxlY3Rpb24taW5wdXRcbiAgICBbZGF0YV09XCJkYXRhXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwic2VsZWN0aW9uQ29udHJvbF8xXCJcbiAgICA+PC9hcHAtY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0PlxuICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycmVtOyBtYXJnaW4tdG9wOiAycmVtO1wiPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFtmb3JtQ29udHJvbF09XCJjaGFuZ2VEZXRlY3Rpb25fMVwiPkNoYW5nZSBEZXRlY3Rpb248L21hdC1zbGlkZS10b2dnbGU+XG4gICAgPG1hdC1zbGlkZS10b2dnbGUgI2Rpc2FibGUxIChjaGFuZ2UpPVwib25EaXNhYmxlZF8xKGRpc2FibGUxLmNoZWNrZWQpXCI+RGlzYWJsZTwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8c3BhbiBzdHlsZT1cImZsZXg6MVwiPjwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtO1wiPlxuICAgIE5vIExhYmVsIGFuZCBQbGFjZWhvbGRlcjxicj5cbiAgICBOb3QgUmVxdWlyZWQ8YnI+XG4gICAgVmFsaWQge3sgc2VsZWN0aW9uQ29udHJvbF8xLnZhbGlkIH19PGJyPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtOyBtYXJnaW4tYm90dG9tOiAxcmVtO1wiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2PlxuICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICA8c3BhbiBzdHlsZT1cImZsZXg6MVwiPjwvc3Bhbj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInNlbGVjdGlvbkNvbnRyb2xfMi5yZXNldCgpXCI+UmVzZXQ8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxhcHAtY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0XG4gICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgbGFiZWw9XCJTZWxlY3Rpb25zXCJcbiAgICBwbGFjZWhvbGRlcj1cIk15IHBsYWNlaG9sZGVyXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwic2VsZWN0aW9uQ29udHJvbF8yXCJcbiAgICA+PC9hcHAtY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0PlxuICA8ZGl2ICpuZ0lmPVwiZXJyb3IyLmNoZWNrZWRcIj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0aW9uQ29udHJvbF8yLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+VGhpcyBmaWVsZCBpcyBSZXF1aXJlZDwvbWF0LWVycm9yPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMnJlbTsgbWFyZ2luLXRvcDogMnJlbTtcIj5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbZm9ybUNvbnRyb2xdPVwiY2hhbmdlRGV0ZWN0aW9uXzJcIj5DaGFuZ2UgRGV0ZWN0aW9uPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNlcnJvcjI+RGlzcGxheSBFcnJvcjwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSAjZGlzYWJsZTIgKGNoYW5nZSk9XCJvbkRpc2FibGVkXzIoZGlzYWJsZTIuY2hlY2tlZClcIj5EaXNhYmxlPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxXCI+PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW07XCI+XG4gICAgTGFiZWwgYW5kIFBsYWNlaG9sZGVyPGJyPlxuICAgIFJlcXVpcmVkPGJyPlxuICAgIFZhbGlkIHt7IHNlbGVjdGlvbkNvbnRyb2xfMi52YWxpZCB9fTxicj5cbiAgPC9kaXY+XG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTsgbWFyZ2luLWJvdHRvbTogMXJlbTtcIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdj5cbiAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgPHNwYW4gc3R5bGU9XCJmbGV4OjFcIj48L3NwYW4+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzZWxlY3Rpb25Db250cm9sXzMucmVzZXQoKVwiPlJlc2V0PC9idXR0b24+XG4gIDwvZGl2PlxuICA8YXBwLWNoZWNrYm94LXNlbGVjdGlvbi1pbnB1dFxuICAgIFtkYXRhXT1cImRhdGFcIlxuICAgIGxhYmVsPVwiUHJvdmlkZXJzXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwic2VsZWN0aW9uQ29udHJvbF8zXCJcbiAgICBbbWluU2VsZWN0aW9uXT1cIjJcIlxuICA+PC9hcHAtY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0PlxuICA8ZGl2ICpuZ0lmPVwiZXJyb3IzLmNoZWNrZWRcIj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0aW9uQ29udHJvbF8zLmhhc0Vycm9yKCdtaW5SZXF1aXJlZCcpXCI+TWluaW11bSBvZiAxIHJlcXVpcmVkPC9tYXQtZXJyb3I+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cInNlbGVjdGlvbkNvbnRyb2xfMy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlRoaXMgZmllbGQgaXMgUmVxdWlyZWQ8L21hdC1lcnJvcj5cbiAgPC9kaXY+XG4gIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDJyZW07IG1hcmdpbi10b3A6IDJyZW07XCI+XG4gICAgPG1hdC1zbGlkZS10b2dnbGUgW2Zvcm1Db250cm9sXT1cImNoYW5nZURldGVjdGlvbl8zXCI+Q2hhbmdlIERldGVjdGlvbjwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSAjZXJyb3IzPkRpc3BsYXkgRXJyb3I8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgPG1hdC1zbGlkZS10b2dnbGUgI2Rpc2FibGUzIChjaGFuZ2UpPVwib25EaXNhYmxlZF8zKGRpc2FibGUzLmNoZWNrZWQpXCI+RGlzYWJsZTwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8c3BhbiBzdHlsZT1cImZsZXg6MVwiPjwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtO1wiPlxuICAgIExhYmVsPGJyPlxuICAgIE1pbmltdW0gb2YgMiBSZXF1aXJlZDxicj5cbiAgICBWYWxpZCB7eyBzZWxlY3Rpb25Db250cm9sXzMudmFsaWQgfX08YnI+XG4gIDwvZGl2PlxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07IG1hcmdpbi1ib3R0b206IDFyZW07XCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG5cblxuPGRpdj5cbiAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgPHNwYW4gc3R5bGU9XCJmbGV4OjFcIj48L3NwYW4+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzZWxlY3Rpb25Db250cm9sXzQucmVzZXQoKVwiPlJlc2V0PC9idXR0b24+XG4gIDwvZGl2PlxuICA8YXBwLWNoZWNrYm94LXNlbGVjdGlvbi1pbnB1dFxuICAgIFtkYXRhXT1cImRhdGFcIlxuICAgIGxhYmVsPVwiUHJvdmlkZXJzXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwic2VsZWN0aW9uQ29udHJvbF80XCJcbiAgICBbbWF4U2VsZWN0aW9uXT1cIjJcIlxuICAgIFtkaXNhYmxlTWF4XT1cImZhbHNlXCJcbiAgPjwvYXBwLWNoZWNrYm94LXNlbGVjdGlvbi1pbnB1dD5cbiAgPGRpdiAqbmdJZj1cImVycm9yNC5jaGVja2VkXCI+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cInNlbGVjdGlvbkNvbnRyb2xfNC5oYXNFcnJvcignbWF4RXhjZWVkZWQnKVwiPk1heGltdW0gcmVhY2hlZDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzZWxlY3Rpb25Db250cm9sXzQuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5UaGlzIGZpZWxkIGlzIFJlcXVpcmVkPC9tYXQtZXJyb3I+XG4gIDwvZGl2PlxuICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycmVtOyBtYXJnaW4tdG9wOiAycmVtO1wiPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFtmb3JtQ29udHJvbF09XCJjaGFuZ2VEZXRlY3Rpb25fNFwiPkNoYW5nZSBEZXRlY3Rpb248L21hdC1zbGlkZS10b2dnbGU+XG4gICAgPG1hdC1zbGlkZS10b2dnbGUgI2Vycm9yND5EaXNwbGF5IEVycm9yPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNkaXNhYmxlNCAoY2hhbmdlKT1cIm9uRGlzYWJsZWRfNChkaXNhYmxlNC5jaGVja2VkKVwiPkRpc2FibGU8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgPHNwYW4gc3R5bGU9XCJmbGV4OjFcIj48L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbTtcIj5cbiAgICBMYWJlbDxicj5cbiAgICBNYXhpbXVtIG9mIDIgUmVxdWlyZWQ8YnI+XG4gICAgVmFsaWQge3sgc2VsZWN0aW9uQ29udHJvbF80LnZhbGlkIH19PGJyPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtOyBtYXJnaW4tYm90dG9tOiAxcmVtO1wiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2PlxuICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICA8c3BhbiBzdHlsZT1cImZsZXg6MVwiPjwvc3Bhbj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInNlbGVjdGlvbkNvbnRyb2xfNS5yZXNldCgpXCI+UmVzZXQ8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxhcHAtY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0XG4gICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgbGFiZWw9XCJQcm92aWRlcnNcIlxuICAgIFtmb3JtQ29udHJvbF09XCJzZWxlY3Rpb25Db250cm9sXzVcIlxuICAgIFttYXhTZWxlY3Rpb25dPVwiMlwiXG4gICAgW2Rpc2FibGVNYXhdPVwidHJ1ZVwiXG4gID48L2FwcC1jaGVja2JveC1zZWxlY3Rpb24taW5wdXQ+XG4gIDxkaXYgKm5nSWY9XCJlcnJvcjUuY2hlY2tlZFwiPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzZWxlY3Rpb25Db250cm9sXzUuaGFzRXJyb3IoJ21heEV4Y2VlZGVkJylcIj5NYXhpbXVtIHJlYWNoZWQ8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0aW9uQ29udHJvbF81Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+VGhpcyBmaWVsZCBpcyBSZXF1aXJlZDwvbWF0LWVycm9yPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMnJlbTsgbWFyZ2luLXRvcDogMnJlbTtcIj5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbZm9ybUNvbnRyb2xdPVwiY2hhbmdlRGV0ZWN0aW9uXzVcIj5DaGFuZ2UgRGV0ZWN0aW9uPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNlcnJvcjU+RGlzcGxheSBFcnJvcjwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSAjZGlzYWJsZTUgKGNoYW5nZSk9XCJvbkRpc2FibGVkXzUoZGlzYWJsZTUuY2hlY2tlZClcIj5EaXNhYmxlPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxXCI+PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW07XCI+XG4gICAgTGFiZWw8YnI+XG4gICAgTWF4aW11bSBvZiAyIFJlcXVpcmVkPGJyPlxuICAgIERpc2FibGUgaWYgTWF4IFJlYWNoZWQ8YnI+XG4gICAgVmFsaWQge3sgc2VsZWN0aW9uQ29udHJvbF81LnZhbGlkIH19PGJyPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtOyBtYXJnaW4tYm90dG9tOiAxcmVtO1wiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxkaXY+XG4gIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxXCI+PC9zcGFuPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic2VsZWN0aW9uQ29udHJvbF82LnJlc2V0KClcIj5SZXNldDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGFwcC1jaGVja2JveC1zZWxlY3Rpb24taW5wdXRcbiAgICBbZGF0YV09XCJkYXRhXCJcbiAgICBsYWJlbD1cIlByb3ZpZGVyc1wiXG4gICAgW2Zvcm1Db250cm9sXT1cInNlbGVjdGlvbkNvbnRyb2xfNlwiXG4gICAgW21pblNlbGVjdGlvbl09XCIxXCJcbiAgICBbbWF4U2VsZWN0aW9uXT1cIjJcIlxuICAgIFtkaXNhYmxlTWF4XT1cInRydWVcIlxuICA+PC9hcHAtY2hlY2tib3gtc2VsZWN0aW9uLWlucHV0PlxuICA8ZGl2ICpuZ0lmPVwiZXJyb3I2LmNoZWNrZWRcIj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0aW9uQ29udHJvbF82Lmhhc0Vycm9yKCdtaW5SZXF1aXJlZCcpXCI+TWluaW11bSBvZiAxIHJlcXVpcmVkPC9tYXQtZXJyb3I+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cInNlbGVjdGlvbkNvbnRyb2xfNi5oYXNFcnJvcignbWF4RXhjZWVkZWQnKVwiPk1heGltdW0gcmVhY2hlZDwvbWF0LWVycm9yPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMnJlbTsgbWFyZ2luLXRvcDogMnJlbTtcIj5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbZm9ybUNvbnRyb2xdPVwiY2hhbmdlRGV0ZWN0aW9uXzZcIj5DaGFuZ2UgRGV0ZWN0aW9uPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNlcnJvcjY+RGlzcGxheSBFcnJvcjwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSAjZGlzYWJsZTYgKGNoYW5nZSk9XCJvbkRpc2FibGVkXzYoZGlzYWJsZTYuY2hlY2tlZClcIj5EaXNhYmxlPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxXCI+PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW07XCI+XG4gICAgTGFiZWw8YnI+XG4gICAgTWluaW11bSBvZiAxIFJlcXVpcmVkPGJyPlxuICAgIE1heGltdW0gb2YgMiBSZXF1aXJlZDxicj5cbiAgICBEaXNhYmxlIGlmIE1heCBSZWFjaGVkPGJyPlxuICAgIFZhbGlkIHt7IHNlbGVjdGlvbkNvbnRyb2xfNi52YWxpZCB9fTxicj5cbiAgPC9kaXY+XG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTsgbWFyZ2luLWJvdHRvbTogMXJlbTtcIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==