@skyux/forms 11.39.0 → 12.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/documentation.json +3994 -4130
- package/fesm2022/skyux-forms-testing.mjs +0 -9
- package/fesm2022/skyux-forms-testing.mjs.map +1 -1
- package/fesm2022/skyux-forms.mjs +181 -186
- package/fesm2022/skyux-forms.mjs.map +1 -1
- package/lib/modules/form-error/form-error.component.d.ts +0 -1
- package/package.json +15 -19
- package/testing/modules/form-error/form-error-harness.d.ts +0 -5
- package/esm2022/index.mjs +0 -44
- package/esm2022/lib/modules/character-counter/character-counter-indicator.component.mjs +0 -38
- package/esm2022/lib/modules/character-counter/character-counter-screen-reader.pipe.mjs +0 -46
- package/esm2022/lib/modules/character-counter/character-counter.directive.mjs +0 -96
- package/esm2022/lib/modules/character-counter/character-counter.module.mjs +0 -43
- package/esm2022/lib/modules/checkbox/checkbox-change.mjs +0 -2
- package/esm2022/lib/modules/checkbox/checkbox-group-heading-level.mjs +0 -2
- package/esm2022/lib/modules/checkbox/checkbox-group-heading-style.mjs +0 -2
- package/esm2022/lib/modules/checkbox/checkbox-group.component.mjs +0 -156
- package/esm2022/lib/modules/checkbox/checkbox-label-text-label.component.mjs +0 -29
- package/esm2022/lib/modules/checkbox/checkbox-label.component.mjs +0 -18
- package/esm2022/lib/modules/checkbox/checkbox.component.mjs +0 -397
- package/esm2022/lib/modules/checkbox/checkbox.module.mjs +0 -75
- package/esm2022/lib/modules/field-group/field-group-heading-level.mjs +0 -2
- package/esm2022/lib/modules/field-group/field-group-heading-style.mjs +0 -2
- package/esm2022/lib/modules/field-group/field-group.component.mjs +0 -75
- package/esm2022/lib/modules/field-group/field-group.module.mjs +0 -16
- package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-change.mjs +0 -2
- package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-click.mjs +0 -2
- package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-join-ids.pipe.mjs +0 -22
- package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-label.component.mjs +0 -31
- package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment.component.mjs +0 -494
- package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment.module.mjs +0 -24
- package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment.service.mjs +0 -100
- package/esm2022/lib/modules/file-attachment/file-attachments.module.mjs +0 -20
- package/esm2022/lib/modules/file-attachment/file-drop/file-drop-change.mjs +0 -2
- package/esm2022/lib/modules/file-attachment/file-drop/file-drop.component.mjs +0 -412
- package/esm2022/lib/modules/file-attachment/file-drop/file-drop.module.mjs +0 -18
- package/esm2022/lib/modules/file-attachment/file-drop/file-item.component.mjs +0 -156
- package/esm2022/lib/modules/file-attachment/file-drop/file-link.mjs +0 -2
- package/esm2022/lib/modules/file-attachment/shared/file-item-error-type.mjs +0 -2
- package/esm2022/lib/modules/file-attachment/shared/file-item.mjs +0 -2
- package/esm2022/lib/modules/file-attachment/shared/file-item.service.mjs +0 -71
- package/esm2022/lib/modules/file-attachment/shared/file-size.pipe.mjs +0 -61
- package/esm2022/lib/modules/file-attachment/shared/file-validate-function.mjs +0 -2
- package/esm2022/lib/modules/form-error/form-error.component.mjs +0 -62
- package/esm2022/lib/modules/form-error/form-error.module.mjs +0 -16
- package/esm2022/lib/modules/form-error/form-errors-enabled-token.mjs +0 -6
- package/esm2022/lib/modules/form-error/form-errors.component.mjs +0 -50
- package/esm2022/lib/modules/form-error/form-errors.module.mjs +0 -20
- package/esm2022/lib/modules/input-box/input-box-adapter.service.mjs +0 -63
- package/esm2022/lib/modules/input-box/input-box-control.directive.mjs +0 -33
- package/esm2022/lib/modules/input-box/input-box-hint-text.pipe.mjs +0 -23
- package/esm2022/lib/modules/input-box/input-box-host.service.mjs +0 -72
- package/esm2022/lib/modules/input-box/input-box-populate-args.mjs +0 -2
- package/esm2022/lib/modules/input-box/input-box.component.mjs +0 -276
- package/esm2022/lib/modules/input-box/input-box.module.mjs +0 -58
- package/esm2022/lib/modules/radio/radio-group-id.service.mjs +0 -50
- package/esm2022/lib/modules/radio/radio-group.component.mjs +0 -390
- package/esm2022/lib/modules/radio/radio-label.component.mjs +0 -34
- package/esm2022/lib/modules/radio/radio.component.mjs +0 -357
- package/esm2022/lib/modules/radio/radio.module.mjs +0 -71
- package/esm2022/lib/modules/radio/types/radio-change.mjs +0 -2
- package/esm2022/lib/modules/radio/types/radio-group-heading-level.mjs +0 -2
- package/esm2022/lib/modules/radio/types/radio-group-heading-style.mjs +0 -2
- package/esm2022/lib/modules/radio/types/radio-type.mjs +0 -2
- package/esm2022/lib/modules/required-state/required-state.directive.mjs +0 -34
- package/esm2022/lib/modules/selection-box/selection-box-adapter.service.mjs +0 -128
- package/esm2022/lib/modules/selection-box/selection-box-description.component.mjs +0 -14
- package/esm2022/lib/modules/selection-box/selection-box-grid.component.mjs +0 -141
- package/esm2022/lib/modules/selection-box/selection-box-header.component.mjs +0 -14
- package/esm2022/lib/modules/selection-box/selection-box.component.mjs +0 -132
- package/esm2022/lib/modules/selection-box/selection-box.module.mjs +0 -40
- package/esm2022/lib/modules/selection-box/types/selection-box-grid-align-items-type.mjs +0 -2
- package/esm2022/lib/modules/selection-box/types/selection-box-grid-align-items.mjs +0 -2
- package/esm2022/lib/modules/shared/sky-forms-resources.module.mjs +0 -142
- package/esm2022/lib/modules/toggle-switch/toggle-switch-label.component.mjs +0 -25
- package/esm2022/lib/modules/toggle-switch/toggle-switch.component.mjs +0 -202
- package/esm2022/lib/modules/toggle-switch/toggle-switch.module.mjs +0 -36
- package/esm2022/lib/modules/toggle-switch/types/toggle-switch-change.mjs +0 -2
- package/esm2022/skyux-forms.mjs +0 -5
- package/esm2022/testing/legacy/checkbox-fixture.mjs +0 -92
- package/esm2022/testing/legacy/radio-fixture.mjs +0 -85
- package/esm2022/testing/modules/character-counter/character-counter-indicator-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/character-counter/character-counter-indicator-harness.mjs +0 -53
- package/esm2022/testing/modules/checkbox/checkbox-group-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/checkbox/checkbox-group-harness.mjs +0 -158
- package/esm2022/testing/modules/checkbox/checkbox-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/checkbox/checkbox-harness.mjs +0 -196
- package/esm2022/testing/modules/checkbox/checkbox-label-harness.mjs +0 -19
- package/esm2022/testing/modules/checkbox/checkbox-label-text-label.harness.mjs +0 -19
- package/esm2022/testing/modules/field-group/field-group-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/field-group/field-group-harness.mjs +0 -92
- package/esm2022/testing/modules/file-attachment/file-attachment/file-attachment-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/file-attachment/file-attachment/file-attachment-harness.mjs +0 -193
- package/esm2022/testing/modules/file-attachment/file-drop/file-drop-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/file-attachment/file-drop/file-drop-harness.mjs +0 -192
- package/esm2022/testing/modules/file-attachment/file-drop/file-drop-link-upload-harness.mjs +0 -47
- package/esm2022/testing/modules/file-attachment/file-drop/file-drop-link-upload-input-harness.mjs +0 -17
- package/esm2022/testing/modules/file-attachment/file-drop/file-item-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/file-attachment/file-drop/file-item-harness.mjs +0 -40
- package/esm2022/testing/modules/file-attachment/shared/provide-file-attachment-testing.mjs +0 -14
- package/esm2022/testing/modules/form-error/form-error-harness.filters.mjs +0 -2
- package/esm2022/testing/modules/form-error/form-error-harness.mjs +0 -31
- package/esm2022/testing/modules/form-error/form-errors-harness.filters.mjs +0 -2
- package/esm2022/testing/modules/form-error/form-errors-harness.mjs +0 -34
- package/esm2022/testing/modules/input-box/input-box-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/input-box/input-box-harness.mjs +0 -188
- package/esm2022/testing/modules/radio/radio-group-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/radio/radio-group-harness.mjs +0 -156
- package/esm2022/testing/modules/radio/radio-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/radio/radio-harness.mjs +0 -147
- package/esm2022/testing/modules/radio/radio-label-harness.mjs +0 -19
- package/esm2022/testing/public-api.mjs +0 -18
- package/esm2022/testing/skyux-forms-testing.mjs +0 -5
|
@@ -1,494 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, Input, Optional, Output, Self, ViewChild, booleanAttribute, inject, } from '@angular/core';
|
|
3
|
-
import { Validators, } from '@angular/forms';
|
|
4
|
-
import { SkyFileReaderService, SkyIdModule, SkyIdService, SkyLiveAnnouncerService, } from '@skyux/core';
|
|
5
|
-
import { SkyHelpInlineModule } from '@skyux/help-inline';
|
|
6
|
-
import { SkyLibResourcesService } from '@skyux/i18n';
|
|
7
|
-
import { SkyIconModule } from '@skyux/icon';
|
|
8
|
-
import { SkyThemeComponentClassDirective, SkyThemeModule, } from '@skyux/theme';
|
|
9
|
-
import { Subject } from 'rxjs';
|
|
10
|
-
import { take, takeUntil } from 'rxjs/operators';
|
|
11
|
-
import { SkyFormErrorComponent } from '../../form-error/form-error.component';
|
|
12
|
-
import { SKY_FORM_ERRORS_ENABLED } from '../../form-error/form-errors-enabled-token';
|
|
13
|
-
import { SkyFormErrorsComponent } from '../../form-error/form-errors.component';
|
|
14
|
-
import { SkyFormsResourcesModule } from '../../shared/sky-forms-resources.module';
|
|
15
|
-
import { SkyFileSizePipe } from '../shared/file-size.pipe';
|
|
16
|
-
import { SkyFileAttachmentJoinIdsPipe } from './file-attachment-join-ids.pipe';
|
|
17
|
-
import { SkyFileAttachmentLabelComponent } from './file-attachment-label.component';
|
|
18
|
-
import { SkyFileAttachmentService } from './file-attachment.service';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "./file-attachment.service";
|
|
21
|
-
import * as i2 from "../shared/file-item.service";
|
|
22
|
-
import * as i3 from "@angular/forms";
|
|
23
|
-
import * as i4 from "@skyux/theme";
|
|
24
|
-
import * as i5 from "@angular/common";
|
|
25
|
-
import * as i6 from "@skyux/i18n";
|
|
26
|
-
import * as i7 from "@skyux/help-inline";
|
|
27
|
-
import * as i8 from "@skyux/icon";
|
|
28
|
-
import * as i9 from "@skyux/core";
|
|
29
|
-
const MAX_FILE_SIZE_DEFAULT = 500000;
|
|
30
|
-
const MIN_FILE_SIZE_DEFAULT = 0;
|
|
31
|
-
/**
|
|
32
|
-
* Provides an element to attach a single local file.
|
|
33
|
-
*/
|
|
34
|
-
export class SkyFileAttachmentComponent {
|
|
35
|
-
#fileReaderSvc;
|
|
36
|
-
/**
|
|
37
|
-
* The maximum size in bytes for valid files.
|
|
38
|
-
* @default 500000
|
|
39
|
-
*/
|
|
40
|
-
set maxFileSize(value) {
|
|
41
|
-
this.#_maxFileSize = value ?? MAX_FILE_SIZE_DEFAULT;
|
|
42
|
-
}
|
|
43
|
-
get maxFileSize() {
|
|
44
|
-
return this.#_maxFileSize;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* The minimum size in bytes for valid files.
|
|
48
|
-
* @default 0
|
|
49
|
-
*/
|
|
50
|
-
set minFileSize(value) {
|
|
51
|
-
this.#_minFileSize = value ?? MIN_FILE_SIZE_DEFAULT;
|
|
52
|
-
}
|
|
53
|
-
get minFileSize() {
|
|
54
|
-
return this.#_minFileSize;
|
|
55
|
-
}
|
|
56
|
-
set value(value) {
|
|
57
|
-
// The null check is needed to address a bug in Angular 4.
|
|
58
|
-
// writeValue is being called twice, first time with a phantom null value
|
|
59
|
-
// See: https://github.com/angular/angular/issues/14988
|
|
60
|
-
const isNewValue = value !== this.value && value !== null;
|
|
61
|
-
if (isNewValue) {
|
|
62
|
-
if (value) {
|
|
63
|
-
this.isData = value.url?.startsWith('data:');
|
|
64
|
-
this.isImage = this.#fileItemService.isImage(value);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
this.isData = false;
|
|
68
|
-
this.isImage = false;
|
|
69
|
-
}
|
|
70
|
-
this.#setFileName(value);
|
|
71
|
-
this.#_value = value;
|
|
72
|
-
this.#onChange(value);
|
|
73
|
-
this.#updateFileAttachmentButton();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
get value() {
|
|
77
|
-
return this.#_value;
|
|
78
|
-
}
|
|
79
|
-
get isRequired() {
|
|
80
|
-
return (this.required ||
|
|
81
|
-
(this.ngControl?.control?.hasValidator(Validators.required) ?? false));
|
|
82
|
-
}
|
|
83
|
-
#enterEventTarget;
|
|
84
|
-
#ngUnsubscribe;
|
|
85
|
-
#_maxFileSize;
|
|
86
|
-
#_minFileSize;
|
|
87
|
-
#_value;
|
|
88
|
-
#changeDetector;
|
|
89
|
-
#fileAttachmentService;
|
|
90
|
-
#fileItemService;
|
|
91
|
-
#themeSvc;
|
|
92
|
-
#idSvc;
|
|
93
|
-
#liveAnnouncerSvc;
|
|
94
|
-
#resourcesSvc;
|
|
95
|
-
constructor(changeDetector, fileAttachmentService, fileItemService, ngControl, themeSvc) {
|
|
96
|
-
this.#fileReaderSvc = inject(SkyFileReaderService);
|
|
97
|
-
/**
|
|
98
|
-
* Whether to disable the input on template-driven forms. Don't use this input on reactive forms because they may overwrite the input or leave the control out of sync.
|
|
99
|
-
* To set the disabled state on reactive forms, use the `FormControl` instead.
|
|
100
|
-
*/
|
|
101
|
-
this.disabled = false;
|
|
102
|
-
/**
|
|
103
|
-
* Whether to hide `labelText` from view.
|
|
104
|
-
*/
|
|
105
|
-
this.labelHidden = false;
|
|
106
|
-
/**
|
|
107
|
-
* Whether the single file attachment is stacked on another form component. When specified,
|
|
108
|
-
* the appropriate vertical spacing is automatically added to the single file attachment.
|
|
109
|
-
*/
|
|
110
|
-
this.stacked = false;
|
|
111
|
-
/**
|
|
112
|
-
* Fires when users add or remove files.
|
|
113
|
-
* @deprecated Subscribe to the form control's `valueChanges` event instead.
|
|
114
|
-
*/
|
|
115
|
-
this.fileChange = new EventEmitter();
|
|
116
|
-
/**
|
|
117
|
-
* Fires when users select the file name link.
|
|
118
|
-
*/
|
|
119
|
-
this.fileClick = new EventEmitter();
|
|
120
|
-
this.acceptedOver = false;
|
|
121
|
-
this.hasLabelComponent = false;
|
|
122
|
-
this.rejectedOver = false;
|
|
123
|
-
/**
|
|
124
|
-
* Whether the input is required for form validation.
|
|
125
|
-
* When you set this property to `true`, the component adds `aria-required` and `required`
|
|
126
|
-
* attributes to the input element so that forms display an invalid state until the input element
|
|
127
|
-
* is complete.
|
|
128
|
-
* For more information about the `aria-required` attribute, see the [WAI-ARIA definition](https://www.w3.org/TR/wai-aria/#aria-required).
|
|
129
|
-
*/
|
|
130
|
-
this.required = false;
|
|
131
|
-
this.fileName = '';
|
|
132
|
-
this.showFileAttachmentButton = true;
|
|
133
|
-
this.truncatedFileName = '';
|
|
134
|
-
this.isImage = false;
|
|
135
|
-
this.isData = false;
|
|
136
|
-
this.#ngUnsubscribe = new Subject();
|
|
137
|
-
this.#_maxFileSize = MAX_FILE_SIZE_DEFAULT;
|
|
138
|
-
this.#_minFileSize = MIN_FILE_SIZE_DEFAULT;
|
|
139
|
-
this.#idSvc = inject(SkyIdService);
|
|
140
|
-
this.#liveAnnouncerSvc = inject(SkyLiveAnnouncerService);
|
|
141
|
-
this.#resourcesSvc = inject(SkyLibResourcesService);
|
|
142
|
-
this.errorId = this.#idSvc.generateId();
|
|
143
|
-
this.labelId = this.#idSvc.generateId();
|
|
144
|
-
// istanbul ignore next
|
|
145
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
146
|
-
this.#onChange = (_) => {
|
|
147
|
-
return;
|
|
148
|
-
};
|
|
149
|
-
// istanbul ignore next
|
|
150
|
-
this.#onTouched = () => {
|
|
151
|
-
return;
|
|
152
|
-
};
|
|
153
|
-
this.#changeDetector = changeDetector;
|
|
154
|
-
this.#fileAttachmentService = fileAttachmentService;
|
|
155
|
-
this.#fileItemService = fileItemService;
|
|
156
|
-
this.ngControl = ngControl;
|
|
157
|
-
this.#themeSvc = themeSvc;
|
|
158
|
-
if (this.ngControl) {
|
|
159
|
-
this.ngControl.valueAccessor = this;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
ngOnInit() {
|
|
163
|
-
if (this.#themeSvc) {
|
|
164
|
-
this.#themeSvc.settingsChange
|
|
165
|
-
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
166
|
-
.subscribe((themeSettings) => {
|
|
167
|
-
this.currentThemeName = themeSettings.currentSettings.theme.name;
|
|
168
|
-
this.#updateFileAttachmentButton();
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
ngAfterViewInit() {
|
|
173
|
-
// This is needed to address a bug in Angular 7.
|
|
174
|
-
// When a control value is set initially, its value is not represented on the view.
|
|
175
|
-
// See: https://github.com/angular/angular/issues/13792
|
|
176
|
-
// Of note is the parent check which allows us to determine if the form is reactive.
|
|
177
|
-
// Without this check there is a changed before checked error
|
|
178
|
-
/* istanbul ignore else */
|
|
179
|
-
if (this.ngControl) {
|
|
180
|
-
setTimeout(() => {
|
|
181
|
-
this.ngControl?.control?.setValue(this.value, {
|
|
182
|
-
emitEvent: false,
|
|
183
|
-
});
|
|
184
|
-
this.#changeDetector.markForCheck();
|
|
185
|
-
});
|
|
186
|
-
// There is some disconnect between the host control and the form control.
|
|
187
|
-
// This handles that by running change detection whenever the host control
|
|
188
|
-
// has any changes. This is a workaround for this existing bug and will be
|
|
189
|
-
// addressed in a future story that refactors file attachment.
|
|
190
|
-
this.ngControl.control?.events.subscribe(() => {
|
|
191
|
-
this.#changeDetector.markForCheck();
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
ngAfterContentInit() {
|
|
196
|
-
if (this.labelComponents) {
|
|
197
|
-
this.hasLabelComponent = this.labelComponents.length > 0;
|
|
198
|
-
this.#changeDetector.detectChanges();
|
|
199
|
-
// Handles updating classes when label changes
|
|
200
|
-
this.labelComponents.changes
|
|
201
|
-
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
202
|
-
.subscribe((newLabelComponents) => {
|
|
203
|
-
this.hasLabelComponent = newLabelComponents.length > 0;
|
|
204
|
-
this.#changeDetector.markForCheck();
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
onButtonBlur() {
|
|
209
|
-
this.#onTouched();
|
|
210
|
-
}
|
|
211
|
-
onDropClicked() {
|
|
212
|
-
this.#onTouched();
|
|
213
|
-
/* istanbul ignore else */
|
|
214
|
-
if (this.inputEl) {
|
|
215
|
-
this.inputEl.nativeElement.click();
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
fileChangeEvent(fileChangeEvent) {
|
|
219
|
-
this.#handleFiles(fileChangeEvent.target?.files);
|
|
220
|
-
}
|
|
221
|
-
fileDragEnter(dragEnterEvent) {
|
|
222
|
-
// Save this target to know when the drag event leaves
|
|
223
|
-
this.#enterEventTarget = dragEnterEvent.target;
|
|
224
|
-
dragEnterEvent.stopPropagation();
|
|
225
|
-
dragEnterEvent.preventDefault();
|
|
226
|
-
}
|
|
227
|
-
fileDragOver(dragOverEvent) {
|
|
228
|
-
const transfer = dragOverEvent.dataTransfer;
|
|
229
|
-
dragOverEvent.stopPropagation();
|
|
230
|
-
dragOverEvent.preventDefault();
|
|
231
|
-
if (transfer) {
|
|
232
|
-
if (transfer.items) {
|
|
233
|
-
const files = Array.from(transfer.items);
|
|
234
|
-
for (const file of files) {
|
|
235
|
-
if (file.type &&
|
|
236
|
-
this.#fileAttachmentService.fileTypeRejected(file.type, this.acceptedTypes)) {
|
|
237
|
-
this.rejectedOver = true;
|
|
238
|
-
this.acceptedOver = false;
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
if (files.length > 0 && !this.acceptedOver) {
|
|
243
|
-
this.rejectedOver = false;
|
|
244
|
-
this.acceptedOver = true;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
else if (transfer.files) {
|
|
248
|
-
// If the browser does not support DataTransfer.items,
|
|
249
|
-
// defer file-type checking to drop handler.
|
|
250
|
-
// https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility
|
|
251
|
-
this.rejectedOver = false;
|
|
252
|
-
this.acceptedOver = true;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
fileDrop(dropEvent) {
|
|
257
|
-
this.#onTouched();
|
|
258
|
-
dropEvent.stopPropagation();
|
|
259
|
-
dropEvent.preventDefault();
|
|
260
|
-
this.#enterEventTarget = undefined;
|
|
261
|
-
this.rejectedOver = false;
|
|
262
|
-
this.acceptedOver = false;
|
|
263
|
-
if (dropEvent.dataTransfer && dropEvent.dataTransfer.files) {
|
|
264
|
-
if (dropEvent.dataTransfer.files.length > 1) {
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
if (this.#fileAttachmentService.hasDirectory(dropEvent.dataTransfer.files)) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
this.#handleFiles(dropEvent.dataTransfer.files);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
fileDragLeave(dragLeaveEvent) {
|
|
274
|
-
if (this.#enterEventTarget === dragLeaveEvent.target) {
|
|
275
|
-
this.rejectedOver = false;
|
|
276
|
-
this.acceptedOver = false;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
deleteFileAttachment() {
|
|
280
|
-
const fileName = this.value?.file.name;
|
|
281
|
-
this.value = undefined;
|
|
282
|
-
this.#emitFileChangeEvent(this.value);
|
|
283
|
-
/* istanbul ignore else: safety check */
|
|
284
|
-
if (fileName) {
|
|
285
|
-
this.#announceState('skyux_file_attachment_file_upload_file_removed', fileName);
|
|
286
|
-
}
|
|
287
|
-
this.#changeDetector.markForCheck();
|
|
288
|
-
}
|
|
289
|
-
ngOnDestroy() {
|
|
290
|
-
this.fileChange.complete();
|
|
291
|
-
this.#ngUnsubscribe.next();
|
|
292
|
-
this.#ngUnsubscribe.complete();
|
|
293
|
-
}
|
|
294
|
-
registerOnChange(fn) {
|
|
295
|
-
this.#onChange = fn;
|
|
296
|
-
}
|
|
297
|
-
registerOnTouched(fn) {
|
|
298
|
-
this.#onTouched = fn;
|
|
299
|
-
}
|
|
300
|
-
writeValue(value) {
|
|
301
|
-
this.value = value;
|
|
302
|
-
this.#changeDetector.markForCheck();
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* @internal
|
|
306
|
-
* Sets the disabled state of the control. Implemented as a part of ControlValueAccessor.
|
|
307
|
-
* @param isDisabled Whether the control should be disabled.
|
|
308
|
-
*/
|
|
309
|
-
setDisabledState(isDisabled) {
|
|
310
|
-
this.disabled = isDisabled;
|
|
311
|
-
this.#changeDetector.markForCheck();
|
|
312
|
-
}
|
|
313
|
-
emitClick() {
|
|
314
|
-
/* istanbul ignore else */
|
|
315
|
-
if (this.value) {
|
|
316
|
-
this.fileClick.emit({
|
|
317
|
-
file: this.value,
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
#announceState(resourceString, ...args) {
|
|
322
|
-
this.#resourcesSvc
|
|
323
|
-
.getString(resourceString, ...args)
|
|
324
|
-
.pipe(take(1))
|
|
325
|
-
.subscribe((internationalizedString) => {
|
|
326
|
-
this.#liveAnnouncerSvc.announce(internationalizedString);
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
#emitFileChangeEvent(currentFile) {
|
|
330
|
-
if (currentFile && !currentFile.errorType) {
|
|
331
|
-
this.writeValue(currentFile);
|
|
332
|
-
this.fileErrorName = undefined;
|
|
333
|
-
this.fileErrorParam = undefined;
|
|
334
|
-
this.fileErrorValidation = undefined;
|
|
335
|
-
}
|
|
336
|
-
else {
|
|
337
|
-
this.writeValue(undefined);
|
|
338
|
-
// Makes sure value accessor is marked as dirty even if current file is undefined
|
|
339
|
-
this.#onChange(undefined);
|
|
340
|
-
this.fileErrorValidation = { fileError: true };
|
|
341
|
-
this.fileErrorName = currentFile?.errorType;
|
|
342
|
-
this.fileErrorParam = currentFile?.errorParam;
|
|
343
|
-
}
|
|
344
|
-
this.fileChange.emit({
|
|
345
|
-
file: currentFile,
|
|
346
|
-
});
|
|
347
|
-
/* istanbul ignore else */
|
|
348
|
-
if (this.inputEl) {
|
|
349
|
-
this.inputEl.nativeElement.value = '';
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
async #loadFile(file) {
|
|
353
|
-
if (file.file) {
|
|
354
|
-
try {
|
|
355
|
-
const previousFileName = this.value?.file.name;
|
|
356
|
-
if (previousFileName) {
|
|
357
|
-
this.#announceState('skyux_file_attachment_file_upload_file_replaced', previousFileName, file.file.name);
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
this.#announceState('skyux_file_attachment_file_upload_file_added', file.file.name);
|
|
361
|
-
}
|
|
362
|
-
file.url = await this.#fileReaderSvc.readAsDataURL(file.file);
|
|
363
|
-
this.#emitFileChangeEvent(file);
|
|
364
|
-
}
|
|
365
|
-
catch {
|
|
366
|
-
this.#emitFileChangeEvent(file);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
#handleFiles(fileList) {
|
|
371
|
-
if (fileList) {
|
|
372
|
-
const files = [];
|
|
373
|
-
if ('item' in fileList) {
|
|
374
|
-
for (let index = 0; index < fileList.length; index++) {
|
|
375
|
-
files.push({
|
|
376
|
-
file: fileList.item(index),
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
const processedFiles = this.#fileAttachmentService.checkFiles(files, this.minFileSize, this.maxFileSize, this.acceptedTypes, this.validateFn);
|
|
381
|
-
for (const file of processedFiles) {
|
|
382
|
-
if (file.errorType) {
|
|
383
|
-
this.#emitFileChangeEvent(file);
|
|
384
|
-
}
|
|
385
|
-
else {
|
|
386
|
-
void this.#loadFile(file);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
#setFileName(file) {
|
|
392
|
-
if (file) {
|
|
393
|
-
const dropName = this.#fileItemService.isFile(file) && file.file.name
|
|
394
|
-
? file.file.name
|
|
395
|
-
: file.url;
|
|
396
|
-
this.fileName = dropName;
|
|
397
|
-
if (dropName.length > 26) {
|
|
398
|
-
this.truncatedFileName = dropName.slice(0, 26) + '...';
|
|
399
|
-
}
|
|
400
|
-
else {
|
|
401
|
-
this.truncatedFileName = dropName;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
this.fileName = '';
|
|
406
|
-
this.truncatedFileName = '';
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
#updateFileAttachmentButton() {
|
|
410
|
-
this.showFileAttachmentButton = !(this.value && this.currentThemeName === 'modern');
|
|
411
|
-
this.#changeDetector.markForCheck();
|
|
412
|
-
}
|
|
413
|
-
// istanbul ignore next
|
|
414
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
415
|
-
#onChange;
|
|
416
|
-
// istanbul ignore next
|
|
417
|
-
#onTouched;
|
|
418
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyFileAttachmentComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyFileAttachmentService }, { token: i2.SkyFileItemService }, { token: i3.NgControl, optional: true, self: true }, { token: i4.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
419
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SkyFileAttachmentComponent, isStandalone: true, selector: "sky-file-attachment", inputs: { acceptedTypes: "acceptedTypes", acceptedTypesErrorMessage: "acceptedTypesErrorMessage", disabled: ["disabled", "disabled", booleanAttribute], helpPopoverContent: "helpPopoverContent", helpPopoverTitle: "helpPopoverTitle", helpKey: "helpKey", labelText: "labelText", labelHidden: ["labelHidden", "labelHidden", booleanAttribute], hintText: "hintText", maxFileSize: "maxFileSize", minFileSize: "minFileSize", stacked: ["stacked", "stacked", booleanAttribute], validateFn: "validateFn", required: ["required", "required", booleanAttribute] }, outputs: { fileChange: "fileChange", fileClick: "fileClick" }, host: { properties: { "class.sky-form-field-stacked": "this.stacked" } }, providers: [
|
|
420
|
-
SkyFileAttachmentService,
|
|
421
|
-
{ provide: SKY_FORM_ERRORS_ENABLED, useValue: true },
|
|
422
|
-
], queries: [{ propertyName: "labelComponents", predicate: SkyFileAttachmentLabelComponent }], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["fileInputRef"], descendants: true }], hostDirectives: [{ directive: i4.SkyThemeComponentClassDirective }], ngImport: i0, template: "<div class=\"sky-file-attachment-wrapper\">\n <div\n class=\"sky-file-attachment-label-wrapper\"\n [ngClass]=\"{\n 'sky-control-label-required':\n !labelText && isRequired && hasLabelComponent\n }\"\n >\n @if (labelText) {\n @if (!labelHidden) {\n <span\n class=\"sky-control-label\"\n [attr.id]=\"labelId\"\n [ngClass]=\"{\n 'sky-control-label-required': isRequired\n }\"\n >{{ labelText }}</span\n >\n }\n } @else {\n <ng-content select=\"sky-file-attachment-label\" />\n }\n @if (isRequired && (hasLabelComponent || labelText)) {\n <span class=\"sky-screen-reader-only\">{{\n 'skyux_file_attachment_required' | skyLibResources\n }}</span>\n }\n @if (labelText && (helpPopoverContent || helpKey)) {\n <span class=\"sky-control-help-container\">\n <sky-help-inline\n [labelText]=\"labelText\"\n [helpKey]=\"helpKey\"\n [popoverTitle]=\"helpPopoverTitle\"\n [popoverContent]=\"helpPopoverContent\"\n />\n </span>\n }\n </div>\n <div\n class=\"sky-file-attachment-upload sky-file-attachment sky-file-attachment-target\"\n [ngClass]=\"{\n 'sky-file-attachment-accept': acceptedOver,\n 'sky-file-attachment-reject': rejectedOver\n }\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragover)=\"fileDragOver($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n >\n <div\n #fileDropDescriptionRef=\"skyId\"\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n role=\"tooltip\"\n skyId\n >\n {{ 'skyux_file_attachment_file_upload_drag_or_click' | skyLibResources }}\n </div>\n <input\n #fileInputRef\n hidden\n tabindex=\"-1\"\n type=\"file\"\n [attr.accept]=\"acceptedTypes || null\"\n [disabled]=\"disabled\"\n [required]=\"isRequired\"\n (change)=\"fileChangeEvent($event)\"\n />\n @if (showFileAttachmentButton) {\n <button\n class=\"sky-file-attachment-btn sky-btn sky-btn-default\"\n type=\"button\"\n [attr.aria-describedby]=\"\n hintText && hintTextEl.id\n | skyFileAttachmentJoinIds: fileDropDescriptionRef.id\n \"\n [attr.aria-labelledby]=\"\n attachButtonLabelRef.id\n | skyFileAttachmentJoinIds\n : (labelText\n ? labelId\n : labelComponents?.get(0)?.labelContentId?.id)\n \"\n [attr.aria-invalid]=\"!!(ngControl?.errors ?? fileErrorValidation)\"\n [attr.aria-errormessage]=\"\n !!(ngControl?.errors ?? fileErrorValidation) ? errorId : undefined\n \"\n [disabled]=\"disabled\"\n (click)=\"onDropClicked()\"\n (blur)=\"onButtonBlur()\"\n >\n <sky-icon icon=\"folder-open-o\" />\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file'\n | skyLibResources)\n : ('skyux_file_attachment_button_label_choose_file'\n | skyLibResources)\n }}\n </button>\n }\n @if (value && !isImage && currentThemeName === 'modern') {\n <sky-icon class=\"sky-file-attachment-icon\" icon=\"file-o\" />\n }\n @if (value || currentThemeName === 'default') {\n <span class=\"sky-file-attachment-file-link\">\n @if (value) {\n <a\n [href]=\"isData ? value.url : undefined\"\n [download]=\"isData ? value.file.name : undefined\"\n [attr.title]=\"fileName\"\n (click)=\"emitClick()\"\n >\n {{ truncatedFileName }}\n </a>\n } @else {\n <span class=\"sky-file-attachment-none sky-font-deemphasized\">\n {{ 'skyux_file_attachment_label_no_file_chosen' | skyLibResources }}\n </span>\n }\n </span>\n }\n\n @if (value) {\n <button\n class=\"sky-btn sky-btn-icon-borderless sky-file-attachment-delete\"\n type=\"button\"\n [attr.aria-labelledby]=\"\n deleteButtonLabelRef.id\n | skyFileAttachmentJoinIds\n : (labelText\n ? labelId\n : labelComponents?.get(0)?.labelContentId?.id)\n \"\n [disabled]=\"disabled\"\n (click)=\"deleteFileAttachment()\"\n >\n <sky-icon icon=\"trash-o\" size=\"md\" />\n </button>\n }\n </div>\n\n @if (value && isImage) {\n <img\n class=\"sky-file-attachment-preview-img\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n [src]=\"value.url\"\n />\n }\n</div>\n<div #hintTextEl=\"skyId\" skyId>\n @if (hintText) {\n <div\n class=\"sky-file-attachment-hint-text\"\n [skyThemeClass]=\"{\n 'sky-font-deemphasized': 'default',\n 'sky-font-hint-text-s': 'modern'\n }\"\n >\n {{ hintText }}\n </div>\n }\n</div>\n\n<sky-form-errors\n [id]=\"errorId\"\n [errors]=\"ngControl?.errors\"\n [labelText]=\"labelText\"\n [touched]=\"ngControl?.touched\"\n [dirty]=\"ngControl?.dirty\"\n>\n <ng-content select=\"sky-form-error\" />\n @if (ngControl?.touched) {\n @if (fileErrorName === 'fileType') {\n <sky-form-error\n errorName=\"fileType\"\n [errorText]=\"\n acceptedTypesErrorMessage ??\n 'skyux_file_attachment_file_type_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n } @else if (fileErrorName === 'maxFileSize') {\n <sky-form-error\n errorName=\"maxFileSize\"\n [errorText]=\"\n 'skyux_file_attachment_max_file_size_error_label_text'\n | skyLibResources: (fileErrorParam | skyFileSize)\n \"\n />\n } @else if (fileErrorName === 'minFileSize') {\n <sky-form-error\n errorName=\"minFileSize\"\n [errorText]=\"\n 'skyux_file_attachment_min_file_size_error_label_text'\n | skyLibResources: (fileErrorParam | skyFileSize)\n \"\n />\n }\n }\n</sky-form-errors>\n\n<span\n #attachButtonLabelRef=\"skyId\"\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n skyId\n>\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file_label'\n | skyLibResources: fileName)\n : ('skyux_file_attachment_button_label_choose_file_label'\n | skyLibResources)\n }}\n</span>\n\n<span\n #deleteButtonLabelRef=\"skyId\"\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n skyId\n>\n {{ 'skyux_file_attachment_file_item_remove' | skyLibResources: fileName }}\n</span>\n", styles: [".sky-file-attachment-wrapper:not(.sky-theme-modern *){--sky-override-file-attachment-accept-border-color: #72bf44;--sky-override-file-attachment-accept-border-radius: 5px;--sky-override-file-attachment-accept-border-width: 1px;--sky-override-file-attachment-control-label-color: #212327;--sky-override-file-attachment-control-label-font-size: 15px;--sky-override-file-attachment-delete-margin-left: 0;--sky-override-file-attachment-file-link-padding: 0 5px;--sky-override-file-attachment-invalid-border: 1px solid #ef4044;--sky-override-file-attachment-invalid-box-shadow: 0 0 8px rgba(239, 64, 68, .6);--sky-override-file-attachment-invalid-label-color: #212327;--sky-override-file-attachment-preview-img-border: none;--sky-override-file-attachment-preview-img-box-shadow: 0 0 5px #666;--sky-override-file-attachment-preview-img-margin: 10px;--sky-override-file-attachment-preview-img-width: auto;--sky-override-file-attachment-reject-border-color: #ef4044;--sky-override-file-attachment-reject-border-radius: 5px;--sky-override-file-attachment-reject-border-width: 1px;--sky-override-file-attachment-upload-display: block;--sky-override-file-attachment-upload-padding-right: 8px;--sky-override-file-attachment-wrapper-display: inline-block}.sky-file-attachment-wrapper:not(.sky-theme-modern *) .sky-file-attachment-delete{padding:0}:host-context(.sky-theme-modern:not(.sky-theme-brand-blackbaud)) .sky-file-attachment-wrapper{--sky-override-file-attachment-accept-border-radius: 5px;--sky-override-file-attachment-accept-border-width: 1px;--sky-override-file-attachment-btn-non-stacked-margin: 0 10px 0 0;--sky-override-file-attachment-control-label-color: #686c73;--sky-override-file-attachment-control-label-font-size: 13px;--sky-override-file-attachment-delete-height: 40px;--sky-override-file-attachment-delete-width: 40px;--sky-override-file-attachment-file-icon-font-size: 30px;--sky-override-file-attachment-file-icon-line-height: normal;--sky-override-file-attachment-file-icon-margin: 5px 10px 5px 5px;--sky-override-file-attachment-file-link-margin: 10px 0 0 0;--sky-override-file-attachment-file-link-padding: 0;--sky-override-file-attachment-invalid-border: 1px solid #ef4044;--sky-override-file-attachment-invalid-box-shadow: 0 0 8px rgba(239, 64, 68, .6);--sky-override-file-attachment-invalid-label-color: #686c73;--sky-override-file-attachment-preview-img-border: var( --sky-border-width-separator-dark ) solid var(--sky-color-border-separator-dark);--sky-override-file-attachment-preview-img-box-shadow: none;--sky-override-file-attachment-preview-img-margin: 0 10px 0 0;--sky-override-file-attachment-reject-border-radius: 5px;--sky-override-file-attachment-reject-border-width: 1px;--sky-override-file-attachment-upload-with-icon-align-items: flex-start}:host-context(.sky-theme-modern:not(.sky-theme-brand-blackbaud)) .sky-file-attachment-wrapper .sky-file-attachment-delete{padding:0}:host.sky-cmp-theme-default{--sky-override-file-attachment-hint-text-margin-top: var( --sky-margin-stacked-xs )}:host.sky-form-field-stacked{display:block}:host:not(.sky-form-field-stacked) .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:var(--sky-override-file-attachment-btn-non-stacked-margin, 0)}.sky-file-attachment-wrapper{display:var(--sky-override-file-attachment-wrapper-display, flex);flex-wrap:wrap}.sky-file-attachment-label-wrapper{width:100%}.sky-file-attachment-upload{flex:1;order:2;display:var(--sky-override-file-attachment-upload-display, flex);align-items:flex-start;padding-right:var(--sky-override-file-attachment-upload-padding-right, 0);border:1px solid transparent}.sky-file-attachment-upload:has(.sky-file-attachment-icon){align-items:var(--sky-override-file-attachment-upload-with-icon-align-items, center)}.sky-file-attachment-accept{border-color:var(--sky-override-file-attachment-accept-border-color, var(--sky-color-border-success));border-style:dashed;border-width:var(--sky-override-file-attachment-accept-border-width, var(--sky-border-width-input-hover));border-radius:var(--sky-override-file-attachment-accept-border-radius, var(--sky-border-radius-s))}.sky-file-attachment-reject{border-color:var(--sky-override-file-attachment-reject-border-color, var(--sky-color-border-danger));border-style:dashed;border-width:var(--sky-override-file-attachment-reject-border-width, var(--sky-border-width-input-hover));border-radius:var(--sky-override-file-attachment-reject-border-radius, var(--sky-border-radius-s))}.sky-file-attachment-btn,.sky-control-label{transition:border-color .15s,box-shadow .15s,color .15s}:host(.ng-invalid.ng-dirty) .sky-file-attachment-btn{box-shadow:var(--sky-override-file-attachment-invalid-box-shadow, none);border:var(--sky-override-file-attachment-invalid-border, var(--sky-border-width-input-error) solid var(--sky-color-border-input-error))}:host(.ng-invalid.ng-dirty) .sky-control-label{color:var(--sky-override-file-attachment-invalid-label-color, var(--sky-color-text-danger))}.sky-file-attachment-file-link{padding:var(--sky-override-file-attachment-file-link-padding, 0 0 0 var(--sky-space-gap-icon-m));margin:var(--sky-override-file-attachment-file-link-margin, 0)}.sky-file-attachment-delete{width:var(--sky-override-file-attachment-delete-width, auto);height:var(--sky-override-file-attachment-delete-height, auto);margin-left:var(--sky-override-file-attachment-delete-margin-left, var(--sky-space-gap-text_action-s))}.sky-file-attachment-preview-img{flex:0;order:1;max-width:25%;width:var(--sky-override-file-attachment-preview-img-width, var(--sky-size-thumbnail-l));height:auto;box-shadow:var(--sky-override-file-attachment-preview-img-box-shadow, var(--sky-elevation-raised-100));border:var(--sky-override-file-attachment-preview-img-border, none);margin:var(--sky-override-file-attachment-preview-img-margin, 0)}.sky-file-attachment-hint-text{margin-top:var(--sky-override-file-attachment-hint-text-margin-top, var(--sky-space-gap-stacked_supplemental-s))}.sky-control-label{color:var(--sky-override-file-attachment-control-label-color, var(--sky-color-text-deemphasized));font-size:var(--sky-override-file-attachment-control-label-font-size, var(--sky-font-size-input-label))}.sky-file-attachment-icon{color:var(--sky-color-icon-deemphasized);margin:var(--sky-override-file-attachment-file-icon-margin, 0 0 0 var(--sky-gap-icon-m));font-size:var(--sky-override-file-attachment-file-icon-font-size, var(--sky-size-icon-xl));line-height:var(--sky-override-file-attachment-file-icon-line-height, 1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: SkyFileAttachmentJoinIdsPipe, name: "skyFileAttachmentJoinIds" }, { kind: "pipe", type: SkyFileSizePipe, name: "skyFileSize" }, { kind: "component", type: SkyFormErrorComponent, selector: "sky-form-error", inputs: ["errorName", "errorText"] }, { kind: "component", type: SkyFormErrorsComponent, selector: "sky-form-errors", inputs: ["errors", "labelText", "touched", "dirty"] }, { kind: "ngmodule", type: SkyFormsResourcesModule }, { kind: "pipe", type: i6.SkyLibResourcesPipe, name: "skyLibResources" }, { kind: "ngmodule", type: SkyHelpInlineModule }, { kind: "component", type: i7.λ1, selector: "sky-help-inline", inputs: ["ariaControls", "ariaExpanded", "ariaLabel", "helpKey", "labelledBy", "labelText", "popoverContent", "popoverTitle"], outputs: ["actionClick"] }, { kind: "ngmodule", type: SkyIconModule }, { kind: "component", type: i8.λ1, selector: "sky-icon", inputs: ["icon", "iconName", "iconType", "size", "fixedWidth", "variant"] }, { kind: "ngmodule", type: SkyIdModule }, { kind: "directive", type: i9.λ2, selector: "[skyId]", exportAs: ["skyId"] }, { kind: "ngmodule", type: SkyThemeModule }, { kind: "directive", type: i4.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "directive", type: SkyThemeComponentClassDirective, selector: "[skyThemeClass]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
423
|
-
}
|
|
424
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyFileAttachmentComponent, decorators: [{
|
|
425
|
-
type: Component,
|
|
426
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
427
|
-
CommonModule,
|
|
428
|
-
SkyFileAttachmentJoinIdsPipe,
|
|
429
|
-
SkyFileSizePipe,
|
|
430
|
-
SkyFormErrorComponent,
|
|
431
|
-
SkyFormErrorsComponent,
|
|
432
|
-
SkyFormsResourcesModule,
|
|
433
|
-
SkyHelpInlineModule,
|
|
434
|
-
SkyIconModule,
|
|
435
|
-
SkyIdModule,
|
|
436
|
-
SkyThemeModule,
|
|
437
|
-
SkyThemeComponentClassDirective,
|
|
438
|
-
], providers: [
|
|
439
|
-
SkyFileAttachmentService,
|
|
440
|
-
{ provide: SKY_FORM_ERRORS_ENABLED, useValue: true },
|
|
441
|
-
], hostDirectives: [SkyThemeComponentClassDirective], selector: 'sky-file-attachment', standalone: true, template: "<div class=\"sky-file-attachment-wrapper\">\n <div\n class=\"sky-file-attachment-label-wrapper\"\n [ngClass]=\"{\n 'sky-control-label-required':\n !labelText && isRequired && hasLabelComponent\n }\"\n >\n @if (labelText) {\n @if (!labelHidden) {\n <span\n class=\"sky-control-label\"\n [attr.id]=\"labelId\"\n [ngClass]=\"{\n 'sky-control-label-required': isRequired\n }\"\n >{{ labelText }}</span\n >\n }\n } @else {\n <ng-content select=\"sky-file-attachment-label\" />\n }\n @if (isRequired && (hasLabelComponent || labelText)) {\n <span class=\"sky-screen-reader-only\">{{\n 'skyux_file_attachment_required' | skyLibResources\n }}</span>\n }\n @if (labelText && (helpPopoverContent || helpKey)) {\n <span class=\"sky-control-help-container\">\n <sky-help-inline\n [labelText]=\"labelText\"\n [helpKey]=\"helpKey\"\n [popoverTitle]=\"helpPopoverTitle\"\n [popoverContent]=\"helpPopoverContent\"\n />\n </span>\n }\n </div>\n <div\n class=\"sky-file-attachment-upload sky-file-attachment sky-file-attachment-target\"\n [ngClass]=\"{\n 'sky-file-attachment-accept': acceptedOver,\n 'sky-file-attachment-reject': rejectedOver\n }\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragover)=\"fileDragOver($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n >\n <div\n #fileDropDescriptionRef=\"skyId\"\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n role=\"tooltip\"\n skyId\n >\n {{ 'skyux_file_attachment_file_upload_drag_or_click' | skyLibResources }}\n </div>\n <input\n #fileInputRef\n hidden\n tabindex=\"-1\"\n type=\"file\"\n [attr.accept]=\"acceptedTypes || null\"\n [disabled]=\"disabled\"\n [required]=\"isRequired\"\n (change)=\"fileChangeEvent($event)\"\n />\n @if (showFileAttachmentButton) {\n <button\n class=\"sky-file-attachment-btn sky-btn sky-btn-default\"\n type=\"button\"\n [attr.aria-describedby]=\"\n hintText && hintTextEl.id\n | skyFileAttachmentJoinIds: fileDropDescriptionRef.id\n \"\n [attr.aria-labelledby]=\"\n attachButtonLabelRef.id\n | skyFileAttachmentJoinIds\n : (labelText\n ? labelId\n : labelComponents?.get(0)?.labelContentId?.id)\n \"\n [attr.aria-invalid]=\"!!(ngControl?.errors ?? fileErrorValidation)\"\n [attr.aria-errormessage]=\"\n !!(ngControl?.errors ?? fileErrorValidation) ? errorId : undefined\n \"\n [disabled]=\"disabled\"\n (click)=\"onDropClicked()\"\n (blur)=\"onButtonBlur()\"\n >\n <sky-icon icon=\"folder-open-o\" />\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file'\n | skyLibResources)\n : ('skyux_file_attachment_button_label_choose_file'\n | skyLibResources)\n }}\n </button>\n }\n @if (value && !isImage && currentThemeName === 'modern') {\n <sky-icon class=\"sky-file-attachment-icon\" icon=\"file-o\" />\n }\n @if (value || currentThemeName === 'default') {\n <span class=\"sky-file-attachment-file-link\">\n @if (value) {\n <a\n [href]=\"isData ? value.url : undefined\"\n [download]=\"isData ? value.file.name : undefined\"\n [attr.title]=\"fileName\"\n (click)=\"emitClick()\"\n >\n {{ truncatedFileName }}\n </a>\n } @else {\n <span class=\"sky-file-attachment-none sky-font-deemphasized\">\n {{ 'skyux_file_attachment_label_no_file_chosen' | skyLibResources }}\n </span>\n }\n </span>\n }\n\n @if (value) {\n <button\n class=\"sky-btn sky-btn-icon-borderless sky-file-attachment-delete\"\n type=\"button\"\n [attr.aria-labelledby]=\"\n deleteButtonLabelRef.id\n | skyFileAttachmentJoinIds\n : (labelText\n ? labelId\n : labelComponents?.get(0)?.labelContentId?.id)\n \"\n [disabled]=\"disabled\"\n (click)=\"deleteFileAttachment()\"\n >\n <sky-icon icon=\"trash-o\" size=\"md\" />\n </button>\n }\n </div>\n\n @if (value && isImage) {\n <img\n class=\"sky-file-attachment-preview-img\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n [src]=\"value.url\"\n />\n }\n</div>\n<div #hintTextEl=\"skyId\" skyId>\n @if (hintText) {\n <div\n class=\"sky-file-attachment-hint-text\"\n [skyThemeClass]=\"{\n 'sky-font-deemphasized': 'default',\n 'sky-font-hint-text-s': 'modern'\n }\"\n >\n {{ hintText }}\n </div>\n }\n</div>\n\n<sky-form-errors\n [id]=\"errorId\"\n [errors]=\"ngControl?.errors\"\n [labelText]=\"labelText\"\n [touched]=\"ngControl?.touched\"\n [dirty]=\"ngControl?.dirty\"\n>\n <ng-content select=\"sky-form-error\" />\n @if (ngControl?.touched) {\n @if (fileErrorName === 'fileType') {\n <sky-form-error\n errorName=\"fileType\"\n [errorText]=\"\n acceptedTypesErrorMessage ??\n 'skyux_file_attachment_file_type_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n } @else if (fileErrorName === 'maxFileSize') {\n <sky-form-error\n errorName=\"maxFileSize\"\n [errorText]=\"\n 'skyux_file_attachment_max_file_size_error_label_text'\n | skyLibResources: (fileErrorParam | skyFileSize)\n \"\n />\n } @else if (fileErrorName === 'minFileSize') {\n <sky-form-error\n errorName=\"minFileSize\"\n [errorText]=\"\n 'skyux_file_attachment_min_file_size_error_label_text'\n | skyLibResources: (fileErrorParam | skyFileSize)\n \"\n />\n }\n }\n</sky-form-errors>\n\n<span\n #attachButtonLabelRef=\"skyId\"\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n skyId\n>\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file_label'\n | skyLibResources: fileName)\n : ('skyux_file_attachment_button_label_choose_file_label'\n | skyLibResources)\n }}\n</span>\n\n<span\n #deleteButtonLabelRef=\"skyId\"\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n skyId\n>\n {{ 'skyux_file_attachment_file_item_remove' | skyLibResources: fileName }}\n</span>\n", styles: [".sky-file-attachment-wrapper:not(.sky-theme-modern *){--sky-override-file-attachment-accept-border-color: #72bf44;--sky-override-file-attachment-accept-border-radius: 5px;--sky-override-file-attachment-accept-border-width: 1px;--sky-override-file-attachment-control-label-color: #212327;--sky-override-file-attachment-control-label-font-size: 15px;--sky-override-file-attachment-delete-margin-left: 0;--sky-override-file-attachment-file-link-padding: 0 5px;--sky-override-file-attachment-invalid-border: 1px solid #ef4044;--sky-override-file-attachment-invalid-box-shadow: 0 0 8px rgba(239, 64, 68, .6);--sky-override-file-attachment-invalid-label-color: #212327;--sky-override-file-attachment-preview-img-border: none;--sky-override-file-attachment-preview-img-box-shadow: 0 0 5px #666;--sky-override-file-attachment-preview-img-margin: 10px;--sky-override-file-attachment-preview-img-width: auto;--sky-override-file-attachment-reject-border-color: #ef4044;--sky-override-file-attachment-reject-border-radius: 5px;--sky-override-file-attachment-reject-border-width: 1px;--sky-override-file-attachment-upload-display: block;--sky-override-file-attachment-upload-padding-right: 8px;--sky-override-file-attachment-wrapper-display: inline-block}.sky-file-attachment-wrapper:not(.sky-theme-modern *) .sky-file-attachment-delete{padding:0}:host-context(.sky-theme-modern:not(.sky-theme-brand-blackbaud)) .sky-file-attachment-wrapper{--sky-override-file-attachment-accept-border-radius: 5px;--sky-override-file-attachment-accept-border-width: 1px;--sky-override-file-attachment-btn-non-stacked-margin: 0 10px 0 0;--sky-override-file-attachment-control-label-color: #686c73;--sky-override-file-attachment-control-label-font-size: 13px;--sky-override-file-attachment-delete-height: 40px;--sky-override-file-attachment-delete-width: 40px;--sky-override-file-attachment-file-icon-font-size: 30px;--sky-override-file-attachment-file-icon-line-height: normal;--sky-override-file-attachment-file-icon-margin: 5px 10px 5px 5px;--sky-override-file-attachment-file-link-margin: 10px 0 0 0;--sky-override-file-attachment-file-link-padding: 0;--sky-override-file-attachment-invalid-border: 1px solid #ef4044;--sky-override-file-attachment-invalid-box-shadow: 0 0 8px rgba(239, 64, 68, .6);--sky-override-file-attachment-invalid-label-color: #686c73;--sky-override-file-attachment-preview-img-border: var( --sky-border-width-separator-dark ) solid var(--sky-color-border-separator-dark);--sky-override-file-attachment-preview-img-box-shadow: none;--sky-override-file-attachment-preview-img-margin: 0 10px 0 0;--sky-override-file-attachment-reject-border-radius: 5px;--sky-override-file-attachment-reject-border-width: 1px;--sky-override-file-attachment-upload-with-icon-align-items: flex-start}:host-context(.sky-theme-modern:not(.sky-theme-brand-blackbaud)) .sky-file-attachment-wrapper .sky-file-attachment-delete{padding:0}:host.sky-cmp-theme-default{--sky-override-file-attachment-hint-text-margin-top: var( --sky-margin-stacked-xs )}:host.sky-form-field-stacked{display:block}:host:not(.sky-form-field-stacked) .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:var(--sky-override-file-attachment-btn-non-stacked-margin, 0)}.sky-file-attachment-wrapper{display:var(--sky-override-file-attachment-wrapper-display, flex);flex-wrap:wrap}.sky-file-attachment-label-wrapper{width:100%}.sky-file-attachment-upload{flex:1;order:2;display:var(--sky-override-file-attachment-upload-display, flex);align-items:flex-start;padding-right:var(--sky-override-file-attachment-upload-padding-right, 0);border:1px solid transparent}.sky-file-attachment-upload:has(.sky-file-attachment-icon){align-items:var(--sky-override-file-attachment-upload-with-icon-align-items, center)}.sky-file-attachment-accept{border-color:var(--sky-override-file-attachment-accept-border-color, var(--sky-color-border-success));border-style:dashed;border-width:var(--sky-override-file-attachment-accept-border-width, var(--sky-border-width-input-hover));border-radius:var(--sky-override-file-attachment-accept-border-radius, var(--sky-border-radius-s))}.sky-file-attachment-reject{border-color:var(--sky-override-file-attachment-reject-border-color, var(--sky-color-border-danger));border-style:dashed;border-width:var(--sky-override-file-attachment-reject-border-width, var(--sky-border-width-input-hover));border-radius:var(--sky-override-file-attachment-reject-border-radius, var(--sky-border-radius-s))}.sky-file-attachment-btn,.sky-control-label{transition:border-color .15s,box-shadow .15s,color .15s}:host(.ng-invalid.ng-dirty) .sky-file-attachment-btn{box-shadow:var(--sky-override-file-attachment-invalid-box-shadow, none);border:var(--sky-override-file-attachment-invalid-border, var(--sky-border-width-input-error) solid var(--sky-color-border-input-error))}:host(.ng-invalid.ng-dirty) .sky-control-label{color:var(--sky-override-file-attachment-invalid-label-color, var(--sky-color-text-danger))}.sky-file-attachment-file-link{padding:var(--sky-override-file-attachment-file-link-padding, 0 0 0 var(--sky-space-gap-icon-m));margin:var(--sky-override-file-attachment-file-link-margin, 0)}.sky-file-attachment-delete{width:var(--sky-override-file-attachment-delete-width, auto);height:var(--sky-override-file-attachment-delete-height, auto);margin-left:var(--sky-override-file-attachment-delete-margin-left, var(--sky-space-gap-text_action-s))}.sky-file-attachment-preview-img{flex:0;order:1;max-width:25%;width:var(--sky-override-file-attachment-preview-img-width, var(--sky-size-thumbnail-l));height:auto;box-shadow:var(--sky-override-file-attachment-preview-img-box-shadow, var(--sky-elevation-raised-100));border:var(--sky-override-file-attachment-preview-img-border, none);margin:var(--sky-override-file-attachment-preview-img-margin, 0)}.sky-file-attachment-hint-text{margin-top:var(--sky-override-file-attachment-hint-text-margin-top, var(--sky-space-gap-stacked_supplemental-s))}.sky-control-label{color:var(--sky-override-file-attachment-control-label-color, var(--sky-color-text-deemphasized));font-size:var(--sky-override-file-attachment-control-label-font-size, var(--sky-font-size-input-label))}.sky-file-attachment-icon{color:var(--sky-color-icon-deemphasized);margin:var(--sky-override-file-attachment-file-icon-margin, 0 0 0 var(--sky-gap-icon-m));font-size:var(--sky-override-file-attachment-file-icon-font-size, var(--sky-size-icon-xl));line-height:var(--sky-override-file-attachment-file-icon-line-height, 1)}\n"] }]
|
|
442
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.SkyFileAttachmentService }, { type: i2.SkyFileItemService }, { type: i3.NgControl, decorators: [{
|
|
443
|
-
type: Self
|
|
444
|
-
}, {
|
|
445
|
-
type: Optional
|
|
446
|
-
}] }, { type: i4.SkyThemeService, decorators: [{
|
|
447
|
-
type: Optional
|
|
448
|
-
}] }], propDecorators: { acceptedTypes: [{
|
|
449
|
-
type: Input
|
|
450
|
-
}], acceptedTypesErrorMessage: [{
|
|
451
|
-
type: Input
|
|
452
|
-
}], disabled: [{
|
|
453
|
-
type: Input,
|
|
454
|
-
args: [{ transform: booleanAttribute }]
|
|
455
|
-
}], helpPopoverContent: [{
|
|
456
|
-
type: Input
|
|
457
|
-
}], helpPopoverTitle: [{
|
|
458
|
-
type: Input
|
|
459
|
-
}], helpKey: [{
|
|
460
|
-
type: Input
|
|
461
|
-
}], labelText: [{
|
|
462
|
-
type: Input
|
|
463
|
-
}], labelHidden: [{
|
|
464
|
-
type: Input,
|
|
465
|
-
args: [{ transform: booleanAttribute }]
|
|
466
|
-
}], hintText: [{
|
|
467
|
-
type: Input
|
|
468
|
-
}], maxFileSize: [{
|
|
469
|
-
type: Input
|
|
470
|
-
}], minFileSize: [{
|
|
471
|
-
type: Input
|
|
472
|
-
}], stacked: [{
|
|
473
|
-
type: Input,
|
|
474
|
-
args: [{ transform: booleanAttribute }]
|
|
475
|
-
}, {
|
|
476
|
-
type: HostBinding,
|
|
477
|
-
args: ['class.sky-form-field-stacked']
|
|
478
|
-
}], validateFn: [{
|
|
479
|
-
type: Input
|
|
480
|
-
}], fileChange: [{
|
|
481
|
-
type: Output
|
|
482
|
-
}], fileClick: [{
|
|
483
|
-
type: Output
|
|
484
|
-
}], required: [{
|
|
485
|
-
type: Input,
|
|
486
|
-
args: [{ transform: booleanAttribute }]
|
|
487
|
-
}], inputEl: [{
|
|
488
|
-
type: ViewChild,
|
|
489
|
-
args: ['fileInputRef']
|
|
490
|
-
}], labelComponents: [{
|
|
491
|
-
type: ContentChildren,
|
|
492
|
-
args: [SkyFileAttachmentLabelComponent]
|
|
493
|
-
}] } });
|
|
494
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1hdHRhY2htZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9mb3Jtcy9zcmMvbGliL21vZHVsZXMvZmlsZS1hdHRhY2htZW50L2ZpbGUtYXR0YWNobWVudC9maWxlLWF0dGFjaG1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2Zvcm1zL3NyYy9saWIvbW9kdWxlcy9maWxlLWF0dGFjaG1lbnQvZmlsZS1hdHRhY2htZW50L2ZpbGUtYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sSUFBSSxFQUVKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFdBQVcsRUFDWCxZQUFZLEVBQ1osdUJBQXVCLEdBQ3hCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFDTCwrQkFBK0IsRUFDL0IsY0FBYyxHQUVmLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENB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QVc7dUJBQUMsOEJBQThCO2dCQVNwQyxVQUFVO3NCQURoQixLQUFLO2dCQVFDLFVBQVU7c0JBRGhCLE1BQU07Z0JBT0EsU0FBUztzQkFEZixNQUFNO2dCQWlCQSxRQUFRO3NCQURkLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBc0MvQixPQUFPO3NCQURiLFNBQVM7dUJBQUMsY0FBYztnQkFJbEIsZUFBZTtzQkFEckIsZUFBZTt1QkFBQywrQkFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNlbGYsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTmdDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBTa3lGaWxlUmVhZGVyU2VydmljZSxcbiAgU2t5SWRNb2R1bGUsXG4gIFNreUlkU2VydmljZSxcbiAgU2t5TGl2ZUFubm91bmNlclNlcnZpY2UsXG59IGZyb20gJ0Bza3l1eC9jb3JlJztcbmltcG9ydCB7IFNreUhlbHBJbmxpbmVNb2R1bGUgfSBmcm9tICdAc2t5dXgvaGVscC1pbmxpbmUnO1xuaW1wb3J0IHsgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcbmltcG9ydCB7IFNreUljb25Nb2R1bGUgfSBmcm9tICdAc2t5dXgvaWNvbic7XG5pbXBvcnQge1xuICBTa3lUaGVtZUNvbXBvbmVudENsYXNzRGlyZWN0aXZlLFxuICBTa3lUaGVtZU1vZHVsZSxcbiAgU2t5VGhlbWVTZXJ2aWNlLFxufSBmcm9tICdAc2t5dXgvdGhlbWUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUZvcm1FcnJvckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm0tZXJyb3IvZm9ybS1lcnJvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU0tZX0ZPUk1fRVJST1JTX0VOQUJMRUQgfSBmcm9tICcuLi8uLi9mb3JtLWVycm9yL2Zvcm0tZXJyb3JzLWVuYWJsZWQtdG9rZW4nO1xuaW1wb3J0IHsgU2t5Rm9ybUVycm9yc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm0tZXJyb3IvZm9ybS1lcnJvcnMuY29tcG9uZW50JztcbmltcG9ydCB7IFNreUZvcm1zUmVzb3VyY2VzTW9kdWxlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NreS1mb3Jtcy1yZXNvdXJjZXMubW9kdWxlJztcbmltcG9ydCB7IFNreUZpbGVJdGVtIH0gZnJvbSAnLi4vc2hhcmVkL2ZpbGUtaXRlbSc7XG5pbXBvcnQgeyBTa3lGaWxlSXRlbUVycm9yVHlwZSB9IGZyb20gJy4uL3NoYXJlZC9maWxlLWl0ZW0tZXJyb3ItdHlwZSc7XG5pbXBvcnQgeyBTa3lGaWxlSXRlbVNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvZmlsZS1pdGVtLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5RmlsZVNpemVQaXBlIH0gZnJvbSAnLi4vc2hhcmVkL2ZpbGUtc2l6ZS5waXBlJztcbmltcG9ydCB7IFNreUZpbGVWYWxpZGF0ZUZuIH0gZnJvbSAnLi4vc2hhcmVkL2ZpbGUtdmFsaWRhdGUtZnVuY3Rpb24nO1xuXG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudENoYW5nZSB9IGZyb20gJy4vZmlsZS1hdHRhY2htZW50LWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudENsaWNrIH0gZnJvbSAnLi9maWxlLWF0dGFjaG1lbnQtY2xpY2snO1xuaW1wb3J0IHsgU2t5RmlsZUF0dGFjaG1lbnRKb2luSWRzUGlwZSB9IGZyb20gJy4vZmlsZS1hdHRhY2htZW50LWpvaW4taWRzLnBpcGUnO1xuaW1wb3J0IHsgU2t5RmlsZUF0dGFjaG1lbnRMYWJlbENvbXBvbmVudCB9IGZyb20gJy4vZmlsZS1hdHRhY2htZW50LWxhYmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudFNlcnZpY2UgfSBmcm9tICcuL2ZpbGUtYXR0YWNobWVudC5zZXJ2aWNlJztcblxuY29uc3QgTUFYX0ZJTEVfU0laRV9ERUZBVUxUID0gNTAwMDAwO1xuY29uc3QgTUlOX0ZJTEVfU0laRV9ERUZBVUxUID0gMDtcblxuLyoqXG4gKiBQcm92aWRlcyBhbiBlbGVtZW50IHRvIGF0dGFjaCBhIHNpbmdsZSBsb2NhbCBmaWxlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgU2t5RmlsZUF0dGFjaG1lbnRKb2luSWRzUGlwZSxcbiAgICBTa3lGaWxlU2l6ZVBpcGUsXG4gICAgU2t5Rm9ybUVycm9yQ29tcG9uZW50LFxuICAgIFNreUZvcm1FcnJvcnNDb21wb25lbnQsXG4gICAgU2t5Rm9ybXNSZXNvdXJjZXNNb2R1bGUsXG4gICAgU2t5SGVscElubGluZU1vZHVsZSxcbiAgICBTa3lJY29uTW9kdWxlLFxuICAgIFNreUlkTW9kdWxlLFxuICAgIFNreVRoZW1lTW9kdWxlLFxuICAgIFNreVRoZW1lQ29tcG9uZW50Q2xhc3NEaXJlY3RpdmUsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIFNreUZpbGVBdHRhY2htZW50U2VydmljZSxcbiAgICB7IHByb3ZpZGU6IFNLWV9GT1JNX0VSUk9SU19FTkFCTEVELCB1c2VWYWx1ZTogdHJ1ZSB9LFxuICBdLFxuICBob3N0RGlyZWN0aXZlczogW1NreVRoZW1lQ29tcG9uZW50Q2xhc3NEaXJlY3RpdmVdLFxuICBzZWxlY3RvcjogJ3NreS1maWxlLWF0dGFjaG1lbnQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzdHlsZVVybDogJy4vZmlsZS1hdHRhY2htZW50LmNvbXBvbmVudC5zY3NzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFNreUZpbGVBdHRhY2htZW50Q29tcG9uZW50XG4gIGltcGxlbWVudHNcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgT25Jbml0LFxuICAgIE9uRGVzdHJveVxue1xuICByZWFkb25seSAjZmlsZVJlYWRlclN2YyA9IGluamVjdChTa3lGaWxlUmVhZGVyU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIGxpdGVyYWwgb2YgTUlNRSB0eXBlcyB0aGF0IHVzZXJzIGNhbiBhdHRhY2guXG4gICAqIEJ5IGRlZmF1bHQsIGFsbCBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFjY2VwdGVkVHlwZXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gYSBmaWxlIGRvZXNuJ3QgbWF0Y2ggdGhlIGFjY2VwdGVkIHR5cGVzLlxuICAgKiBUaGlzIHJlcGxhY2VzIGEgZGVmYXVsdCBlcnJvciBtZXNzYWdlIHRoYXQgbGlzdHMgYWxsIGFjY2VwdGVkIHR5cGVzLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFjY2VwdGVkVHlwZXNFcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBpbnB1dCBvbiB0ZW1wbGF0ZS1kcml2ZW4gZm9ybXMuIERvbid0IHVzZSB0aGlzIGlucHV0IG9uIHJlYWN0aXZlIGZvcm1zIGJlY2F1c2UgdGhleSBtYXkgb3ZlcndyaXRlIHRoZSBpbnB1dCBvciBsZWF2ZSB0aGUgY29udHJvbCBvdXQgb2Ygc3luYy5cbiAgICogVG8gc2V0IHRoZSBkaXNhYmxlZCBzdGF0ZSBvbiByZWFjdGl2ZSBmb3JtcywgdXNlIHRoZSBgRm9ybUNvbnRyb2xgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBoZWxwIHBvcG92ZXIuIFdoZW4gc3BlY2lmaWVkIGFsb25nIHdpdGggYGxhYmVsVGV4dGAsIGEgW2hlbHAgaW5saW5lXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvaGVscC1pbmxpbmUpXG4gICAqIGJ1dHRvbiBpcyBhZGRlZCB0byB0aGUgc2luZ2xlIGZpbGUgYXR0YWNobWVudCBsYWJlbC4gVGhlIGhlbHAgaW5saW5lIGJ1dHRvbiBkaXNwbGF5cyBhIFtwb3BvdmVyXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvcG9wb3ZlcilcbiAgICogd2hlbiBjbGlja2VkIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29udGVudCBhbmQgb3B0aW9uYWwgdGl0bGUuIFRoaXMgcHJvcGVydHkgb25seSBhcHBsaWVzIHdoZW4gYGxhYmVsVGV4dGAgaXMgYWxzbyBzcGVjaWZpZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVscFBvcG92ZXJDb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHRpdGxlIG9mIHRoZSBoZWxwIHBvcG92ZXIuIFRoaXMgcHJvcGVydHkgb25seSBhcHBsaWVzIHdoZW4gYGhlbHBQb3BvdmVyQ29udGVudGAgaXNcbiAgICogYWxzbyBzcGVjaWZpZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVscFBvcG92ZXJUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGhlbHAga2V5IHRoYXQgaWRlbnRpZmllcyB0aGUgZ2xvYmFsIGhlbHAgY29udGVudCB0byBkaXNwbGF5LiBXaGVuIHNwZWNpZmllZCBhbG9uZyB3aXRoIGBsYWJlbFRleHRgLCBhIFtoZWxwIGlubGluZV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2hlbHAtaW5saW5lKVxuICAgKiBidXR0b24gaXMgcGxhY2VkIGJlc2lkZSB0aGUgc2luZ2xlIGZpbGUgYXR0YWNobWVudCBsYWJlbC4gQ2xpY2tpbmcgdGhlIGJ1dHRvbiBpbnZva2VzIFtnbG9iYWwgaGVscF0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9kZXZlbG9wL2dsb2JhbC1oZWxwKVxuICAgKiBhcyBjb25maWd1cmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBwcm9wZXJ0eSBvbmx5IGFwcGxpZXMgd2hlbiBgbGFiZWxUZXh0YCBpcyBhbHNvIHNwZWNpZmllZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoZWxwS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIGRpc3BsYXkgYXMgdGhlIGZpbGUgYXR0YWNobWVudCdzIGxhYmVsLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGxhYmVsVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhpZGUgYGxhYmVsVGV4dGAgZnJvbSB2aWV3LlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBsYWJlbEhpZGRlbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBbUGVyc2lzdGVudCBpbmxpbmUgaGVscCB0ZXh0XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2Rlc2lnbi9ndWlkZWxpbmVzL3VzZXItYXNzaXN0YW5jZSNpbmxpbmUtaGVscCkgdGhhdCBwcm92aWRlc1xuICAgKiBhZGRpdGlvbmFsIGNvbnRleHQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGludFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gc2l6ZSBpbiBieXRlcyBmb3IgdmFsaWQgZmlsZXMuXG4gICAqIEBkZWZhdWx0IDUwMDAwMFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtYXhGaWxlU2l6ZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX21heEZpbGVTaXplID0gdmFsdWUgPz8gTUFYX0ZJTEVfU0laRV9ERUZBVUxUO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXhGaWxlU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNfbWF4RmlsZVNpemU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gc2l6ZSBpbiBieXRlcyBmb3IgdmFsaWQgZmlsZXMuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWluRmlsZVNpemUodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19taW5GaWxlU2l6ZSA9IHZhbHVlID8/IE1JTl9GSUxFX1NJWkVfREVGQVVMVDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluRmlsZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jX21pbkZpbGVTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNpbmdsZSBmaWxlIGF0dGFjaG1lbnQgaXMgc3RhY2tlZCBvbiBhbm90aGVyIGZvcm0gY29tcG9uZW50LiBXaGVuIHNwZWNpZmllZCxcbiAgICogdGhlIGFwcHJvcHJpYXRlIHZlcnRpY2FsIHNwYWNpbmcgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgc2luZ2xlIGZpbGUgYXR0YWNobWVudC5cbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNreS1mb3JtLWZpZWxkLXN0YWNrZWQnKVxuICBwdWJsaWMgc3RhY2tlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24uIFRoaXMgdmFsaWRhdGlvbiBydW5zIGFsb25nc2lkZSB0aGUgaW50ZXJuYWxcbiAgICogZmlsZSB2YWxpZGF0aW9uLiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgYFNreUZpbGVJdGVtYCBvYmplY3QgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIEBkZXByZWNhdGVkIEFkZCBhIGN1c3RvbSBBbmd1bGFyIGBWYWxpZGF0b3JgIGZ1bmN0aW9uIHRvIHRoZSBgRm9ybUNvbnRyb2xgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdmFsaWRhdGVGbjogU2t5RmlsZVZhbGlkYXRlRm4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgYWRkIG9yIHJlbW92ZSBmaWxlcy5cbiAgICogQGRlcHJlY2F0ZWQgU3Vic2NyaWJlIHRvIHRoZSBmb3JtIGNvbnRyb2wncyBgdmFsdWVDaGFuZ2VzYCBldmVudCBpbnN0ZWFkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBmaWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lGaWxlQXR0YWNobWVudENoYW5nZT4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBzZWxlY3QgdGhlIGZpbGUgbmFtZSBsaW5rLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBmaWxlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFNreUZpbGVBdHRhY2htZW50Q2xpY2s+KCk7XG5cbiAgcHVibGljIGFjY2VwdGVkT3ZlciA9IGZhbHNlO1xuXG4gIHB1YmxpYyBoYXNMYWJlbENvbXBvbmVudCA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWplY3RlZE92ZXIgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaW5wdXQgaXMgcmVxdWlyZWQgZm9yIGZvcm0gdmFsaWRhdGlvbi5cbiAgICogV2hlbiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgdG8gYHRydWVgLCB0aGUgY29tcG9uZW50IGFkZHMgYGFyaWEtcmVxdWlyZWRgIGFuZCBgcmVxdWlyZWRgXG4gICAqIGF0dHJpYnV0ZXMgdG8gdGhlIGlucHV0IGVsZW1lbnQgc28gdGhhdCBmb3JtcyBkaXNwbGF5IGFuIGludmFsaWQgc3RhdGUgdW50aWwgdGhlIGlucHV0IGVsZW1lbnRcbiAgICogaXMgY29tcGxldGUuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBgYXJpYS1yZXF1aXJlZGAgYXR0cmlidXRlLCBzZWUgdGhlIFtXQUktQVJJQSBkZWZpbml0aW9uXShodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEvI2FyaWEtcmVxdWlyZWQpLlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IFNreUZpbGVJdGVtIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIC8vIFRoZSBudWxsIGNoZWNrIGlzIG5lZWRlZCB0byBhZGRyZXNzIGEgYnVnIGluIEFuZ3VsYXIgNC5cbiAgICAvLyB3cml0ZVZhbHVlIGlzIGJlaW5nIGNhbGxlZCB0d2ljZSwgZmlyc3QgdGltZSB3aXRoIGEgcGhhbnRvbSBudWxsIHZhbHVlXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xNDk4OFxuICAgIGNvbnN0IGlzTmV3VmFsdWUgPSB2YWx1ZSAhPT0gdGhpcy52YWx1ZSAmJiB2YWx1ZSAhPT0gbnVsbDtcblxuICAgIGlmIChpc05ld1ZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5pc0RhdGEgPSB2YWx1ZS51cmw/LnN0YXJ0c1dpdGgoJ2RhdGE6Jyk7XG4gICAgICAgIHRoaXMuaXNJbWFnZSA9IHRoaXMuI2ZpbGVJdGVtU2VydmljZS5pc0ltYWdlKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNEYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNJbWFnZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy4jc2V0RmlsZU5hbWUodmFsdWUpO1xuXG4gICAgICB0aGlzLiNfdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuI29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgIHRoaXMuI3VwZGF0ZUZpbGVBdHRhY2htZW50QnV0dG9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBTa3lGaWxlSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI192YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBjdXJyZW50VGhlbWVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGZpbGVOYW1lID0gJyc7XG5cbiAgcHVibGljIHNob3dGaWxlQXR0YWNobWVudEJ1dHRvbiA9IHRydWU7XG5cbiAgcHVibGljIHRydW5jYXRlZEZpbGVOYW1lID0gJyc7XG5cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0UmVmJylcbiAgcHVibGljIGlucHV0RWw6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTa3lGaWxlQXR0YWNobWVudExhYmVsQ29tcG9uZW50KVxuICBwdWJsaWMgbGFiZWxDb21wb25lbnRzOlxuICAgIHwgUXVlcnlMaXN0PFNreUZpbGVBdHRhY2htZW50TGFiZWxDb21wb25lbnQ+XG4gICAgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGlzSW1hZ2UgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgaXNEYXRhID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnJlcXVpcmVkIHx8XG4gICAgICAodGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/Lmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSA/PyBmYWxzZSlcbiAgICApO1xuICB9XG5cbiAgI2VudGVyRXZlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuICAjbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI19tYXhGaWxlU2l6ZSA9IE1BWF9GSUxFX1NJWkVfREVGQVVMVDtcblxuICAjX21pbkZpbGVTaXplID0gTUlOX0ZJTEVfU0laRV9ERUZBVUxUO1xuXG4gICNfdmFsdWU6IFNreUZpbGVJdGVtIHwgdW5kZWZpbmVkO1xuXG4gICNjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG4gICNmaWxlQXR0YWNobWVudFNlcnZpY2U6IFNreUZpbGVBdHRhY2htZW50U2VydmljZTtcbiAgI2ZpbGVJdGVtU2VydmljZTogU2t5RmlsZUl0ZW1TZXJ2aWNlO1xuICAjdGhlbWVTdmM6IFNreVRoZW1lU2VydmljZSB8IHVuZGVmaW5lZDtcblxuICByZWFkb25seSAjaWRTdmMgPSBpbmplY3QoU2t5SWRTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI2xpdmVBbm5vdW5jZXJTdmMgPSBpbmplY3QoU2t5TGl2ZUFubm91bmNlclNlcnZpY2UpO1xuICByZWFkb25seSAjcmVzb3VyY2VzU3ZjID0gaW5qZWN0KFNreUxpYlJlc291cmNlc1NlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGVycm9ySWQgPSB0aGlzLiNpZFN2Yy5nZW5lcmF0ZUlkKCk7XG4gIHByb3RlY3RlZCBsYWJlbElkID0gdGhpcy4jaWRTdmMuZ2VuZXJhdGVJZCgpO1xuXG4gIHByb3RlY3RlZCBmaWxlRXJyb3JOYW1lOiBTa3lGaWxlSXRlbUVycm9yVHlwZSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGZpbGVFcnJvclBhcmFtOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBmaWxlRXJyb3JWYWxpZGF0aW9uOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgZmlsZUF0dGFjaG1lbnRTZXJ2aWNlOiBTa3lGaWxlQXR0YWNobWVudFNlcnZpY2UsXG4gICAgZmlsZUl0ZW1TZXJ2aWNlOiBTa3lGaWxlSXRlbVNlcnZpY2UsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBuZ0NvbnRyb2w/OiBOZ0NvbnRyb2wsXG4gICAgQE9wdGlvbmFsKCkgdGhlbWVTdmM/OiBTa3lUaGVtZVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy4jZmlsZUF0dGFjaG1lbnRTZXJ2aWNlID0gZmlsZUF0dGFjaG1lbnRTZXJ2aWNlO1xuICAgIHRoaXMuI2ZpbGVJdGVtU2VydmljZSA9IGZpbGVJdGVtU2VydmljZTtcbiAgICB0aGlzLm5nQ29udHJvbCA9IG5nQ29udHJvbDtcbiAgICB0aGlzLiN0aGVtZVN2YyA9IHRoZW1lU3ZjO1xuXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI3RoZW1lU3ZjKSB7XG4gICAgICB0aGlzLiN0aGVtZVN2Yy5zZXR0aW5nc0NoYW5nZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHRoZW1lU2V0dGluZ3MpID0+IHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRUaGVtZU5hbWUgPSB0aGVtZVNldHRpbmdzLmN1cnJlbnRTZXR0aW5ncy50aGVtZS5uYW1lO1xuICAgICAgICAgIHRoaXMuI3VwZGF0ZUZpbGVBdHRhY2htZW50QnV0dG9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWRkcmVzcyBhIGJ1ZyBpbiBBbmd1bGFyIDcuXG4gICAgLy8gV2hlbiBhIGNvbnRyb2wgdmFsdWUgaXMgc2V0IGluaXRpYWxseSwgaXRzIHZhbHVlIGlzIG5vdCByZXByZXNlbnRlZCBvbiB0aGUgdmlldy5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNzkyXG4gICAgLy8gT2Ygbm90ZSBpcyB0aGUgcGFyZW50IGNoZWNrIHdoaWNoIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgaWYgdGhlIGZvcm0gaXMgcmVhY3RpdmUuXG4gICAgLy8gV2l0aG91dCB0aGlzIGNoZWNrIHRoZXJlIGlzIGEgY2hhbmdlZCBiZWZvcmUgY2hlY2tlZCBlcnJvclxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/LnNldFZhbHVlKHRoaXMudmFsdWUsIHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlcmUgaXMgc29tZSBkaXNjb25uZWN0IGJldHdlZW4gdGhlIGhvc3QgY29udHJvbCBhbmQgdGhlIGZvcm0gY29udHJvbC5cbiAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGF0IGJ5IHJ1bm5pbmcgY2hhbmdlIGRldGVjdGlvbiB3aGVuZXZlciB0aGUgaG9zdCBjb250cm9sXG4gICAgICAvLyBoYXMgYW55IGNoYW5nZXMuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGlzIGV4aXN0aW5nIGJ1ZyBhbmQgd2lsbCBiZVxuICAgICAgLy8gYWRkcmVzc2VkIGluIGEgZnV0dXJlIHN0b3J5IHRoYXQgcmVmYWN0b3JzIGZpbGUgYXR0YWNobWVudC5cbiAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2w/LmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGFiZWxDb21wb25lbnRzKSB7XG4gICAgICB0aGlzLmhhc0xhYmVsQ29tcG9uZW50ID0gdGhpcy5sYWJlbENvbXBvbmVudHMubGVuZ3RoID4gMDtcbiAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgLy8gSGFuZGxlcyB1cGRhdGluZyBjbGFzc2VzIHdoZW4gbGFiZWwgY2hhbmdlc1xuICAgICAgdGhpcy5sYWJlbENvbXBvbmVudHMuY2hhbmdlc1xuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgKG5ld0xhYmVsQ29tcG9uZW50czogUXVlcnlMaXN0PFNreUZpbGVBdHRhY2htZW50TGFiZWxDb21wb25lbnQ+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc0xhYmVsQ29tcG9uZW50ID0gbmV3TGFiZWxDb21wb25lbnRzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkJ1dHRvbkJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy4jb25Ub3VjaGVkKCk7XG4gIH1cblxuICBwdWJsaWMgb25Ecm9wQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLiNvblRvdWNoZWQoKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmlucHV0RWwpIHtcbiAgICAgIHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpbGVDaGFuZ2VFdmVudChmaWxlQ2hhbmdlRXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy4jaGFuZGxlRmlsZXMoXG4gICAgICAoZmlsZUNoYW5nZUV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkKT8uZmlsZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWxlRHJhZ0VudGVyKGRyYWdFbnRlckV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBTYXZlIHRoaXMgdGFyZ2V0IHRvIGtub3cgd2hlbiB0aGUgZHJhZyBldmVudCBsZWF2ZXNcbiAgICB0aGlzLiNlbnRlckV2ZW50VGFyZ2V0ID0gZHJhZ0VudGVyRXZlbnQudGFyZ2V0O1xuICAgIGRyYWdFbnRlckV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRyYWdFbnRlckV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwdWJsaWMgZmlsZURyYWdPdmVyKGRyYWdPdmVyRXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYW5zZmVyID0gZHJhZ092ZXJFdmVudC5kYXRhVHJhbnNmZXI7XG5cbiAgICBkcmFnT3ZlckV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRyYWdPdmVyRXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0cmFuc2Zlcikge1xuICAgICAgaWYgKHRyYW5zZmVyLml0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbSh0cmFuc2Zlci5pdGVtcyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmlsZS50eXBlICYmXG4gICAgICAgICAgICB0aGlzLiNmaWxlQXR0YWNobWVudFNlcnZpY2UuZmlsZVR5cGVSZWplY3RlZChcbiAgICAgICAgICAgICAgZmlsZS50eXBlLFxuICAgICAgICAgICAgICB0aGlzLmFjY2VwdGVkVHlwZXMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdGVkT3ZlciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFjY2VwdGVkT3ZlciA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwICYmICF0aGlzLmFjY2VwdGVkT3Zlcikge1xuICAgICAgICAgIHRoaXMucmVqZWN0ZWRPdmVyID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5hY2NlcHRlZE92ZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyYW5zZmVyLmZpbGVzKSB7XG4gICAgICAgIC8vIElmIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgRGF0YVRyYW5zZmVyLml0ZW1zLFxuICAgICAgICAvLyBkZWZlciBmaWxlLXR5cGUgY2hlY2tpbmcgdG8gZHJvcCBoYW5kbGVyLlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVyL2l0ZW1zI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICAgICAgICB0aGlzLnJlamVjdGVkT3ZlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY2VwdGVkT3ZlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpbGVEcm9wKGRyb3BFdmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy4jb25Ub3VjaGVkKCk7XG4gICAgZHJvcEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRyb3BFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy4jZW50ZXJFdmVudFRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlamVjdGVkT3ZlciA9IGZhbHNlO1xuICAgIHRoaXMuYWNjZXB0ZWRPdmVyID0gZmFsc2U7XG5cbiAgICBpZiAoZHJvcEV2ZW50LmRhdGFUcmFuc2ZlciAmJiBkcm9wRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKSB7XG4gICAgICBpZiAoZHJvcEV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLiNmaWxlQXR0YWNobWVudFNlcnZpY2UuaGFzRGlyZWN0b3J5KGRyb3BFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXMpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiNoYW5kbGVGaWxlcyhkcm9wRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlsZURyYWdMZWF2ZShkcmFnTGVhdmVFdmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI2VudGVyRXZlbnRUYXJnZXQgPT09IGRyYWdMZWF2ZUV2ZW50LnRhcmdldCkge1xuICAgICAgdGhpcy5yZWplY3RlZE92ZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWNjZXB0ZWRPdmVyID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlbGV0ZUZpbGVBdHRhY2htZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy52YWx1ZT8uZmlsZS5uYW1lO1xuICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4jZW1pdEZpbGVDaGFuZ2VFdmVudCh0aGlzLnZhbHVlKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBzYWZldHkgY2hlY2sgKi9cbiAgICBpZiAoZmlsZU5hbWUpIHtcbiAgICAgIHRoaXMuI2Fubm91bmNlU3RhdGUoXG4gICAgICAgICdza3l1eF9maWxlX2F0dGFjaG1lbnRfZmlsZV91cGxvYWRfZmlsZV9yZW1vdmVkJyxcbiAgICAgICAgZmlsZU5hbWUsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZmlsZUNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gYW55KTogdm9pZCB7XG4gICAgdGhpcy4jb25DaGFuZ2UgPSBmbjtcbiAgfVxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IGFueSk6IHZvaWQge1xuICAgIHRoaXMuI29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgdGhlIGNvbnRyb2wuIEltcGxlbWVudGVkIGFzIGEgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgV2hldGhlciB0aGUgY29udHJvbCBzaG91bGQgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdENsaWNrKCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuZmlsZUNsaWNrLmVtaXQoe1xuICAgICAgICBmaWxlOiB0aGlzLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgI2Fubm91bmNlU3RhdGUocmVzb3VyY2VTdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLiNyZXNvdXJjZXNTdmNcbiAgICAgIC5nZXRTdHJpbmcocmVzb3VyY2VTdHJpbmcsIC4uLmFyZ3MpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoaW50ZXJuYXRpb25hbGl6ZWRTdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy4jbGl2ZUFubm91bmNlclN2Yy5hbm5vdW5jZShpbnRlcm5hdGlvbmFsaXplZFN0cmluZyk7XG4gICAgICB9KTtcbiAgfVxuXG4gICNlbWl0RmlsZUNoYW5nZUV2ZW50KGN1cnJlbnRGaWxlPzogU2t5RmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoY3VycmVudEZpbGUgJiYgIWN1cnJlbnRGaWxlLmVycm9yVHlwZSkge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKGN1cnJlbnRGaWxlKTtcbiAgICAgIHRoaXMuZmlsZUVycm9yTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZmlsZUVycm9yUGFyYW0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZpbGVFcnJvclZhbGlkYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgLy8gTWFrZXMgc3VyZSB2YWx1ZSBhY2Nlc3NvciBpcyBtYXJrZWQgYXMgZGlydHkgZXZlbiBpZiBjdXJyZW50IGZpbGUgaXMgdW5kZWZpbmVkXG4gICAgICB0aGlzLiNvbkNoYW5nZSh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5maWxlRXJyb3JWYWxpZGF0aW9uID0geyBmaWxlRXJyb3I6IHRydWUgfTtcbiAgICAgIHRoaXMuZmlsZUVycm9yTmFtZSA9IGN1cnJlbnRGaWxlPy5lcnJvclR5cGU7XG4gICAgICB0aGlzLmZpbGVFcnJvclBhcmFtID0gY3VycmVudEZpbGU/LmVycm9yUGFyYW07XG4gICAgfVxuICAgIHRoaXMuZmlsZUNoYW5nZS5lbWl0KHtcbiAgICAgIGZpbGU6IGN1cnJlbnRGaWxlLFxuICAgIH0gYXMgU2t5RmlsZUF0dGFjaG1lbnRDaGFuZ2UpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5pbnB1dEVsKSB7XG4gICAgICB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNsb2FkRmlsZShmaWxlOiBTa3lGaWxlSXRlbSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChmaWxlLmZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzRmlsZU5hbWUgPSB0aGlzLnZhbHVlPy5maWxlLm5hbWU7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzRmlsZU5hbWUpIHtcbiAgICAgICAgICB0aGlzLiNhbm5vdW5jZVN0YXRlKFxuICAgICAgICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9maWxlX3VwbG9hZF9maWxlX3JlcGxhY2VkJyxcbiAgICAgICAgICAgIHByZXZpb3VzRmlsZU5hbWUsXG4gICAgICAgICAgICBmaWxlLmZpbGUubmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuI2Fubm91bmNlU3RhdGUoXG4gICAgICAgICAgICAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2ZpbGVfdXBsb2FkX2ZpbGVfYWRkZWQnLFxuICAgICAgICAgICAgZmlsZS5maWxlLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGUudXJsID0gYXdhaXQgdGhpcy4jZmlsZVJlYWRlclN2Yy5yZWFkQXNEYXRhVVJMKGZpbGUuZmlsZSk7XG5cbiAgICAgICAgdGhpcy4jZW1pdEZpbGVDaGFuZ2VFdmVudChmaWxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLiNlbWl0RmlsZUNoYW5nZUV2ZW50KGZpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICNoYW5kbGVGaWxlcyhmaWxlTGlzdD86IEZpbGVMaXN0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChmaWxlTGlzdCkge1xuICAgICAgY29uc3QgZmlsZXM6IFNreUZpbGVJdGVtW10gPSBbXTtcblxuICAgICAgaWYgKCdpdGVtJyBpbiBmaWxlTGlzdCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmlsZUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgICBmaWxlOiBmaWxlTGlzdC5pdGVtKGluZGV4KSxcbiAgICAgICAgICB9IGFzIFNreUZpbGVJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9jZXNzZWRGaWxlcyA9IHRoaXMuI2ZpbGVBdHRhY2htZW50U2VydmljZS5jaGVja0ZpbGVzKFxuICAgICAgICBmaWxlcyxcbiAgICAgICAgdGhpcy5taW5GaWxlU2l6ZSxcbiAgICAgICAgdGhpcy5tYXhGaWxlU2l6ZSxcbiAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVzLFxuICAgICAgICB0aGlzLnZhbGlkYXRlRm4sXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgcHJvY2Vzc2VkRmlsZXMpIHtcbiAgICAgICAgaWYgKGZpbGUuZXJyb3JUeXBlKSB7XG4gICAgICAgICAgdGhpcy4jZW1pdEZpbGVDaGFuZ2VFdmVudChmaWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2b2lkIHRoaXMuI2xvYWRGaWxlKGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3NldEZpbGVOYW1lKGZpbGU/OiBTa3lGaWxlSXRlbSk6IHZvaWQge1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBjb25zdCBkcm9wTmFtZSA9XG4gICAgICAgIHRoaXMuI2ZpbGVJdGVtU2VydmljZS5pc0ZpbGUoZmlsZSkgJiYgZmlsZS5maWxlLm5hbWVcbiAgICAgICAgICA/IGZpbGUuZmlsZS5uYW1lXG4gICAgICAgICAgOiBmaWxlLnVybDtcblxuICAgICAgdGhpcy5maWxlTmFtZSA9IGRyb3BOYW1lO1xuXG4gICAgICBpZiAoZHJvcE5hbWUubGVuZ3RoID4gMjYpIHtcbiAgICAgICAgdGhpcy50cnVuY2F0ZWRGaWxlTmFtZSA9IGRyb3BOYW1lLnNsaWNlKDAsIDI2KSArICcuLi4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cnVuY2F0ZWRGaWxlTmFtZSA9IGRyb3BOYW1lO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbGVOYW1lID0gJyc7XG4gICAgICB0aGlzLnRydW5jYXRlZEZpbGVOYW1lID0gJyc7XG4gICAgfVxuICB9XG5cbiAgI3VwZGF0ZUZpbGVBdHRhY2htZW50QnV0dG9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0ZpbGVBdHRhY2htZW50QnV0dG9uID0gIShcbiAgICAgIHRoaXMudmFsdWUgJiYgdGhpcy5jdXJyZW50VGhlbWVOYW1lID09PSAnbW9kZXJuJ1xuICAgICk7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICNvbkNoYW5nZSA9IChfOiBhbnkpOiB2b2lkID0+IHtcbiAgICByZXR1cm47XG4gIH07XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICNvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgcmV0dXJuO1xuICB9O1xufVxuIiwiPGRpdiBjbGFzcz1cInNreS1maWxlLWF0dGFjaG1lbnQtd3JhcHBlclwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LWxhYmVsLXdyYXBwZXJcIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICdza3ktY29udHJvbC1sYWJlbC1yZXF1aXJlZCc6XG4gICAgICAgICFsYWJlbFRleHQgJiYgaXNSZXF1aXJlZCAmJiBoYXNMYWJlbENvbXBvbmVudFxuICAgIH1cIlxuICA+XG4gICAgQGlmIChsYWJlbFRleHQpIHtcbiAgICAgIEBpZiAoIWxhYmVsSGlkZGVuKSB7XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJza3ktY29udHJvbC1sYWJlbFwiXG4gICAgICAgICAgW2F0dHIuaWRdPVwibGFiZWxJZFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ3NreS1jb250cm9sLWxhYmVsLXJlcXVpcmVkJzogaXNSZXF1aXJlZFxuICAgICAgICAgIH1cIlxuICAgICAgICAgID57eyBsYWJlbFRleHQgfX08L3NwYW5cbiAgICAgICAgPlxuICAgICAgfVxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2t5LWZpbGUtYXR0YWNobWVudC1sYWJlbFwiIC8+XG4gICAgfVxuICAgIEBpZiAoaXNSZXF1aXJlZCAmJiAoaGFzTGFiZWxDb21wb25lbnQgfHwgbGFiZWxUZXh0KSkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJza3ktc2NyZWVuLXJlYWRlci1vbmx5XCI+e3tcbiAgICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9yZXF1aXJlZCcgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgIH19PC9zcGFuPlxuICAgIH1cbiAgICBAaWYgKGxhYmVsVGV4dCAmJiAoaGVscFBvcG92ZXJDb250ZW50IHx8IGhlbHBLZXkpKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cInNreS1jb250cm9sLWhlbHAtY29udGFpbmVyXCI+XG4gICAgICAgIDxza3ktaGVscC1pbmxpbmVcbiAgICAgICAgICBbbGFiZWxUZXh0XT1cImxhYmVsVGV4dFwiXG4gICAgICAgICAgW2hlbHBLZXldPVwiaGVscEtleVwiXG4gICAgICAgICAgW3BvcG92ZXJUaXRsZV09XCJoZWxwUG9wb3ZlclRpdGxlXCJcbiAgICAgICAgICBbcG9wb3ZlckNvbnRlbnRdPVwiaGVscFBvcG92ZXJDb250ZW50XCJcbiAgICAgICAgLz5cbiAgICAgIDwvc3Bhbj5cbiAgICB9XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LXVwbG9hZCBza3ktZmlsZS1hdHRhY2htZW50IHNreS1maWxlLWF0dGFjaG1lbnQtdGFyZ2V0XCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnc2t5LWZpbGUtYXR0YWNobWVudC1hY2NlcHQnOiBhY2NlcHRlZE92ZXIsXG4gICAgICAnc2t5LWZpbGUtYXR0YWNobWVudC1yZWplY3QnOiByZWplY3RlZE92ZXJcbiAgICB9XCJcbiAgICAoZHJhZ2VudGVyKT1cImZpbGVEcmFnRW50ZXIoJGV2ZW50KVwiXG4gICAgKGRyYWdvdmVyKT1cImZpbGVEcmFnT3ZlcigkZXZlbnQpXCJcbiAgICAoZHJhZ2xlYXZlKT1cImZpbGVEcmFnTGVhdmUoJGV2ZW50KVwiXG4gICAgKGRyb3ApPVwiZmlsZURyb3AoJGV2ZW50KVwiXG4gID5cbiAgICA8ZGl2XG4gICAgICAjZmlsZURyb3BEZXNjcmlwdGlvblJlZj1cInNreUlkXCJcbiAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICBjbGFzcz1cInNreS1zY3JlZW4tcmVhZGVyLW9ubHlcIlxuICAgICAgcm9sZT1cInRvb2x0aXBcIlxuICAgICAgc2t5SWRcbiAgICA+XG4gICAgICB7eyAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2ZpbGVfdXBsb2FkX2RyYWdfb3JfY2xpY2snIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgPC9kaXY+XG4gICAgPGlucHV0XG4gICAgICAjZmlsZUlucHV0UmVmXG4gICAgICBoaWRkZW5cbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgW2F0dHIuYWNjZXB0XT1cImFjY2VwdGVkVHlwZXMgfHwgbnVsbFwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3JlcXVpcmVkXT1cImlzUmVxdWlyZWRcIlxuICAgICAgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgLz5cbiAgICBAaWYgKHNob3dGaWxlQXR0YWNobWVudEJ1dHRvbikge1xuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInNreS1maWxlLWF0dGFjaG1lbnQtYnRuIHNreS1idG4gc2t5LWJ0bi1kZWZhdWx0XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiXG4gICAgICAgICAgaGludFRleHQgJiYgaGludFRleHRFbC5pZFxuICAgICAgICAgICAgfCBza3lGaWxlQXR0YWNobWVudEpvaW5JZHM6IGZpbGVEcm9wRGVzY3JpcHRpb25SZWYuaWRcbiAgICAgICAgXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxuICAgICAgICAgIGF0dGFjaEJ1dHRvbkxhYmVsUmVmLmlkXG4gICAgICAgICAgICB8IHNreUZpbGVBdHRhY2htZW50Sm9pbklkc1xuICAgICAgICAgICAgICA6IChsYWJlbFRleHRcbiAgICAgICAgICAgICAgICAgID8gbGFiZWxJZFxuICAgICAgICAgICAgICAgICAgOiBsYWJlbENvbXBvbmVudHM/LmdldCgwKT8ubGFiZWxDb250ZW50SWQ/LmlkKVxuICAgICAgICBcIlxuICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiISEobmdDb250cm9sPy5lcnJvcnMgPz8gZmlsZUVycm9yVmFsaWRhdGlvbilcIlxuICAgICAgICBbYXR0ci5hcmlhLWVycm9ybWVzc2FnZV09XCJcbiAgICAgICAgICAhIShuZ0NvbnRyb2w/LmVycm9ycyA/PyBmaWxlRXJyb3JWYWxpZGF0aW9uKSA/IGVycm9ySWQgOiB1bmRlZmluZWRcbiAgICAgICAgXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uRHJvcENsaWNrZWQoKVwiXG4gICAgICAgIChibHVyKT1cIm9uQnV0dG9uQmx1cigpXCJcbiAgICAgID5cbiAgICAgICAgPHNreS1pY29uIGljb249XCJmb2xkZXItb3Blbi1vXCIgLz5cbiAgICAgICAge3tcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgPyAoJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9idXR0b25fbGFiZWxfcmVwbGFjZV9maWxlJ1xuICAgICAgICAgICAgICB8IHNreUxpYlJlc291cmNlcylcbiAgICAgICAgICAgIDogKCdza3l1eF9maWxlX2F0dGFjaG1lbnRfYnV0dG9uX2xhYmVsX2Nob29zZV9maWxlJ1xuICAgICAgICAgICAgICB8IHNreUxpYlJlc291cmNlcylcbiAgICAgICAgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgICBAaWYgKHZhbHVlICYmICFpc0ltYWdlICYmIGN1cnJlbnRUaGVtZU5hbWUgPT09ICdtb2Rlcm4nKSB7XG4gICAgICA8c2t5LWljb24gY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LWljb25cIiBpY29uPVwiZmlsZS1vXCIgLz5cbiAgICB9XG4gICAgQGlmICh2YWx1ZSB8fCBjdXJyZW50VGhlbWVOYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgIDxzcGFuIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1maWxlLWxpbmtcIj5cbiAgICAgICAgQGlmICh2YWx1ZSkge1xuICAgICAgICAgIDxhXG4gICAgICAgICAgICBbaHJlZl09XCJpc0RhdGEgPyB2YWx1ZS51cmwgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW2Rvd25sb2FkXT1cImlzRGF0YSA/IHZhbHVlLmZpbGUubmFtZSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICBbYXR0ci50aXRsZV09XCJmaWxlTmFtZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZW1pdENsaWNrKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHRydW5jYXRlZEZpbGVOYW1lIH19XG4gICAgICAgICAgPC9hPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNreS1maWxlLWF0dGFjaG1lbnQtbm9uZSBza3ktZm9udC1kZWVtcGhhc2l6ZWRcIj5cbiAgICAgICAgICAgIHt7ICdza3l1eF9maWxlX2F0dGFjaG1lbnRfbGFiZWxfbm9fZmlsZV9jaG9zZW4nIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L3NwYW4+XG4gICAgfVxuXG4gICAgQGlmICh2YWx1ZSkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1pY29uLWJvcmRlcmxlc3Mgc2t5LWZpbGUtYXR0YWNobWVudC1kZWxldGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxuICAgICAgICAgIGRlbGV0ZUJ1dHRvbkxhYmVsUmVmLmlkXG4gICAgICAgICAgICB8IHNreUZpbGVBdHRhY2htZW50Sm9pbklkc1xuICAgICAgICAgICAgICA6IChsYWJlbFRleHRcbiAgICAgICAgICAgICAgICAgID8gbGFiZWxJZFxuICAgICAgICAgICAgICAgICAgOiBsYWJlbENvbXBvbmVudHM/LmdldCgwKT8ubGFiZWxDb250ZW50SWQ/LmlkKVxuICAgICAgICBcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwiZGVsZXRlRmlsZUF0dGFjaG1lbnQoKVwiXG4gICAgICA+XG4gICAgICAgIDxza3ktaWNvbiBpY29uPVwidHJhc2gtb1wiIHNpemU9XCJtZFwiIC8+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIEBpZiAodmFsdWUgJiYgaXNJbWFnZSkge1xuICAgIDxpbWdcbiAgICAgIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1wcmV2aWV3LWltZ1wiXG4gICAgICBbYWx0XT1cIlxuICAgICAgICAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2ZpbGVfdXBsb2FkX2ltYWdlX3ByZXZpZXdfYWx0X3RleHQnXG4gICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgIFwiXG4gICAgICBbc3JjXT1cInZhbHVlLnVybFwiXG4gICAgLz5cbiAgfVxuPC9kaXY+XG48ZGl2ICNoaW50VGV4dEVsPVwic2t5SWRcIiBza3lJZD5cbiAgQGlmIChoaW50VGV4dCkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1oaW50LXRleHRcIlxuICAgICAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICAgICAnc2t5LWZvbnQtZGVlbXBoYXNpemVkJzogJ2RlZmF1bHQnLFxuICAgICAgICAnc2t5LWZvbnQtaGludC10ZXh0LXMnOiAnbW9kZXJuJ1xuICAgICAgfVwiXG4gICAgPlxuICAgICAge3sgaGludFRleHQgfX1cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbjxza3ktZm9ybS1lcnJvcnNcbiAgW2lkXT1cImVycm9ySWRcIlxuICBbZXJyb3JzXT1cIm5nQ29udHJvbD8uZXJyb3JzXCJcbiAgW2xhYmVsVGV4dF09XCJsYWJlbFRleHRcIlxuICBbdG91Y2hlZF09XCJuZ0NvbnRyb2w/LnRvdWNoZWRcIlxuICBbZGlydHldPVwibmdDb250cm9sPy5kaXJ0eVwiXG4+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cInNreS1mb3JtLWVycm9yXCIgLz5cbiAgQGlmIChuZ0NvbnRyb2w/LnRvdWNoZWQpIHtcbiAgICBAaWYgKGZpbGVFcnJvck5hbWUgPT09ICdmaWxlVHlwZScpIHtcbiAgICAgIDxza3ktZm9ybS1lcnJvclxuICAgICAgICBlcnJvck5hbWU9XCJmaWxlVHlwZVwiXG4gICAgICAgIFtlcnJvclRleHRdPVwiXG4gICAgICAgICAgYWNjZXB0ZWRUeXBlc0Vycm9yTWVzc2FnZSA/P1xuICAgICAgICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9maWxlX3R5cGVfZXJyb3JfbGFiZWxfdGV4dCdcbiAgICAgICAgICAgIHwgc2t5TGliUmVzb3VyY2VzOiBmaWxlRXJyb3JQYXJhbVxuICAgICAgICBcIlxuICAgICAgLz5cbiAgICB9IEBlbHNlIGlmIChmaWxlRXJyb3JOYW1lID09PSAnbWF4RmlsZVNpemUnKSB7XG4gICAgICA8c2t5LWZvcm0tZXJyb3JcbiAgICAgICAgZXJyb3JOYW1lPVwibWF4RmlsZVNpemVcIlxuICAgICAgICBbZXJyb3JUZXh0XT1cIlxuICAgICAgICAgICdza3l1eF9maWxlX2F0dGFjaG1lbnRfbWF4X2ZpbGVfc2l6ZV9lcnJvcl9sYWJlbF90ZXh0J1xuICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXM6IChmaWxlRXJyb3JQYXJhbSB8IHNreUZpbGVTaXplKVxuICAgICAgICBcIlxuICAgICAgLz5cbiAgICB9IEBlbHNlIGlmIChmaWxlRXJyb3JOYW1lID09PSAnbWluRmlsZVNpemUnKSB7XG4gICAgICA8c2t5LWZvcm0tZXJyb3JcbiAgICAgICAgZXJyb3JOYW1lPVwibWluRmlsZVNpemVcIlxuICAgICAgICBbZXJyb3JUZXh0XT1cIlxuICAgICAgICAgICdza3l1eF9maWxlX2F0dGFjaG1lbnRfbWluX2ZpbGVfc2l6ZV9lcnJvcl9sYWJlbF90ZXh0J1xuICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXM6IChmaWxlRXJyb3JQYXJhbSB8IHNreUZpbGVTaXplKVxuICAgICAgICBcIlxuICAgICAgLz5cbiAgICB9XG4gIH1cbjwvc2t5LWZvcm0tZXJyb3JzPlxuXG48c3BhblxuICAjYXR0YWNoQnV0dG9uTGFiZWxSZWY9XCJza3lJZFwiXG4gIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gIGNsYXNzPVwic2t5LXNjcmVlbi1yZWFkZXItb25seVwiXG4gIHNreUlkXG4+XG4gIHt7XG4gICAgdmFsdWVcbiAgICAgID8gKCdza3l1eF9maWxlX2F0dGFjaG1lbnRfYnV0dG9uX2xhYmVsX3JlcGxhY2VfZmlsZV9sYWJlbCdcbiAgICAgICAgfCBza3lMaWJSZXNvdXJjZXM6IGZpbGVOYW1lKVxuICAgICAgOiAoJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9idXR0b25fbGFiZWxfY2hvb3NlX2ZpbGVfbGFiZWwnXG4gICAgICAgIHwgc2t5TGliUmVzb3VyY2VzKVxuICB9fVxuPC9zcGFuPlxuXG48c3BhblxuICAjZGVsZXRlQnV0dG9uTGFiZWxSZWY9XCJza3lJZFwiXG4gIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gIGNsYXNzPVwic2t5LXNjcmVlbi1yZWFkZXItb25seVwiXG4gIHNreUlkXG4+XG4gIHt7ICdza3l1eF9maWxlX2F0dGFjaG1lbnRfZmlsZV9pdGVtX3JlbW92ZScgfCBza3lMaWJSZXNvdXJjZXM6IGZpbGVOYW1lIH19XG48L3NwYW4+XG4iXX0=
|