@firestitch/report 18.10.0 → 18.10.2
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/app/reports/components/component-text/component-text.component.d.ts +1 -0
- package/app/reports/components/component-text/value-embed.plugin.d.ts +25 -1
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +12 -0
- package/app/reports/components/report-component/report-component.component.d.ts +1 -0
- package/app/reports/data/report.data.d.ts +5 -7
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +13 -1
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +30 -2
- package/app/reports/export/report-export-collector.service.d.ts +13 -5
- package/app/reports/export/report-filter-lines.d.ts +3 -0
- package/app/reports/filter-settings-rules.d.ts +4 -0
- package/app/reports/filter-text.d.ts +8 -0
- package/app/reports/format.d.ts +1 -0
- package/app/reports/interfaces/report-export-lines-input.interface.d.ts +1 -0
- package/app/reports/interfaces/report-filter-group-changes.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +1 -14
- package/app/reports/report-filter-items.d.ts +11 -8
- package/app/reports/report-view-config.d.ts +1 -3
- package/app/reports/services/report-filter-state.service.d.ts +5 -14
- package/app/reports/services/report-view.service.d.ts +1 -13
- package/app/reports/text.d.ts +16 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +2 -8
- package/esm2022/app/reports/canvas-landing-page.mjs +7 -6
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +5 -5
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +34 -22
- package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +254 -42
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +130 -24
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +38 -19
- package/esm2022/app/reports/data/report.data.mjs +19 -11
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +57 -14
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +169 -21
- package/esm2022/app/reports/export/report-export-collector.service.mjs +84 -33
- package/esm2022/app/reports/export/report-filter-lines.mjs +25 -8
- package/esm2022/app/reports/export/report-pdf.service.mjs +31 -21
- package/esm2022/app/reports/export/report-pptx.service.mjs +21 -11
- package/esm2022/app/reports/filter-settings-rules.mjs +8 -1
- package/esm2022/app/reports/filter-text.mjs +154 -0
- package/esm2022/app/reports/format.mjs +3 -2
- package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-filter-group-changes.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/report-date-presets.mjs +2 -2
- package/esm2022/app/reports/report-filter-items.mjs +48 -106
- package/esm2022/app/reports/report-view-config.mjs +6 -116
- package/esm2022/app/reports/services/report-filter-state.service.mjs +92 -269
- package/esm2022/app/reports/services/report-view.service.mjs +25 -165
- package/esm2022/app/reports/text.mjs +59 -13
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +69 -130
- package/esm2022/app/reports/views/report/report.component.mjs +25 -19
- package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs → firestitch-report-echarts-CyHkFToO.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs.map → firestitch-report-echarts-CyHkFToO.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-B1keNrcK.mjs → firestitch-report-firestitch-report-DftB7M1o.mjs} +2936 -3254
- package/fesm2022/firestitch-report-firestitch-report-DftB7M1o.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/app/reports/interfaces/report-url-link.interface.d.ts +0 -4
- package/app/reports/interfaces/report-url-value-name.type.d.ts +0 -1
- package/app/reports/interfaces/report-url-write.interface.d.ts +0 -4
- package/app/reports/report-url-state.d.ts +0 -36
- package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +0 -2
- package/esm2022/app/reports/report-url-state.mjs +0 -677
- package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +0 -1
|
@@ -1,43 +1,27 @@
|
|
|
1
1
|
import { HttpContext } from '@angular/common/http';
|
|
2
2
|
import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';
|
|
3
3
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { DisplayApiError
|
|
4
|
+
import { DisplayApiError } from '@firestitch/api';
|
|
5
5
|
import { FsMessage } from '@firestitch/message';
|
|
6
6
|
import { EMPTY, of } from 'rxjs';
|
|
7
|
-
import { catchError, map,
|
|
7
|
+
import { catchError, map, tap } from 'rxjs/operators';
|
|
8
8
|
import { ReportData } from '../data/report.data';
|
|
9
|
-
import {
|
|
10
|
-
import { URL_TOO_LONG_MESSAGE, hasReportUrlState, paramsToViewConfig, readReportUrlLink, reportParamsToClear, urlValueNames, viewConfigToParams, } from '../report-url-state';
|
|
11
|
-
import { REPORT_VIEW_CONFIG_VERSION, VIEW_NOT_AVAILABLE_MESSAGE, toStoredGroupValue, viewConfigDiff, viewDroppedCount, viewDroppedMessage, withStoredKeys, } from '../report-view-config';
|
|
9
|
+
import { viewDroppedCount, viewDroppedMessage, withStoredKeys } from '../report-view-config';
|
|
12
10
|
import { ReportFilterStateService } from './report-filter-state.service';
|
|
13
11
|
import * as i0 from "@angular/core";
|
|
14
12
|
// The open report's saved views, per open report beside the state service:
|
|
15
13
|
// the list the viewer may see, the view that is open, the order a report
|
|
16
|
-
// opens in
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
14
|
+
// opens in and the calls that change a view. The viewer state stays
|
|
15
|
+
// ReportFilterStateService's: this service puts a view on screen through
|
|
16
|
+
// apply() and reads the screen through snapshot(), base and viewChanged.
|
|
17
|
+
// Nothing here runs for a report whose server does not list 'views'
|
|
18
|
+
// (serves()). A view is opened from the Views menu only: a report keeps no
|
|
19
|
+
// state in the browser URL, so there is no link to a view.
|
|
21
20
|
//
|
|
22
21
|
// The order a report opens in (open(), on its first load only):
|
|
23
|
-
// 1.
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
// the viewer owns that view it is the open view, and the screen is
|
|
27
|
-
// compared with it. The tiles wait for that one view only; the list loads
|
|
28
|
-
// behind them. A link with rpv and no state (the owner's view was open on
|
|
29
|
-
// the report's defaults) is a link for the owner only; for anyone else
|
|
30
|
-
// it is no link.
|
|
31
|
-
// 2. Else the viewer's default view.
|
|
32
|
-
// 3. Else the report's authored defaults.
|
|
33
|
-
// A page in the link beats a view's page.
|
|
34
|
-
//
|
|
35
|
-
// The link (urlParams): while a shared view is open, rv and what differs
|
|
36
|
-
// from it; while one of the viewer's own views is open, or when the screen
|
|
37
|
-
// went back to something a link cannot say on top of the shared view (see
|
|
38
|
-
// viewConfigDiff), everything that differs from the report's defaults, and
|
|
39
|
-
// rpv when the viewer owns the open view. Sharing the open view, or no
|
|
40
|
-
// longer sharing it, writes the link again.
|
|
22
|
+
// 1. The viewer's default view.
|
|
23
|
+
// 2. Else the report's authored defaults.
|
|
24
|
+
// A ?page= the report opened with beats the default view's page.
|
|
41
25
|
export class ReportViewService {
|
|
42
26
|
// The views the viewer may see, names and flags only: its own first, then
|
|
43
27
|
// the ones others share. Empty until the list is read.
|
|
@@ -58,42 +42,24 @@ export class ReportViewService {
|
|
|
58
42
|
_openView = signal(null);
|
|
59
43
|
// The report the views belong to.
|
|
60
44
|
_reportId = null;
|
|
61
|
-
// The note that the screen is too long for a link shows once per report.
|
|
62
|
-
_tooLongShown = false;
|
|
63
45
|
// Whether the open report's server keeps saved views.
|
|
64
46
|
serves(report) {
|
|
65
47
|
return !!report?.viewerFeatures?.includes('views');
|
|
66
48
|
}
|
|
67
49
|
// A report's first load, in the open order above: the state service is
|
|
68
|
-
// set up for `report` (init)
|
|
69
|
-
// the
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
open(report,
|
|
50
|
+
// set up for `report` (init) once the list is read, and the screen opened
|
|
51
|
+
// on the viewer's default view, else on the report's defaults. `pageId` is
|
|
52
|
+
// the ?page= the report opened with, which beats the view's page. Ends once
|
|
53
|
+
// the screen is set.
|
|
54
|
+
open(report, pageId) {
|
|
73
55
|
this._start(report);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const state = hasReportUrlState(params, report.filterGroups ?? []);
|
|
77
|
-
if (!state && !link.personalViewId) {
|
|
78
|
-
return this._openDefault(report, page);
|
|
79
|
-
}
|
|
80
|
-
const linkDiff = { ...paramsToViewConfig(params, report.filterGroups ?? []), ...page };
|
|
81
|
-
const viewId = link.viewId ?? link.personalViewId;
|
|
82
|
-
return (viewId ? this._readView(report.id, viewId) : of(null))
|
|
83
|
-
.pipe(switchMap((view) => {
|
|
84
|
-
// A link that names only a personal view (its screen was the
|
|
85
|
-
// report's defaults) is the owner's link; for anyone else it says
|
|
86
|
-
// nothing, and the report opens as it would with no link.
|
|
87
|
-
if (!state && !view?.mine) {
|
|
88
|
-
return this._openDefault(report, page);
|
|
89
|
-
}
|
|
56
|
+
return this._readViews(report)
|
|
57
|
+
.pipe(tap((list) => {
|
|
90
58
|
this._filterState.init(report);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return of(undefined);
|
|
96
|
-
}));
|
|
59
|
+
if (list?.myDefault) {
|
|
60
|
+
this._openOn(list.myDefault, () => this._filterState.apply(list.myDefault.config, pageId));
|
|
61
|
+
}
|
|
62
|
+
}), map(() => undefined));
|
|
97
63
|
}
|
|
98
64
|
// A later load of the open report (a chat edit, a settings save): the
|
|
99
65
|
// screen and the open view stay, and the list is read again behind them so
|
|
@@ -166,20 +132,6 @@ export class ReportViewService {
|
|
|
166
132
|
this._message.success('View deleted');
|
|
167
133
|
}));
|
|
168
134
|
}
|
|
169
|
-
// The query params that make the URL carry the screen (see the class
|
|
170
|
-
// comment), spread over the owned keys `current` carries so the ones the
|
|
171
|
-
// screen no longer needs are removed. The host adds its page key.
|
|
172
|
-
// A select's value is named by `name`, else by the name `current` carries
|
|
173
|
-
// for it.
|
|
174
|
-
urlParams(current, name = () => null) {
|
|
175
|
-
const currentName = urlValueNames(current, this._reportGroups());
|
|
176
|
-
const write = this._linkWrite((groupId, value) => name(groupId, value) ?? currentName(groupId, value));
|
|
177
|
-
if (write.tooLong && !this._tooLongShown) {
|
|
178
|
-
this._tooLongShown = true;
|
|
179
|
-
this._message.warning(URL_TOO_LONG_MESSAGE);
|
|
180
|
-
}
|
|
181
|
-
return { ...reportParamsToClear(current, this._reportGroups()), ...write.params };
|
|
182
|
-
}
|
|
183
135
|
// Starts over for another report: no list and no open view.
|
|
184
136
|
_start(report) {
|
|
185
137
|
if (report.id === this._reportId) {
|
|
@@ -189,35 +141,6 @@ export class ReportViewService {
|
|
|
189
141
|
this._views.set([]);
|
|
190
142
|
this._canShare.set(false);
|
|
191
143
|
this._openView.set(null);
|
|
192
|
-
this._tooLongShown = false;
|
|
193
|
-
}
|
|
194
|
-
// No link: the viewer's default view, else the report's defaults, once the
|
|
195
|
-
// list is read.
|
|
196
|
-
_openDefault(report, page) {
|
|
197
|
-
return this._readViews(report)
|
|
198
|
-
.pipe(tap((list) => {
|
|
199
|
-
this._filterState.init(report);
|
|
200
|
-
if (list?.myDefault) {
|
|
201
|
-
this._openOn(list.myDefault, () => this._filterState.apply(list.myDefault.config, page));
|
|
202
|
-
}
|
|
203
|
-
}), map(() => undefined));
|
|
204
|
-
}
|
|
205
|
-
// A link with state: on the shared view rv names, else on the report's
|
|
206
|
-
// defaults; rpv's view is the open view only when the viewer owns it.
|
|
207
|
-
_openLink(link, view, linkDiff) {
|
|
208
|
-
if (link.viewId && view) {
|
|
209
|
-
this._openOn(view, () => this._filterState.apply(view.config, linkDiff));
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
if (!link.viewId && view?.mine) {
|
|
213
|
-
this._openOn(view, () => this._filterState.apply(null, linkDiff, view.config));
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
this._openView.set(null);
|
|
217
|
-
this._filterState.apply(null, linkDiff);
|
|
218
|
-
if (link.viewId) {
|
|
219
|
-
this._message.warning(VIEW_NOT_AVAILABLE_MESSAGE);
|
|
220
|
-
}
|
|
221
144
|
}
|
|
222
145
|
// Makes `view` the open view, puts it on screen (`applyView`), and says
|
|
223
146
|
// how many of its settings no longer apply (and to save it, when the
|
|
@@ -231,9 +154,7 @@ export class ReportViewService {
|
|
|
231
154
|
}
|
|
232
155
|
}
|
|
233
156
|
// Runs a change on the open view and takes its answer as the open view
|
|
234
|
-
// and its row in the list.
|
|
235
|
-
// whose it is) changes the key a link names it by, so the URL is written
|
|
236
|
-
// again.
|
|
157
|
+
// and its row in the list.
|
|
237
158
|
_changeOpen(change) {
|
|
238
159
|
const open = this._openView();
|
|
239
160
|
if (!open) {
|
|
@@ -243,9 +164,6 @@ export class ReportViewService {
|
|
|
243
164
|
.pipe(tap((view) => {
|
|
244
165
|
this._openView.set(view);
|
|
245
166
|
this._putRow(view);
|
|
246
|
-
if (view.shared !== open.shared || view.mine !== open.mine) {
|
|
247
|
-
this._filterState.rewriteUrl();
|
|
248
|
-
}
|
|
249
167
|
}));
|
|
250
168
|
}
|
|
251
169
|
// A view's row in the list, replaced or added. A new default clears the
|
|
@@ -277,64 +195,6 @@ export class ReportViewService {
|
|
|
277
195
|
}
|
|
278
196
|
}));
|
|
279
197
|
}
|
|
280
|
-
// A view a link names; null when the viewer cannot open it. The server
|
|
281
|
-
// answers 'View not found' for one it cannot see, which must not move the
|
|
282
|
-
// host to its not-found page.
|
|
283
|
-
_readView(reportId, reportViewId) {
|
|
284
|
-
return this._reportData.view(reportId, reportViewId, { context: new HttpContext().set(ProcessApiError, false) })
|
|
285
|
-
.pipe(catchError(() => of(null)));
|
|
286
|
-
}
|
|
287
|
-
// The params the screen writes (see the class comment).
|
|
288
|
-
_linkWrite(name) {
|
|
289
|
-
const open = this._openView();
|
|
290
|
-
const screen = this._filterState.snapshot();
|
|
291
|
-
const authored = this._filterState.authoredConfig();
|
|
292
|
-
const authoredSort = (componentId) => this._authoredSort(componentId);
|
|
293
|
-
if (open?.shared) {
|
|
294
|
-
// A group the view holds that the base let go of (its authored default
|
|
295
|
-
// changed while the view was open, and the screen took the new one)
|
|
296
|
-
// is still the view's value when a link opens the view, so it is
|
|
297
|
-
// compared with that value and written when the screen differs.
|
|
298
|
-
const base = this._filterState.base();
|
|
299
|
-
const linkBase = { ...base, groups: { ...open.config?.groups, ...base.groups } };
|
|
300
|
-
const diff = viewConfigDiff(linkBase, screen, authored, authoredSort);
|
|
301
|
-
if (diff) {
|
|
302
|
-
return viewConfigToParams(this._linkDays(diff), this._reportGroups(), { viewId: open.id }, name);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
const full = viewConfigDiff(authored, screen, authored, authoredSort) ?? screen;
|
|
306
|
-
const link = open?.mine ? { personalViewId: open.id } : {};
|
|
307
|
-
return viewConfigToParams(this._linkDays(full), this._reportGroups(), link, name);
|
|
308
|
-
}
|
|
309
|
-
// `config` with each rolling range (a relative name, which a view keeps) as
|
|
310
|
-
// the days it gives today in the report's zone: a link carries days, never a
|
|
311
|
-
// preset name. A name the report does not know is left as it is, and the
|
|
312
|
-
// link leaves that group out.
|
|
313
|
-
_linkDays(config) {
|
|
314
|
-
if (!config.groups) {
|
|
315
|
-
return config;
|
|
316
|
-
}
|
|
317
|
-
const groups = Object.entries(config.groups)
|
|
318
|
-
.map(([groupId, value]) => [groupId, this._groupDays(value)]);
|
|
319
|
-
return { ...config, groups: Object.fromEntries(groups) };
|
|
320
|
-
}
|
|
321
|
-
_groupDays(value) {
|
|
322
|
-
const range = value?.relative ? this._filterState.resolveRelative(value.relative) : null;
|
|
323
|
-
return range ? toStoredGroupValue('dateRange', { start: range.start, end: range.end }) : value;
|
|
324
|
-
}
|
|
325
|
-
// Every filter group of the open report: the link keys each by its label.
|
|
326
|
-
_reportGroups() {
|
|
327
|
-
return this._filterState.report()?.filterGroups ?? [];
|
|
328
|
-
}
|
|
329
|
-
// A list's authored first sort term, or null for any other component.
|
|
330
|
-
_authoredSort(componentId) {
|
|
331
|
-
const report = this._filterState.report();
|
|
332
|
-
const component = [
|
|
333
|
-
...(report?.pages ?? []).flatMap((page) => page.components ?? []),
|
|
334
|
-
...(report?.master?.components ?? []),
|
|
335
|
-
].find((candidate) => candidate.id === componentId);
|
|
336
|
-
return component?.type === 'list' ? listSortTerms(component.config)[0] ?? null : null;
|
|
337
|
-
}
|
|
338
198
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
339
199
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportViewService });
|
|
340
200
|
}
|
|
@@ -355,4 +215,4 @@ function viewSummary(view) {
|
|
|
355
215
|
modifyDate: view.modifyDate,
|
|
356
216
|
};
|
|
357
217
|
}
|
|
358
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9zZXJ2aWNlcy9yZXBvcnQtdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsS0FBSyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBV2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQ25HLGFBQWEsRUFBRSxrQkFBa0IsR0FDbEMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsMEJBQTBCLEVBQUUsMEJBQTBCLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUM1RyxrQkFBa0IsRUFBRSxjQUFjLEdBQ25DLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0s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QyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEYsQ0FBQzt3R0ExWFUsaUJBQWlCOzRHQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVU7O0FBK1hYLGlFQUFpRTtBQUNqRSxTQUFTLFdBQVcsQ0FBQyxJQUFnQjtJQUNuQyxPQUFPO1FBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1FBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtRQUNyQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7UUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1FBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztRQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7S0FDNUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IERlc3Ryb3lSZWYsIEluamVjdGFibGUsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgUGFyYW1NYXAsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IERpc3BsYXlBcGlFcnJvciwgUHJvY2Vzc0FwaUVycm9yIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXBpJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuXG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydFVybExpbmsgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC11cmwtbGluay5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0VXJsVmFsdWVOYW1lIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdXJsLXZhbHVlLW5hbWUudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRVcmxXcml0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXVybC13cml0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld0NvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3Q3JlYXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdmlldy1jcmVhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdEZWxldGVkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdmlldy1kZWxldGVkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3U3VtbWFyeSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctc3VtbWFyeS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0VmlldyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdmlld3MuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZpbHRlckdyb3VwRGVmYXVsdCwgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0U29ydCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBsaXN0U29ydFRlcm1zIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHtcbiAgVVJMX1RPT19MT05HX01FU1NBR0UsIGhhc1JlcG9ydFVybFN0YXRlLCBwYXJhbXNUb1ZpZXdDb25maWcsIHJlYWRSZXBvcnRVcmxMaW5rLCByZXBvcnRQYXJhbXNUb0NsZWFyLFxuICB1cmxWYWx1ZU5hbWVzLCB2aWV3Q29uZmlnVG9QYXJhbXMsXG59IGZyb20gJy4uL3JlcG9ydC11cmwtc3RhdGUnO1xuaW1wb3J0IHtcbiAgUkVQT1JUX1ZJRVdfQ09ORklHX1ZFUlNJT04sIFZJRVdfTk9UX0FWQUlMQUJMRV9NRVNTQUdFLCB0b1N0b3JlZEdyb3VwVmFsdWUsIHZpZXdDb25maWdEaWZmLCB2aWV3RHJvcHBlZENvdW50LFxuICB2aWV3RHJvcHBlZE1lc3NhZ2UsIHdpdGhTdG9yZWRLZXlzLFxufSBmcm9tICcuLi9yZXBvcnQtdmlldy1jb25maWcnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbi8vIFRoZSBvcGVuIHJlcG9ydCdzIHNhdmVkIHZpZXdzLCBwZXIgb3BlbiByZXBvcnQgYmVzaWRlIHRoZSBzdGF0ZSBzZXJ2aWNlOlxuLy8gdGhlIGxpc3QgdGhlIHZpZXdlciBtYXkgc2VlLCB0aGUgdmlldyB0aGF0IGlzIG9wZW4sIHRoZSBvcmRlciBhIHJlcG9ydFxuLy8gb3BlbnMgaW4sIHRoZSBjYWxscyB0aGF0IGNoYW5nZSBhIHZpZXcsIGFuZCB0aGUgbGluayB0aGUgc2NyZWVuIHdyaXRlcy5cbi8vIFRoZSB2aWV3ZXIgc3RhdGUgc3RheXMgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlJ3M6IHRoaXMgc2VydmljZSBwdXRzIGFcbi8vIHZpZXcgb24gc2NyZWVuIHRocm91Z2ggYXBwbHkoKSBhbmQgcmVhZHMgdGhlIHNjcmVlbiB0aHJvdWdoIHNuYXBzaG90KCksXG4vLyBiYXNlIGFuZCB2aWV3Q2hhbmdlZC4gTm90aGluZyBoZXJlIHJ1bnMgZm9yIGEgcmVwb3J0IHdob3NlIHNlcnZlciBkb2VzIG5vdFxuLy8gbGlzdCAndmlld3MnIChzZXJ2ZXMoKSk7IHN1Y2ggYSByZXBvcnQga2VlcHMgdGhlIGxpbmsgaXQgYWx3YXlzIGhhZC5cbi8vXG4vLyBUaGUgb3JkZXIgYSByZXBvcnQgb3BlbnMgaW4gKG9wZW4oKSwgb24gaXRzIGZpcnN0IGxvYWQgb25seSk6XG4vLyAxLiBBIGxpbmsgdGhhdCBjYXJyaWVzIHN0YXRlIChhbnkgb3duZWQga2V5LCBtYXRjaCBvciBydikuIHJ2IG5hbWVzIHRoZSBzaGFyZWRcbi8vICAgIHZpZXcgaXQgaXMgYSBkaWZmIGZyb207IG9uZSB0aGUgdmlld2VyIGNhbm5vdCBvcGVuIGxlYXZlcyB0aGUgZGlmZiBvblxuLy8gICAgdGhlIHJlcG9ydCdzIGRlZmF1bHRzLCB3aXRoIGEgbm90ZS4gcnB2IG5ldmVyIGNoYW5nZXMgdGhlIHNjcmVlbjogd2hlblxuLy8gICAgdGhlIHZpZXdlciBvd25zIHRoYXQgdmlldyBpdCBpcyB0aGUgb3BlbiB2aWV3LCBhbmQgdGhlIHNjcmVlbiBpc1xuLy8gICAgY29tcGFyZWQgd2l0aCBpdC4gVGhlIHRpbGVzIHdhaXQgZm9yIHRoYXQgb25lIHZpZXcgb25seTsgdGhlIGxpc3QgbG9hZHNcbi8vICAgIGJlaGluZCB0aGVtLiBBIGxpbmsgd2l0aCBycHYgYW5kIG5vIHN0YXRlICh0aGUgb3duZXIncyB2aWV3IHdhcyBvcGVuIG9uXG4vLyAgICB0aGUgcmVwb3J0J3MgZGVmYXVsdHMpIGlzIGEgbGluayBmb3IgdGhlIG93bmVyIG9ubHk7IGZvciBhbnlvbmUgZWxzZVxuLy8gICAgaXQgaXMgbm8gbGluay5cbi8vIDIuIEVsc2UgdGhlIHZpZXdlcidzIGRlZmF1bHQgdmlldy5cbi8vIDMuIEVsc2UgdGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzLlxuLy8gQSBwYWdlIGluIHRoZSBsaW5rIGJlYXRzIGEgdmlldydzIHBhZ2UuXG4vL1xuLy8gVGhlIGxpbmsgKHVybFBhcmFtcyk6IHdoaWxlIGEgc2hhcmVkIHZpZXcgaXMgb3BlbiwgcnYgYW5kIHdoYXQgZGlmZmVyc1xuLy8gZnJvbSBpdDsgd2hpbGUgb25lIG9mIHRoZSB2aWV3ZXIncyBvd24gdmlld3MgaXMgb3Blbiwgb3Igd2hlbiB0aGUgc2NyZWVuXG4vLyB3ZW50IGJhY2sgdG8gc29tZXRoaW5nIGEgbGluayBjYW5ub3Qgc2F5IG9uIHRvcCBvZiB0aGUgc2hhcmVkIHZpZXcgKHNlZVxuLy8gdmlld0NvbmZpZ0RpZmYpLCBldmVyeXRoaW5nIHRoYXQgZGlmZmVycyBmcm9tIHRoZSByZXBvcnQncyBkZWZhdWx0cywgYW5kXG4vLyBycHYgd2hlbiB0aGUgdmlld2VyIG93bnMgdGhlIG9wZW4gdmlldy4gU2hhcmluZyB0aGUgb3BlbiB2aWV3LCBvciBub1xuLy8gbG9uZ2VyIHNoYXJpbmcgaXQsIHdyaXRlcyB0aGUgbGluayBhZ2Fpbi5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRWaWV3U2VydmljZSB7XG5cbiAgLy8gVGhlIHZpZXdzIHRoZSB2aWV3ZXIgbWF5IHNlZSwgbmFtZXMgYW5kIGZsYWdzIG9ubHk6IGl0cyBvd24gZmlyc3QsIHRoZW5cbiAgLy8gdGhlIG9uZXMgb3RoZXJzIHNoYXJlLiBFbXB0eSB1bnRpbCB0aGUgbGlzdCBpcyByZWFkLlxuICBwdWJsaWMgcmVhZG9ubHkgdmlld3MgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl92aWV3cygpKTtcblxuICAvLyBUaGUgdmlld2VyIG1heSBzaGFyZSBpdHMgdmlld3Mgd2l0aCBldmVyeW9uZS5cbiAgcHVibGljIHJlYWRvbmx5IGNhblNoYXJlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fY2FuU2hhcmUoKSk7XG5cbiAgLy8gVGhlIG9wZW4gdmlldywgd2l0aCBpdHMgY29uZmlnIGFzIGl0IHdhcyByZWFkIG9yIHNhdmVkOyBudWxsIHdoaWxlIHRoZVxuICAvLyBzY3JlZW4gaXMgb24gdGhlIHJlcG9ydCdzIGRlZmF1bHRzLlxuICBwdWJsaWMgcmVhZG9ubHkgb3BlblZpZXcgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9vcGVuVmlldygpKTtcblxuICAvLyBXaGV0aGVyIHRoZSBzY3JlZW4gZGlmZmVycyBmcm9tIHRoZSBvcGVuIHZpZXc7IGZhbHNlIHdpdGggbm9uZSBvcGVuLlxuICBwdWJsaWMgcmVhZG9ubHkgdmlld0NoYW5nZWQgPSBjb21wdXRlZCgoKSA9PiAhIXRoaXMuX29wZW5WaWV3KCkgJiYgdGhpcy5fZmlsdGVyU3RhdGUudmlld0NoYW5nZWQoKSk7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgX3ZpZXdzID0gc2lnbmFsPFJlcG9ydFZpZXdTdW1tYXJ5W10+KFtdKTtcbiAgcHJpdmF0ZSBfY2FuU2hhcmUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9vcGVuVmlldyA9IHNpZ25hbDxSZXBvcnRWaWV3IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIHJlcG9ydCB0aGUgdmlld3MgYmVsb25nIHRvLlxuICBwcml2YXRlIF9yZXBvcnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVGhlIG5vdGUgdGhhdCB0aGUgc2NyZWVuIGlzIHRvbyBsb25nIGZvciBhIGxpbmsgc2hvd3Mgb25jZSBwZXIgcmVwb3J0LlxuICBwcml2YXRlIF90b29Mb25nU2hvd24gPSBmYWxzZTtcblxuICAvLyBXaGV0aGVyIHRoZSBvcGVuIHJlcG9ydCdzIHNlcnZlciBrZWVwcyBzYXZlZCB2aWV3cy5cbiAgcHVibGljIHNlcnZlcyhyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFyZXBvcnQ/LnZpZXdlckZlYXR1cmVzPy5pbmNsdWRlcygndmlld3MnKTtcbiAgfVxuXG4gIC8vIEEgcmVwb3J0J3MgZmlyc3QgbG9hZCwgaW4gdGhlIG9wZW4gb3JkZXIgYWJvdmU6IHRoZSBzdGF0ZSBzZXJ2aWNlIGlzXG4gIC8vIHNldCB1cCBmb3IgYHJlcG9ydGAgKGluaXQpIGFuZCB0aGUgc2NyZWVuIG9wZW5lZCBvbiBhIGxpbmsgKGBwYXJhbXNgLFxuICAvLyB0aGUgVVJMJ3MgcXVlcnkgcGFyYW1zKSwgYSBkZWZhdWx0IHZpZXcgb3IgdGhlIHJlcG9ydCdzIGRlZmF1bHRzLlxuICAvLyBgcGFnZUlkYCBpcyB0aGUgcGFnZSB0aGUgbGluayBuYW1lcywgd2hpY2ggYmVhdHMgYSB2aWV3J3MgcGFnZS4gRW5kc1xuICAvLyBvbmNlIHRoZSBzY3JlZW4gaXMgc2V0OyB0aGUgbGlzdCBtYXkgc3RpbGwgYmUgbG9hZGluZyBiZWhpbmQgaXQuXG4gIHB1YmxpYyBvcGVuKHJlcG9ydDogUmVwb3J0LCBwYXJhbXM6IFBhcmFtcywgcGFnZUlkOiBudW1iZXIgfCBudWxsKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgdGhpcy5fc3RhcnQocmVwb3J0KTtcbiAgICBjb25zdCBwYWdlOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCA9IHBhZ2VJZCA/IHsgdjogUkVQT1JUX1ZJRVdfQ09ORklHX1ZFUlNJT04sIHBhZ2VJZCB9IDogbnVsbDtcbiAgICBjb25zdCBsaW5rID0gcmVhZFJlcG9ydFVybExpbmsocGFyYW1zKTtcbiAgICBjb25zdCBzdGF0ZSA9IGhhc1JlcG9ydFVybFN0YXRlKHBhcmFtcywgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSk7XG5cbiAgICBpZiAoIXN0YXRlICYmICFsaW5rLnBlcnNvbmFsVmlld0lkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb3BlbkRlZmF1bHQocmVwb3J0LCBwYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5rRGlmZjogUmVwb3J0Vmlld0NvbmZpZyA9IHsgLi4ucGFyYW1zVG9WaWV3Q29uZmlnKHBhcmFtcywgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSksIC4uLnBhZ2UgfTtcbiAgICBjb25zdCB2aWV3SWQgPSBsaW5rLnZpZXdJZCA/PyBsaW5rLnBlcnNvbmFsVmlld0lkO1xuXG4gICAgcmV0dXJuICh2aWV3SWQgPyB0aGlzLl9yZWFkVmlldyhyZXBvcnQuaWQsIHZpZXdJZCkgOiBvZihudWxsKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHZpZXcpID0+IHtcbiAgICAgICAgICAvLyBBIGxpbmsgdGhhdCBuYW1lcyBvbmx5IGEgcGVyc29uYWwgdmlldyAoaXRzIHNjcmVlbiB3YXMgdGhlXG4gICAgICAgICAgLy8gcmVwb3J0J3MgZGVmYXVsdHMpIGlzIHRoZSBvd25lcidzIGxpbms7IGZvciBhbnlvbmUgZWxzZSBpdCBzYXlzXG4gICAgICAgICAgLy8gbm90aGluZywgYW5kIHRoZSByZXBvcnQgb3BlbnMgYXMgaXQgd291bGQgd2l0aCBubyBsaW5rLlxuICAgICAgICAgIGlmICghc3RhdGUgJiYgIXZpZXc/Lm1pbmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcGVuRGVmYXVsdChyZXBvcnQsIHBhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0KTtcbiAgICAgICAgICB0aGlzLl9vcGVuTGluayhsaW5rLCB2aWV3LCBsaW5rRGlmZik7XG4gICAgICAgICAgdGhpcy5fcmVhZFZpZXdzKHJlcG9ydClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBBIGxhdGVyIGxvYWQgb2YgdGhlIG9wZW4gcmVwb3J0IChhIGNoYXQgZWRpdCwgYSBzZXR0aW5ncyBzYXZlKTogdGhlXG4gIC8vIHNjcmVlbiBhbmQgdGhlIG9wZW4gdmlldyBzdGF5LCBhbmQgdGhlIGxpc3QgaXMgcmVhZCBhZ2FpbiBiZWhpbmQgdGhlbSBzb1xuICAvLyBpdCBuYW1lcyB3aGF0IHRoZSBzZXJ2ZXIgaG9sZHMgbm93LlxuICBwdWJsaWMgcmVmcmVzaChyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXJ0KHJlcG9ydCk7XG4gICAgdGhpcy5fcmVhZFZpZXdzKHJlcG9ydClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIE9wZW5zIGEgdmlldyBwaWNrZWQgZnJvbSB0aGUgbGlzdDsgaXRzIGNvbmZpZyBpcyByZWFkIG5vdy5cbiAgcHVibGljIHBpY2socmVwb3J0Vmlld0lkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS52aWV3KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCh2aWV3KSA9PiB0aGlzLl9vcGVuT24odmlldywgKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuYXBwbHkodmlldy5jb25maWcpKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQ2xvc2VzIHRoZSBvcGVuIHZpZXcgYW5kIHB1dHMgdGhlIHNjcmVlbiBvbiB0aGUgcmVwb3J0J3MgZGVmYXVsdHMuXG4gIHB1YmxpYyBvcGVuRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgdGhpcy5fb3BlblZpZXcuc2V0KG51bGwpO1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KG51bGwpO1xuICB9XG5cbiAgLy8gU2F2ZXMgdGhlIHNjcmVlbiBhcyBhIG5ldyB2aWV3LCB3aGljaCBiZWNvbWVzIHRoZSBvcGVuIHZpZXcuIFRoZSBzY3JlZW5cbiAgLy8gaXMgYWxyZWFkeSB0aGUgdmlldywgc28gbm90aGluZyBpcyBhcHBsaWVkIGFnYWluLlxuICBwdWJsaWMgc2F2ZUFzTmV3KHZpZXc6IE9taXQ8UmVwb3J0Vmlld0NyZWF0ZSwgJ2NvbmZpZyc+KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuY3JlYXRlVmlldyh0aGlzLl9yZXBvcnRJZCwgeyAuLi52aWV3LCBjb25maWc6IHRoaXMuX2ZpbHRlclN0YXRlLnNuYXBzaG90KCkgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHNhdmVkKSA9PiB7XG4gICAgICAgICAgdGhpcy5fb3BlblZpZXcuc2V0KHNhdmVkKTtcbiAgICAgICAgICB0aGlzLl9wdXRSb3coc2F2ZWQpO1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEJhc2VUb1NjcmVlbigpO1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnVmlldyBzYXZlZCcpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBTYXZlcyB0aGUgc2NyZWVuIG92ZXIgdGhlIG9wZW4gdmlldywga2VlcGluZyB0aGUga2V5cyB0aGlzIHZpZXdlciBkb2VzXG4gIC8vIG5vdCBrbm93ICh3aXRoU3RvcmVkS2V5cykuXG4gIHB1YmxpYyBzYXZlQ2hhbmdlcygpOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICBjb25zdCBvcGVuID0gdGhpcy5fb3BlblZpZXcoKTtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVWaWV3KHRoaXMuX3JlcG9ydElkLCBvcGVuLmlkLCB7IGNvbmZpZzogd2l0aFN0b3JlZEtleXMob3Blbi5jb25maWcsIHRoaXMuX2ZpbHRlclN0YXRlLnNuYXBzaG90KCkpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChzYXZlZCkgPT4ge1xuICAgICAgICAgIHRoaXMuX29wZW5WaWV3LnNldChzYXZlZCk7XG4gICAgICAgICAgdGhpcy5fcHV0Um93KHNhdmVkKTtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRCYXNlVG9TY3JlZW4oKTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1ZpZXcgc2F2ZWQnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlT3BlbigocmVwb3J0Vmlld0lkKSA9PiB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZVZpZXcodGhpcy5fcmVwb3J0SWQsIHJlcG9ydFZpZXdJZCwgeyBuYW1lIH0pKTtcbiAgfVxuXG4gIC8vIFNoYXJlcyB0aGUgb3BlbiB2aWV3IHdpdGggZXZlcnlvbmUgd2hvIG1heSBvcGVuIHRoZSByZXBvcnQsIG9yIHN0b3BzLlxuICBwdWJsaWMgc2hhcmUoc2hhcmVkOiBib29sZWFuKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZU9wZW4oKHJlcG9ydFZpZXdJZCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5zaGFyZVZpZXcodGhpcy5fcmVwb3J0SWQsIHJlcG9ydFZpZXdJZCwgc2hhcmVkKSk7XG4gIH1cblxuICAvLyBNYWtlcyB0aGUgb3BlbiB2aWV3IHRoZSB2aWV3ZXIncyBkZWZhdWx0LCBvciBzdG9wcyBvcGVuaW5nIGl0IGJ5IGRlZmF1bHQuXG4gIHB1YmxpYyBzZXREZWZhdWx0KHBlcnNvbmFsRGVmYXVsdDogYm9vbGVhbik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VPcGVuKChyZXBvcnRWaWV3SWQpID0+IHRoaXMuX3JlcG9ydERhdGEuc2V0Vmlld0RlZmF1bHQodGhpcy5fcmVwb3J0SWQsIHJlcG9ydFZpZXdJZCwgcGVyc29uYWxEZWZhdWx0KSk7XG4gIH1cblxuICAvLyBEZWxldGVzIHRoZSBvcGVuIHZpZXcuIFRoZSBzY3JlZW4gc3RheXM7IHRoZSByZXBvcnQncyBkZWZhdWx0cyBiZWNvbWVcbiAgLy8gd2hhdCBpdCBpcyBjb21wYXJlZCB3aXRoLlxuICBwdWJsaWMgZGVsZXRlT3BlbigpOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXdEZWxldGVkPiB7XG4gICAgY29uc3Qgb3BlbiA9IHRoaXMuX29wZW5WaWV3KCk7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuZGVsZXRlVmlldyh0aGlzLl9yZXBvcnRJZCwgb3Blbi5pZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX29wZW5WaWV3LnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLl92aWV3cy51cGRhdGUoKHZpZXdzKSA9PiB2aWV3cy5maWx0ZXIoKHZpZXcpID0+IHZpZXcuaWQgIT09IG9wZW4uaWQpKTtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jbGVhckJhc2UoKTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1ZpZXcgZGVsZXRlZCcpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgcXVlcnkgcGFyYW1zIHRoYXQgbWFrZSB0aGUgVVJMIGNhcnJ5IHRoZSBzY3JlZW4gKHNlZSB0aGUgY2xhc3NcbiAgLy8gY29tbWVudCksIHNwcmVhZCBvdmVyIHRoZSBvd25lZCBrZXlzIGBjdXJyZW50YCBjYXJyaWVzIHNvIHRoZSBvbmVzIHRoZVxuICAvLyBzY3JlZW4gbm8gbG9uZ2VyIG5lZWRzIGFyZSByZW1vdmVkLiBUaGUgaG9zdCBhZGRzIGl0cyBwYWdlIGtleS5cbiAgLy8gQSBzZWxlY3QncyB2YWx1ZSBpcyBuYW1lZCBieSBgbmFtZWAsIGVsc2UgYnkgdGhlIG5hbWUgYGN1cnJlbnRgIGNhcnJpZXNcbiAgLy8gZm9yIGl0LlxuICBwdWJsaWMgdXJsUGFyYW1zKGN1cnJlbnQ6IFBhcmFtTWFwLCBuYW1lOiBSZXBvcnRVcmxWYWx1ZU5hbWUgPSAoKSA9PiBudWxsKTogUGFyYW1zIHtcbiAgICBjb25zdCBjdXJyZW50TmFtZSA9IHVybFZhbHVlTmFtZXMoY3VycmVudCwgdGhpcy5fcmVwb3J0R3JvdXBzKCkpO1xuICAgIGNvbnN0IHdyaXRlID0gdGhpcy5fbGlua1dyaXRlKChncm91cElkLCB2YWx1ZSkgPT4gbmFtZShncm91cElkLCB2YWx1ZSkgPz8gY3VycmVudE5hbWUoZ3JvdXBJZCwgdmFsdWUpKTtcblxuICAgIGlmICh3cml0ZS50b29Mb25nICYmICF0aGlzLl90b29Mb25nU2hvd24pIHtcbiAgICAgIHRoaXMuX3Rvb0xvbmdTaG93biA9IHRydWU7XG4gICAgICB0aGlzLl9tZXNzYWdlLndhcm5pbmcoVVJMX1RPT19MT05HX01FU1NBR0UpO1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLnJlcG9ydFBhcmFtc1RvQ2xlYXIoY3VycmVudCwgdGhpcy5fcmVwb3J0R3JvdXBzKCkpLCAuLi53cml0ZS5wYXJhbXMgfTtcbiAgfVxuXG4gIC8vIFN0YXJ0cyBvdmVyIGZvciBhbm90aGVyIHJlcG9ydDogbm8gbGlzdCBhbmQgbm8gb3BlbiB2aWV3LlxuICBwcml2YXRlIF9zdGFydChyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIGlmIChyZXBvcnQuaWQgPT09IHRoaXMuX3JlcG9ydElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0SWQgPSByZXBvcnQuaWQ7XG4gICAgdGhpcy5fdmlld3Muc2V0KFtdKTtcbiAgICB0aGlzLl9jYW5TaGFyZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuX29wZW5WaWV3LnNldChudWxsKTtcbiAgICB0aGlzLl90b29Mb25nU2hvd24gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIE5vIGxpbms6IHRoZSB2aWV3ZXIncyBkZWZhdWx0IHZpZXcsIGVsc2UgdGhlIHJlcG9ydCdzIGRlZmF1bHRzLCBvbmNlIHRoZVxuICAvLyBsaXN0IGlzIHJlYWQuXG4gIHByaXZhdGUgX29wZW5EZWZhdWx0KHJlcG9ydDogUmVwb3J0LCBwYWdlOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkVmlld3MocmVwb3J0KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0KTtcbiAgICAgICAgICBpZiAobGlzdD8ubXlEZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLl9vcGVuT24obGlzdC5teURlZmF1bHQsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KGxpc3QubXlEZWZhdWx0LmNvbmZpZywgcGFnZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEEgbGluayB3aXRoIHN0YXRlOiBvbiB0aGUgc2hhcmVkIHZpZXcgcnYgbmFtZXMsIGVsc2Ugb24gdGhlIHJlcG9ydCdzXG4gIC8vIGRlZmF1bHRzOyBycHYncyB2aWV3IGlzIHRoZSBvcGVuIHZpZXcgb25seSB3aGVuIHRoZSB2aWV3ZXIgb3ducyBpdC5cbiAgcHJpdmF0ZSBfb3BlbkxpbmsobGluazogUmVwb3J0VXJsTGluaywgdmlldzogUmVwb3J0VmlldyB8IG51bGwsIGxpbmtEaWZmOiBSZXBvcnRWaWV3Q29uZmlnKTogdm9pZCB7XG4gICAgaWYgKGxpbmsudmlld0lkICYmIHZpZXcpIHtcbiAgICAgIHRoaXMuX29wZW5Pbih2aWV3LCAoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5hcHBseSh2aWV3LmNvbmZpZywgbGlua0RpZmYpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbGluay52aWV3SWQgJiYgdmlldz8ubWluZSkge1xuICAgICAgdGhpcy5fb3Blbk9uKHZpZXcsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KG51bGwsIGxpbmtEaWZmLCB2aWV3LmNvbmZpZykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlblZpZXcuc2V0KG51bGwpO1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KG51bGwsIGxpbmtEaWZmKTtcblxuICAgIGlmIChsaW5rLnZpZXdJZCkge1xuICAgICAgdGhpcy5fbWVzc2FnZS53YXJuaW5nKFZJRVdfTk9UX0FWQUlMQUJMRV9NRVNTQUdFKTtcbiAgICB9XG4gIH1cblxuICAvLyBNYWtlcyBgdmlld2AgdGhlIG9wZW4gdmlldywgcHV0cyBpdCBvbiBzY3JlZW4gKGBhcHBseVZpZXdgKSwgYW5kIHNheXNcbiAgLy8gaG93IG1hbnkgb2YgaXRzIHNldHRpbmdzIG5vIGxvbmdlciBhcHBseSAoYW5kIHRvIHNhdmUgaXQsIHdoZW4gdGhlXG4gIC8vIHZpZXdlciBtYXkpLlxuICBwcml2YXRlIF9vcGVuT24odmlldzogUmVwb3J0VmlldywgYXBwbHlWaWV3OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fb3BlblZpZXcuc2V0KHZpZXcpO1xuICAgIGFwcGx5VmlldygpO1xuXG4gICAgY29uc3Qgbm90ZSA9IHZpZXdEcm9wcGVkTWVzc2FnZSh2aWV3RHJvcHBlZENvdW50KHZpZXcsIHRoaXMuX2ZpbHRlclN0YXRlLmJhc2UoKSksIHZpZXcuY2FuQ2hhbmdlKTtcbiAgICBpZiAobm90ZSkge1xuICAgICAgdGhpcy5fbWVzc2FnZS53YXJuaW5nKG5vdGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJ1bnMgYSBjaGFuZ2Ugb24gdGhlIG9wZW4gdmlldyBhbmQgdGFrZXMgaXRzIGFuc3dlciBhcyB0aGUgb3BlbiB2aWV3XG4gIC8vIGFuZCBpdHMgcm93IGluIHRoZSBsaXN0LiBBIGNoYW5nZSBvZiB3aG8gbWF5IHNlZSB0aGUgdmlldyAoc2hhcmVkLCBvclxuICAvLyB3aG9zZSBpdCBpcykgY2hhbmdlcyB0aGUga2V5IGEgbGluayBuYW1lcyBpdCBieSwgc28gdGhlIFVSTCBpcyB3cml0dGVuXG4gIC8vIGFnYWluLlxuICBwcml2YXRlIF9jaGFuZ2VPcGVuKGNoYW5nZTogKHJlcG9ydFZpZXdJZDogbnVtYmVyKSA9PiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgY29uc3Qgb3BlbiA9IHRoaXMuX29wZW5WaWV3KCk7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZShvcGVuLmlkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgodmlldykgPT4ge1xuICAgICAgICAgIHRoaXMuX29wZW5WaWV3LnNldCh2aWV3KTtcbiAgICAgICAgICB0aGlzLl9wdXRSb3codmlldyk7XG5cbiAgICAgICAgICBpZiAodmlldy5zaGFyZWQgIT09IG9wZW4uc2hhcmVkIHx8IHZpZXcubWluZSAhPT0gb3Blbi5taW5lKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5yZXdyaXRlVXJsKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBBIHZpZXcncyByb3cgaW4gdGhlIGxpc3QsIHJlcGxhY2VkIG9yIGFkZGVkLiBBIG5ldyBkZWZhdWx0IGNsZWFycyB0aGVcbiAgLy8gZmxhZyBvbiB0aGUgdmlld2VyJ3Mgb3RoZXIgdmlld3MsIGFzIHRoZSBzZXJ2ZXIgZG9lcy4gQSBuZXcgcm93IGtlZXBzXG4gIC8vIHRoZSBsaXN0J3Mgb3JkZXI6IHRoZSB2aWV3ZXIncyBvd24gdmlld3MgZmlyc3QsIHRoZW4gdGhlIG9uZXMgb3RoZXJzXG4gIC8vIHNoYXJlLlxuICBwcml2YXRlIF9wdXRSb3codmlldzogUmVwb3J0Vmlldyk6IHZvaWQge1xuICAgIGNvbnN0IHN1bW1hcnkgPSB2aWV3U3VtbWFyeSh2aWV3KTtcblxuICAgIHRoaXMuX3ZpZXdzLnVwZGF0ZSgodmlld3MpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSB2aWV3cy5tYXAoKHJvdykgPT4gKHZpZXcucGVyc29uYWxEZWZhdWx0ICYmIHJvdy5wZXJzb25hbERlZmF1bHQgPyB7IC4uLnJvdywgcGVyc29uYWxEZWZhdWx0OiBmYWxzZSB9IDogcm93KSk7XG4gICAgICBjb25zdCBpbmRleCA9IHJvd3MuZmluZEluZGV4KChyb3cpID0+IHJvdy5pZCA9PT0gdmlldy5pZCk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHJldHVybiByb3dzLm1hcCgocm93LCBhdCkgPT4gKGF0ID09PSBpbmRleCA/IHN1bW1hcnkgOiByb3cpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3RoZXJzQXQgPSB2aWV3Lm1pbmUgPyByb3dzLmZpbmRJbmRleCgocm93KSA9PiAhcm93Lm1pbmUpIDogLTE7XG5cbiAgICAgIHJldHVybiBvdGhlcnNBdCA8IDBcbiAgICAgICAgPyBbLi4ucm93cywgc3VtbWFyeV1cbiAgICAgICAgOiBbLi4ucm93cy5zbGljZSgwLCBvdGhlcnNBdCksIHN1bW1hcnksIC4uLnJvd3Muc2xpY2Uob3RoZXJzQXQpXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBsaXN0LCByZWFkIGZvciBgcmVwb3J0YDsgbnVsbCB3aGVuIGl0IGNhbm5vdCBiZSByZWFkLiBJdHMgYW5zd2VyIGlzXG4gIC8vIGtlcHQgb25seSB3aGlsZSB0aGUgcmVwb3J0IGlzIHN0aWxsIHRoZSBvcGVuIG9uZS5cbiAgcHJpdmF0ZSBfcmVhZFZpZXdzKHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3cyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS52aWV3cyhyZXBvcnQuaWQsIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIGlmIChsaXN0ICYmIHJlcG9ydC5pZCA9PT0gdGhpcy5fcmVwb3J0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnNldChsaXN0LnZpZXdzID8/IFtdKTtcbiAgICAgICAgICAgIHRoaXMuX2NhblNoYXJlLnNldCghIWxpc3QuY2FuU2hhcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSB2aWV3IGEgbGluayBuYW1lczsgbnVsbCB3aGVuIHRoZSB2aWV3ZXIgY2Fubm90IG9wZW4gaXQuIFRoZSBzZXJ2ZXJcbiAgLy8gYW5zd2VycyAnVmlldyBub3QgZm91bmQnIGZvciBvbmUgaXQgY2Fubm90IHNlZSwgd2hpY2ggbXVzdCBub3QgbW92ZSB0aGVcbiAgLy8gaG9zdCB0byBpdHMgbm90LWZvdW5kIHBhZ2UuXG4gIHByaXZhdGUgX3JlYWRWaWV3KHJlcG9ydElkOiBudW1iZXIsIHJlcG9ydFZpZXdJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLnZpZXcocmVwb3J0SWQsIHJlcG9ydFZpZXdJZCwgeyBjb250ZXh0OiBuZXcgSHR0cENvbnRleHQoKS5zZXQoUHJvY2Vzc0FwaUVycm9yLCBmYWxzZSkgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKTtcbiAgfVxuXG4gIC8vIFRoZSBwYXJhbXMgdGhlIHNjcmVlbiB3cml0ZXMgKHNlZSB0aGUgY2xhc3MgY29tbWVudCkuXG4gIHByaXZhdGUgX2xpbmtXcml0ZShuYW1lOiBSZXBvcnRVcmxWYWx1ZU5hbWUpOiBSZXBvcnRVcmxXcml0ZSB7XG4gICAgY29uc3Qgb3BlbiA9IHRoaXMuX29wZW5WaWV3KCk7XG4gICAgY29uc3Qgc2NyZWVuID0gdGhpcy5fZmlsdGVyU3RhdGUuc25hcHNob3QoKTtcbiAgICBjb25zdCBhdXRob3JlZCA9IHRoaXMuX2ZpbHRlclN0YXRlLmF1dGhvcmVkQ29uZmlnKCk7XG4gICAgY29uc3QgYXV0aG9yZWRTb3J0ID0gKGNvbXBvbmVudElkOiBudW1iZXIpID0+IHRoaXMuX2F1dGhvcmVkU29ydChjb21wb25lbnRJZCk7XG5cbiAgICBpZiAob3Blbj8uc2hhcmVkKSB7XG4gICAgICAvLyBBIGdyb3VwIHRoZSB2aWV3IGhvbGRzIHRoYXQgdGhlIGJhc2UgbGV0IGdvIG9mIChpdHMgYXV0aG9yZWQgZGVmYXVsdFxuICAgICAgLy8gY2hhbmdlZCB3aGlsZSB0aGUgdmlldyB3YXMgb3BlbiwgYW5kIHRoZSBzY3JlZW4gdG9vayB0aGUgbmV3IG9uZSlcbiAgICAgIC8vIGlzIHN0aWxsIHRoZSB2aWV3J3MgdmFsdWUgd2hlbiBhIGxpbmsgb3BlbnMgdGhlIHZpZXcsIHNvIGl0IGlzXG4gICAgICAvLyBjb21wYXJlZCB3aXRoIHRoYXQgdmFsdWUgYW5kIHdyaXR0ZW4gd2hlbiB0aGUgc2NyZWVuIGRpZmZlcnMuXG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5fZmlsdGVyU3RhdGUuYmFzZSgpO1xuICAgICAgY29uc3QgbGlua0Jhc2U6IFJlcG9ydFZpZXdDb25maWcgPSB7IC4uLmJhc2UsIGdyb3VwczogeyAuLi5vcGVuLmNvbmZpZz8uZ3JvdXBzLCAuLi5iYXNlLmdyb3VwcyB9IH07XG4gICAgICBjb25zdCBkaWZmID0gdmlld0NvbmZpZ0RpZmYobGlua0Jhc2UsIHNjcmVlbiwgYXV0aG9yZWQsIGF1dGhvcmVkU29ydCk7XG5cbiAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgIHJldHVybiB2aWV3Q29uZmlnVG9QYXJhbXModGhpcy5fbGlua0RheXMoZGlmZiksIHRoaXMuX3JlcG9ydEdyb3VwcygpLCB7IHZpZXdJZDogb3Blbi5pZCB9LCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmdWxsID0gdmlld0NvbmZpZ0RpZmYoYXV0aG9yZWQsIHNjcmVlbiwgYXV0aG9yZWQsIGF1dGhvcmVkU29ydCkgPz8gc2NyZWVuO1xuXG4gICAgY29uc3QgbGluayA9IG9wZW4/Lm1pbmUgPyB7IHBlcnNvbmFsVmlld0lkOiBvcGVuLmlkIH0gOiB7fTtcblxuICAgIHJldHVybiB2aWV3Q29uZmlnVG9QYXJhbXModGhpcy5fbGlua0RheXMoZnVsbCksIHRoaXMuX3JlcG9ydEdyb3VwcygpLCBsaW5rLCBuYW1lKTtcbiAgfVxuXG4gIC8vIGBjb25maWdgIHdpdGggZWFjaCByb2xsaW5nIHJhbmdlIChhIHJlbGF0aXZlIG5hbWUsIHdoaWNoIGEgdmlldyBrZWVwcykgYXNcbiAgLy8gdGhlIGRheXMgaXQgZ2l2ZXMgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmU6IGEgbGluayBjYXJyaWVzIGRheXMsIG5ldmVyIGFcbiAgLy8gcHJlc2V0IG5hbWUuIEEgbmFtZSB0aGUgcmVwb3J0IGRvZXMgbm90IGtub3cgaXMgbGVmdCBhcyBpdCBpcywgYW5kIHRoZVxuICAvLyBsaW5rIGxlYXZlcyB0aGF0IGdyb3VwIG91dC5cbiAgcHJpdmF0ZSBfbGlua0RheXMoY29uZmlnOiBSZXBvcnRWaWV3Q29uZmlnKTogUmVwb3J0Vmlld0NvbmZpZyB7XG4gICAgaWYgKCFjb25maWcuZ3JvdXBzKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5lbnRyaWVzKGNvbmZpZy5ncm91cHMpXG4gICAgICAubWFwKChbZ3JvdXBJZCwgdmFsdWVdKSA9PiBbZ3JvdXBJZCwgdGhpcy5fZ3JvdXBEYXlzKHZhbHVlKV0pO1xuXG4gICAgcmV0dXJuIHsgLi4uY29uZmlnLCBncm91cHM6IE9iamVjdC5mcm9tRW50cmllcyhncm91cHMpIH07XG4gIH1cblxuICBwcml2YXRlIF9ncm91cERheXModmFsdWU6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwpOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHtcbiAgICBjb25zdCByYW5nZSA9IHZhbHVlPy5yZWxhdGl2ZSA/IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVSZWxhdGl2ZSh2YWx1ZS5yZWxhdGl2ZSkgOiBudWxsO1xuXG4gICAgcmV0dXJuIHJhbmdlID8gdG9TdG9yZWRHcm91cFZhbHVlKCdkYXRlUmFuZ2UnLCB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQgfSkgOiB2YWx1ZTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IGZpbHRlciBncm91cCBvZiB0aGUgb3BlbiByZXBvcnQ6IHRoZSBsaW5rIGtleXMgZWFjaCBieSBpdHMgbGFiZWwuXG4gIHByaXZhdGUgX3JlcG9ydEdyb3VwcygpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyU3RhdGUucmVwb3J0KCk/LmZpbHRlckdyb3VwcyA/PyBbXTtcbiAgfVxuXG4gIC8vIEEgbGlzdCdzIGF1dGhvcmVkIGZpcnN0IHNvcnQgdGVybSwgb3IgbnVsbCBmb3IgYW55IG90aGVyIGNvbXBvbmVudC5cbiAgcHJpdmF0ZSBfYXV0aG9yZWRTb3J0KGNvbXBvbmVudElkOiBudW1iZXIpOiBSZXBvcnRTb3J0IHwgbnVsbCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fZmlsdGVyU3RhdGUucmVwb3J0KCk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gW1xuICAgICAgLi4uKHJlcG9ydD8ucGFnZXMgPz8gW10pLmZsYXRNYXAoKHBhZ2UpID0+IHBhZ2UuY29tcG9uZW50cyA/PyBbXSksXG4gICAgICAuLi4ocmVwb3J0Py5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLFxuICAgIF0uZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IGNvbXBvbmVudElkKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ/LnR5cGUgPT09ICdsaXN0JyA/IGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCA6IG51bGw7XG4gIH1cbn1cblxuXG4vLyBBIHZpZXcncyByb3cgYXMgdGhlIGxpc3QgaG9sZHMgaXQ6IG5hbWVzIGFuZCBmbGFncywgbm8gY29uZmlnLlxuZnVuY3Rpb24gdmlld1N1bW1hcnkodmlldzogUmVwb3J0Vmlldyk6IFJlcG9ydFZpZXdTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmlldy5pZCxcbiAgICBuYW1lOiB2aWV3Lm5hbWUsXG4gICAgc2hhcmVkOiB2aWV3LnNoYXJlZCxcbiAgICBtaW5lOiB2aWV3Lm1pbmUsXG4gICAgcGVyc29uYWxEZWZhdWx0OiB2aWV3LnBlcnNvbmFsRGVmYXVsdCxcbiAgICBvd25lck5hbWU6IHZpZXcub3duZXJOYW1lLFxuICAgIGNhbkNoYW5nZTogdmlldy5jYW5DaGFuZ2UsXG4gICAgY2FuRGVsZXRlOiB2aWV3LmNhbkRlbGV0ZSxcbiAgICBtb2RpZnlEYXRlOiB2aWV3Lm1vZGlmeURhdGUsXG4gIH07XG59XG4iXX0=
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9zZXJ2aWNlcy9yZXBvcnQtdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU9qRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBR3pFLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLHlFQUF5RTtBQUN6RSx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLDJFQUEyRTtBQUMzRSwyREFBMkQ7QUFDM0QsRUFBRTtBQUNGLGdFQUFnRTtBQUNoRSxnQ0FBZ0M7QUFDaEMsMENBQTBDO0FBQzFDLGlFQUFpRTtBQUVqRSxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLDBFQUEwRTtJQUMxRSx1REFBdUQ7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IjpbImltcG9ydCB7IEh0dHBDb250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRGVzdHJveVJlZiwgSW5qZWN0YWJsZSwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IERpc3BsYXlBcGlFcnJvciB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcblxuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld0NyZWF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctY3JlYXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3RGVsZXRlZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctZGVsZXRlZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld1N1bW1hcnkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LXN1bW1hcnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3cyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgdmlld0Ryb3BwZWRDb3VudCwgdmlld0Ryb3BwZWRNZXNzYWdlLCB3aXRoU3RvcmVkS2V5cyB9IGZyb20gJy4uL3JlcG9ydC12aWV3LWNvbmZpZyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5cblxuLy8gVGhlIG9wZW4gcmVwb3J0J3Mgc2F2ZWQgdmlld3MsIHBlciBvcGVuIHJlcG9ydCBiZXNpZGUgdGhlIHN0YXRlIHNlcnZpY2U6XG4vLyB0aGUgbGlzdCB0aGUgdmlld2VyIG1heSBzZWUsIHRoZSB2aWV3IHRoYXQgaXMgb3BlbiwgdGhlIG9yZGVyIGEgcmVwb3J0XG4vLyBvcGVucyBpbiBhbmQgdGhlIGNhbGxzIHRoYXQgY2hhbmdlIGEgdmlldy4gVGhlIHZpZXdlciBzdGF0ZSBzdGF5c1xuLy8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlJ3M6IHRoaXMgc2VydmljZSBwdXRzIGEgdmlldyBvbiBzY3JlZW4gdGhyb3VnaFxuLy8gYXBwbHkoKSBhbmQgcmVhZHMgdGhlIHNjcmVlbiB0aHJvdWdoIHNuYXBzaG90KCksIGJhc2UgYW5kIHZpZXdDaGFuZ2VkLlxuLy8gTm90aGluZyBoZXJlIHJ1bnMgZm9yIGEgcmVwb3J0IHdob3NlIHNlcnZlciBkb2VzIG5vdCBsaXN0ICd2aWV3cydcbi8vIChzZXJ2ZXMoKSkuIEEgdmlldyBpcyBvcGVuZWQgZnJvbSB0aGUgVmlld3MgbWVudSBvbmx5OiBhIHJlcG9ydCBrZWVwcyBub1xuLy8gc3RhdGUgaW4gdGhlIGJyb3dzZXIgVVJMLCBzbyB0aGVyZSBpcyBubyBsaW5rIHRvIGEgdmlldy5cbi8vXG4vLyBUaGUgb3JkZXIgYSByZXBvcnQgb3BlbnMgaW4gKG9wZW4oKSwgb24gaXRzIGZpcnN0IGxvYWQgb25seSk6XG4vLyAxLiBUaGUgdmlld2VyJ3MgZGVmYXVsdCB2aWV3LlxuLy8gMi4gRWxzZSB0aGUgcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHMuXG4vLyBBID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZCB3aXRoIGJlYXRzIHRoZSBkZWZhdWx0IHZpZXcncyBwYWdlLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydFZpZXdTZXJ2aWNlIHtcblxuICAvLyBUaGUgdmlld3MgdGhlIHZpZXdlciBtYXkgc2VlLCBuYW1lcyBhbmQgZmxhZ3Mgb25seTogaXRzIG93biBmaXJzdCwgdGhlblxuICAvLyB0aGUgb25lcyBvdGhlcnMgc2hhcmUuIEVtcHR5IHVudGlsIHRoZSBsaXN0IGlzIHJlYWQuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3ZpZXdzKCkpO1xuXG4gIC8vIFRoZSB2aWV3ZXIgbWF5IHNoYXJlIGl0cyB2aWV3cyB3aXRoIGV2ZXJ5b25lLlxuICBwdWJsaWMgcmVhZG9ubHkgY2FuU2hhcmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9jYW5TaGFyZSgpKTtcblxuICAvLyBUaGUgb3BlbiB2aWV3LCB3aXRoIGl0cyBjb25maWcgYXMgaXQgd2FzIHJlYWQgb3Igc2F2ZWQ7IG51bGwgd2hpbGUgdGhlXG4gIC8vIHNjcmVlbiBpcyBvbiB0aGUgcmVwb3J0J3MgZGVmYXVsdHMuXG4gIHB1YmxpYyByZWFkb25seSBvcGVuVmlldyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX29wZW5WaWV3KCkpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhlIG9wZW4gdmlldzsgZmFsc2Ugd2l0aCBub25lIG9wZW4uXG4gIHB1YmxpYyByZWFkb25seSB2aWV3Q2hhbmdlZCA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5fb3BlblZpZXcoKSAmJiB0aGlzLl9maWx0ZXJTdGF0ZS52aWV3Q2hhbmdlZCgpKTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHJpdmF0ZSBfdmlld3MgPSBzaWduYWw8UmVwb3J0Vmlld1N1bW1hcnlbXT4oW10pO1xuICBwcml2YXRlIF9jYW5TaGFyZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX29wZW5WaWV3ID0gc2lnbmFsPFJlcG9ydFZpZXcgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgcmVwb3J0IHRoZSB2aWV3cyBiZWxvbmcgdG8uXG4gIHByaXZhdGUgX3JlcG9ydElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBXaGV0aGVyIHRoZSBvcGVuIHJlcG9ydCdzIHNlcnZlciBrZWVwcyBzYXZlZCB2aWV3cy5cbiAgcHVibGljIHNlcnZlcyhyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFyZXBvcnQ/LnZpZXdlckZlYXR1cmVzPy5pbmNsdWRlcygndmlld3MnKTtcbiAgfVxuXG4gIC8vIEEgcmVwb3J0J3MgZmlyc3QgbG9hZCwgaW4gdGhlIG9wZW4gb3JkZXIgYWJvdmU6IHRoZSBzdGF0ZSBzZXJ2aWNlIGlzXG4gIC8vIHNldCB1cCBmb3IgYHJlcG9ydGAgKGluaXQpIG9uY2UgdGhlIGxpc3QgaXMgcmVhZCwgYW5kIHRoZSBzY3JlZW4gb3BlbmVkXG4gIC8vIG9uIHRoZSB2aWV3ZXIncyBkZWZhdWx0IHZpZXcsIGVsc2Ugb24gdGhlIHJlcG9ydCdzIGRlZmF1bHRzLiBgcGFnZUlkYCBpc1xuICAvLyB0aGUgP3BhZ2U9IHRoZSByZXBvcnQgb3BlbmVkIHdpdGgsIHdoaWNoIGJlYXRzIHRoZSB2aWV3J3MgcGFnZS4gRW5kcyBvbmNlXG4gIC8vIHRoZSBzY3JlZW4gaXMgc2V0LlxuICBwdWJsaWMgb3BlbihyZXBvcnQ6IFJlcG9ydCwgcGFnZUlkOiBudW1iZXIgfCBudWxsKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgdGhpcy5fc3RhcnQocmVwb3J0KTtcblxuICAgIHJldHVybiB0aGlzLl9yZWFkVmlld3MocmVwb3J0KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0KTtcbiAgICAgICAgICBpZiAobGlzdD8ubXlEZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLl9vcGVuT24obGlzdC5teURlZmF1bHQsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KGxpc3QubXlEZWZhdWx0LmNvbmZpZywgcGFnZUlkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSBsYXRlciBsb2FkIG9mIHRoZSBvcGVuIHJlcG9ydCAoYSBjaGF0IGVkaXQsIGEgc2V0dGluZ3Mgc2F2ZSk6IHRoZVxuICAvLyBzY3JlZW4gYW5kIHRoZSBvcGVuIHZpZXcgc3RheSwgYW5kIHRoZSBsaXN0IGlzIHJlYWQgYWdhaW4gYmVoaW5kIHRoZW0gc29cbiAgLy8gaXQgbmFtZXMgd2hhdCB0aGUgc2VydmVyIGhvbGRzIG5vdy5cbiAgcHVibGljIHJlZnJlc2gocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGFydChyZXBvcnQpO1xuICAgIHRoaXMuX3JlYWRWaWV3cyhyZXBvcnQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBPcGVucyBhIHZpZXcgcGlja2VkIGZyb20gdGhlIGxpc3Q7IGl0cyBjb25maWcgaXMgcmVhZCBub3cuXG4gIHB1YmxpYyBwaWNrKHJlcG9ydFZpZXdJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEudmlldyh0aGlzLl9yZXBvcnRJZCwgcmVwb3J0Vmlld0lkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgodmlldykgPT4gdGhpcy5fb3Blbk9uKHZpZXcsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KHZpZXcuY29uZmlnKSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIENsb3NlcyB0aGUgb3BlbiB2aWV3IGFuZCBwdXRzIHRoZSBzY3JlZW4gb24gdGhlIHJlcG9ydCdzIGRlZmF1bHRzLlxuICBwdWJsaWMgb3BlbkRlZmF1bHRzKCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5WaWV3LnNldChudWxsKTtcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5hcHBseShudWxsKTtcbiAgfVxuXG4gIC8vIFNhdmVzIHRoZSBzY3JlZW4gYXMgYSBuZXcgdmlldywgd2hpY2ggYmVjb21lcyB0aGUgb3BlbiB2aWV3LiBUaGUgc2NyZWVuXG4gIC8vIGlzIGFscmVhZHkgdGhlIHZpZXcsIHNvIG5vdGhpbmcgaXMgYXBwbGllZCBhZ2Fpbi5cbiAgcHVibGljIHNhdmVBc05ldyh2aWV3OiBPbWl0PFJlcG9ydFZpZXdDcmVhdGUsICdjb25maWcnPik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNyZWF0ZVZpZXcodGhpcy5fcmVwb3J0SWQsIHsgLi4udmlldywgY29uZmlnOiB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChzYXZlZCkgPT4ge1xuICAgICAgICAgIHRoaXMuX29wZW5WaWV3LnNldChzYXZlZCk7XG4gICAgICAgICAgdGhpcy5fcHV0Um93KHNhdmVkKTtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRCYXNlVG9TY3JlZW4oKTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1ZpZXcgc2F2ZWQnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gU2F2ZXMgdGhlIHNjcmVlbiBvdmVyIHRoZSBvcGVuIHZpZXcsIGtlZXBpbmcgdGhlIGtleXMgdGhpcyB2aWV3ZXIgZG9lc1xuICAvLyBub3Qga25vdyAod2l0aFN0b3JlZEtleXMpLlxuICBwdWJsaWMgc2F2ZUNoYW5nZXMoKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgY29uc3Qgb3BlbiA9IHRoaXMuX29wZW5WaWV3KCk7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEudXBkYXRlVmlldyh0aGlzLl9yZXBvcnRJZCwgb3Blbi5pZCwgeyBjb25maWc6IHdpdGhTdG9yZWRLZXlzKG9wZW4uY29uZmlnLCB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpKSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoc2F2ZWQpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuVmlldy5zZXQoc2F2ZWQpO1xuICAgICAgICAgIHRoaXMuX3B1dFJvdyhzYXZlZCk7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0QmFzZVRvU2NyZWVuKCk7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdWaWV3IHNhdmVkJyk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWUobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZU9wZW4oKHJlcG9ydFZpZXdJZCkgPT4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVWaWV3KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQsIHsgbmFtZSB9KSk7XG4gIH1cblxuICAvLyBTaGFyZXMgdGhlIG9wZW4gdmlldyB3aXRoIGV2ZXJ5b25lIHdobyBtYXkgb3BlbiB0aGUgcmVwb3J0LCBvciBzdG9wcy5cbiAgcHVibGljIHNoYXJlKHNoYXJlZDogYm9vbGVhbik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VPcGVuKChyZXBvcnRWaWV3SWQpID0+IHRoaXMuX3JlcG9ydERhdGEuc2hhcmVWaWV3KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQsIHNoYXJlZCkpO1xuICB9XG5cbiAgLy8gTWFrZXMgdGhlIG9wZW4gdmlldyB0aGUgdmlld2VyJ3MgZGVmYXVsdCwgb3Igc3RvcHMgb3BlbmluZyBpdCBieSBkZWZhdWx0LlxuICBwdWJsaWMgc2V0RGVmYXVsdChwZXJzb25hbERlZmF1bHQ6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlT3BlbigocmVwb3J0Vmlld0lkKSA9PiB0aGlzLl9yZXBvcnREYXRhLnNldFZpZXdEZWZhdWx0KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQsIHBlcnNvbmFsRGVmYXVsdCkpO1xuICB9XG5cbiAgLy8gRGVsZXRlcyB0aGUgb3BlbiB2aWV3LiBUaGUgc2NyZWVuIHN0YXlzOyB0aGUgcmVwb3J0J3MgZGVmYXVsdHMgYmVjb21lXG4gIC8vIHdoYXQgaXQgaXMgY29tcGFyZWQgd2l0aC5cbiAgcHVibGljIGRlbGV0ZU9wZW4oKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3RGVsZXRlZD4ge1xuICAgIGNvbnN0IG9wZW4gPSB0aGlzLl9vcGVuVmlldygpO1xuICAgIGlmICghb3Blbikge1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZVZpZXcodGhpcy5fcmVwb3J0SWQsIG9wZW4uaWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuVmlldy5zZXQobnVsbCk7XG4gICAgICAgICAgdGhpcy5fdmlld3MudXBkYXRlKCh2aWV3cykgPT4gdmlld3MuZmlsdGVyKCh2aWV3KSA9PiB2aWV3LmlkICE9PSBvcGVuLmlkKSk7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuY2xlYXJCYXNlKCk7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdWaWV3IGRlbGV0ZWQnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gU3RhcnRzIG92ZXIgZm9yIGFub3RoZXIgcmVwb3J0OiBubyBsaXN0IGFuZCBubyBvcGVuIHZpZXcuXG4gIHByaXZhdGUgX3N0YXJ0KHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgaWYgKHJlcG9ydC5pZCA9PT0gdGhpcy5fcmVwb3J0SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnRJZCA9IHJlcG9ydC5pZDtcbiAgICB0aGlzLl92aWV3cy5zZXQoW10pO1xuICAgIHRoaXMuX2NhblNoYXJlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fb3BlblZpZXcuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gTWFrZXMgYHZpZXdgIHRoZSBvcGVuIHZpZXcsIHB1dHMgaXQgb24gc2NyZWVuIChgYXBwbHlWaWV3YCksIGFuZCBzYXlzXG4gIC8vIGhvdyBtYW55IG9mIGl0cyBzZXR0aW5ncyBubyBsb25nZXIgYXBwbHkgKGFuZCB0byBzYXZlIGl0LCB3aGVuIHRoZVxuICAvLyB2aWV3ZXIgbWF5KS5cbiAgcHJpdmF0ZSBfb3Blbk9uKHZpZXc6IFJlcG9ydFZpZXcsIGFwcGx5VmlldzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5WaWV3LnNldCh2aWV3KTtcbiAgICBhcHBseVZpZXcoKTtcblxuICAgIGNvbnN0IG5vdGUgPSB2aWV3RHJvcHBlZE1lc3NhZ2Uodmlld0Ryb3BwZWRDb3VudCh2aWV3LCB0aGlzLl9maWx0ZXJTdGF0ZS5iYXNlKCkpLCB2aWV3LmNhbkNoYW5nZSk7XG4gICAgaWYgKG5vdGUpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2Uud2FybmluZyhub3RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBSdW5zIGEgY2hhbmdlIG9uIHRoZSBvcGVuIHZpZXcgYW5kIHRha2VzIGl0cyBhbnN3ZXIgYXMgdGhlIG9wZW4gdmlld1xuICAvLyBhbmQgaXRzIHJvdyBpbiB0aGUgbGlzdC5cbiAgcHJpdmF0ZSBfY2hhbmdlT3BlbihjaGFuZ2U6IChyZXBvcnRWaWV3SWQ6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTxSZXBvcnRWaWV3Pik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIGNvbnN0IG9wZW4gPSB0aGlzLl9vcGVuVmlldygpO1xuICAgIGlmICghb3Blbikge1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2Uob3Blbi5pZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHZpZXcpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuVmlldy5zZXQodmlldyk7XG4gICAgICAgICAgdGhpcy5fcHV0Um93KHZpZXcpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBBIHZpZXcncyByb3cgaW4gdGhlIGxpc3QsIHJlcGxhY2VkIG9yIGFkZGVkLiBBIG5ldyBkZWZhdWx0IGNsZWFycyB0aGVcbiAgLy8gZmxhZyBvbiB0aGUgdmlld2VyJ3Mgb3RoZXIgdmlld3MsIGFzIHRoZSBzZXJ2ZXIgZG9lcy4gQSBuZXcgcm93IGtlZXBzXG4gIC8vIHRoZSBsaXN0J3Mgb3JkZXI6IHRoZSB2aWV3ZXIncyBvd24gdmlld3MgZmlyc3QsIHRoZW4gdGhlIG9uZXMgb3RoZXJzXG4gIC8vIHNoYXJlLlxuICBwcml2YXRlIF9wdXRSb3codmlldzogUmVwb3J0Vmlldyk6IHZvaWQge1xuICAgIGNvbnN0IHN1bW1hcnkgPSB2aWV3U3VtbWFyeSh2aWV3KTtcblxuICAgIHRoaXMuX3ZpZXdzLnVwZGF0ZSgodmlld3MpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSB2aWV3cy5tYXAoKHJvdykgPT4gKHZpZXcucGVyc29uYWxEZWZhdWx0ICYmIHJvdy5wZXJzb25hbERlZmF1bHQgPyB7IC4uLnJvdywgcGVyc29uYWxEZWZhdWx0OiBmYWxzZSB9IDogcm93KSk7XG4gICAgICBjb25zdCBpbmRleCA9IHJvd3MuZmluZEluZGV4KChyb3cpID0+IHJvdy5pZCA9PT0gdmlldy5pZCk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHJldHVybiByb3dzLm1hcCgocm93LCBhdCkgPT4gKGF0ID09PSBpbmRleCA/IHN1bW1hcnkgOiByb3cpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3RoZXJzQXQgPSB2aWV3Lm1pbmUgPyByb3dzLmZpbmRJbmRleCgocm93KSA9PiAhcm93Lm1pbmUpIDogLTE7XG5cbiAgICAgIHJldHVybiBvdGhlcnNBdCA8IDBcbiAgICAgICAgPyBbLi4ucm93cywgc3VtbWFyeV1cbiAgICAgICAgOiBbLi4ucm93cy5zbGljZSgwLCBvdGhlcnNBdCksIHN1bW1hcnksIC4uLnJvd3Muc2xpY2Uob3RoZXJzQXQpXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBsaXN0LCByZWFkIGZvciBgcmVwb3J0YDsgbnVsbCB3aGVuIGl0IGNhbm5vdCBiZSByZWFkLiBJdHMgYW5zd2VyIGlzXG4gIC8vIGtlcHQgb25seSB3aGlsZSB0aGUgcmVwb3J0IGlzIHN0aWxsIHRoZSBvcGVuIG9uZS5cbiAgcHJpdmF0ZSBfcmVhZFZpZXdzKHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3cyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS52aWV3cyhyZXBvcnQuaWQsIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIGlmIChsaXN0ICYmIHJlcG9ydC5pZCA9PT0gdGhpcy5fcmVwb3J0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnNldChsaXN0LnZpZXdzID8/IFtdKTtcbiAgICAgICAgICAgIHRoaXMuX2NhblNoYXJlLnNldCghIWxpc3QuY2FuU2hhcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbn1cblxuXG4vLyBBIHZpZXcncyByb3cgYXMgdGhlIGxpc3QgaG9sZHMgaXQ6IG5hbWVzIGFuZCBmbGFncywgbm8gY29uZmlnLlxuZnVuY3Rpb24gdmlld1N1bW1hcnkodmlldzogUmVwb3J0Vmlldyk6IFJlcG9ydFZpZXdTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmlldy5pZCxcbiAgICBuYW1lOiB2aWV3Lm5hbWUsXG4gICAgc2hhcmVkOiB2aWV3LnNoYXJlZCxcbiAgICBtaW5lOiB2aWV3Lm1pbmUsXG4gICAgcGVyc29uYWxEZWZhdWx0OiB2aWV3LnBlcnNvbmFsRGVmYXVsdCxcbiAgICBvd25lck5hbWU6IHZpZXcub3duZXJOYW1lLFxuICAgIGNhbkNoYW5nZTogdmlldy5jYW5DaGFuZ2UsXG4gICAgY2FuRGVsZXRlOiB2aWV3LmNhbkRlbGV0ZSxcbiAgICBtb2RpZnlEYXRlOiB2aWV3Lm1vZGlmeURhdGUsXG4gIH07XG59XG4iXX0=
|