@rivet-health/design-system 40.8.0 → 40.9.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/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +78 -19
- package/esm2020/lib/table/table/clipboard.mjs +182 -0
- package/esm2020/lib/table/table/table/table.component.mjs +35 -2
- package/fesm2015/rivet-health-design-system.mjs +291 -18
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +289 -18
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/lib/navigation/editable-heading/editable-heading.component.d.ts +42 -8
- package/lib/table/table/clipboard.d.ts +38 -0
- package/lib/table/table/table/table.component.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "@angular/common";
|
|
4
4
|
import * as i2 from "../../input/button/button.component";
|
|
5
|
-
import * as i3 from "../../
|
|
5
|
+
import * as i3 from "../../input/text-field/text-field.component";
|
|
6
|
+
import * as i4 from "../../format/truncate/truncate.component";
|
|
6
7
|
/**
|
|
7
8
|
* A borderless heading with a click-to-edit title and an optional
|
|
8
9
|
* click-to-edit description, plus a projected slot for actions.
|
|
@@ -21,12 +22,10 @@ import * as i3 from "../../format/truncate/truncate.component";
|
|
|
21
22
|
* "commit" framing over "change" is deliberate: consumers that persist on
|
|
22
23
|
* commit (analytics, PATCH) treat the gesture itself as the event; those
|
|
23
24
|
* that only care about diffs can compare `next === current` in the handler.
|
|
24
|
-
* There is no cancel path.
|
|
25
25
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* than changing outside-click's meaning.
|
|
26
|
+
* Escape cancels: reverts the draft back to the current value and drops out
|
|
27
|
+
* of edit mode WITHOUT emitting a change. Outside-click still commits (to
|
|
28
|
+
* match `riv-date` / `riv-select`); Escape is the deliberate abandon path.
|
|
30
29
|
*
|
|
31
30
|
* Value handling follows the same convention as `riv-text-field`: `[title]`
|
|
32
31
|
* and `[description]` are treated as suggestions, not authoritative state.
|
|
@@ -35,6 +34,12 @@ import * as i3 from "../../format/truncate/truncate.component";
|
|
|
35
34
|
* a different value. That lets the component demo out of the box (e.g. in
|
|
36
35
|
* Storybook) without requiring a round trip through the parent.
|
|
37
36
|
*
|
|
37
|
+
* Programmatic entry into edit mode is available via `startEditingTitle()`
|
|
38
|
+
* and `startEditingDescription()` — obtain a reference with
|
|
39
|
+
* `@ViewChild(EditableHeadingComponent)`. Use these for secondary entry
|
|
40
|
+
* points like a kebab-menu "Rename" item, or to auto-open rename after
|
|
41
|
+
* creating a new entity.
|
|
42
|
+
*
|
|
38
43
|
* The component owns no border, background, or card chrome — consumers who
|
|
39
44
|
* want a bordered container should wrap it.
|
|
40
45
|
*
|
|
@@ -71,6 +76,15 @@ export class EditableHeadingComponent {
|
|
|
71
76
|
get description() {
|
|
72
77
|
return this._description;
|
|
73
78
|
}
|
|
79
|
+
set disabled(v) {
|
|
80
|
+
this._disabled = v;
|
|
81
|
+
if (v && this.mode !== 'view')
|
|
82
|
+
this.cancel();
|
|
83
|
+
this.cdr.markForCheck();
|
|
84
|
+
}
|
|
85
|
+
get disabled() {
|
|
86
|
+
return this._disabled;
|
|
87
|
+
}
|
|
74
88
|
constructor(cdr, host) {
|
|
75
89
|
this.cdr = cdr;
|
|
76
90
|
this.host = host;
|
|
@@ -79,6 +93,13 @@ export class EditableHeadingComponent {
|
|
|
79
93
|
this._description = '';
|
|
80
94
|
this.titleMaxLength = 100;
|
|
81
95
|
this.descriptionMaxLength = 300;
|
|
96
|
+
/**
|
|
97
|
+
* When true, the title and description are not clickable and cannot be
|
|
98
|
+
* edited. Any in-progress edit is dropped without emitting. Imperative
|
|
99
|
+
* `startEditing*` calls no-op. Useful for consumers that need to gate
|
|
100
|
+
* editing on a permission or a broader "actions disabled" state.
|
|
101
|
+
*/
|
|
102
|
+
this._disabled = false;
|
|
82
103
|
this.titleChange = new EventEmitter();
|
|
83
104
|
this.descriptionChange = new EventEmitter();
|
|
84
105
|
this.mode = 'view';
|
|
@@ -88,15 +109,38 @@ export class EditableHeadingComponent {
|
|
|
88
109
|
get isEditing() {
|
|
89
110
|
return this.mode !== 'view';
|
|
90
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Enter title-edit mode programmatically. Same behavior as clicking the
|
|
114
|
+
* title — populates the edit buffer from the current value, focuses the
|
|
115
|
+
* input with the caret at the end, and hides the actions slot. No-op if
|
|
116
|
+
* already in an editing mode or when the component is disabled.
|
|
117
|
+
*
|
|
118
|
+
* Intended for consumers that offer a secondary entry point to renaming
|
|
119
|
+
* (e.g. a kebab menu item), or that want to auto-open rename after
|
|
120
|
+
* creating a new entity. Bind via `@ViewChild(EditableHeadingComponent)`.
|
|
121
|
+
*/
|
|
91
122
|
startEditingTitle() {
|
|
123
|
+
if (this.disabled || this.mode !== 'view')
|
|
124
|
+
return;
|
|
92
125
|
this.draftTitle = this.title;
|
|
93
126
|
this.mode = 'editingTitle';
|
|
127
|
+
// `markForCheck` so consumers can call this from outside Angular's zone
|
|
128
|
+
// (e.g. an async callback) without having to trigger CD themselves.
|
|
129
|
+
this.cdr.markForCheck();
|
|
94
130
|
// Defer focus until Angular has rendered the input into the DOM.
|
|
95
131
|
setTimeout(() => this.focusEnd(this.titleInputRef), 0);
|
|
96
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Enter description-edit mode programmatically. Same behavior as clicking
|
|
135
|
+
* the description (or the "+ Add description" button). No-op if already
|
|
136
|
+
* in an editing mode or when the component is disabled.
|
|
137
|
+
*/
|
|
97
138
|
startEditingDescription() {
|
|
139
|
+
if (this.disabled || this.mode !== 'view')
|
|
140
|
+
return;
|
|
98
141
|
this.draftDescription = this.description;
|
|
99
142
|
this.mode = 'editingDescription';
|
|
143
|
+
this.cdr.markForCheck();
|
|
100
144
|
setTimeout(() => this.focusEnd(this.descriptionInputRef), 0);
|
|
101
145
|
}
|
|
102
146
|
commitTitle() {
|
|
@@ -122,6 +166,18 @@ export class EditableHeadingComponent {
|
|
|
122
166
|
this.mode = 'view';
|
|
123
167
|
this.descriptionChange.emit(value);
|
|
124
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Abandon the current edit and return to view mode. No change is emitted.
|
|
171
|
+
* Wired to the Escape key on both edit inputs; also called internally
|
|
172
|
+
* when `disabled` flips to true mid-edit.
|
|
173
|
+
*/
|
|
174
|
+
cancel() {
|
|
175
|
+
if (this.mode === 'view')
|
|
176
|
+
return;
|
|
177
|
+
this.draftTitle = this._title;
|
|
178
|
+
this.draftDescription = this._description;
|
|
179
|
+
this.mode = 'view';
|
|
180
|
+
}
|
|
125
181
|
// Listens on `mousedown` (not `click`) so the check runs before Angular
|
|
126
182
|
// re-renders the trigger element out of the DOM — otherwise
|
|
127
183
|
// `host.contains(target)` returns false for a click that landed on the
|
|
@@ -139,23 +195,24 @@ export class EditableHeadingComponent {
|
|
|
139
195
|
this.commitDescription();
|
|
140
196
|
}
|
|
141
197
|
}
|
|
142
|
-
//
|
|
143
|
-
//
|
|
198
|
+
// Position caret at end (rather than selecting all) so the user can continue
|
|
199
|
+
// typing where the previous value left off. `riv-text-field` handles the
|
|
200
|
+
// focus itself via `[autoFocus]`; we just fix up the selection range on the
|
|
201
|
+
// descendant `<input>`.
|
|
144
202
|
focusEnd(ref) {
|
|
145
|
-
const
|
|
146
|
-
if (!
|
|
203
|
+
const input = ref?.nativeElement.querySelector('input');
|
|
204
|
+
if (!input)
|
|
147
205
|
return;
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
el.setSelectionRange(len, len);
|
|
206
|
+
const len = input.value.length;
|
|
207
|
+
input.setSelectionRange(len, len);
|
|
151
208
|
this.cdr.markForCheck();
|
|
152
209
|
}
|
|
153
210
|
}
|
|
154
211
|
EditableHeadingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditableHeadingComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
155
|
-
EditableHeadingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EditableHeadingComponent, selector: "riv-editable-heading", inputs: { title: "title", description: "description", titleMaxLength: "titleMaxLength", descriptionMaxLength: "descriptionMaxLength" }, outputs: { titleChange: "titleChange", descriptionChange: "descriptionChange" }, host: { listeners: { "document:mousedown": "onDocumentMouseDown($event.target)" }, properties: { "class.editing": "this.isEditing" } }, viewQueries: [{ propertyName: "titleInputRef", first: true, predicate: ["titleInput"], descendants: true }, { propertyName: "descriptionInputRef", first: true, predicate: ["descriptionInput"], descendants: true }], ngImport: i0, template: "<div class=\"leading\">\n <ng-container [ngSwitch]=\"mode\">\n <!-- View mode -->\n <ng-container *ngSwitchDefault>\n <button\n type=\"button\"\n class=\"title\"\n [class.has-description]=\"description\"\n rivTruncate\n aria-label=\"Rename\"\n (click)=\"startEditingTitle()\"\n >\n {{ title || 'Untitled' }}\n </button>\n\n <div class=\"divider\"></div>\n\n <button\n *ngIf=\"description; else addDescription\"\n type=\"button\"\n class=\"description\"\n rivTruncate\n aria-label=\"Edit description\"\n (click)=\"startEditingDescription()\"\n >\n {{ description }}\n </button>\n\n <ng-template #addDescription>\n <div class=\"add-description-wrap\">\n <button\n rivButton\n [variant]=\"'ghost'\"\n [size]=\"'xsmall'\"\n [icon]=\"'Plus'\"\n [iconPosition]=\"'first'\"\n type=\"button\"\n (click)=\"startEditingDescription()\"\n >\n Add description\n </button>\n </div>\n </ng-template>\n </ng-container>\n\n
|
|
212
|
+
EditableHeadingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EditableHeadingComponent, selector: "riv-editable-heading", inputs: { title: "title", description: "description", titleMaxLength: "titleMaxLength", descriptionMaxLength: "descriptionMaxLength", disabled: "disabled" }, outputs: { titleChange: "titleChange", descriptionChange: "descriptionChange" }, host: { listeners: { "document:mousedown": "onDocumentMouseDown($event.target)" }, properties: { "class.editing": "this.isEditing" } }, viewQueries: [{ propertyName: "titleInputRef", first: true, predicate: ["titleInput"], descendants: true, read: ElementRef }, { propertyName: "descriptionInputRef", first: true, predicate: ["descriptionInput"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"leading\">\n <ng-container [ngSwitch]=\"mode\">\n <!-- View mode -->\n <ng-container *ngSwitchDefault>\n <button\n type=\"button\"\n class=\"title\"\n [class.has-description]=\"description\"\n [disabled]=\"disabled\"\n rivTruncate\n aria-label=\"Rename\"\n (click)=\"startEditingTitle()\"\n >\n {{ title || 'Untitled' }}\n </button>\n\n <div class=\"divider\"></div>\n\n <button\n *ngIf=\"description; else addDescription\"\n type=\"button\"\n class=\"description\"\n [disabled]=\"disabled\"\n rivTruncate\n aria-label=\"Edit description\"\n (click)=\"startEditingDescription()\"\n >\n {{ description }}\n </button>\n\n <ng-template #addDescription>\n <div class=\"add-description-wrap\" *ngIf=\"!disabled\">\n <button\n rivButton\n [variant]=\"'ghost'\"\n [size]=\"'xsmall'\"\n [icon]=\"'Plus'\"\n [iconPosition]=\"'first'\"\n type=\"button\"\n (click)=\"startEditingDescription()\"\n >\n Add description\n </button>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'editingTitle'\">\n <riv-text-field\n #titleInput\n class=\"title-input\"\n [value]=\"draftTitle\"\n [maxLength]=\"titleMaxLength\"\n [autoFocus]=\"true\"\n (valueChange)=\"draftTitle = $event\"\n (keydown.enter)=\"commitTitle()\"\n (keydown.escape)=\"cancel()\"\n ></riv-text-field>\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n [disabled]=\"!draftTitle\"\n (click)=\"commitTitle()\"\n aria-label=\"Save title\"\n ></button>\n </ng-container>\n\n <!-- Editing description -->\n <ng-container *ngSwitchCase=\"'editingDescription'\">\n <riv-text-field\n #descriptionInput\n class=\"description-input\"\n placeholder=\"Add a description\"\n [value]=\"draftDescription\"\n [maxLength]=\"descriptionMaxLength\"\n [autoFocus]=\"true\"\n (valueChange)=\"draftDescription = $event\"\n (keydown.enter)=\"commitDescription()\"\n (keydown.escape)=\"cancel()\"\n ></riv-text-field>\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n (click)=\"commitDescription()\"\n aria-label=\"Save description\"\n ></button>\n </ng-container>\n </ng-container>\n</div>\n\n<div class=\"actions\" *ngIf=\"!isEditing\">\n <ng-content select=\"[actions]\"></ng-content>\n</div>\n", styles: [":host{display:flex;align-items:stretch;gap:var(--size-large);min-height:calc(var(--base-grid-size) * 8);font:var(--body-medium)}.leading{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:var(--size-small)}.title,.description{padding:0;border:none;background:none;text-align:left;cursor:pointer;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.title:disabled,.description:disabled{cursor:default}.title{font:var(--stat-xsmall);line-height:calc(var(--base-grid-size) * 4.5);color:var(--type-light-high-contrast);max-width:100%}.title.has-description{width:-moz-fit-content;width:fit-content;max-width:50%;flex-shrink:0}.description{font:var(--input-small);line-height:calc(var(--base-grid-size) * 3.5);color:var(--type-light-low-contrast);flex:1 1 auto}.divider{align-self:stretch;border-right:var(--border-width) solid var(--border-light);margin:0 var(--base-grid-size) 0 0;flex-shrink:0}.add-description-wrap{flex-shrink:0}.title-input,.description-input{flex:1 1 auto;min-width:0}.commit{flex-shrink:0}.actions{display:flex;align-items:center;gap:var(--size-small);flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i3.TextFieldComponent, selector: "riv-text-field", inputs: ["disabled", "readonly", "placeholder", "casing", "type", "size", "autoFocus", "name", "minLength", "maxLength", "value"], outputs: ["valueChange", "blur"] }, { kind: "component", type: i4.TruncateComponent, selector: "[rivTruncate]", inputs: ["maxTooltipWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
156
213
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditableHeadingComponent, decorators: [{
|
|
157
214
|
type: Component,
|
|
158
|
-
args: [{ selector: 'riv-editable-heading', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"leading\">\n <ng-container [ngSwitch]=\"mode\">\n <!-- View mode -->\n <ng-container *ngSwitchDefault>\n <button\n type=\"button\"\n class=\"title\"\n [class.has-description]=\"description\"\n rivTruncate\n aria-label=\"Rename\"\n (click)=\"startEditingTitle()\"\n >\n {{ title || 'Untitled' }}\n </button>\n\n <div class=\"divider\"></div>\n\n <button\n *ngIf=\"description; else addDescription\"\n type=\"button\"\n class=\"description\"\n rivTruncate\n aria-label=\"Edit description\"\n (click)=\"startEditingDescription()\"\n >\n {{ description }}\n </button>\n\n <ng-template #addDescription>\n <div class=\"add-description-wrap\">\n <button\n rivButton\n [variant]=\"'ghost'\"\n [size]=\"'xsmall'\"\n [icon]=\"'Plus'\"\n [iconPosition]=\"'first'\"\n type=\"button\"\n (click)=\"startEditingDescription()\"\n >\n Add description\n </button>\n </div>\n </ng-template>\n </ng-container>\n\n
|
|
215
|
+
args: [{ selector: 'riv-editable-heading', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"leading\">\n <ng-container [ngSwitch]=\"mode\">\n <!-- View mode -->\n <ng-container *ngSwitchDefault>\n <button\n type=\"button\"\n class=\"title\"\n [class.has-description]=\"description\"\n [disabled]=\"disabled\"\n rivTruncate\n aria-label=\"Rename\"\n (click)=\"startEditingTitle()\"\n >\n {{ title || 'Untitled' }}\n </button>\n\n <div class=\"divider\"></div>\n\n <button\n *ngIf=\"description; else addDescription\"\n type=\"button\"\n class=\"description\"\n [disabled]=\"disabled\"\n rivTruncate\n aria-label=\"Edit description\"\n (click)=\"startEditingDescription()\"\n >\n {{ description }}\n </button>\n\n <ng-template #addDescription>\n <div class=\"add-description-wrap\" *ngIf=\"!disabled\">\n <button\n rivButton\n [variant]=\"'ghost'\"\n [size]=\"'xsmall'\"\n [icon]=\"'Plus'\"\n [iconPosition]=\"'first'\"\n type=\"button\"\n (click)=\"startEditingDescription()\"\n >\n Add description\n </button>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'editingTitle'\">\n <riv-text-field\n #titleInput\n class=\"title-input\"\n [value]=\"draftTitle\"\n [maxLength]=\"titleMaxLength\"\n [autoFocus]=\"true\"\n (valueChange)=\"draftTitle = $event\"\n (keydown.enter)=\"commitTitle()\"\n (keydown.escape)=\"cancel()\"\n ></riv-text-field>\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n [disabled]=\"!draftTitle\"\n (click)=\"commitTitle()\"\n aria-label=\"Save title\"\n ></button>\n </ng-container>\n\n <!-- Editing description -->\n <ng-container *ngSwitchCase=\"'editingDescription'\">\n <riv-text-field\n #descriptionInput\n class=\"description-input\"\n placeholder=\"Add a description\"\n [value]=\"draftDescription\"\n [maxLength]=\"descriptionMaxLength\"\n [autoFocus]=\"true\"\n (valueChange)=\"draftDescription = $event\"\n (keydown.enter)=\"commitDescription()\"\n (keydown.escape)=\"cancel()\"\n ></riv-text-field>\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n (click)=\"commitDescription()\"\n aria-label=\"Save description\"\n ></button>\n </ng-container>\n </ng-container>\n</div>\n\n<div class=\"actions\" *ngIf=\"!isEditing\">\n <ng-content select=\"[actions]\"></ng-content>\n</div>\n", styles: [":host{display:flex;align-items:stretch;gap:var(--size-large);min-height:calc(var(--base-grid-size) * 8);font:var(--body-medium)}.leading{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:var(--size-small)}.title,.description{padding:0;border:none;background:none;text-align:left;cursor:pointer;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.title:disabled,.description:disabled{cursor:default}.title{font:var(--stat-xsmall);line-height:calc(var(--base-grid-size) * 4.5);color:var(--type-light-high-contrast);max-width:100%}.title.has-description{width:-moz-fit-content;width:fit-content;max-width:50%;flex-shrink:0}.description{font:var(--input-small);line-height:calc(var(--base-grid-size) * 3.5);color:var(--type-light-low-contrast);flex:1 1 auto}.divider{align-self:stretch;border-right:var(--border-width) solid var(--border-light);margin:0 var(--base-grid-size) 0 0;flex-shrink:0}.add-description-wrap{flex-shrink:0}.title-input,.description-input{flex:1 1 auto;min-width:0}.commit{flex-shrink:0}.actions{display:flex;align-items:center;gap:var(--size-small);flex-shrink:0}\n"] }]
|
|
159
216
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { title: [{
|
|
160
217
|
type: Input
|
|
161
218
|
}], description: [{
|
|
@@ -164,16 +221,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
164
221
|
type: Input
|
|
165
222
|
}], descriptionMaxLength: [{
|
|
166
223
|
type: Input
|
|
224
|
+
}], disabled: [{
|
|
225
|
+
type: Input
|
|
167
226
|
}], titleChange: [{
|
|
168
227
|
type: Output
|
|
169
228
|
}], descriptionChange: [{
|
|
170
229
|
type: Output
|
|
171
230
|
}], titleInputRef: [{
|
|
172
231
|
type: ViewChild,
|
|
173
|
-
args: ['titleInput']
|
|
232
|
+
args: ['titleInput', { read: ElementRef }]
|
|
174
233
|
}], descriptionInputRef: [{
|
|
175
234
|
type: ViewChild,
|
|
176
|
-
args: ['descriptionInput']
|
|
235
|
+
args: ['descriptionInput', { read: ElementRef }]
|
|
177
236
|
}], isEditing: [{
|
|
178
237
|
type: HostBinding,
|
|
179
238
|
args: ['class.editing']
|
|
@@ -181,4 +240,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
181
240
|
type: HostListener,
|
|
182
241
|
args: ['document:mousedown', ['$event.target']]
|
|
183
242
|
}] } });
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9uYXZpZ2F0aW9uL2VkaXRhYmxlLWhlYWRpbmcvZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9uYXZpZ2F0aW9uL2VkaXRhYmxlLWhlYWRpbmcvZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFFdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvREc7QUFPSCxNQUFNLE9BQU8sd0JBQXdCO0lBR25DLElBQ0ksS0FBSyxDQUFDLENBQVM7UUFDakIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFHRCxJQUNJLFdBQVcsQ0FBQyxDQUFTO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZO1lBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBd0JELFlBQ21CLEdBQXNCLEVBQ3RCLElBQTZCO1FBRDdCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFNBQUks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RSxxREFBcUQ7SUFDN0MsUUFBUSxDQUFDLEdBQWtDO1FBQ2pELE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxhQUFhLENBQUM7UUFDOUIsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBQ2hCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzVCLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOztzSEFqSFUsd0JBQXdCOzBHQUF4Qix3QkFBd0Isb25CQ3hFckMsNHJGQWtHQTs0RkQxQmEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHNCQUFzQixtQkFHZix1QkFBdUIsQ0FBQyxNQUFNO2lJQU0zQyxLQUFLO3NCQURSLEtBQUs7Z0JBVUYsV0FBVztzQkFEZCxLQUFLO2dCQVNOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFJQyxhQUFhO3NCQURwQixTQUFTO3VCQUFDLFlBQVk7Z0JBSWYsbUJBQW1CO3NCQUQxQixTQUFTO3VCQUFDLGtCQUFrQjtnQkFhekIsU0FBUztzQkFEWixXQUFXO3VCQUFDLGVBQWU7Z0JBK0NsQixtQkFBbUI7c0JBRDVCLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEEgYm9yZGVybGVzcyBoZWFkaW5nIHdpdGggYSBjbGljay10by1lZGl0IHRpdGxlIGFuZCBhbiBvcHRpb25hbFxuICogY2xpY2stdG8tZWRpdCBkZXNjcmlwdGlvbiwgcGx1cyBhIHByb2plY3RlZCBzbG90IGZvciBhY3Rpb25zLlxuICpcbiAqIExheW91dDogYFt0aXRsZV0gfCBbZGVzY3JpcHRpb25dICBbYWN0aW9uc11gXG4gKlxuICogLSBDbGljayB0aGUgdGl0bGUgdG8gcmVuYW1lOyBjbGljayB0aGUgZGVzY3JpcHRpb24gKG9yIHRoZSBnaG9zdFxuICogICBcIisgQWRkIGRlc2NyaXB0aW9uXCIgYnV0dG9uIHdoZW4gZW1wdHkpIHRvIGVkaXQgaXQuXG4gKiAtIE9ubHkgb25lIG9mIHRpdGxlIG9yIGRlc2NyaXB0aW9uIGNhbiBiZSBlZGl0ZWQgYXQgYSB0aW1lLlxuICogLSBXaGlsZSBlaXRoZXIgaXMgYmVpbmcgZWRpdGVkLCB0aGUgYFthY3Rpb25zXWAgc2xvdCBpcyBoaWRkZW4gc29cbiAqICAgcHJvamVjdGVkIGNvbnRyb2xzIGRvbid0IGNvbXBldGUgd2l0aCB0aGUgZWRpdCBhZmZvcmRhbmNlLlxuICpcbiAqIENvbW1pdCBzZW1hbnRpY3M6IGB0aXRsZUNoYW5nZWAgLyBgZGVzY3JpcHRpb25DaGFuZ2VgIGZpcmUgd2hlbiB0aGUgdXNlclxuICogY29tbWl0cyDigJQgRW50ZXIsIG91dHNpZGUgY2xpY2ssIG9yIHRoZSBDaGVjayBidXR0b24g4oCUIG5vdCBvbiBldmVyeVxuICoga2V5c3Ryb2tlLCBhbmQgYWx3YXlzIG9uIGNvbW1pdCAoZXZlbiB3aGVuIHRoZSB2YWx1ZSBpcyB1bmNoYW5nZWQpLiBUaGVcbiAqIFwiY29tbWl0XCIgZnJhbWluZyBvdmVyIFwiY2hhbmdlXCIgaXMgZGVsaWJlcmF0ZTogY29uc3VtZXJzIHRoYXQgcGVyc2lzdCBvblxuICogY29tbWl0IChhbmFseXRpY3MsIFBBVENIKSB0cmVhdCB0aGUgZ2VzdHVyZSBpdHNlbGYgYXMgdGhlIGV2ZW50OyB0aG9zZVxuICogdGhhdCBvbmx5IGNhcmUgYWJvdXQgZGlmZnMgY2FuIGNvbXBhcmUgYG5leHQgPT09IGN1cnJlbnRgIGluIHRoZSBoYW5kbGVyLlxuICogVGhlcmUgaXMgbm8gY2FuY2VsIHBhdGguXG4gKlxuICogT3V0c2lkZS1jbGljayBjb21taXRzIChyYXRoZXIgdGhhbiBjYW5jZWxzKSB0byBtYXRjaCB0aGUgZXN0YWJsaXNoZWQgRFNcbiAqIGludGVyYWN0aW9uIHBhdHRlcm4gaW4gYHJpdi1kYXRlYCBhbmQgYHJpdi1zZWxlY3RgLiBJZiBhIGZ1dHVyZSBjb25zdW1lclxuICogbmVlZHMgYW4gYWJhbmRvbiBwYXRoLCB0aGUgc29mdCBmaXJzdCBzdGVwIGlzIEVzY2FwZS10by1jYW5jZWwgcmF0aGVyXG4gKiB0aGFuIGNoYW5naW5nIG91dHNpZGUtY2xpY2sncyBtZWFuaW5nLlxuICpcbiAqIFZhbHVlIGhhbmRsaW5nIGZvbGxvd3MgdGhlIHNhbWUgY29udmVudGlvbiBhcyBgcml2LXRleHQtZmllbGRgOiBgW3RpdGxlXWBcbiAqIGFuZCBgW2Rlc2NyaXB0aW9uXWAgYXJlIHRyZWF0ZWQgYXMgc3VnZ2VzdGlvbnMsIG5vdCBhdXRob3JpdGF0aXZlIHN0YXRlLlxuICogT24gY29tbWl0LCB0aGUgY29tcG9uZW50IGtlZXBzIGRpc3BsYXlpbmcgdGhlIHVzZXIncyBjb21taXR0ZWQgdmFsdWUsXG4gKiBhbmQgb25seSBvdmVyd3JpdGVzIGl0cyBpbnRlcm5hbCBzdGF0ZSB3aGVuIHRoZSBwYXJlbnQgZXhwbGljaXRseSBzZW5kc1xuICogYSBkaWZmZXJlbnQgdmFsdWUuIFRoYXQgbGV0cyB0aGUgY29tcG9uZW50IGRlbW8gb3V0IG9mIHRoZSBib3ggKGUuZy4gaW5cbiAqIFN0b3J5Ym9vaykgd2l0aG91dCByZXF1aXJpbmcgYSByb3VuZCB0cmlwIHRocm91Z2ggdGhlIHBhcmVudC5cbiAqXG4gKiBUaGUgY29tcG9uZW50IG93bnMgbm8gYm9yZGVyLCBiYWNrZ3JvdW5kLCBvciBjYXJkIGNocm9tZSDigJQgY29uc3VtZXJzIHdob1xuICogd2FudCBhIGJvcmRlcmVkIGNvbnRhaW5lciBzaG91bGQgd3JhcCBpdC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8cml2LWVkaXRhYmxlLWhlYWRpbmdcbiAqICAgW3RpdGxlXT1cInJlcG9ydC50aXRsZVwiXG4gKiAgIFtkZXNjcmlwdGlvbl09XCJyZXBvcnQuZGVzY3JpcHRpb25cIlxuICogICAodGl0bGVDaGFuZ2UpPVwib25UaXRsZUNvbW1pdCgkZXZlbnQpXCJcbiAqICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIm9uRGVzY3JpcHRpb25Db21taXQoJGV2ZW50KVwiXG4gKiA+XG4gKiAgIDxyaXYtbWVudSBhY3Rpb25zPlxuICogICAgIDxuZy10ZW1wbGF0ZSAjdHJpZ2dlcj5cbiAqICAgICAgIDxidXR0b24gcml2QnV0dG9uIFtpY29uXT1cIidNb3JlVmVydGljYWwnXCIgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiPjwvYnV0dG9uPlxuICogICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgPGJ1dHRvbiByaXYtbWVudS1pdGVtPlJlbmFtZTwvYnV0dG9uPlxuICogICAgIDxidXR0b24gcml2LW1lbnUtaXRlbT5EdXBsaWNhdGU8L2J1dHRvbj5cbiAqICAgPC9yaXYtbWVudT5cbiAqICAgPGJ1dHRvbiByaXZCdXR0b24gYWN0aW9ucyBbdmFyaWFudF09XCIncHJpbWFyeSdcIj5TYXZlPC9idXR0b24+XG4gKiA8L3Jpdi1lZGl0YWJsZS1oZWFkaW5nPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1lZGl0YWJsZS1oZWFkaW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VkaXRhYmxlLWhlYWRpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1oZWFkaW5nLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEVkaXRhYmxlSGVhZGluZ0NvbXBvbmVudCB7XG4gIC8vIFNlZSB0aGUgXCJWYWx1ZSBoYW5kbGluZ1wiIHNlY3Rpb24gb2YgdGhlIGNsYXNzLWxldmVsIGRvYy5cbiAgcHJvdGVjdGVkIF90aXRsZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpXG4gIHNldCB0aXRsZSh2OiBzdHJpbmcpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5fdGl0bGUpIHRoaXMuX3RpdGxlID0gdjtcbiAgfVxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Rlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KClcbiAgc2V0IGRlc2NyaXB0aW9uKHY6IHN0cmluZykge1xuICAgIGlmICh2ICE9PSB0aGlzLl9kZXNjcmlwdGlvbikgdGhpcy5fZGVzY3JpcHRpb24gPSB2O1xuICB9XG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHRpdGxlTWF4TGVuZ3RoOiBudW1iZXIgPSAxMDA7XG5cbiAgQElucHV0KClcbiAgZGVzY3JpcHRpb25NYXhMZW5ndGg6IG51bWJlciA9IDMwMDtcblxuICBAT3V0cHV0KClcbiAgdGl0bGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAT3V0cHV0KClcbiAgZGVzY3JpcHRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkKCd0aXRsZUlucHV0JylcbiAgcHJpdmF0ZSB0aXRsZUlucHV0UmVmPzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdkZXNjcmlwdGlvbklucHV0JylcbiAgcHJpdmF0ZSBkZXNjcmlwdGlvbklucHV0UmVmPzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwcm90ZWN0ZWQgbW9kZTogJ3ZpZXcnIHwgJ2VkaXRpbmdUaXRsZScgfCAnZWRpdGluZ0Rlc2NyaXB0aW9uJyA9ICd2aWV3JztcbiAgcHJvdGVjdGVkIGRyYWZ0VGl0bGU6IHN0cmluZyA9ICcnO1xuICBwcm90ZWN0ZWQgZHJhZnREZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICkge31cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmVkaXRpbmcnKVxuICBnZXQgaXNFZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgIT09ICd2aWV3JztcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydEVkaXRpbmdUaXRsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYWZ0VGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgIHRoaXMubW9kZSA9ICdlZGl0aW5nVGl0bGUnO1xuICAgIC8vIERlZmVyIGZvY3VzIHVudGlsIEFuZ3VsYXIgaGFzIHJlbmRlcmVkIHRoZSBpbnB1dCBpbnRvIHRoZSBET00uXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzRW5kKHRoaXMudGl0bGVJbnB1dFJlZiksIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RWRpdGluZ0Rlc2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZnREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgdGhpcy5tb2RlID0gJ2VkaXRpbmdEZXNjcmlwdGlvbic7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzRW5kKHRoaXMuZGVzY3JpcHRpb25JbnB1dFJlZiksIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbW1pdFRpdGxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdlZGl0aW5nVGl0bGUnKSByZXR1cm47XG4gICAgLy8gVGl0bGUgY2Fubm90IGJlIGNvbW1pdHRlZCBlbXB0eS4gVGhlIENoZWNrIGJ1dHRvbiBpcyBkaXNhYmxlZCBpbiB0aGF0XG4gICAgLy8gc3RhdGU7IGZvciBFbnRlciBhbmQgb3V0c2lkZS1jbGljayB3ZSByZXZlcnQgdG8gdGhlIGN1cnJlbnQgdGl0bGUgc29cbiAgICAvLyB0aGUgdXNlciBpcyBuZXZlciBzdHVjayBpbiBlZGl0IG1vZGUgd2l0aCBhIHJlamVjdGVkIHZhbHVlLlxuICAgIGlmICghdGhpcy5kcmFmdFRpdGxlKSB7XG4gICAgICB0aGlzLm1vZGUgPSAndmlldyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kcmFmdFRpdGxlO1xuICAgIHRoaXMuX3RpdGxlID0gdmFsdWU7XG4gICAgdGhpcy5tb2RlID0gJ3ZpZXcnO1xuICAgIHRoaXMudGl0bGVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tbWl0RGVzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ2VkaXRpbmdEZXNjcmlwdGlvbicpIHJldHVybjtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZHJhZnREZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMubW9kZSA9ICd2aWV3JztcbiAgICB0aGlzLmRlc2NyaXB0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLy8gTGlzdGVucyBvbiBgbW91c2Vkb3duYCAobm90IGBjbGlja2ApIHNvIHRoZSBjaGVjayBydW5zIGJlZm9yZSBBbmd1bGFyXG4gIC8vIHJlLXJlbmRlcnMgdGhlIHRyaWdnZXIgZWxlbWVudCBvdXQgb2YgdGhlIERPTSDigJQgb3RoZXJ3aXNlXG4gIC8vIGBob3N0LmNvbnRhaW5zKHRhcmdldClgIHJldHVybnMgZmFsc2UgZm9yIGEgY2xpY2sgdGhhdCBsYW5kZWQgb24gdGhlXG4gIC8vIG5vdy1yZW1vdmVkIGAudGl0bGVgIC8gYC5kZXNjcmlwdGlvbmAgZWxlbWVudC4gU2FtZSBwYXR0ZXJuIGFzXG4gIC8vIGByaXYtZGF0ZWAuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsnJGV2ZW50LnRhcmdldCddKVxuICBwcm90ZWN0ZWQgb25Eb2N1bWVudE1vdXNlRG93bih0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICd2aWV3JyB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZWRpdGluZ1RpdGxlJykge1xuICAgICAgdGhpcy5jb21taXRUaXRsZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnZWRpdGluZ0Rlc2NyaXB0aW9uJykge1xuICAgICAgdGhpcy5jb21taXREZXNjcmlwdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZvY3VzIHdpdGggY2FyZXQgYXQgZW5kIChyYXRoZXIgdGhhbiBzZWxlY3RpbmcgYWxsKSBzbyB0aGUgdXNlciBjYW5cbiAgLy8gY29udGludWUgdHlwaW5nIHdoZXJlIHRoZSBwcmV2aW91cyB2YWx1ZSBsZWZ0IG9mZi5cbiAgcHJpdmF0ZSBmb2N1c0VuZChyZWY/OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSByZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGVsLmZvY3VzKCk7XG4gICAgY29uc3QgbGVuID0gZWwudmFsdWUubGVuZ3RoO1xuICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKGxlbiwgbGVuKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxlYWRpbmdcIj5cbiAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwibW9kZVwiPlxuICAgIDwhLS0gVmlldyBtb2RlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwidGl0bGVcIlxuICAgICAgICBbY2xhc3MuaGFzLWRlc2NyaXB0aW9uXT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgcml2VHJ1bmNhdGVcbiAgICAgICAgYXJpYS1sYWJlbD1cIlJlbmFtZVwiXG4gICAgICAgIChjbGljayk9XCJzdGFydEVkaXRpbmdUaXRsZSgpXCJcbiAgICAgID5cbiAgICAgICAge3sgdGl0bGUgfHwgJ1VudGl0bGVkJyB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJkZXNjcmlwdGlvbjsgZWxzZSBhZGREZXNjcmlwdGlvblwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgcml2VHJ1bmNhdGVcbiAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgZGVzY3JpcHRpb25cIlxuICAgICAgICAoY2xpY2spPVwic3RhcnRFZGl0aW5nRGVzY3JpcHRpb24oKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGRlc2NyaXB0aW9uIH19XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNhZGREZXNjcmlwdGlvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFkZC1kZXNjcmlwdGlvbi13cmFwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICBbdmFyaWFudF09XCInZ2hvc3QnXCJcbiAgICAgICAgICAgIFtzaXplXT1cIid4c21hbGwnXCJcbiAgICAgICAgICAgIFtpY29uXT1cIidQbHVzJ1wiXG4gICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cIidmaXJzdCdcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhcnRFZGl0aW5nRGVzY3JpcHRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQWRkIGRlc2NyaXB0aW9uXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRWRpdGluZyB0aXRsZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZWRpdGluZ1RpdGxlJ1wiPlxuICAgICAgPGlucHV0XG4gICAgICAgICN0aXRsZUlucHV0XG4gICAgICAgIGNsYXNzPVwidGl0bGUtaW5wdXRcIlxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJUaXRsZVwiXG4gICAgICAgIFt2YWx1ZV09XCJkcmFmdFRpdGxlXCJcbiAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpdGxlTWF4TGVuZ3RoXCJcbiAgICAgICAgKGlucHV0KT1cImRyYWZ0VGl0bGUgPSB0aXRsZUlucHV0LnZhbHVlXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY29tbWl0VGl0bGUoKVwiXG4gICAgICAvPlxuICAgICAgPGJ1dHRvblxuICAgICAgICByaXZCdXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY29tbWl0XCJcbiAgICAgICAgW3ZhcmlhbnRdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgW2ljb25dPVwiJ0NoZWNrJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhZHJhZnRUaXRsZVwiXG4gICAgICAgIChjbGljayk9XCJjb21taXRUaXRsZSgpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlNhdmUgdGl0bGVcIlxuICAgICAgPjwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFZGl0aW5nIGRlc2NyaXB0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidlZGl0aW5nRGVzY3JpcHRpb24nXCI+XG4gICAgICA8aW5wdXRcbiAgICAgICAgI2Rlc2NyaXB0aW9uSW5wdXRcbiAgICAgICAgY2xhc3M9XCJkZXNjcmlwdGlvbi1pbnB1dFwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkRlc2NyaXB0aW9uXCJcbiAgICAgICAgW3ZhbHVlXT1cImRyYWZ0RGVzY3JpcHRpb25cIlxuICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwiZGVzY3JpcHRpb25NYXhMZW5ndGhcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBhIGRlc2NyaXB0aW9uXCJcbiAgICAgICAgKGlucHV0KT1cImRyYWZ0RGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbklucHV0LnZhbHVlXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY29tbWl0RGVzY3JpcHRpb24oKVwiXG4gICAgICAvPlxuICAgICAgPGJ1dHRvblxuICAgICAgICByaXZCdXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY29tbWl0XCJcbiAgICAgICAgW3ZhcmlhbnRdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgW2ljb25dPVwiJ0NoZWNrJ1wiXG4gICAgICAgIChjbGljayk9XCJjb21taXREZXNjcmlwdGlvbigpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlNhdmUgZGVzY3JpcHRpb25cIlxuICAgICAgPjwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWN0aW9uc1wiICpuZ0lmPVwiIWlzRWRpdGluZ1wiPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9uYXZpZ2F0aW9uL2VkaXRhYmxlLWhlYWRpbmcvZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9uYXZpZ2F0aW9uL2VkaXRhYmxlLWhlYWRpbmcvZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7Ozs7OztBQUV2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3REc7QUFPSCxNQUFNLE9BQU8sd0JBQXdCO0lBR25DLElBQ0ksS0FBSyxDQUFDLENBQVM7UUFDakIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFHRCxJQUNJLFdBQVcsQ0FBQyxDQUFTO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZO1lBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBZUQsSUFDSSxRQUFRLENBQUMsQ0FBVTtRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLENB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QUM7UUFDMUUsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQ25CLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQy9CLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOztzSEF0S1Usd0JBQXdCOzBHQUF4Qix3QkFBd0IsMmdCQW1ERixVQUFVLGtIQUdKLFVBQVUsNkJDbEluRCwweUZBbUdBOzRGRHZCYSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0Usc0JBQXNCLG1CQUdmLHVCQUF1QixDQUFDLE1BQU07aUlBTTNDLEtBQUs7c0JBRFIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBU04sY0FBYztzQkFEYixLQUFLO2dCQUlOLG9CQUFvQjtzQkFEbkIsS0FBSztnQkFXRixRQUFRO3NCQURYLEtBQUs7Z0JBV04sV0FBVztzQkFEVixNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFNQyxhQUFhO3NCQURwQixTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSXJDLG1CQUFtQjtzQkFEMUIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBYS9DLFNBQVM7c0JBRFosV0FBVzt1QkFBQyxlQUFlO2dCQWdGbEIsbUJBQW1CO3NCQUQ1QixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBBIGJvcmRlcmxlc3MgaGVhZGluZyB3aXRoIGEgY2xpY2stdG8tZWRpdCB0aXRsZSBhbmQgYW4gb3B0aW9uYWxcbiAqIGNsaWNrLXRvLWVkaXQgZGVzY3JpcHRpb24sIHBsdXMgYSBwcm9qZWN0ZWQgc2xvdCBmb3IgYWN0aW9ucy5cbiAqXG4gKiBMYXlvdXQ6IGBbdGl0bGVdIHwgW2Rlc2NyaXB0aW9uXSAgW2FjdGlvbnNdYFxuICpcbiAqIC0gQ2xpY2sgdGhlIHRpdGxlIHRvIHJlbmFtZTsgY2xpY2sgdGhlIGRlc2NyaXB0aW9uIChvciB0aGUgZ2hvc3RcbiAqICAgXCIrIEFkZCBkZXNjcmlwdGlvblwiIGJ1dHRvbiB3aGVuIGVtcHR5KSB0byBlZGl0IGl0LlxuICogLSBPbmx5IG9uZSBvZiB0aXRsZSBvciBkZXNjcmlwdGlvbiBjYW4gYmUgZWRpdGVkIGF0IGEgdGltZS5cbiAqIC0gV2hpbGUgZWl0aGVyIGlzIGJlaW5nIGVkaXRlZCwgdGhlIGBbYWN0aW9uc11gIHNsb3QgaXMgaGlkZGVuIHNvXG4gKiAgIHByb2plY3RlZCBjb250cm9scyBkb24ndCBjb21wZXRlIHdpdGggdGhlIGVkaXQgYWZmb3JkYW5jZS5cbiAqXG4gKiBDb21taXQgc2VtYW50aWNzOiBgdGl0bGVDaGFuZ2VgIC8gYGRlc2NyaXB0aW9uQ2hhbmdlYCBmaXJlIHdoZW4gdGhlIHVzZXJcbiAqIGNvbW1pdHMg4oCUIEVudGVyLCBvdXRzaWRlIGNsaWNrLCBvciB0aGUgQ2hlY2sgYnV0dG9uIOKAlCBub3Qgb24gZXZlcnlcbiAqIGtleXN0cm9rZSwgYW5kIGFsd2F5cyBvbiBjb21taXQgKGV2ZW4gd2hlbiB0aGUgdmFsdWUgaXMgdW5jaGFuZ2VkKS4gVGhlXG4gKiBcImNvbW1pdFwiIGZyYW1pbmcgb3ZlciBcImNoYW5nZVwiIGlzIGRlbGliZXJhdGU6IGNvbnN1bWVycyB0aGF0IHBlcnNpc3Qgb25cbiAqIGNvbW1pdCAoYW5hbHl0aWNzLCBQQVRDSCkgdHJlYXQgdGhlIGdlc3R1cmUgaXRzZWxmIGFzIHRoZSBldmVudDsgdGhvc2VcbiAqIHRoYXQgb25seSBjYXJlIGFib3V0IGRpZmZzIGNhbiBjb21wYXJlIGBuZXh0ID09PSBjdXJyZW50YCBpbiB0aGUgaGFuZGxlci5cbiAqXG4gKiBFc2NhcGUgY2FuY2VsczogcmV2ZXJ0cyB0aGUgZHJhZnQgYmFjayB0byB0aGUgY3VycmVudCB2YWx1ZSBhbmQgZHJvcHMgb3V0XG4gKiBvZiBlZGl0IG1vZGUgV0lUSE9VVCBlbWl0dGluZyBhIGNoYW5nZS4gT3V0c2lkZS1jbGljayBzdGlsbCBjb21taXRzICh0b1xuICogbWF0Y2ggYHJpdi1kYXRlYCAvIGByaXYtc2VsZWN0YCk7IEVzY2FwZSBpcyB0aGUgZGVsaWJlcmF0ZSBhYmFuZG9uIHBhdGguXG4gKlxuICogVmFsdWUgaGFuZGxpbmcgZm9sbG93cyB0aGUgc2FtZSBjb252ZW50aW9uIGFzIGByaXYtdGV4dC1maWVsZGA6IGBbdGl0bGVdYFxuICogYW5kIGBbZGVzY3JpcHRpb25dYCBhcmUgdHJlYXRlZCBhcyBzdWdnZXN0aW9ucywgbm90IGF1dGhvcml0YXRpdmUgc3RhdGUuXG4gKiBPbiBjb21taXQsIHRoZSBjb21wb25lbnQga2VlcHMgZGlzcGxheWluZyB0aGUgdXNlcidzIGNvbW1pdHRlZCB2YWx1ZSxcbiAqIGFuZCBvbmx5IG92ZXJ3cml0ZXMgaXRzIGludGVybmFsIHN0YXRlIHdoZW4gdGhlIHBhcmVudCBleHBsaWNpdGx5IHNlbmRzXG4gKiBhIGRpZmZlcmVudCB2YWx1ZS4gVGhhdCBsZXRzIHRoZSBjb21wb25lbnQgZGVtbyBvdXQgb2YgdGhlIGJveCAoZS5nLiBpblxuICogU3Rvcnlib29rKSB3aXRob3V0IHJlcXVpcmluZyBhIHJvdW5kIHRyaXAgdGhyb3VnaCB0aGUgcGFyZW50LlxuICpcbiAqIFByb2dyYW1tYXRpYyBlbnRyeSBpbnRvIGVkaXQgbW9kZSBpcyBhdmFpbGFibGUgdmlhIGBzdGFydEVkaXRpbmdUaXRsZSgpYFxuICogYW5kIGBzdGFydEVkaXRpbmdEZXNjcmlwdGlvbigpYCDigJQgb2J0YWluIGEgcmVmZXJlbmNlIHdpdGhcbiAqIGBAVmlld0NoaWxkKEVkaXRhYmxlSGVhZGluZ0NvbXBvbmVudClgLiBVc2UgdGhlc2UgZm9yIHNlY29uZGFyeSBlbnRyeVxuICogcG9pbnRzIGxpa2UgYSBrZWJhYi1tZW51IFwiUmVuYW1lXCIgaXRlbSwgb3IgdG8gYXV0by1vcGVuIHJlbmFtZSBhZnRlclxuICogY3JlYXRpbmcgYSBuZXcgZW50aXR5LlxuICpcbiAqIFRoZSBjb21wb25lbnQgb3ducyBubyBib3JkZXIsIGJhY2tncm91bmQsIG9yIGNhcmQgY2hyb21lIOKAlCBjb25zdW1lcnMgd2hvXG4gKiB3YW50IGEgYm9yZGVyZWQgY29udGFpbmVyIHNob3VsZCB3cmFwIGl0LlxuICpcbiAqIGBgYGh0bWxcbiAqIDxyaXYtZWRpdGFibGUtaGVhZGluZ1xuICogICBbdGl0bGVdPVwicmVwb3J0LnRpdGxlXCJcbiAqICAgW2Rlc2NyaXB0aW9uXT1cInJlcG9ydC5kZXNjcmlwdGlvblwiXG4gKiAgICh0aXRsZUNoYW5nZSk9XCJvblRpdGxlQ29tbWl0KCRldmVudClcIlxuICogICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwib25EZXNjcmlwdGlvbkNvbW1pdCgkZXZlbnQpXCJcbiAqID5cbiAqICAgPHJpdi1tZW51IGFjdGlvbnM+XG4gKiAgICAgPG5nLXRlbXBsYXRlICN0cmlnZ2VyPlxuICogICAgICAgPGJ1dHRvbiByaXZCdXR0b24gW2ljb25dPVwiJ01vcmVWZXJ0aWNhbCdcIiBbdmFyaWFudF09XCInZ2hvc3QnXCI+PC9idXR0b24+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICA8YnV0dG9uIHJpdi1tZW51LWl0ZW0+UmVuYW1lPC9idXR0b24+XG4gKiAgICAgPGJ1dHRvbiByaXYtbWVudS1pdGVtPkR1cGxpY2F0ZTwvYnV0dG9uPlxuICogICA8L3Jpdi1tZW51PlxuICogICA8YnV0dG9uIHJpdkJ1dHRvbiBhY3Rpb25zIFt2YXJpYW50XT1cIidwcmltYXJ5J1wiPlNhdmU8L2J1dHRvbj5cbiAqIDwvcml2LWVkaXRhYmxlLWhlYWRpbmc+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LWVkaXRhYmxlLWhlYWRpbmcnLFxuICB0ZW1wbGF0ZVVybDogJy4vZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VkaXRhYmxlLWhlYWRpbmcuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRWRpdGFibGVIZWFkaW5nQ29tcG9uZW50IHtcbiAgLy8gU2VlIHRoZSBcIlZhbHVlIGhhbmRsaW5nXCIgc2VjdGlvbiBvZiB0aGUgY2xhc3MtbGV2ZWwgZG9jLlxuICBwcm90ZWN0ZWQgX3RpdGxlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KClcbiAgc2V0IHRpdGxlKHY6IHN0cmluZykge1xuICAgIGlmICh2ICE9PSB0aGlzLl90aXRsZSkgdGhpcy5fdGl0bGUgPSB2O1xuICB9XG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICBzZXQgZGVzY3JpcHRpb24odjogc3RyaW5nKSB7XG4gICAgaWYgKHYgIT09IHRoaXMuX2Rlc2NyaXB0aW9uKSB0aGlzLl9kZXNjcmlwdGlvbiA9IHY7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgQElucHV0KClcbiAgdGl0bGVNYXhMZW5ndGg6IG51bWJlciA9IDEwMDtcblxuICBASW5wdXQoKVxuICBkZXNjcmlwdGlvbk1heExlbmd0aDogbnVtYmVyID0gMzAwO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoZSB0aXRsZSBhbmQgZGVzY3JpcHRpb24gYXJlIG5vdCBjbGlja2FibGUgYW5kIGNhbm5vdCBiZVxuICAgKiBlZGl0ZWQuIEFueSBpbi1wcm9ncmVzcyBlZGl0IGlzIGRyb3BwZWQgd2l0aG91dCBlbWl0dGluZy4gSW1wZXJhdGl2ZVxuICAgKiBgc3RhcnRFZGl0aW5nKmAgY2FsbHMgbm8tb3AuIFVzZWZ1bCBmb3IgY29uc3VtZXJzIHRoYXQgbmVlZCB0byBnYXRlXG4gICAqIGVkaXRpbmcgb24gYSBwZXJtaXNzaW9uIG9yIGEgYnJvYWRlciBcImFjdGlvbnMgZGlzYWJsZWRcIiBzdGF0ZS5cbiAgICovXG4gIHByb3RlY3RlZCBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHY7XG4gICAgaWYgKHYgJiYgdGhpcy5tb2RlICE9PSAndmlldycpIHRoaXMuY2FuY2VsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICB0aXRsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBPdXRwdXQoKVxuICBkZXNjcmlwdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vIGByZWFkOiBFbGVtZW50UmVmYCBnZXRzIHRoZSBob3N0IGVsZW1lbnQgb2YgdGhlIGA8cml2LXRleHQtZmllbGQ+YCwgZnJvbVxuICAvLyB3aGljaCB3ZSBjYW4gcmVhY2ggdGhlIGFjdHVhbCBgPGlucHV0PmAgZm9yIGNhcmV0LWF0LWVuZCBwb3NpdGlvbmluZy5cbiAgQFZpZXdDaGlsZCgndGl0bGVJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIHRpdGxlSW5wdXRSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdkZXNjcmlwdGlvbklucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgZGVzY3JpcHRpb25JbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCBtb2RlOiAndmlldycgfCAnZWRpdGluZ1RpdGxlJyB8ICdlZGl0aW5nRGVzY3JpcHRpb24nID0gJ3ZpZXcnO1xuICBwcm90ZWN0ZWQgZHJhZnRUaXRsZTogc3RyaW5nID0gJyc7XG4gIHByb3RlY3RlZCBkcmFmdERlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgKSB7fVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZWRpdGluZycpXG4gIGdldCBpc0VkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSAhPT0gJ3ZpZXcnO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGVyIHRpdGxlLWVkaXQgbW9kZSBwcm9ncmFtbWF0aWNhbGx5LiBTYW1lIGJlaGF2aW9yIGFzIGNsaWNraW5nIHRoZVxuICAgKiB0aXRsZSDigJQgcG9wdWxhdGVzIHRoZSBlZGl0IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IHZhbHVlLCBmb2N1c2VzIHRoZVxuICAgKiBpbnB1dCB3aXRoIHRoZSBjYXJldCBhdCB0aGUgZW5kLCBhbmQgaGlkZXMgdGhlIGFjdGlvbnMgc2xvdC4gTm8tb3AgaWZcbiAgICogYWxyZWFkeSBpbiBhbiBlZGl0aW5nIG1vZGUgb3Igd2hlbiB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLlxuICAgKlxuICAgKiBJbnRlbmRlZCBmb3IgY29uc3VtZXJzIHRoYXQgb2ZmZXIgYSBzZWNvbmRhcnkgZW50cnkgcG9pbnQgdG8gcmVuYW1pbmdcbiAgICogKGUuZy4gYSBrZWJhYiBtZW51IGl0ZW0pLCBvciB0aGF0IHdhbnQgdG8gYXV0by1vcGVuIHJlbmFtZSBhZnRlclxuICAgKiBjcmVhdGluZyBhIG5ldyBlbnRpdHkuIEJpbmQgdmlhIGBAVmlld0NoaWxkKEVkaXRhYmxlSGVhZGluZ0NvbXBvbmVudClgLlxuICAgKi9cbiAgc3RhcnRFZGl0aW5nVGl0bGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5tb2RlICE9PSAndmlldycpIHJldHVybjtcbiAgICB0aGlzLmRyYWZ0VGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgIHRoaXMubW9kZSA9ICdlZGl0aW5nVGl0bGUnO1xuICAgIC8vIGBtYXJrRm9yQ2hlY2tgIHNvIGNvbnN1bWVycyBjYW4gY2FsbCB0aGlzIGZyb20gb3V0c2lkZSBBbmd1bGFyJ3Mgem9uZVxuICAgIC8vIChlLmcuIGFuIGFzeW5jIGNhbGxiYWNrKSB3aXRob3V0IGhhdmluZyB0byB0cmlnZ2VyIENEIHRoZW1zZWx2ZXMuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgLy8gRGVmZXIgZm9jdXMgdW50aWwgQW5ndWxhciBoYXMgcmVuZGVyZWQgdGhlIGlucHV0IGludG8gdGhlIERPTS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNFbmQodGhpcy50aXRsZUlucHV0UmVmKSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXIgZGVzY3JpcHRpb24tZWRpdCBtb2RlIHByb2dyYW1tYXRpY2FsbHkuIFNhbWUgYmVoYXZpb3IgYXMgY2xpY2tpbmdcbiAgICogdGhlIGRlc2NyaXB0aW9uIChvciB0aGUgXCIrIEFkZCBkZXNjcmlwdGlvblwiIGJ1dHRvbikuIE5vLW9wIGlmIGFscmVhZHlcbiAgICogaW4gYW4gZWRpdGluZyBtb2RlIG9yIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIHN0YXJ0RWRpdGluZ0Rlc2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMubW9kZSAhPT0gJ3ZpZXcnKSByZXR1cm47XG4gICAgdGhpcy5kcmFmdERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLm1vZGUgPSAnZWRpdGluZ0Rlc2NyaXB0aW9uJztcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNFbmQodGhpcy5kZXNjcmlwdGlvbklucHV0UmVmKSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tbWl0VGl0bGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ2VkaXRpbmdUaXRsZScpIHJldHVybjtcbiAgICAvLyBUaXRsZSBjYW5ub3QgYmUgY29tbWl0dGVkIGVtcHR5LiBUaGUgQ2hlY2sgYnV0dG9uIGlzIGRpc2FibGVkIGluIHRoYXRcbiAgICAvLyBzdGF0ZTsgZm9yIEVudGVyIGFuZCBvdXRzaWRlLWNsaWNrIHdlIHJldmVydCB0byB0aGUgY3VycmVudCB0aXRsZSBzb1xuICAgIC8vIHRoZSB1c2VyIGlzIG5ldmVyIHN0dWNrIGluIGVkaXQgbW9kZSB3aXRoIGEgcmVqZWN0ZWQgdmFsdWUuXG4gICAgaWYgKCF0aGlzLmRyYWZ0VGl0bGUpIHtcbiAgICAgIHRoaXMubW9kZSA9ICd2aWV3JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmRyYWZ0VGl0bGU7XG4gICAgdGhpcy5fdGl0bGUgPSB2YWx1ZTtcbiAgICB0aGlzLm1vZGUgPSAndmlldyc7XG4gICAgdGhpcy50aXRsZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb21taXREZXNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnZWRpdGluZ0Rlc2NyaXB0aW9uJykgcmV0dXJuO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kcmFmdERlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5tb2RlID0gJ3ZpZXcnO1xuICAgIHRoaXMuZGVzY3JpcHRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWJhbmRvbiB0aGUgY3VycmVudCBlZGl0IGFuZCByZXR1cm4gdG8gdmlldyBtb2RlLiBObyBjaGFuZ2UgaXMgZW1pdHRlZC5cbiAgICogV2lyZWQgdG8gdGhlIEVzY2FwZSBrZXkgb24gYm90aCBlZGl0IGlucHV0czsgYWxzbyBjYWxsZWQgaW50ZXJuYWxseVxuICAgKiB3aGVuIGBkaXNhYmxlZGAgZmxpcHMgdG8gdHJ1ZSBtaWQtZWRpdC5cbiAgICovXG4gIHByb3RlY3RlZCBjYW5jZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3ZpZXcnKSByZXR1cm47XG4gICAgdGhpcy5kcmFmdFRpdGxlID0gdGhpcy5fdGl0bGU7XG4gICAgdGhpcy5kcmFmdERlc2NyaXB0aW9uID0gdGhpcy5fZGVzY3JpcHRpb247XG4gICAgdGhpcy5tb2RlID0gJ3ZpZXcnO1xuICB9XG5cbiAgLy8gTGlzdGVucyBvbiBgbW91c2Vkb3duYCAobm90IGBjbGlja2ApIHNvIHRoZSBjaGVjayBydW5zIGJlZm9yZSBBbmd1bGFyXG4gIC8vIHJlLXJlbmRlcnMgdGhlIHRyaWdnZXIgZWxlbWVudCBvdXQgb2YgdGhlIERPTSDigJQgb3RoZXJ3aXNlXG4gIC8vIGBob3N0LmNvbnRhaW5zKHRhcmdldClgIHJldHVybnMgZmFsc2UgZm9yIGEgY2xpY2sgdGhhdCBsYW5kZWQgb24gdGhlXG4gIC8vIG5vdy1yZW1vdmVkIGAudGl0bGVgIC8gYC5kZXNjcmlwdGlvbmAgZWxlbWVudC4gU2FtZSBwYXR0ZXJuIGFzXG4gIC8vIGByaXYtZGF0ZWAuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsnJGV2ZW50LnRhcmdldCddKVxuICBwcm90ZWN0ZWQgb25Eb2N1bWVudE1vdXNlRG93bih0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICd2aWV3JyB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZWRpdGluZ1RpdGxlJykge1xuICAgICAgdGhpcy5jb21taXRUaXRsZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnZWRpdGluZ0Rlc2NyaXB0aW9uJykge1xuICAgICAgdGhpcy5jb21taXREZXNjcmlwdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBvc2l0aW9uIGNhcmV0IGF0IGVuZCAocmF0aGVyIHRoYW4gc2VsZWN0aW5nIGFsbCkgc28gdGhlIHVzZXIgY2FuIGNvbnRpbnVlXG4gIC8vIHR5cGluZyB3aGVyZSB0aGUgcHJldmlvdXMgdmFsdWUgbGVmdCBvZmYuIGByaXYtdGV4dC1maWVsZGAgaGFuZGxlcyB0aGVcbiAgLy8gZm9jdXMgaXRzZWxmIHZpYSBgW2F1dG9Gb2N1c11gOyB3ZSBqdXN0IGZpeCB1cCB0aGUgc2VsZWN0aW9uIHJhbmdlIG9uIHRoZVxuICAvLyBkZXNjZW5kYW50IGA8aW5wdXQ+YC5cbiAgcHJpdmF0ZSBmb2N1c0VuZChyZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gcmVmPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuICAgIGNvbnN0IGxlbiA9IGlucHV0LnZhbHVlLmxlbmd0aDtcbiAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShsZW4sIGxlbik7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsZWFkaW5nXCI+XG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIm1vZGVcIj5cbiAgICA8IS0tIFZpZXcgbW9kZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInRpdGxlXCJcbiAgICAgICAgW2NsYXNzLmhhcy1kZXNjcmlwdGlvbl09XCJkZXNjcmlwdGlvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIHJpdlRydW5jYXRlXG4gICAgICAgIGFyaWEtbGFiZWw9XCJSZW5hbWVcIlxuICAgICAgICAoY2xpY2spPVwic3RhcnRFZGl0aW5nVGl0bGUoKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpdGxlIHx8ICdVbnRpdGxlZCcgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZGVzY3JpcHRpb247IGVsc2UgYWRkRGVzY3JpcHRpb25cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIHJpdlRydW5jYXRlXG4gICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGRlc2NyaXB0aW9uXCJcbiAgICAgICAgKGNsaWNrKT1cInN0YXJ0RWRpdGluZ0Rlc2NyaXB0aW9uKClcIlxuICAgICAgPlxuICAgICAgICB7eyBkZXNjcmlwdGlvbiB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjYWRkRGVzY3JpcHRpb24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtZGVzY3JpcHRpb24td3JhcFwiICpuZ0lmPVwiIWRpc2FibGVkXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICBbdmFyaWFudF09XCInZ2hvc3QnXCJcbiAgICAgICAgICAgIFtzaXplXT1cIid4c21hbGwnXCJcbiAgICAgICAgICAgIFtpY29uXT1cIidQbHVzJ1wiXG4gICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cIidmaXJzdCdcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhcnRFZGl0aW5nRGVzY3JpcHRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQWRkIGRlc2NyaXB0aW9uXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidlZGl0aW5nVGl0bGUnXCI+XG4gICAgICA8cml2LXRleHQtZmllbGRcbiAgICAgICAgI3RpdGxlSW5wdXRcbiAgICAgICAgY2xhc3M9XCJ0aXRsZS1pbnB1dFwiXG4gICAgICAgIFt2YWx1ZV09XCJkcmFmdFRpdGxlXCJcbiAgICAgICAgW21heExlbmd0aF09XCJ0aXRsZU1heExlbmd0aFwiXG4gICAgICAgIFthdXRvRm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkcmFmdFRpdGxlID0gJGV2ZW50XCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY29tbWl0VGl0bGUoKVwiXG4gICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJjYW5jZWwoKVwiXG4gICAgICA+PC9yaXYtdGV4dC1maWVsZD5cbiAgICAgIDxidXR0b25cbiAgICAgICAgcml2QnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNvbW1pdFwiXG4gICAgICAgIFt2YXJpYW50XT1cIidwcmltYXJ5J1wiXG4gICAgICAgIFtpY29uXT1cIidDaGVjaydcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIWRyYWZ0VGl0bGVcIlxuICAgICAgICAoY2xpY2spPVwiY29tbWl0VGl0bGUoKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlIHRpdGxlXCJcbiAgICAgID48L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRWRpdGluZyBkZXNjcmlwdGlvbiAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZWRpdGluZ0Rlc2NyaXB0aW9uJ1wiPlxuICAgICAgPHJpdi10ZXh0LWZpZWxkXG4gICAgICAgICNkZXNjcmlwdGlvbklucHV0XG4gICAgICAgIGNsYXNzPVwiZGVzY3JpcHRpb24taW5wdXRcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBhIGRlc2NyaXB0aW9uXCJcbiAgICAgICAgW3ZhbHVlXT1cImRyYWZ0RGVzY3JpcHRpb25cIlxuICAgICAgICBbbWF4TGVuZ3RoXT1cImRlc2NyaXB0aW9uTWF4TGVuZ3RoXCJcbiAgICAgICAgW2F1dG9Gb2N1c109XCJ0cnVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRyYWZ0RGVzY3JpcHRpb24gPSAkZXZlbnRcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjb21taXREZXNjcmlwdGlvbigpXCJcbiAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImNhbmNlbCgpXCJcbiAgICAgID48L3Jpdi10ZXh0LWZpZWxkPlxuICAgICAgPGJ1dHRvblxuICAgICAgICByaXZCdXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY29tbWl0XCJcbiAgICAgICAgW3ZhcmlhbnRdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgW2ljb25dPVwiJ0NoZWNrJ1wiXG4gICAgICAgIChjbGljayk9XCJjb21taXREZXNjcmlwdGlvbigpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlNhdmUgZGVzY3JpcHRpb25cIlxuICAgICAgPjwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWN0aW9uc1wiICpuZ0lmPVwiIWlzRWRpdGluZ1wiPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { sumBy } from 'lodash';
|
|
2
|
+
/**
|
|
3
|
+
* Clipboard serialization for `riv-table`.
|
|
4
|
+
*
|
|
5
|
+
* Rows that have a link render as `<a class="row-link">` rather than `<tr>`, and
|
|
6
|
+
* the browser's clipboard serializer does not treat those as table rows — the
|
|
7
|
+
* copied content pastes into a spreadsheet as one lateral run instead of a grid.
|
|
8
|
+
* These helpers rebuild the rendered grid so that copied content pastes as rows
|
|
9
|
+
* and columns.
|
|
10
|
+
*/
|
|
11
|
+
export var RivTableClipboard;
|
|
12
|
+
(function (RivTableClipboard) {
|
|
13
|
+
/** Cells that hold controls rather than data. */
|
|
14
|
+
const controlCellSelector = 'th.selection-head, th.menu-head, td.selection-body, td.menu-body';
|
|
15
|
+
/** The column name within a header cell; the rest of the cell is controls. */
|
|
16
|
+
const headerLabelSelector = '.header-wrapper';
|
|
17
|
+
/** Elements whose text exists for assistive technology only. */
|
|
18
|
+
const assistiveTextSelector = 'riv-sr-only';
|
|
19
|
+
/** Rows that stand in for data rather than carrying it. */
|
|
20
|
+
const fillerRowSelector = 'riv-zero-state';
|
|
21
|
+
/** Elements that own their own clipboard behavior. */
|
|
22
|
+
const editableSelector = 'input, textarea, select, [contenteditable=""], [contenteditable="true"]';
|
|
23
|
+
/** Whether the copy came from a control that serializes its own value. */
|
|
24
|
+
function isEditable(target) {
|
|
25
|
+
return (target instanceof Element && target.closest(editableSelector) !== null);
|
|
26
|
+
}
|
|
27
|
+
RivTableClipboard.isEditable = isEditable;
|
|
28
|
+
/**
|
|
29
|
+
* Whether `host` is the first element of its kind that the selection touches.
|
|
30
|
+
* A selection can span several tables; deferring to the first keeps instances
|
|
31
|
+
* from overwriting each other's clipboard data.
|
|
32
|
+
*/
|
|
33
|
+
function ownsSelection(host, isSelected) {
|
|
34
|
+
return (Array.from(document.querySelectorAll(host.localName)).find(element => isSelected(element)) === host);
|
|
35
|
+
}
|
|
36
|
+
RivTableClipboard.ownsSelection = ownsSelection;
|
|
37
|
+
/**
|
|
38
|
+
* Serializes the selected region of `tables` (one per row group), or null when
|
|
39
|
+
* the selection covers at most one cell — those are left to the browser so
|
|
40
|
+
* that copying part of a cell's text keeps working.
|
|
41
|
+
*
|
|
42
|
+
* `endpoints` are where the selection starts and ends, which narrow the copied
|
|
43
|
+
* columns to that span. A selection is a linear range in reading order, so
|
|
44
|
+
* dragging down one column touches every column in between; the endpoints are
|
|
45
|
+
* what distinguish "this column" from "these rows".
|
|
46
|
+
*/
|
|
47
|
+
function extract(tables, isSelected, endpoints = []) {
|
|
48
|
+
const layouts = tables.map(layout);
|
|
49
|
+
const columns = selectedColumns(layouts, isSelected, endpoints);
|
|
50
|
+
const headers = layouts.flatMap(l => l.header);
|
|
51
|
+
const rows = layouts
|
|
52
|
+
.flatMap(l => l.body)
|
|
53
|
+
.filter(row => selectedCount(row, isSelected) > 0);
|
|
54
|
+
// Header cells own the pointer for column reordering, so a drag cannot
|
|
55
|
+
// reach them; the header comes along with any copied data instead.
|
|
56
|
+
const header = headers.find(row => selectedCount(row, isSelected) > 0) ??
|
|
57
|
+
(rows.length > 0 ? headers[0] : undefined);
|
|
58
|
+
if (columns.length === 0 ||
|
|
59
|
+
sumBy([...(header ? [header] : []), ...rows], row => selectedCount(row, isSelected)) < 2)
|
|
60
|
+
return null;
|
|
61
|
+
return {
|
|
62
|
+
text: toText(header, rows, columns),
|
|
63
|
+
html: toHtml(header, rows, columns),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
RivTableClipboard.extract = extract;
|
|
67
|
+
function toText(header, rows, columns) {
|
|
68
|
+
return [
|
|
69
|
+
...(header ? [columns.map(column => headerText(header[column]))] : []),
|
|
70
|
+
...rows.map(row => columns.map(column => text(row[column]))),
|
|
71
|
+
]
|
|
72
|
+
.map(cells => cells.join('\t'))
|
|
73
|
+
.join('\n');
|
|
74
|
+
}
|
|
75
|
+
function toHtml(header, rows, columns) {
|
|
76
|
+
const cells = (values, tag) => values.map(value => `<${tag}>${escapeHtml(value)}</${tag}>`).join('');
|
|
77
|
+
return [
|
|
78
|
+
'<table>',
|
|
79
|
+
header
|
|
80
|
+
? `<thead><tr>${cells(columns.map(column => headerText(header[column])), 'th')}</tr></thead>`
|
|
81
|
+
: '',
|
|
82
|
+
`<tbody>${rows
|
|
83
|
+
.map(row => `<tr>${cells(columns.map(column => text(row[column])), 'td')}</tr>`)
|
|
84
|
+
.join('')}</tbody>`,
|
|
85
|
+
'</table>',
|
|
86
|
+
].join('');
|
|
87
|
+
}
|
|
88
|
+
function layout(table) {
|
|
89
|
+
return {
|
|
90
|
+
header: grid(Array.from(table.querySelectorAll(':scope > thead > tr')).filter(isDataRow)),
|
|
91
|
+
body: grid(Array.from(table.querySelectorAll(':scope > tbody > tr, :scope > tbody > a.row-link')).filter(isDataRow)),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Maps rows onto a column grid. Cells covered by a rowspan repeat the spanning
|
|
96
|
+
* cell so that every line has one value per column, matching how CSV export
|
|
97
|
+
* flattens spans.
|
|
98
|
+
*/
|
|
99
|
+
function grid(rows) {
|
|
100
|
+
const cells = rows.map(() => []);
|
|
101
|
+
rows.forEach((row, rowIndex) => {
|
|
102
|
+
let column = 0;
|
|
103
|
+
for (const cell of dataCells(row)) {
|
|
104
|
+
while (cells[rowIndex][column] !== undefined)
|
|
105
|
+
column++;
|
|
106
|
+
const rowSpan = Math.max(1, cell.rowSpan);
|
|
107
|
+
const colSpan = Math.max(1, cell.colSpan);
|
|
108
|
+
for (let r = rowIndex; r <= Math.min(rows.length - 1, rowIndex + rowSpan - 1); r++)
|
|
109
|
+
for (let c = column; c < column + colSpan; c++)
|
|
110
|
+
cells[r][c] = cell;
|
|
111
|
+
column += colSpan;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return cells;
|
|
115
|
+
}
|
|
116
|
+
function dataCells(row) {
|
|
117
|
+
return Array.from(row.querySelectorAll(':scope > td, :scope > th')).filter(cell => !cell.matches(controlCellSelector));
|
|
118
|
+
}
|
|
119
|
+
/** Excludes the zero-state row, which spans every column. */
|
|
120
|
+
function isDataRow(row) {
|
|
121
|
+
return (row.querySelector(fillerRowSelector) === null &&
|
|
122
|
+
dataCells(row).every(cell => cell.colSpan <= 1));
|
|
123
|
+
}
|
|
124
|
+
function selectedColumns(layouts, isSelected, endpoints) {
|
|
125
|
+
const columns = new Set();
|
|
126
|
+
for (const { header, body } of layouts)
|
|
127
|
+
for (const row of [...header, ...body])
|
|
128
|
+
row.forEach((cell, column) => {
|
|
129
|
+
if (cell !== undefined && isSelected(cell))
|
|
130
|
+
columns.add(column);
|
|
131
|
+
});
|
|
132
|
+
const touched = [...columns].sort((a, b) => a - b);
|
|
133
|
+
// Both ends have to land in a cell to describe a span; anything else (a
|
|
134
|
+
// select-all, an endpoint on a row rather than a cell) keeps every column.
|
|
135
|
+
const span = endpoints
|
|
136
|
+
.map(node => (node ? columnOf(layouts, node) : undefined))
|
|
137
|
+
.filter((column) => column !== undefined);
|
|
138
|
+
return span.length === endpoints.length && span.length > 1
|
|
139
|
+
? touched.filter(column => column >= Math.min(...span) && column <= Math.max(...span))
|
|
140
|
+
: touched;
|
|
141
|
+
}
|
|
142
|
+
function columnOf(layouts, node) {
|
|
143
|
+
for (const { header, body } of layouts)
|
|
144
|
+
for (const row of [...header, ...body]) {
|
|
145
|
+
const column = row.findIndex(cell => cell?.contains(node) === true);
|
|
146
|
+
if (column >= 0)
|
|
147
|
+
return column;
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
function selectedCount(row, isSelected) {
|
|
152
|
+
return row.filter(cell => cell !== undefined && isSelected(cell)).length;
|
|
153
|
+
}
|
|
154
|
+
function headerText(cell) {
|
|
155
|
+
return text(cell?.querySelector(headerLabelSelector) ?? cell);
|
|
156
|
+
}
|
|
157
|
+
function text(cell) {
|
|
158
|
+
return cell ? visibleText(cell).replace(/\s+/g, ' ').trim() : '';
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Template indentation lands in the DOM as newlines and runs of spaces, which
|
|
162
|
+
* split a single row across several spreadsheet rows unless collapsed by the
|
|
163
|
+
* caller. Comment anchors and screen-reader-only content are dropped, and
|
|
164
|
+
* sibling nodes are separated so that adjacent elements do not run together.
|
|
165
|
+
*/
|
|
166
|
+
function visibleText(node) {
|
|
167
|
+
if (node instanceof Text)
|
|
168
|
+
return node.nodeValue ?? '';
|
|
169
|
+
if (node instanceof Element)
|
|
170
|
+
return node.matches(assistiveTextSelector)
|
|
171
|
+
? ''
|
|
172
|
+
: Array.from(node.childNodes).map(visibleText).join(' ');
|
|
173
|
+
return '';
|
|
174
|
+
}
|
|
175
|
+
function escapeHtml(value) {
|
|
176
|
+
return value
|
|
177
|
+
.replace(/&/g, '&')
|
|
178
|
+
.replace(/</g, '<')
|
|
179
|
+
.replace(/>/g, '>');
|
|
180
|
+
}
|
|
181
|
+
})(RivTableClipboard || (RivTableClipboard = {}));
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcGJvYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvY2xpcGJvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFL0I7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLEtBQVcsaUJBQWlCLENBMlFqQztBQTNRRCxXQUFpQixpQkFBaUI7SUFDaEMsaURBQWlEO0lBQ2pELE1BQU0sbUJBQW1CLEdBQ3ZCLGtFQUFrRSxDQUFDO0lBRXJFLDhFQUE4RTtJQUM5RSxNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDO0lBRTlDLGdFQUFnRTtJQUNoRSxNQUFNLHFCQUFxQixHQUFHLGFBQWEsQ0FBQztJQUU1QywyREFBMkQ7SUFDM0QsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztJQUUzQyxzREFBc0Q7SUFDdEQsTUFBTSxnQkFBZ0IsR0FDcEIseUVBQXlFLENBQUM7SUFvQjVFLDBFQUEwRTtJQUMxRSxTQUFnQixVQUFVLENBQUMsTUFBMEI7UUFDbkQsT0FBTyxDQUNMLE1BQU0sWUFBWSxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksQ0FDdkUsQ0FBQztJQUNKLENBQUM7SUFKZSw0QkFBVSxhQUl6QixDQUFBO0lBRUQ7Ozs7T0FJRztJQUNILFNBQWdCLGFBQWEsQ0FDM0IsSUFBYSxFQUNiLFVBQXlCO1FBRXpCLE9BQU8sQ0FDTCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FDbkUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUNwQixLQUFLLElBQUksQ0FDWCxDQUFDO0lBQ0osQ0FBQztJQVRlLCtCQUFhLGdC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LENBQUMsSUFBZ0M7UUFDNUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxXQUFXLENBQUMsSUFBVTtRQUM3QixJQUFJLElBQUksWUFBWSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLElBQUksWUFBWSxPQUFPO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsU0FBUyxVQUFVLENBQUMsS0FBYTtRQUMvQixPQUFPLEtBQUs7YUFDVCxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQzthQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQzthQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLENBQUM7QUFDSCxDQUFDLEVBM1FnQixpQkFBaUIsS0FBakIsaUJBQWlCLFFBMlFqQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN1bUJ5IH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBDbGlwYm9hcmQgc2VyaWFsaXphdGlvbiBmb3IgYHJpdi10YWJsZWAuXG4gKlxuICogUm93cyB0aGF0IGhhdmUgYSBsaW5rIHJlbmRlciBhcyBgPGEgY2xhc3M9XCJyb3ctbGlua1wiPmAgcmF0aGVyIHRoYW4gYDx0cj5gLCBhbmRcbiAqIHRoZSBicm93c2VyJ3MgY2xpcGJvYXJkIHNlcmlhbGl6ZXIgZG9lcyBub3QgdHJlYXQgdGhvc2UgYXMgdGFibGUgcm93cyDigJQgdGhlXG4gKiBjb3BpZWQgY29udGVudCBwYXN0ZXMgaW50byBhIHNwcmVhZHNoZWV0IGFzIG9uZSBsYXRlcmFsIHJ1biBpbnN0ZWFkIG9mIGEgZ3JpZC5cbiAqIFRoZXNlIGhlbHBlcnMgcmVidWlsZCB0aGUgcmVuZGVyZWQgZ3JpZCBzbyB0aGF0IGNvcGllZCBjb250ZW50IHBhc3RlcyBhcyByb3dzXG4gKiBhbmQgY29sdW1ucy5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBSaXZUYWJsZUNsaXBib2FyZCB7XG4gIC8qKiBDZWxscyB0aGF0IGhvbGQgY29udHJvbHMgcmF0aGVyIHRoYW4gZGF0YS4gKi9cbiAgY29uc3QgY29udHJvbENlbGxTZWxlY3RvciA9XG4gICAgJ3RoLnNlbGVjdGlvbi1oZWFkLCB0aC5tZW51LWhlYWQsIHRkLnNlbGVjdGlvbi1ib2R5LCB0ZC5tZW51LWJvZHknO1xuXG4gIC8qKiBUaGUgY29sdW1uIG5hbWUgd2l0aGluIGEgaGVhZGVyIGNlbGw7IHRoZSByZXN0IG9mIHRoZSBjZWxsIGlzIGNvbnRyb2xzLiAqL1xuICBjb25zdCBoZWFkZXJMYWJlbFNlbGVjdG9yID0gJy5oZWFkZXItd3JhcHBlcic7XG5cbiAgLyoqIEVsZW1lbnRzIHdob3NlIHRleHQgZXhpc3RzIGZvciBhc3Npc3RpdmUgdGVjaG5vbG9neSBvbmx5LiAqL1xuICBjb25zdCBhc3Npc3RpdmVUZXh0U2VsZWN0b3IgPSAncml2LXNyLW9ubHknO1xuXG4gIC8qKiBSb3dzIHRoYXQgc3RhbmQgaW4gZm9yIGRhdGEgcmF0aGVyIHRoYW4gY2FycnlpbmcgaXQuICovXG4gIGNvbnN0IGZpbGxlclJvd1NlbGVjdG9yID0gJ3Jpdi16ZXJvLXN0YXRlJztcblxuICAvKiogRWxlbWVudHMgdGhhdCBvd24gdGhlaXIgb3duIGNsaXBib2FyZCBiZWhhdmlvci4gKi9cbiAgY29uc3QgZWRpdGFibGVTZWxlY3RvciA9XG4gICAgJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBbY29udGVudGVkaXRhYmxlPVwiXCJdLCBbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSc7XG5cbiAgZXhwb3J0IHR5cGUgUGF5bG9hZCA9IHtcbiAgICAvKiogVGFiLWRlbGltaXRlZCByb3dzLCBvbmUgbGluZSBwZXIgcm93LiAqL1xuICAgIHRleHQ6IHN0cmluZztcbiAgICAvKiogRXF1aXZhbGVudCB0YWJsZSBtYXJrdXAsIGZvciB0YXJnZXRzIHRoYXQgcHJlZmVyIHJpY2ggY29udGVudC4gKi9cbiAgICBodG1sOiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqIFByZWRpY2F0ZSBmb3Igd2hldGhlciBhIG5vZGUgZmFsbHMgd2l0aGluIHRoZSB1c2VyJ3Mgc2VsZWN0aW9uLiAqL1xuICBleHBvcnQgdHlwZSBTZWxlY3Rpb25UZXN0ID0gKG5vZGU6IE5vZGUpID0+IGJvb2xlYW47XG5cbiAgLyoqIEEgcmVuZGVyZWQgcm93LCBob2xkaW5nIHRoZSBjZWxsIG9jY3VweWluZyBlYWNoIGRhdGEgY29sdW1uLiAqL1xuICB0eXBlIFJvdyA9IHJlYWRvbmx5IChFbGVtZW50IHwgdW5kZWZpbmVkKVtdO1xuXG4gIHR5cGUgTGF5b3V0ID0ge1xuICAgIGhlYWRlcjogcmVhZG9ubHkgUm93W107XG4gICAgYm9keTogcmVhZG9ubHkgUm93W107XG4gIH07XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNvcHkgY2FtZSBmcm9tIGEgY29udHJvbCB0aGF0IHNlcmlhbGl6ZXMgaXRzIG93biB2YWx1ZS4gKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzRWRpdGFibGUodGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQuY2xvc2VzdChlZGl0YWJsZVNlbGVjdG9yKSAhPT0gbnVsbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBgaG9zdGAgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgaXRzIGtpbmQgdGhhdCB0aGUgc2VsZWN0aW9uIHRvdWNoZXMuXG4gICAqIEEgc2VsZWN0aW9uIGNhbiBzcGFuIHNldmVyYWwgdGFibGVzOyBkZWZlcnJpbmcgdG8gdGhlIGZpcnN0IGtlZXBzIGluc3RhbmNlc1xuICAgKiBmcm9tIG92ZXJ3cml0aW5nIGVhY2ggb3RoZXIncyBjbGlwYm9hcmQgZGF0YS5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBvd25zU2VsZWN0aW9uKFxuICAgIGhvc3Q6IEVsZW1lbnQsXG4gICAgaXNTZWxlY3RlZDogU2VsZWN0aW9uVGVzdCxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChob3N0LmxvY2FsTmFtZSkpLmZpbmQoZWxlbWVudCA9PlxuICAgICAgICBpc1NlbGVjdGVkKGVsZW1lbnQpLFxuICAgICAgKSA9PT0gaG9zdFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgc2VsZWN0ZWQgcmVnaW9uIG9mIGB0YWJsZXNgIChvbmUgcGVyIHJvdyBncm91cCksIG9yIG51bGwgd2hlblxuICAgKiB0aGUgc2VsZWN0aW9uIGNvdmVycyBhdCBtb3N0IG9uZSBjZWxsIOKAlCB0aG9zZSBhcmUgbGVmdCB0byB0aGUgYnJvd3NlciBzb1xuICAgKiB0aGF0IGNvcHlpbmcgcGFydCBvZiBhIGNlbGwncyB0ZXh0IGtlZXBzIHdvcmtpbmcuXG4gICAqXG4gICAqIGBlbmRwb2ludHNgIGFyZSB3aGVyZSB0aGUgc2VsZWN0aW9uIHN0YXJ0cyBhbmQgZW5kcywgd2hpY2ggbmFycm93IHRoZSBjb3BpZWRcbiAgICogY29sdW1ucyB0byB0aGF0IHNwYW4uIEEgc2VsZWN0aW9uIGlzIGEgbGluZWFyIHJhbmdlIGluIHJlYWRpbmcgb3JkZXIsIHNvXG4gICAqIGRyYWdnaW5nIGRvd24gb25lIGNvbHVtbiB0b3VjaGVzIGV2ZXJ5IGNvbHVtbiBpbiBiZXR3ZWVuOyB0aGUgZW5kcG9pbnRzIGFyZVxuICAgKiB3aGF0IGRpc3Rpbmd1aXNoIFwidGhpcyBjb2x1bW5cIiBmcm9tIFwidGhlc2Ugcm93c1wiLlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3QoXG4gICAgdGFibGVzOiByZWFkb25seSBIVE1MVGFibGVFbGVtZW50W10sXG4gICAgaXNTZWxlY3RlZDogU2VsZWN0aW9uVGVzdCxcbiAgICBlbmRwb2ludHM6IHJlYWRvbmx5IChOb2RlIHwgbnVsbCB8IHVuZGVmaW5lZClbXSA9IFtdLFxuICApOiBQYXlsb2FkIHwgbnVsbCB7XG4gICAgY29uc3QgbGF5b3V0cyA9IHRhYmxlcy5tYXAobGF5b3V0KTtcbiAgICBjb25zdCBjb2x1bW5zID0gc2VsZWN0ZWRDb2x1bW5zKGxheW91dHMsIGlzU2VsZWN0ZWQsIGVuZHBvaW50cyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGxheW91dHMuZmxhdE1hcChsID0+IGwuaGVhZGVyKTtcbiAgICBjb25zdCByb3dzID0gbGF5b3V0c1xuICAgICAgLmZsYXRNYXAobCA9PiBsLmJvZHkpXG4gICAgICAuZmlsdGVyKHJvdyA9PiBzZWxlY3RlZENvdW50KHJvdywgaXNTZWxlY3RlZCkgPiAwKTtcbiAgICAvLyBIZWFkZXIgY2VsbHMgb3duIHRoZSBwb2ludGVyIGZvciBjb2x1bW4gcmVvcmRlcmluZywgc28gYSBkcmFnIGNhbm5vdFxuICAgIC8vIHJlYWNoIHRoZW07IHRoZSBoZWFkZXIgY29tZXMgYWxvbmcgd2l0aCBhbnkgY29waWVkIGRhdGEgaW5zdGVhZC5cbiAgICBjb25zdCBoZWFkZXIgPVxuICAgICAgaGVhZGVycy5maW5kKHJvdyA9PiBzZWxlY3RlZENvdW50KHJvdywgaXNTZWxlY3RlZCkgPiAwKSA/P1xuICAgICAgKHJvd3MubGVuZ3RoID4gMCA/IGhlYWRlcnNbMF0gOiB1bmRlZmluZWQpO1xuXG4gICAgaWYgKFxuICAgICAgY29sdW1ucy5sZW5ndGggPT09IDAgfHxcbiAgICAgIHN1bUJ5KFsuLi4oaGVhZGVyID8gW2hlYWRlcl0gOiBbXSksIC4uLnJvd3NdLCByb3cgPT5cbiAgICAgICAgc2VsZWN0ZWRDb3VudChyb3csIGlzU2VsZWN0ZWQpLFxuICAgICAgKSA8IDJcbiAgICApXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiB0b1RleHQoaGVhZGVyLCByb3dzLCBjb2x1bW5zKSxcbiAgICAgIGh0bWw6IHRvSHRtbChoZWFkZXIsIHJvd3MsIGNvbHVtbnMpLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0b1RleHQoXG4gICAgaGVhZGVyOiBSb3cgfCB1bmRlZmluZWQsXG4gICAgcm93czogcmVhZG9ubHkgUm93W10sXG4gICAgY29sdW1uczogcmVhZG9ubHkgbnVtYmVyW10sXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihoZWFkZXIgPyBbY29sdW1ucy5tYXAoY29sdW1uID0+IGhlYWRlclRleHQoaGVhZGVyW2NvbHVtbl0pKV0gOiBbXSksXG4gICAgICAuLi5yb3dzLm1hcChyb3cgPT4gY29sdW1ucy5tYXAoY29sdW1uID0+IHRleHQocm93W2NvbHVtbl0pKSksXG4gICAgXVxuICAgICAgLm1hcChjZWxscyA9PiBjZWxscy5qb2luKCdcXHQnKSlcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvSHRtbChcbiAgICBoZWFkZXI6IFJvdyB8IHVuZGVmaW5lZCxcbiAgICByb3dzOiByZWFkb25seSBSb3dbXSxcbiAgICBjb2x1bW5zOiByZWFkb25seSBudW1iZXJbXSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBjZWxscyA9ICh2YWx1ZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCB0YWc6ICd0aCcgfCAndGQnKSA9PlxuICAgICAgdmFsdWVzLm1hcCh2YWx1ZSA9PiBgPCR7dGFnfT4ke2VzY2FwZUh0bWwodmFsdWUpfTwvJHt0YWd9PmApLmpvaW4oJycpO1xuICAgIHJldHVybiBbXG4gICAgICAnPHRhYmxlPicsXG4gICAgICBoZWFkZXJcbiAgICAgICAgPyBgPHRoZWFkPjx0cj4ke2NlbGxzKFxuICAgICAgICAgICAgY29sdW1ucy5tYXAoY29sdW1uID0+IGhlYWRlclRleHQoaGVhZGVyW2NvbHVtbl0pKSxcbiAgICAgICAgICAgICd0aCcsXG4gICAgICAgICAgKX08L3RyPjwvdGhlYWQ+YFxuICAgICAgICA6ICcnLFxuICAgICAgYDx0Ym9keT4ke3Jvd3NcbiAgICAgICAgLm1hcChcbiAgICAgICAgICByb3cgPT5cbiAgICAgICAgICAgIGA8dHI+JHtjZWxscyhcbiAgICAgICAgICAgICAgY29sdW1ucy5tYXAoY29sdW1uID0+IHRleHQocm93W2NvbHVtbl0pKSxcbiAgICAgICAgICAgICAgJ3RkJyxcbiAgICAgICAgICAgICl9PC90cj5gLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcnKX08L3Rib2R5PmAsXG4gICAgICAnPC90YWJsZT4nLFxuICAgIF0uam9pbignJyk7XG4gIH1cblxuICBmdW5jdGlvbiBsYXlvdXQodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQpOiBMYXlvdXQge1xuICAgIHJldHVybiB7XG4gICAgICBoZWFkZXI6IGdyaWQoXG4gICAgICAgIEFycmF5LmZyb20odGFibGUucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGhlYWQgPiB0cicpKS5maWx0ZXIoXG4gICAgICAgICAgaXNEYXRhUm93LFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIGJvZHk6IGdyaWQoXG4gICAgICAgIEFycmF5LmZyb20oXG4gICAgICAgICAgdGFibGUucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICc6c2NvcGUgPiB0Ym9keSA+IHRyLCA6c2NvcGUgPiB0Ym9keSA+IGEucm93LWxpbmsnLFxuICAgICAgICAgICksXG4gICAgICAgICkuZmlsdGVyKGlzRGF0YVJvdyksXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTWFwcyByb3dzIG9udG8gYSBjb2x1bW4gZ3JpZC4gQ2VsbHMgY292ZXJlZCBieSBhIHJvd3NwYW4gcmVwZWF0IHRoZSBzcGFubmluZ1xuICAgKiBjZWxsIHNvIHRoYXQgZXZlcnkgbGluZSBoYXMgb25lIHZhbHVlIHBlciBjb2x1bW4sIG1hdGNoaW5nIGhvdyBDU1YgZXhwb3J0XG4gICAqIGZsYXR0ZW5zIHNwYW5zLlxuICAgKi9cbiAgZnVuY3Rpb24gZ3JpZChyb3dzOiByZWFkb25seSBFbGVtZW50W10pOiBSb3dbXSB7XG4gICAgY29uc3QgY2VsbHM6IChFbGVtZW50IHwgdW5kZWZpbmVkKVtdW10gPSByb3dzLm1hcCgoKSA9PiBbXSk7XG4gICAgcm93cy5mb3JFYWNoKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBsZXQgY29sdW1uID0gMDtcbiAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBkYXRhQ2VsbHMocm93KSkge1xuICAgICAgICB3aGlsZSAoY2VsbHNbcm93SW5kZXhdW2NvbHVtbl0gIT09IHVuZGVmaW5lZCkgY29sdW1uKys7XG4gICAgICAgIGNvbnN0IHJvd1NwYW4gPSBNYXRoLm1heCgxLCBjZWxsLnJvd1NwYW4pO1xuICAgICAgICBjb25zdCBjb2xTcGFuID0gTWF0aC5tYXgoMSwgY2VsbC5jb2xTcGFuKTtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBsZXQgciA9IHJvd0luZGV4O1xuICAgICAgICAgIHIgPD0gTWF0aC5taW4ocm93cy5sZW5ndGggLSAxLCByb3dJbmRleCArIHJvd1NwYW4gLSAxKTtcbiAgICAgICAgICByKytcbiAgICAgICAgKVxuICAgICAgICAgIGZvciAobGV0IGMgPSBjb2x1bW47IGMgPCBjb2x1bW4gKyBjb2xTcGFuOyBjKyspIGNlbGxzW3JdW2NdID0gY2VsbDtcbiAgICAgICAgY29sdW1uICs9IGNvbFNwYW47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNlbGxzO1xuICB9XG5cbiAgZnVuY3Rpb24gZGF0YUNlbGxzKHJvdzogRWxlbWVudCk6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgcm93LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCc6c2NvcGUgPiB0ZCwgOnNjb3BlID4gdGgnKSxcbiAgICApLmZpbHRlcihjZWxsID0+ICFjZWxsLm1hdGNoZXMoY29udHJvbENlbGxTZWxlY3RvcikpO1xuICB9XG5cbiAgLyoqIEV4Y2x1ZGVzIHRoZSB6ZXJvLXN0YXRlIHJvdywgd2hpY2ggc3BhbnMgZXZlcnkgY29sdW1uLiAqL1xuICBmdW5jdGlvbiBpc0RhdGFSb3cocm93OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHJvdy5xdWVyeVNlbGVjdG9yKGZpbGxlclJvd1NlbGVjdG9yKSA9PT0gbnVsbCAmJlxuICAgICAgZGF0YUNlbGxzKHJvdykuZXZlcnkoY2VsbCA9PiBjZWxsLmNvbFNwYW4gPD0gMSlcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0ZWRDb2x1bW5zKFxuICAgIGxheW91dHM6IHJlYWRvbmx5IExheW91dFtdLFxuICAgIGlzU2VsZWN0ZWQ6IFNlbGVjdGlvblRlc3QsXG4gICAgZW5kcG9pbnRzOiByZWFkb25seSAoTm9kZSB8IG51bGwgfCB1bmRlZmluZWQpW10sXG4gICk6IG51bWJlcltdIHtcbiAgICBjb25zdCBjb2x1bW5zID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCB7IGhlYWRlciwgYm9keSB9IG9mIGxheW91dHMpXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBbLi4uaGVhZGVyLCAuLi5ib2R5XSlcbiAgICAgICAgcm93LmZvckVhY2goKGNlbGwsIGNvbHVtbikgPT4ge1xuICAgICAgICAgIGlmIChjZWxsICE9PSB1bmRlZmluZWQgJiYgaXNTZWxlY3RlZChjZWxsKSkgY29sdW1ucy5hZGQoY29sdW1uKTtcbiAgICAgICAgfSk7XG4gICAgY29uc3QgdG91Y2hlZCA9IFsuLi5jb2x1bW5zXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG5cbiAgICAvLyBCb3RoIGVuZHMgaGF2ZSB0byBsYW5kIGluIGEgY2VsbCB0byBkZXNjcmliZSBhIHNwYW47IGFueXRoaW5nIGVsc2UgKGFcbiAgICAvLyBzZWxlY3QtYWxsLCBhbiBlbmRwb2ludCBvbiBhIHJvdyByYXRoZXIgdGhhbiBhIGNlbGwpIGtlZXBzIGV2ZXJ5IGNvbHVtbi5cbiAgICBjb25zdCBzcGFuID0gZW5kcG9pbnRzXG4gICAgICAubWFwKG5vZGUgPT4gKG5vZGUgPyBjb2x1bW5PZihsYXlvdXRzLCBub2RlKSA6IHVuZGVmaW5lZCkpXG4gICAgICAuZmlsdGVyKChjb2x1bW4pOiBjb2x1bW4gaXMgbnVtYmVyID0+IGNvbHVtbiAhPT0gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gc3Bhbi5sZW5ndGggPT09IGVuZHBvaW50cy5sZW5ndGggJiYgc3Bhbi5sZW5ndGggPiAxXG4gICAgICA/IHRvdWNoZWQuZmlsdGVyKFxuICAgICAgICAgIGNvbHVtbiA9PiBjb2x1bW4gPj0gTWF0aC5taW4oLi4uc3BhbikgJiYgY29sdW1uIDw9IE1hdGgubWF4KC4uLnNwYW4pLFxuICAgICAgICApXG4gICAgICA6IHRvdWNoZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb2x1bW5PZihcbiAgICBsYXlvdXRzOiByZWFkb25seSBMYXlvdXRbXSxcbiAgICBub2RlOiBOb2RlLFxuICApOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgeyBoZWFkZXIsIGJvZHkgfSBvZiBsYXlvdXRzKVxuICAgICAgZm9yIChjb25zdCByb3cgb2YgWy4uLmhlYWRlciwgLi4uYm9keV0pIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gcm93LmZpbmRJbmRleChjZWxsID0+IGNlbGw/LmNvbnRhaW5zKG5vZGUpID09PSB0cnVlKTtcbiAgICAgICAgaWYgKGNvbHVtbiA+PSAwKSByZXR1cm4gY29sdW1uO1xuICAgICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3RlZENvdW50KHJvdzogUm93LCBpc1NlbGVjdGVkOiBTZWxlY3Rpb25UZXN0KTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93LmZpbHRlcihjZWxsID0+IGNlbGwgIT09IHVuZGVmaW5lZCAmJiBpc1NlbGVjdGVkKGNlbGwpKS5sZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBoZWFkZXJUZXh0KGNlbGw6IEVsZW1lbnQgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0KGNlbGw/LnF1ZXJ5U2VsZWN0b3IoaGVhZGVyTGFiZWxTZWxlY3RvcikgPz8gY2VsbCk7XG4gIH1cblxuICBmdW5jdGlvbiB0ZXh0KGNlbGw6IEVsZW1lbnQgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY2VsbCA/IHZpc2libGVUZXh0KGNlbGwpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkgOiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUZW1wbGF0ZSBpbmRlbnRhdGlvbiBsYW5kcyBpbiB0aGUgRE9NIGFzIG5ld2xpbmVzIGFuZCBydW5zIG9mIHNwYWNlcywgd2hpY2hcbiAgICogc3BsaXQgYSBzaW5nbGUgcm93IGFjcm9zcyBzZXZlcmFsIHNwcmVhZHNoZWV0IHJvd3MgdW5sZXNzIGNvbGxhcHNlZCBieSB0aGVcbiAgICogY2FsbGVyLiBDb21tZW50IGFuY2hvcnMgYW5kIHNjcmVlbi1yZWFkZXItb25seSBjb250ZW50IGFyZSBkcm9wcGVkLCBhbmRcbiAgICogc2libGluZyBub2RlcyBhcmUgc2VwYXJhdGVkIHNvIHRoYXQgYWRqYWNlbnQgZWxlbWVudHMgZG8gbm90IHJ1biB0b2dldGhlci5cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2libGVUZXh0KG5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgVGV4dCkgcmV0dXJuIG5vZGUubm9kZVZhbHVlID8/ICcnO1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudClcbiAgICAgIHJldHVybiBub2RlLm1hdGNoZXMoYXNzaXN0aXZlVGV4dFNlbGVjdG9yKVxuICAgICAgICA/ICcnXG4gICAgICAgIDogQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLm1hcCh2aXNpYmxlVGV4dCkuam9pbignICcpO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgfVxufVxuIl19
|