@firestitch/report 18.8.1 → 18.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/anchor-at-point.d.ts +14 -0
- package/app/reports/canvas-landing-page.d.ts +2 -0
- package/app/reports/components/component-chart/component-chart.component.d.ts +18 -2
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +4 -1
- package/app/reports/components/component-text/component-text.component.d.ts +47 -2
- package/app/reports/components/component-text/value-embed.plugin.d.ts +67 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +37 -9
- package/app/reports/components/report-component/report-component.component.d.ts +45 -2
- package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
- package/app/reports/data/report.data.d.ts +18 -2
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +25 -2
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +15 -6
- package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +13 -0
- package/app/reports/drill-crumbs.d.ts +12 -0
- package/app/reports/enums/report-value-formula.enum.d.ts +6 -0
- package/app/reports/export/report-export-collector.service.d.ts +35 -4
- package/app/reports/export/report-export.service.d.ts +3 -1
- package/app/reports/export/report-filter-lines.d.ts +18 -0
- package/app/reports/export/report-pdf.service.d.ts +18 -2
- package/app/reports/export/report-pptx.service.d.ts +15 -2
- package/app/reports/export/report-text-layout.service.d.ts +35 -0
- package/app/reports/filter-settings-rules.d.ts +33 -0
- package/app/reports/format.d.ts +2 -1
- package/app/reports/interfaces/canvas-landing-input.interface.d.ts +8 -0
- package/app/reports/interfaces/component-data-applied.interface.d.ts +13 -0
- package/app/reports/interfaces/component-data-drill.interface.d.ts +22 -0
- package/app/reports/interfaces/filter-bar-placement.type.d.ts +1 -0
- package/app/reports/interfaces/filter-component-toggle-state.interface.d.ts +4 -0
- package/app/reports/interfaces/filter-settings-option.interface.d.ts +4 -0
- package/app/reports/interfaces/filter-type-select-state.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chart-hit.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.d.ts +4 -0
- package/app/reports/interfaces/report-chat-viewer-cross-filter.interface.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-detail.interface.d.ts +4 -0
- package/app/reports/interfaces/report-chat-viewer-drill-step.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-drill.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +3 -0
- package/app/reports/interfaces/report-chat-viewer-selection.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +12 -0
- package/app/reports/interfaces/report-drill-crumb.interface.d.ts +6 -0
- package/app/reports/interfaces/report-drill-refusal.type.d.ts +1 -0
- package/app/reports/interfaces/report-drill-step.interface.d.ts +5 -0
- package/app/reports/interfaces/report-export-line-kind.type.d.ts +1 -0
- package/app/reports/interfaces/report-export-line.interface.d.ts +8 -0
- package/app/reports/interfaces/report-export-lines-input.interface.d.ts +9 -0
- package/app/reports/interfaces/report-export-snapshot.interface.d.ts +15 -0
- package/app/reports/interfaces/report-filter-line-context.interface.d.ts +8 -0
- package/app/reports/interfaces/report-filter-line-form.type.d.ts +1 -0
- package/app/reports/interfaces/report-filter-match.type.d.ts +1 -0
- package/app/reports/interfaces/report-filter-option-pair.interface.d.ts +4 -0
- package/app/reports/interfaces/report-filter-options-ask.interface.d.ts +6 -0
- package/app/reports/interfaces/report-filter-options-list.interface.d.ts +7 -0
- package/app/reports/interfaces/report-filter-options-request.interface.d.ts +6 -0
- package/app/reports/interfaces/report-filter-options-stream.interface.d.ts +11 -0
- package/app/reports/interfaces/report-filter-options.interface.d.ts +7 -0
- package/app/reports/interfaces/report-filter-skip.type.d.ts +1 -0
- package/app/reports/interfaces/report-mark-action.type.d.ts +1 -0
- package/app/reports/interfaces/report-mark-click.interface.d.ts +13 -0
- package/app/reports/interfaces/report-mark-context.interface.d.ts +6 -0
- package/app/reports/interfaces/report-mark-decision.interface.d.ts +6 -0
- package/app/reports/interfaces/report-mark-event.interface.d.ts +11 -0
- package/app/reports/interfaces/report-mark-point.interface.d.ts +8 -0
- package/app/reports/interfaces/report-temporary-state.interface.d.ts +4 -0
- package/app/reports/interfaces/report-tile-state.interface.d.ts +8 -0
- package/app/reports/interfaces/report-url-link.interface.d.ts +4 -0
- package/app/reports/interfaces/report-url-value-name.type.d.ts +1 -0
- package/app/reports/interfaces/report-url-write.interface.d.ts +4 -0
- package/app/reports/interfaces/report-view-config.interface.d.ts +11 -0
- package/app/reports/interfaces/report-view-create.interface.d.ts +7 -0
- package/app/reports/interfaces/report-view-deleted.interface.d.ts +4 -0
- package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +7 -0
- package/app/reports/interfaces/report-view-dropped.interface.d.ts +5 -0
- package/app/reports/interfaces/report-view-menu-item.interface.d.ts +10 -0
- package/app/reports/interfaces/report-view-summary.interface.d.ts +11 -0
- package/app/reports/interfaces/report-view.interface.d.ts +7 -0
- package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -0
- package/app/reports/interfaces/report-views.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +48 -5
- package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -0
- package/app/reports/layout.d.ts +2 -0
- package/app/reports/mark-click.d.ts +20 -0
- package/app/reports/option-builder.d.ts +12 -1
- package/app/reports/report-chat-viewer-state.d.ts +8 -0
- package/app/reports/report-date-presets.d.ts +2 -0
- package/app/reports/report-filter-items.d.ts +27 -22
- package/app/reports/report-tile.d.ts +2 -0
- package/app/reports/report-url-state.d.ts +27 -10
- package/app/reports/report-view-config.d.ts +36 -0
- package/app/reports/report-view-menu.d.ts +15 -0
- package/app/reports/report-viewer-features.d.ts +5 -0
- package/app/reports/services/report-filter-options.service.d.ts +26 -0
- package/app/reports/services/report-filter-state.service.d.ts +65 -2
- package/app/reports/services/report-view.service.d.ts +51 -0
- package/app/reports/text.d.ts +50 -0
- package/app/reports/tile-data-state.d.ts +7 -0
- package/app/reports/tile-loads.d.ts +4 -0
- package/app/reports/values.d.ts +17 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +9 -1
- package/app/reports/views/report/report.component.d.ts +6 -0
- package/esm2022/app/reports/anchor-at-point.mjs +49 -0
- package/esm2022/app/reports/canvas-landing-page.mjs +25 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +97 -5
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +11 -4
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +7 -1
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +213 -16
- package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +484 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +296 -55
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +318 -76
- package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
- package/esm2022/app/reports/data/report.data.mjs +103 -8
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +210 -44
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +86 -90
- package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +52 -0
- package/esm2022/app/reports/drill-crumbs.mjs +73 -0
- package/esm2022/app/reports/enums/report-value-formula.enum.mjs +14 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +299 -125
- package/esm2022/app/reports/export/report-export.service.mjs +57 -19
- package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +315 -71
- package/esm2022/app/reports/export/report-pptx.service.mjs +293 -71
- package/esm2022/app/reports/export/report-text-layout.service.mjs +241 -0
- package/esm2022/app/reports/filter-settings-rules.mjs +283 -0
- package/esm2022/app/reports/format.mjs +13 -30
- package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/component-data-applied.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/component-data-drill.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-bar-placement.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-component-toggle-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-settings-option.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-type-select-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chart-hit.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-drill-step.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-drill.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-chat-viewer-selection.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-drill-crumb.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-drill-refusal.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-drill-step.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-line-kind.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-line.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-line-context.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-line-form.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-match.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-option-pair.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-ask.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-list.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-request.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-stream.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-skip.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-click.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-context.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-decision.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-event.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-point.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-views.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/tile-load-result.interface.mjs +2 -0
- package/esm2022/app/reports/layout.mjs +11 -1
- package/esm2022/app/reports/mark-click.mjs +193 -0
- package/esm2022/app/reports/option-builder.mjs +159 -15
- package/esm2022/app/reports/report-chat-viewer-state.mjs +34 -0
- package/esm2022/app/reports/report-date-presets.mjs +18 -0
- package/esm2022/app/reports/report-filter-items.mjs +343 -72
- package/esm2022/app/reports/report-tile.mjs +12 -0
- package/esm2022/app/reports/report-url-state.mjs +596 -108
- package/esm2022/app/reports/report-view-config.mjs +697 -0
- package/esm2022/app/reports/report-view-menu.mjs +119 -0
- package/esm2022/app/reports/report-viewer-features.mjs +42 -0
- package/esm2022/app/reports/services/report-filter-options.service.mjs +238 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +715 -71
- package/esm2022/app/reports/services/report-view.service.mjs +358 -0
- package/esm2022/app/reports/text.mjs +293 -85
- package/esm2022/app/reports/tile-data-state.mjs +127 -0
- package/esm2022/app/reports/tile-loads.mjs +38 -0
- package/esm2022/app/reports/values.mjs +183 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +180 -46
- package/esm2022/app/reports/views/report/report.component.mjs +106 -23
- package/esm2022/public_api.mjs +24 -1
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs → firestitch-report-echarts-UBg8Wlhd.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs.map → firestitch-report-echarts-UBg8Wlhd.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CSylkyko.mjs → firestitch-report-firestitch-report-B1keNrcK.mjs} +11315 -4201
- package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +23 -0
- package/fesm2022/firestitch-report-firestitch-report-CSylkyko.mjs.map +0 -1
|
@@ -1,33 +1,25 @@
|
|
|
1
1
|
import { Injectable, signal } from '@angular/core';
|
|
2
|
+
import { computed } from '@angular/core';
|
|
3
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
2
4
|
import { Subject } from 'rxjs';
|
|
3
5
|
import { map, filter as rxFilter } from 'rxjs/operators';
|
|
6
|
+
import { scan } from 'rxjs/operators';
|
|
4
7
|
import { endOfWeek, startOfMonth, startOfQuarter, startOfWeek, startOfYear, subDays, subMonths, subWeeks, } from 'date-fns';
|
|
5
8
|
import { REPORT_WEEK_STARTS_ON } from '../consts/report-week.const';
|
|
6
9
|
import { DEFAULT_FORMAT_CONTEXT, getZonedNow, resolveFormatContext, resolveReportTimezone, } from '../format';
|
|
7
10
|
import { GRANULARITY_OPTIONS, } from '../interfaces/report.interface';
|
|
8
11
|
import { listHiddenColumns, listSortTerms } from '../list-config';
|
|
9
12
|
import { dateBoundString, LIST_SEARCH_MAX_LENGTH } from '../report-filter-items';
|
|
10
|
-
import {
|
|
13
|
+
import { groupValueSignature } from '../report-filter-items';
|
|
14
|
+
import { isTile } from '../report-tile';
|
|
15
|
+
import { decodeColumnList, decodeSort } from '../report-url-state';
|
|
16
|
+
import { isRelativeRange } from '../report-view-config';
|
|
17
|
+
import { REPORT_VIEW_CONFIG_VERSION, cleanDrillPath, groupValueFromStored, isChartGranularity, sameDrillPath, toLiveGroupValue, toStoredGroupValue, viewDiffers, } from '../report-view-config';
|
|
18
|
+
import { finiteNumber } from '../report-view-config';
|
|
19
|
+
import { sameStoredGroupValue } from '../report-view-config';
|
|
20
|
+
import { tileDataState } from '../tile-data-state';
|
|
21
|
+
import { reportComponents } from '../values';
|
|
11
22
|
import * as i0 from "@angular/core";
|
|
12
|
-
// Every relative range name the server knows. A record rather than a list, so
|
|
13
|
-
// the build fails when ReportRelativeRange gains a name this misses.
|
|
14
|
-
const RELATIVE_RANGES = {
|
|
15
|
-
thisWeek: true,
|
|
16
|
-
lastWeek: true,
|
|
17
|
-
last7Days: true,
|
|
18
|
-
last30Days: true,
|
|
19
|
-
last3Months: true,
|
|
20
|
-
last6Months: true,
|
|
21
|
-
last12Months: true,
|
|
22
|
-
thisMonth: true,
|
|
23
|
-
thisQuarter: true,
|
|
24
|
-
thisYear: true,
|
|
25
|
-
yearToDate: true,
|
|
26
|
-
};
|
|
27
|
-
// Whether a stored preset name is one the server resolves (ReportRelativeRange).
|
|
28
|
-
function isRelativeRange(name) {
|
|
29
|
-
return Object.prototype.hasOwnProperty.call(RELATIVE_RANGES, name);
|
|
30
|
-
}
|
|
31
23
|
// Whether two stored filter-group defaults are the same. Compared on the fields a
|
|
32
24
|
// default can actually carry, so key order in the payload can't read as a change.
|
|
33
25
|
export function sameDefault(a, b) {
|
|
@@ -38,8 +30,21 @@ export function sameDefault(a, b) {
|
|
|
38
30
|
&& a.end === b.end
|
|
39
31
|
&& a.value === b.value
|
|
40
32
|
&& a.relative === b.relative
|
|
41
|
-
&& (a.values
|
|
42
|
-
&& (a.
|
|
33
|
+
&& sameList(a.values, b.values)
|
|
34
|
+
&& sameList(a.excludeValues, b.excludeValues)
|
|
35
|
+
&& a.min === b.min
|
|
36
|
+
&& a.max === b.max;
|
|
37
|
+
}
|
|
38
|
+
// Whether two stored lists hold the same values in the same order.
|
|
39
|
+
function sameList(a, b) {
|
|
40
|
+
return (a ?? []).length === (b ?? []).length
|
|
41
|
+
&& (a ?? []).every((value, index) => value === (b ?? [])[index]);
|
|
42
|
+
}
|
|
43
|
+
// Whether two select pick lists hold the same picks in any order, a number
|
|
44
|
+
// and its text being the same pick.
|
|
45
|
+
function samePicks(a, b) {
|
|
46
|
+
const picks = (list) => (list ?? []).map(String).sort();
|
|
47
|
+
return sameList(picks(a), picks(b));
|
|
43
48
|
}
|
|
44
49
|
// Whether two list sorts order the rows the same way. No direction reads as
|
|
45
50
|
// ascending, the way the list applies it.
|
|
@@ -49,18 +54,12 @@ function sameSort(a, b) {
|
|
|
49
54
|
&& (a.direction ?? 'asc') === (b.direction ?? 'asc');
|
|
50
55
|
}
|
|
51
56
|
// Whether a value read off a filter bar is the value already stored for its
|
|
52
|
-
// group: the same calendar days, the same select values
|
|
53
|
-
// the same
|
|
54
|
-
//
|
|
57
|
+
// group: the same calendar days, the same select values kept or left out in
|
|
58
|
+
// the same order, the same trimmed text and the same number range ends. A
|
|
59
|
+
// bar re-reads every group it shows on any change, so this is what tells the
|
|
60
|
+
// group that changed from the ones that did not.
|
|
55
61
|
export function sameFilterValue(a, b) {
|
|
56
|
-
|
|
57
|
-
return !a && !b;
|
|
58
|
-
}
|
|
59
|
-
const values = (value) => (value.values ?? []).map(String);
|
|
60
|
-
return sameDays(a, b)
|
|
61
|
-
&& values(a).join('\u0000') === values(b).join('\u0000')
|
|
62
|
-
&& values(a).length === values(b).length
|
|
63
|
-
&& (a.value ?? '').trim() === (b.value ?? '').trim();
|
|
62
|
+
return groupValueSignature(a) === groupValueSignature(b);
|
|
64
63
|
}
|
|
65
64
|
// The groups a bar re-read that it now shows with a value other than the one
|
|
66
65
|
// it last reported, recording each new value in `lastReported`. A bar is
|
|
@@ -111,8 +110,15 @@ export function defaultSignature(group) {
|
|
|
111
110
|
groupDefault.value ?? '',
|
|
112
111
|
groupDefault.relative ?? '',
|
|
113
112
|
(groupDefault.values ?? []).join(','),
|
|
113
|
+
(groupDefault.excludeValues ?? []).join(','),
|
|
114
|
+
groupDefault.min ?? '',
|
|
115
|
+
groupDefault.max ?? '',
|
|
114
116
|
].join('~');
|
|
115
117
|
}
|
|
118
|
+
// The temporary layer with nothing picked.
|
|
119
|
+
function emptyTemporaryState() {
|
|
120
|
+
return { crossFilters: [], detail: null };
|
|
121
|
+
}
|
|
116
122
|
// Viewer filter state for the open report. Filter VALUES are never saved to
|
|
117
123
|
// the report — this service holds them per filter GROUP (the propagation unit),
|
|
118
124
|
// resolves them into per-component member-filter values for each data request,
|
|
@@ -123,6 +129,12 @@ export function defaultSignature(group) {
|
|
|
123
129
|
// urlSnapshot() says what differs from the authored defaults, init() restores
|
|
124
130
|
// it, and urlChanges() tells the host's single URL writer when to write.
|
|
125
131
|
//
|
|
132
|
+
// The same durable state, with the page, the match and each chart's drill
|
|
133
|
+
// path, is one view document: snapshot() writes it, apply() opens a view (and
|
|
134
|
+
// a link's changes on top), and base and viewChanged say whether the screen
|
|
135
|
+
// still shows that view. The temporary layer (a cross-filter, an open rows
|
|
136
|
+
// panel) is its own section, so no view or link ever carries it.
|
|
137
|
+
//
|
|
126
138
|
// Session-only, never in the URL: per-filter enable/disable toggles from a
|
|
127
139
|
// component's filter menu (the `enabled` column is the authored default; a
|
|
128
140
|
// viewer's toggle shouldn't write to the report).
|
|
@@ -147,6 +159,46 @@ export class ReportFilterStateService {
|
|
|
147
159
|
listHidden = signal(new Map(), {
|
|
148
160
|
equal: sameHidden,
|
|
149
161
|
});
|
|
162
|
+
// Moves each time apply() or resetToBase() replaces the whole durable
|
|
163
|
+
// state. Bars and tiles key on it, so an applied view repaints all of them.
|
|
164
|
+
stateVersion = computed(() => this._stateVersion());
|
|
165
|
+
// Moves each time apply() opens a view (or the report's defaults). The
|
|
166
|
+
// canvas keys its tiles on it, so an opened view draws each one again.
|
|
167
|
+
// resetToBase() leaves it: a reset refetches the tiles in place, so their
|
|
168
|
+
// data stays on screen while they reload.
|
|
169
|
+
appliedVersion = computed(() => this._appliedVersion());
|
|
170
|
+
// By list component id, how many resets moved that list's sort. FsList
|
|
171
|
+
// reads its sort only when it is created, so a list whose sort a reset
|
|
172
|
+
// moved is drawn again (keyed on its count); every other tile reloads in
|
|
173
|
+
// place.
|
|
174
|
+
listSortResets = computed(() => this._listSortResets());
|
|
175
|
+
// The open page, or null before the host reports one (setPage).
|
|
176
|
+
page = computed(() => this._pageId());
|
|
177
|
+
// How the groups combine: 'all' keeps the rows every group keeps, 'any'
|
|
178
|
+
// the rows at least one eligible group keeps (setMatch).
|
|
179
|
+
match = computed(() => this._match());
|
|
180
|
+
// The viewer features the open report's server serves (Report.viewerFeatures):
|
|
181
|
+
// a filter bar offers a control only when its feature is listed. Empty
|
|
182
|
+
// before a report is open and from an older server.
|
|
183
|
+
viewerFeatures = computed(() => this._report()?.viewerFeatures ?? []);
|
|
184
|
+
// The report init() last read, or null before one is open. A tile header
|
|
185
|
+
// lists its select options from it (ReportFilterOptionsService).
|
|
186
|
+
report = computed(() => this._report());
|
|
187
|
+
// The state the screen is compared with: the base apply() was given (the
|
|
188
|
+
// open view as it applied), or the report's authored defaults
|
|
189
|
+
// (authoredConfig()) when no view is open. It holds only the groups the
|
|
190
|
+
// view held; every other group follows its authored default.
|
|
191
|
+
base = computed(() => {
|
|
192
|
+
this._revision();
|
|
193
|
+
return this._baseConfig() ?? this.authoredConfig();
|
|
194
|
+
});
|
|
195
|
+
// Whether the screen differs from base (viewDiffers): what a view picker
|
|
196
|
+
// marks '(edited)'. A switch of page does not count, and the temporary
|
|
197
|
+
// state never does.
|
|
198
|
+
viewChanged = computed(() => {
|
|
199
|
+
this._revision();
|
|
200
|
+
return viewDiffers(this.base(), this.snapshot(), this.authoredConfig());
|
|
201
|
+
});
|
|
150
202
|
_values = new Map();
|
|
151
203
|
_groups = new Map();
|
|
152
204
|
_sessionDisabled = new Set();
|
|
@@ -183,6 +235,40 @@ export class ReportFilterStateService {
|
|
|
183
235
|
_changed$ = new Subject();
|
|
184
236
|
// Fires whenever anything the URL carries may have changed.
|
|
185
237
|
_urlChanged$ = new Subject();
|
|
238
|
+
// Counts the changes urlChanges() reports. The group values, the grain and
|
|
239
|
+
// the list state that base and viewChanged compare are the plain fields
|
|
240
|
+
// above, which every setter reports through urlChanges() (they are shared
|
|
241
|
+
// with the inline values build, so they stay as they are); this counter is
|
|
242
|
+
// how the two computeds hear of them. The view state below is signals and
|
|
243
|
+
// is read directly. The subject is this service's own and is never
|
|
244
|
+
// completed, so the signal listens to it exactly as long as the service
|
|
245
|
+
// lives.
|
|
246
|
+
_revision = toSignal(this._urlChanged$.pipe(scan((count) => count + 1, 0)), {
|
|
247
|
+
initialValue: 0,
|
|
248
|
+
manualCleanup: true,
|
|
249
|
+
});
|
|
250
|
+
_stateVersion = signal(0);
|
|
251
|
+
_appliedVersion = signal(0);
|
|
252
|
+
_listSortResets = signal(new Map());
|
|
253
|
+
// The report init() last read: the tiles and pages a view's state is
|
|
254
|
+
// checked against.
|
|
255
|
+
_report = signal(null);
|
|
256
|
+
// The open page, set by the host as the viewer moves between pages. A view
|
|
257
|
+
// stores it, but moving to another page never edits a view.
|
|
258
|
+
_pageId = signal(null);
|
|
259
|
+
// How the groups combine: 'all' (the default) or 'any'.
|
|
260
|
+
_match = signal('all');
|
|
261
|
+
// Each chart's drill path, top first, by component id. A chart at its top
|
|
262
|
+
// has no entry, and only a chart has one.
|
|
263
|
+
_drills = signal(new Map());
|
|
264
|
+
// Emits the id of the chart whose drill path changed.
|
|
265
|
+
_drillChanged$ = new Subject();
|
|
266
|
+
// The base as apply() applied it, or null when the base is the authored
|
|
267
|
+
// defaults (see base).
|
|
268
|
+
_baseConfig = signal(null);
|
|
269
|
+
// The temporary layer: kept apart from everything above, so snapshot(),
|
|
270
|
+
// urlSnapshot() and viewChanged never read it.
|
|
271
|
+
_temporary = signal(emptyTemporaryState());
|
|
186
272
|
// Seed groups + their defaults when a report loads. Existing session values
|
|
187
273
|
// for still-existing groups survive a structure re-fetch (a chat edit
|
|
188
274
|
// shouldn't reset the viewer's filters), and so does a group the viewer
|
|
@@ -219,6 +305,7 @@ export class ReportFilterStateService {
|
|
|
219
305
|
this._restore(report, restore);
|
|
220
306
|
}
|
|
221
307
|
this._prune(report);
|
|
308
|
+
this._pruneViewState(report, previousGroups);
|
|
222
309
|
this._changed$.next(null);
|
|
223
310
|
this._urlChanged$.next();
|
|
224
311
|
}
|
|
@@ -229,7 +316,7 @@ export class ReportFilterStateService {
|
|
|
229
316
|
// while its days are still the stored days: the bars re-set every group they
|
|
230
317
|
// show whenever any one of them changes, and an untouched rolling range must
|
|
231
318
|
// keep its name rather than turn into two fixed dates. Any other range, a
|
|
232
|
-
// picker
|
|
319
|
+
// date picker preset included, is stored as the fixed dates it shows.
|
|
233
320
|
setValue(groupId, value) {
|
|
234
321
|
if (value === null) {
|
|
235
322
|
this._values.delete(groupId);
|
|
@@ -245,7 +332,8 @@ export class ReportFilterStateService {
|
|
|
245
332
|
this._urlChanged$.next();
|
|
246
333
|
}
|
|
247
334
|
// A relative preset name as today's range in the report's zone, or null for
|
|
248
|
-
// a name it does not know.
|
|
335
|
+
// a name it does not know. A view's rolling range is opened through this, and
|
|
336
|
+
// a link writes one as the days it gives (ReportViewService).
|
|
249
337
|
resolveRelative(name) {
|
|
250
338
|
return this._relativeRange(name);
|
|
251
339
|
}
|
|
@@ -417,6 +505,19 @@ export class ReportFilterStateService {
|
|
|
417
505
|
return this._changed$.asObservable()
|
|
418
506
|
.pipe(rxFilter((groupId) => groupId === null || groupIds.has(groupId)));
|
|
419
507
|
}
|
|
508
|
+
// Notifications relevant to ANY of a set of components that comes and goes
|
|
509
|
+
// (a page's values): a change to a group one of their filters belongs to.
|
|
510
|
+
// Unlike changesFor, the set is read on each event rather than captured at
|
|
511
|
+
// subscribe, so one subscription follows the set as the report reloads. A
|
|
512
|
+
// full re-init (null) is not passed on: init() runs on a report
|
|
513
|
+
// (re)load, and a caller of this checks on that reload itself whether the
|
|
514
|
+
// filter values its components are read with moved.
|
|
515
|
+
changesForAny(components) {
|
|
516
|
+
return this._changed$.asObservable()
|
|
517
|
+
.pipe(rxFilter((groupId) => groupId !== null
|
|
518
|
+
&& components().some((component) => (component.filters ?? [])
|
|
519
|
+
.some((filter) => filter.filterGroupId === groupId))));
|
|
520
|
+
}
|
|
420
521
|
// The group values resolved into this component's member-filter values —
|
|
421
522
|
// what the data request carries. Disabled filters (authored or session) are
|
|
422
523
|
// skipped entirely.
|
|
@@ -449,21 +550,223 @@ export class ReportFilterStateService {
|
|
|
449
550
|
})
|
|
450
551
|
.filter((entry) => entry !== null);
|
|
451
552
|
}
|
|
452
|
-
// Every
|
|
553
|
+
// Every tile's resolved values in one array — what a report-level export
|
|
453
554
|
// carries so each file in the archive is filtered exactly as the screen is.
|
|
454
555
|
// Filter ids are unique per component, so the backend picks each component's
|
|
455
|
-
// own out of the pile.
|
|
556
|
+
// own out of the pile. Only a tile becomes a file (isTile), so no other
|
|
557
|
+
// component's entries ride along. A page id narrows it to that page.
|
|
456
558
|
resolveForReport(report, pageId = null) {
|
|
457
559
|
const pages = (report.pages ?? [])
|
|
458
560
|
.filter((page) => !pageId || page.id === pageId);
|
|
459
561
|
return pages
|
|
460
562
|
.flatMap((page) => (page.components ?? [])
|
|
563
|
+
.filter((component) => isTile(component))
|
|
461
564
|
.flatMap((component) => this.resolveForComponent(component)));
|
|
462
565
|
}
|
|
566
|
+
setPage(pageId) {
|
|
567
|
+
if (pageId === this._pageId()) {
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
this._pageId.set(pageId);
|
|
571
|
+
this._urlChanged$.next();
|
|
572
|
+
}
|
|
573
|
+
// A change of match can change every tile a group with a value narrows, so
|
|
574
|
+
// every tile hears about it.
|
|
575
|
+
setMatch(match) {
|
|
576
|
+
const next = match === 'any' ? 'any' : 'all';
|
|
577
|
+
if (next === this._match()) {
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
this._match.set(next);
|
|
581
|
+
this._changed$.next(null);
|
|
582
|
+
this._urlChanged$.next();
|
|
583
|
+
}
|
|
584
|
+
// A chart's drill path, top first; empty while the chart is at its top.
|
|
585
|
+
// It reads a signal, so a template that shows it repaints when it moves.
|
|
586
|
+
drill(componentId) {
|
|
587
|
+
return this._drills().get(componentId) ?? [];
|
|
588
|
+
}
|
|
589
|
+
// Records a chart's drill path, kept to cleanDrillPath; an empty path is
|
|
590
|
+
// the chart's top. Only a chart of the open report drills: a path for any
|
|
591
|
+
// other component is ignored. Only that chart and the URL hear about it,
|
|
592
|
+
// and only on a real change.
|
|
593
|
+
setDrill(componentId, path) {
|
|
594
|
+
const kept = cleanDrillPath(path);
|
|
595
|
+
if (!this._isChart(componentId) || sameDrillPath(kept, this.drill(componentId))) {
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
this._setDrillPath(componentId, kept);
|
|
599
|
+
this._drillChanged$.next(componentId);
|
|
600
|
+
this._urlChanged$.next();
|
|
601
|
+
}
|
|
602
|
+
// Fires whenever one chart's drill path changes, so that chart refetches.
|
|
603
|
+
drillChanges(componentId) {
|
|
604
|
+
return this._drillChanged$.asObservable()
|
|
605
|
+
.pipe(rxFilter((id) => id === componentId), map(() => undefined));
|
|
606
|
+
}
|
|
607
|
+
// Takes the drill path a chart's answer applied as the chart's own: the
|
|
608
|
+
// server keeps the longest part of a sent path it can apply, so the URL and
|
|
609
|
+
// a later save hold that part only. The chart has just read that path, so
|
|
610
|
+
// only the URL hears about it. True when the path changed.
|
|
611
|
+
adoptDrill(componentId, path) {
|
|
612
|
+
const kept = cleanDrillPath(path);
|
|
613
|
+
if (!this._isChart(componentId) || sameDrillPath(kept, this.drill(componentId))) {
|
|
614
|
+
return false;
|
|
615
|
+
}
|
|
616
|
+
this._setDrillPath(componentId, kept);
|
|
617
|
+
this._urlChanged$.next();
|
|
618
|
+
return true;
|
|
619
|
+
}
|
|
620
|
+
// The durable state on screen as one view document: the page, every group
|
|
621
|
+
// the report has (null when it holds nothing, a cleared default included),
|
|
622
|
+
// the match, the grain, and each tile's sort, search, hidden columns and
|
|
623
|
+
// drill path where they differ from the authored tile. A date range that
|
|
624
|
+
// still carries its relative preset is written as that preset, whatever
|
|
625
|
+
// today is (toStoredGroupValue). The temporary layer is never part of it.
|
|
626
|
+
snapshot() {
|
|
627
|
+
const config = { v: REPORT_VIEW_CONFIG_VERSION };
|
|
628
|
+
if (this._pageId()) {
|
|
629
|
+
config.pageId = this._pageId();
|
|
630
|
+
}
|
|
631
|
+
if (this._frequency) {
|
|
632
|
+
config.groupBy = this._frequency;
|
|
633
|
+
}
|
|
634
|
+
if (this._match() === 'any') {
|
|
635
|
+
config.match = 'any';
|
|
636
|
+
}
|
|
637
|
+
config.groups = this._snapshotGroups();
|
|
638
|
+
const tiles = this._snapshotTiles();
|
|
639
|
+
if (Object.keys(tiles).length) {
|
|
640
|
+
config.tiles = tiles;
|
|
641
|
+
}
|
|
642
|
+
return config;
|
|
643
|
+
}
|
|
644
|
+
// The report's authored defaults as a view document: every group at its
|
|
645
|
+
// authored default (null when it has none), no match, grain or tile state.
|
|
646
|
+
authoredConfig() {
|
|
647
|
+
const groups = {};
|
|
648
|
+
this._groups.forEach((group) => {
|
|
649
|
+
groups[group.id] = toStoredGroupValue(group.type, this._defaultValue(group));
|
|
650
|
+
});
|
|
651
|
+
return { v: REPORT_VIEW_CONFIG_VERSION, groups };
|
|
652
|
+
}
|
|
653
|
+
// Replaces the durable state with a view's (`config`; null = the report's
|
|
654
|
+
// authored defaults), then applies a link's changes on top of it
|
|
655
|
+
// (`urlDiff`). A group the view does not hold opens at its authored
|
|
656
|
+
// default; one the report does not have, or whose value does not fit the
|
|
657
|
+
// group's type, is skipped. A key urlDiff does not carry keeps the value
|
|
658
|
+
// below it, and its page beats the view's. The temporary layer is kept.
|
|
659
|
+
//
|
|
660
|
+
// `base` is what the screen is compared with for '(edited)' and what
|
|
661
|
+
// resetToBase() returns to; it is `config` unless the caller names
|
|
662
|
+
// another (null = the authored defaults). So:
|
|
663
|
+
// - a shared view's link (rv): apply(sharedView, diff);
|
|
664
|
+
// - a personal view's link (rpv): apply(null, fullDiff, personalView). The
|
|
665
|
+
// screen is the authored defaults plus the full diff, so a key the diff
|
|
666
|
+
// leaves out (the match, the grain, a tile's sort) is the authored one,
|
|
667
|
+
// and the personal view is still the base.
|
|
668
|
+
// Every change is announced once, at the end.
|
|
669
|
+
apply(config, urlDiff = null, base = config) {
|
|
670
|
+
const frequency = this._frequency;
|
|
671
|
+
this._setBase(base);
|
|
672
|
+
if (config !== base) {
|
|
673
|
+
this._applyLayer(config, true);
|
|
674
|
+
}
|
|
675
|
+
this._applyPage(config?.pageId);
|
|
676
|
+
if (urlDiff) {
|
|
677
|
+
this._applyLayer(urlDiff, false);
|
|
678
|
+
this._applyPage(urlDiff.pageId);
|
|
679
|
+
}
|
|
680
|
+
this._appliedVersion.update((version) => version + 1);
|
|
681
|
+
this._notifyApplied(frequency);
|
|
682
|
+
}
|
|
683
|
+
// Puts the screen back on its base (the open view, else the authored
|
|
684
|
+
// defaults) on the page it is on, and clears the temporary layer. The
|
|
685
|
+
// tiles stay and reload in place (appliedVersion does not move), except a
|
|
686
|
+
// list whose sort this moved (listSortResets).
|
|
687
|
+
resetToBase() {
|
|
688
|
+
const frequency = this._frequency;
|
|
689
|
+
const sorts = new Map(this._listSorts);
|
|
690
|
+
this._temporary.set(emptyTemporaryState());
|
|
691
|
+
this._applyLayer(this._baseConfig(), true);
|
|
692
|
+
this._countSortResets(sorts);
|
|
693
|
+
this._notifyApplied(frequency);
|
|
694
|
+
}
|
|
695
|
+
// The screen as it is becomes the base, with nothing applied: what a view
|
|
696
|
+
// just saved from the screen holds. The page on screen is the base's.
|
|
697
|
+
setBaseToScreen() {
|
|
698
|
+
this._baseConfig.set(this.snapshot());
|
|
699
|
+
this._urlChanged$.next();
|
|
700
|
+
}
|
|
701
|
+
// The report's authored defaults become the base again (the open view was
|
|
702
|
+
// deleted); the screen stays as it is.
|
|
703
|
+
clearBase() {
|
|
704
|
+
this._baseConfig.set(null);
|
|
705
|
+
this._urlChanged$.next();
|
|
706
|
+
}
|
|
707
|
+
// Puts only `groupIds` back on the base: the open view's value for a group
|
|
708
|
+
// it holds, else the group's authored default. A tile header's 'Clear
|
|
709
|
+
// filters' owns only its own groups; the report bar's calls resetToBase().
|
|
710
|
+
// Each group is announced as a viewer's change to it is, so the tiles in
|
|
711
|
+
// it refetch and a bar showing it with another value is built again.
|
|
712
|
+
resetGroupsToBase(groupIds) {
|
|
713
|
+
const held = this._baseConfig()?.groups ?? {};
|
|
714
|
+
groupIds.forEach((groupId) => {
|
|
715
|
+
const group = this._groups.get(groupId);
|
|
716
|
+
if (!group) {
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
719
|
+
if (!Object.prototype.hasOwnProperty.call(held, groupId) || !this._applyGroup(group, held[groupId])) {
|
|
720
|
+
this._seedAuthored(group);
|
|
721
|
+
}
|
|
722
|
+
this._changed$.next(groupId);
|
|
723
|
+
});
|
|
724
|
+
this._urlChanged$.next();
|
|
725
|
+
}
|
|
726
|
+
// Whether one of `groupIds` shows a value other than its base: the open
|
|
727
|
+
// view's value for a group it holds, else the group's authored default,
|
|
728
|
+
// the value resetGroupsToBase() puts back and viewChanged compares. A tile
|
|
729
|
+
// header's Clear chip shows exactly while one of its own groups does. It
|
|
730
|
+
// reads the revision viewChanged reads, so a caller on each check of an
|
|
731
|
+
// OnPush view stays current.
|
|
732
|
+
groupsDifferFromBase(groupIds) {
|
|
733
|
+
this._revision();
|
|
734
|
+
const held = this._baseConfig()?.groups ?? {};
|
|
735
|
+
return groupIds.some((groupId) => {
|
|
736
|
+
const group = this._groups.get(groupId);
|
|
737
|
+
if (!group) {
|
|
738
|
+
return false;
|
|
739
|
+
}
|
|
740
|
+
const base = Object.prototype.hasOwnProperty.call(held, groupId)
|
|
741
|
+
? held[groupId]
|
|
742
|
+
: toStoredGroupValue(group.type, this._defaultValue(group));
|
|
743
|
+
const screen = this._cleared.has(groupId) ? null : toStoredGroupValue(group.type, this._values.get(groupId));
|
|
744
|
+
return !sameStoredGroupValue(base, screen);
|
|
745
|
+
});
|
|
746
|
+
}
|
|
747
|
+
// Asks the host's URL writer to write again, with nothing on screen
|
|
748
|
+
// changed: sharing the open view, or no longer sharing it, moves the key
|
|
749
|
+
// that names it in a link (rv or rpv).
|
|
750
|
+
rewriteUrl() {
|
|
751
|
+
this._urlChanged$.next();
|
|
752
|
+
}
|
|
753
|
+
// The interaction state a tile's data request carries now: tileDataState
|
|
754
|
+
// over the open report and the screen's snapshot().
|
|
755
|
+
tileState(component) {
|
|
756
|
+
return tileDataState(this._report(), component, this.snapshot());
|
|
757
|
+
}
|
|
758
|
+
// The relative range a group's value still is, as a data request names it
|
|
759
|
+
// (its preset while its days are that range resolved today), or null. The
|
|
760
|
+
// export wording names a live preset by it.
|
|
761
|
+
livePreset(groupId) {
|
|
762
|
+
const value = this._values.get(groupId);
|
|
763
|
+
return value ? this._livePreset(value) : null;
|
|
764
|
+
}
|
|
463
765
|
// A group value as the fields a request carries: date bounds as calendar
|
|
464
|
-
// days, select values when any are picked
|
|
465
|
-
//
|
|
466
|
-
//
|
|
766
|
+
// days, select values when any are picked (else the values left out),
|
|
767
|
+
// keyword text trimmed, a number range's ends. Null when all of them are
|
|
768
|
+
// empty. A date range also names the relative range it still is
|
|
769
|
+
// (_livePreset), so the server knows which period the days cover;
|
|
467
770
|
// the days stay the window either way. Component data, the report and page
|
|
468
771
|
// exports and the chat's viewer filters all read their fields here, so all
|
|
469
772
|
// three carry it.
|
|
@@ -485,7 +788,9 @@ export class ReportFilterStateService {
|
|
|
485
788
|
if (value.value?.trim()) {
|
|
486
789
|
fields.value = value.value.trim();
|
|
487
790
|
}
|
|
791
|
+
this._resolveExcludeAndRange(value, fields);
|
|
488
792
|
return fields.start || fields.end || fields.values || fields.value
|
|
793
|
+
|| fields.excludeValues || fields.min !== undefined || fields.max !== undefined
|
|
489
794
|
? fields
|
|
490
795
|
: null;
|
|
491
796
|
}
|
|
@@ -537,22 +842,13 @@ export class ReportFilterStateService {
|
|
|
537
842
|
this._frequency = GRANULARITY_OPTIONS
|
|
538
843
|
.find((option) => option.value === restore.groupBy)?.value ?? null;
|
|
539
844
|
}
|
|
540
|
-
// The URL's group values. An empty one is an
|
|
845
|
+
// The URL's group values, applied as a view's are. An empty one is an
|
|
846
|
+
// explicit clear of the group.
|
|
541
847
|
_restoreGroups(restore) {
|
|
542
|
-
restore.groups.forEach((
|
|
848
|
+
restore.groups.forEach((stored, groupId) => {
|
|
543
849
|
const group = this._groups.get(groupId);
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
: undefined;
|
|
547
|
-
if (value === null) {
|
|
548
|
-
this._values.delete(groupId);
|
|
549
|
-
if (group?.config?.default) {
|
|
550
|
-
this._cleared.add(groupId);
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
else if (value) {
|
|
554
|
-
this._values.set(groupId, value);
|
|
555
|
-
this._cleared.delete(groupId);
|
|
850
|
+
if (group) {
|
|
851
|
+
this._applyGroup(group, stored);
|
|
556
852
|
}
|
|
557
853
|
});
|
|
558
854
|
}
|
|
@@ -625,7 +921,9 @@ export class ReportFilterStateService {
|
|
|
625
921
|
this._listSorts.delete(componentId);
|
|
626
922
|
}
|
|
627
923
|
});
|
|
628
|
-
|
|
924
|
+
// Values included: one is never drawn, but its filters are the report's
|
|
925
|
+
// like any other component's, and so are their session toggles.
|
|
926
|
+
const filterIds = new Set(reportComponents(report)
|
|
629
927
|
.flatMap((component) => (component.filters ?? []).map((filter) => filter.id)));
|
|
630
928
|
this._sessionDisabled.forEach((filterId) => {
|
|
631
929
|
if (!filterIds.has(filterId)) {
|
|
@@ -668,25 +966,18 @@ export class ReportFilterStateService {
|
|
|
668
966
|
return true;
|
|
669
967
|
}
|
|
670
968
|
return sameDays(value, defaultValue);
|
|
671
|
-
case 'select':
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
969
|
+
case 'select':
|
|
970
|
+
return samePicks(value.values, defaultValue.values)
|
|
971
|
+
&& samePicks(value.excludeValues, defaultValue.excludeValues);
|
|
972
|
+
case 'numberRange':
|
|
973
|
+
return finiteNumber(value.min) === finiteNumber(defaultValue.min)
|
|
974
|
+
&& finiteNumber(value.max) === finiteNumber(defaultValue.max);
|
|
677
975
|
default:
|
|
678
976
|
return (value.value ?? '').trim() === (defaultValue.value ?? '').trim();
|
|
679
977
|
}
|
|
680
978
|
}
|
|
681
|
-
// Every component of the report: its pages' and its header and footer's.
|
|
682
|
-
_components(report) {
|
|
683
|
-
return [
|
|
684
|
-
...(report.pages ?? []).flatMap((page) => page.components ?? []),
|
|
685
|
-
...(report.master?.components ?? []),
|
|
686
|
-
];
|
|
687
|
-
}
|
|
688
979
|
_listComponents(report) {
|
|
689
|
-
return
|
|
980
|
+
return reportComponents(report)
|
|
690
981
|
.filter((component) => component.type === 'list');
|
|
691
982
|
}
|
|
692
983
|
// The columns a list can be sorted by: every authored column, or a
|
|
@@ -723,7 +1014,7 @@ export class ReportFilterStateService {
|
|
|
723
1014
|
if (groupDefault.value) {
|
|
724
1015
|
return { value: groupDefault.value };
|
|
725
1016
|
}
|
|
726
|
-
return
|
|
1017
|
+
return this._excludeOrRangeDefault(groupDefault);
|
|
727
1018
|
}
|
|
728
1019
|
// A relative preset as a calendar-day range. "Today" is the day in the
|
|
729
1020
|
// report's effective zone, not the browser's, so every viewer seeds the same
|
|
@@ -770,10 +1061,363 @@ export class ReportFilterStateService {
|
|
|
770
1061
|
return null;
|
|
771
1062
|
}
|
|
772
1063
|
}
|
|
1064
|
+
// Every group in its stored shape: null when it holds nothing, a default
|
|
1065
|
+
// the viewer cleared included.
|
|
1066
|
+
_snapshotGroups() {
|
|
1067
|
+
const groups = {};
|
|
1068
|
+
this._groups.forEach((group) => {
|
|
1069
|
+
groups[group.id] = this._cleared.has(group.id)
|
|
1070
|
+
? null
|
|
1071
|
+
: toStoredGroupValue(group.type, this._values.get(group.id));
|
|
1072
|
+
});
|
|
1073
|
+
return groups;
|
|
1074
|
+
}
|
|
1075
|
+
// Each tile's state where it differs from the authored tile. A list sort
|
|
1076
|
+
// that is the list's authored first term is its default, not a choice.
|
|
1077
|
+
_snapshotTiles() {
|
|
1078
|
+
const tiles = {};
|
|
1079
|
+
for (const component of this._tiles()) {
|
|
1080
|
+
const tile = {};
|
|
1081
|
+
const sort = this._listSorts.get(component.id);
|
|
1082
|
+
const search = this._listSearches.get(component.id);
|
|
1083
|
+
const hidden = this.hiddenColumns(component.id);
|
|
1084
|
+
const drill = this.drill(component.id);
|
|
1085
|
+
if (sort && !sameSort(sort, listSortTerms(component.config)[0] ?? null)) {
|
|
1086
|
+
tile.sort = { ...sort };
|
|
1087
|
+
}
|
|
1088
|
+
if (search) {
|
|
1089
|
+
tile.search = search;
|
|
1090
|
+
}
|
|
1091
|
+
if (hidden.length) {
|
|
1092
|
+
tile.hidden = [...hidden];
|
|
1093
|
+
}
|
|
1094
|
+
if (drill.length) {
|
|
1095
|
+
tile.drill = drill.map((step) => ({ ...step }));
|
|
1096
|
+
}
|
|
1097
|
+
if (Object.keys(tile).length) {
|
|
1098
|
+
tiles[component.id] = tile;
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
return tiles;
|
|
1102
|
+
}
|
|
1103
|
+
// The base apply() was given, applied as the screen's state (the caller
|
|
1104
|
+
// applies the screen's own layer next, unless it is the same document).
|
|
1105
|
+
// What is kept is the snapshot of it, with only the groups it held: a
|
|
1106
|
+
// group it did not hold, or held in a shape that does not fit, follows its
|
|
1107
|
+
// authored default (viewDiffers compares it with authoredConfig()).
|
|
1108
|
+
_setBase(base) {
|
|
1109
|
+
const held = this._applyLayer(base, true);
|
|
1110
|
+
if (!base) {
|
|
1111
|
+
this._baseConfig.set(null);
|
|
1112
|
+
return;
|
|
1113
|
+
}
|
|
1114
|
+
// The page is the base's own, not the one on screen.
|
|
1115
|
+
const applied = this.snapshot();
|
|
1116
|
+
delete applied.pageId;
|
|
1117
|
+
applied.groups = Object.fromEntries(Object.entries(applied.groups ?? {})
|
|
1118
|
+
.filter(([groupId]) => held.has(Number(groupId))));
|
|
1119
|
+
if (base.pageId && (this._report()?.pages ?? []).some((page) => page.id === base.pageId)) {
|
|
1120
|
+
applied.pageId = base.pageId;
|
|
1121
|
+
}
|
|
1122
|
+
this._baseConfig.set(applied);
|
|
1123
|
+
}
|
|
1124
|
+
// Applies one layer of view state and gives the ids of the groups it set.
|
|
1125
|
+
// A base layer (`reset`) replaces it all: what `config` does not hold goes
|
|
1126
|
+
// back to the authored report. A link's layer changes only what it
|
|
1127
|
+
// carries, and a key it carries that does not fit is ignored. Nothing is
|
|
1128
|
+
// announced here: the caller announces once (_notifyApplied).
|
|
1129
|
+
_applyLayer(config, reset) {
|
|
1130
|
+
const held = this._applyGroups(config?.groups ?? {}, reset);
|
|
1131
|
+
const match = config?.match;
|
|
1132
|
+
if (reset || match === 'all' || match === 'any') {
|
|
1133
|
+
this._match.set(match === 'any' ? 'any' : 'all');
|
|
1134
|
+
}
|
|
1135
|
+
const groupBy = config?.groupBy;
|
|
1136
|
+
if (reset || isChartGranularity(groupBy)) {
|
|
1137
|
+
this._frequency = isChartGranularity(groupBy) ? groupBy : null;
|
|
1138
|
+
}
|
|
1139
|
+
if (reset) {
|
|
1140
|
+
this._clearTiles();
|
|
1141
|
+
}
|
|
1142
|
+
Object.entries(config?.tiles ?? {})
|
|
1143
|
+
.forEach(([componentId, tile]) => this._applyTile(Number(componentId), tile ?? {}));
|
|
1144
|
+
return held;
|
|
1145
|
+
}
|
|
1146
|
+
// Each group's value from a layer; on a base layer a group it does not
|
|
1147
|
+
// set goes back to its authored default. A link carries days, never a
|
|
1148
|
+
// preset name, so a link's days that are the base's rolling range today
|
|
1149
|
+
// keep it rolling (_rollingValue), as an untouched range does in the bar.
|
|
1150
|
+
_applyGroups(groups, reset) {
|
|
1151
|
+
const held = new Set();
|
|
1152
|
+
this._groups.forEach((group) => {
|
|
1153
|
+
if (Object.prototype.hasOwnProperty.call(groups, group.id) && this._applyGroup(group, groups[group.id], !reset)) {
|
|
1154
|
+
held.add(group.id);
|
|
1155
|
+
}
|
|
1156
|
+
else if (reset) {
|
|
1157
|
+
this._seedAuthored(group);
|
|
1158
|
+
}
|
|
1159
|
+
});
|
|
1160
|
+
return held;
|
|
1161
|
+
}
|
|
1162
|
+
// One group's stored value, or false when the group's type cannot hold it
|
|
1163
|
+
// (it is then dropped whole, and the group stays as the layer below left
|
|
1164
|
+
// it). null, or a value that holds nothing, clears the group. With
|
|
1165
|
+
// `keepRolling`, days that are the base's rolling range keep its name.
|
|
1166
|
+
_applyGroup(group, stored, keepRolling = false) {
|
|
1167
|
+
const kept = stored === null ? {} : groupValueFromStored(stored, group.type);
|
|
1168
|
+
if (kept === null) {
|
|
1169
|
+
return false;
|
|
1170
|
+
}
|
|
1171
|
+
const value = toLiveGroupValue(group.type, kept, (name) => this.resolveRelative(name));
|
|
1172
|
+
if (value) {
|
|
1173
|
+
this._values.set(group.id, keepRolling ? this._withPreset(this._rollingValue(group.id), value) : value);
|
|
1174
|
+
this._cleared.delete(group.id);
|
|
1175
|
+
}
|
|
1176
|
+
else {
|
|
1177
|
+
this._values.delete(group.id);
|
|
1178
|
+
this._cleared.delete(group.id);
|
|
1179
|
+
if (group.config?.default) {
|
|
1180
|
+
this._cleared.add(group.id);
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
return true;
|
|
1184
|
+
}
|
|
1185
|
+
// The rolling range a link's days are compared with: the one the base
|
|
1186
|
+
// holds for the group (a view's, resolved today), else the value on screen
|
|
1187
|
+
// (the authored default the base layer seeded).
|
|
1188
|
+
_rollingValue(groupId) {
|
|
1189
|
+
const held = this._baseConfig()?.groups?.[groupId];
|
|
1190
|
+
return held?.relative
|
|
1191
|
+
? toLiveGroupValue('dateRange', held, (name) => this.resolveRelative(name)) ?? undefined
|
|
1192
|
+
: this._values.get(groupId);
|
|
1193
|
+
}
|
|
1194
|
+
// A group back at its authored default.
|
|
1195
|
+
_seedAuthored(group) {
|
|
1196
|
+
const value = this._defaultValue(group);
|
|
1197
|
+
this._cleared.delete(group.id);
|
|
1198
|
+
if (value) {
|
|
1199
|
+
this._values.set(group.id, value);
|
|
1200
|
+
}
|
|
1201
|
+
else {
|
|
1202
|
+
this._values.delete(group.id);
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
// Every tile back at its authored state.
|
|
1206
|
+
_clearTiles() {
|
|
1207
|
+
this._listSorts.clear();
|
|
1208
|
+
this._listSearches.clear();
|
|
1209
|
+
this.listHidden.set(new Map());
|
|
1210
|
+
this._drills.set(new Map());
|
|
1211
|
+
}
|
|
1212
|
+
// One tile's stored state, each key checked as the URL restore checks it:
|
|
1213
|
+
// a sort on a column the list can sort by, a search on a list that shows
|
|
1214
|
+
// the box, hidden columns the list can hide, a drill path on a chart.
|
|
1215
|
+
_applyTile(componentId, tile) {
|
|
1216
|
+
const list = this._lists.get(componentId);
|
|
1217
|
+
if (list) {
|
|
1218
|
+
this._applyListTile(list, tile);
|
|
1219
|
+
}
|
|
1220
|
+
if (Array.isArray(tile.drill) && this._isChart(componentId)) {
|
|
1221
|
+
this._setDrillPath(componentId, cleanDrillPath(tile.drill));
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
// A list's sort, search and hidden columns from a tile state, kept by the
|
|
1225
|
+
// rules setListSort, setListSearch and setHiddenColumns apply, but set
|
|
1226
|
+
// straight on the maps: those setters each announce a change, and an apply
|
|
1227
|
+
// announces once, at its end. A sort that is the list's authored first
|
|
1228
|
+
// term is its default, so it clears the entry.
|
|
1229
|
+
_applyListTile(list, tile) {
|
|
1230
|
+
const sort = tile.sort;
|
|
1231
|
+
if (sort?.column && this._sortableColumns(list).includes(sort.column)) {
|
|
1232
|
+
if (sameSort(sort, listSortTerms(list.config)[0] ?? null)) {
|
|
1233
|
+
this._listSorts.delete(list.id);
|
|
1234
|
+
}
|
|
1235
|
+
else {
|
|
1236
|
+
this._listSorts.set(list.id, { ...sort });
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
if (typeof tile.search === 'string') {
|
|
1240
|
+
const search = listSearchText(tile.search);
|
|
1241
|
+
if (search && this.listSearchable(list)) {
|
|
1242
|
+
this._listSearches.set(list.id, search);
|
|
1243
|
+
}
|
|
1244
|
+
else {
|
|
1245
|
+
this._listSearches.delete(list.id);
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
if (Array.isArray(tile.hidden)) {
|
|
1249
|
+
const hidden = listHiddenColumns(list.config, tile.hidden);
|
|
1250
|
+
const next = new Map(this.listHidden());
|
|
1251
|
+
if (hidden.length) {
|
|
1252
|
+
next.set(list.id, hidden);
|
|
1253
|
+
}
|
|
1254
|
+
else {
|
|
1255
|
+
next.delete(list.id);
|
|
1256
|
+
}
|
|
1257
|
+
this.listHidden.set(next);
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
// One chart's drill path; an empty path is the chart's top.
|
|
1261
|
+
_setDrillPath(componentId, path) {
|
|
1262
|
+
const next = new Map(this._drills());
|
|
1263
|
+
if (path.length) {
|
|
1264
|
+
next.set(componentId, path);
|
|
1265
|
+
}
|
|
1266
|
+
else {
|
|
1267
|
+
next.delete(componentId);
|
|
1268
|
+
}
|
|
1269
|
+
this._drills.set(next);
|
|
1270
|
+
}
|
|
1271
|
+
// The page a layer names, when the report has it.
|
|
1272
|
+
_applyPage(pageId) {
|
|
1273
|
+
if (pageId && (this._report()?.pages ?? []).some((page) => page.id === pageId)) {
|
|
1274
|
+
this._pageId.set(pageId);
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
// After apply() or resetToBase(): every bar and tile repaints, and the
|
|
1278
|
+
// time-series charts refetch when the grain moved.
|
|
1279
|
+
_notifyApplied(frequency) {
|
|
1280
|
+
this._stateVersion.update((version) => version + 1);
|
|
1281
|
+
this._changed$.next(null);
|
|
1282
|
+
if (frequency !== this._frequency) {
|
|
1283
|
+
this._frequencyChanged$.next();
|
|
1284
|
+
}
|
|
1285
|
+
this._urlChanged$.next();
|
|
1286
|
+
}
|
|
1287
|
+
// The tiles of the report init() last read.
|
|
1288
|
+
_tiles() {
|
|
1289
|
+
const report = this._report();
|
|
1290
|
+
return report
|
|
1291
|
+
? reportComponents(report).filter(isTile)
|
|
1292
|
+
: [];
|
|
1293
|
+
}
|
|
1294
|
+
_isChart(componentId) {
|
|
1295
|
+
return this._tiles()
|
|
1296
|
+
.some((component) => component.id === componentId && component.type === 'chart');
|
|
1297
|
+
}
|
|
1298
|
+
// Keeps the view state to what the report (re)loaded by init() still has:
|
|
1299
|
+
// drill paths on charts it still has, the page while it has it, and the
|
|
1300
|
+
// base to what the screen can still show (_pruneBase). On another report it
|
|
1301
|
+
// starts again: no open view, match 'all', no drill and nothing temporary.
|
|
1302
|
+
_pruneViewState(report, previousGroups) {
|
|
1303
|
+
if (this._report()?.id !== report.id) {
|
|
1304
|
+
this._baseConfig.set(null);
|
|
1305
|
+
this._match.set('all');
|
|
1306
|
+
this._pageId.set(null);
|
|
1307
|
+
this._drills.set(new Map());
|
|
1308
|
+
this._temporary.set(emptyTemporaryState());
|
|
1309
|
+
}
|
|
1310
|
+
this._report.set(report);
|
|
1311
|
+
this._drills.set(new Map([...this._drills()]
|
|
1312
|
+
.filter(([componentId]) => this._isChart(componentId))));
|
|
1313
|
+
if (this._pageId() && !(report.pages ?? []).some((page) => page.id === this._pageId())) {
|
|
1314
|
+
this._pageId.set(null);
|
|
1315
|
+
}
|
|
1316
|
+
this._pruneBase(previousGroups);
|
|
1317
|
+
}
|
|
1318
|
+
// Keeps the base to what the screen can still show, by the rules the live
|
|
1319
|
+
// state is pruned by (_prune, _seed and the drill pruning above), so an
|
|
1320
|
+
// edit of the report alone never reads as '(edited)'. A group whose
|
|
1321
|
+
// authored default changed leaves the base and follows the new default,
|
|
1322
|
+
// as the live value does (_seed re-seeds it); so does a group the report
|
|
1323
|
+
// no longer has. Each tile keeps only the state its component can still
|
|
1324
|
+
// take (_baseTile).
|
|
1325
|
+
_pruneBase(previousGroups) {
|
|
1326
|
+
const base = this._baseConfig();
|
|
1327
|
+
if (!base) {
|
|
1328
|
+
return;
|
|
1329
|
+
}
|
|
1330
|
+
const groups = Object.fromEntries(Object.entries(base.groups ?? {})
|
|
1331
|
+
.filter(([groupId]) => {
|
|
1332
|
+
const group = this._groups.get(Number(groupId));
|
|
1333
|
+
return !!group
|
|
1334
|
+
&& sameDefault(previousGroups.get(group.id)?.config?.default ?? null, group.config?.default ?? null);
|
|
1335
|
+
}));
|
|
1336
|
+
const tiles = Object.fromEntries(Object.entries(base.tiles ?? {})
|
|
1337
|
+
.map(([componentId, tile]) => [componentId, this._baseTile(Number(componentId), tile)])
|
|
1338
|
+
.filter(([, tile]) => Object.keys(tile).length));
|
|
1339
|
+
const pruned = { ...base, groups };
|
|
1340
|
+
delete pruned.tiles;
|
|
1341
|
+
if (Object.keys(tiles).length) {
|
|
1342
|
+
pruned.tiles = tiles;
|
|
1343
|
+
}
|
|
1344
|
+
this._baseConfig.set(pruned);
|
|
1345
|
+
}
|
|
1346
|
+
// A base tile's state, kept to what its component can still take: a sort
|
|
1347
|
+
// on a column the list can still sort by that is not now its authored
|
|
1348
|
+
// first term, a search while the list shows the box, the hidden columns
|
|
1349
|
+
// the list still has, a drill path while the component is a chart.
|
|
1350
|
+
_baseTile(componentId, tile) {
|
|
1351
|
+
const kept = {};
|
|
1352
|
+
const list = this._lists.get(componentId);
|
|
1353
|
+
const hidden = list && tile.hidden ? listHiddenColumns(list.config, tile.hidden) : [];
|
|
1354
|
+
if (list && tile.sort && this._sortableColumns(list).includes(tile.sort.column)
|
|
1355
|
+
&& !sameSort(tile.sort, listSortTerms(list.config)[0] ?? null)) {
|
|
1356
|
+
kept.sort = tile.sort;
|
|
1357
|
+
}
|
|
1358
|
+
if (list && tile.search && this.listSearchable(list)) {
|
|
1359
|
+
kept.search = tile.search;
|
|
1360
|
+
}
|
|
1361
|
+
if (hidden.length) {
|
|
1362
|
+
kept.hidden = hidden;
|
|
1363
|
+
}
|
|
1364
|
+
if (tile.drill?.length && this._isChart(componentId)) {
|
|
1365
|
+
kept.drill = tile.drill;
|
|
1366
|
+
}
|
|
1367
|
+
return kept;
|
|
1368
|
+
}
|
|
1369
|
+
// A select's values to leave out (only when it keeps none) and a number
|
|
1370
|
+
// range's ends, an open end left out and 0 kept, written onto `fields`.
|
|
1371
|
+
_resolveExcludeAndRange(value, fields) {
|
|
1372
|
+
if (value.excludeValues?.length && !fields.values) {
|
|
1373
|
+
fields.excludeValues = value.excludeValues;
|
|
1374
|
+
}
|
|
1375
|
+
const min = finiteNumber(value.min);
|
|
1376
|
+
const max = finiteNumber(value.max);
|
|
1377
|
+
if (min !== undefined) {
|
|
1378
|
+
fields.min = min;
|
|
1379
|
+
}
|
|
1380
|
+
if (max !== undefined) {
|
|
1381
|
+
fields.max = max;
|
|
1382
|
+
}
|
|
1383
|
+
}
|
|
1384
|
+
// An authored default that leaves select values out, or a number range's
|
|
1385
|
+
// ends (0 kept), as a session value; null when it holds neither.
|
|
1386
|
+
_excludeOrRangeDefault(groupDefault) {
|
|
1387
|
+
if (groupDefault.excludeValues?.length) {
|
|
1388
|
+
return { excludeValues: groupDefault.excludeValues };
|
|
1389
|
+
}
|
|
1390
|
+
const min = finiteNumber(groupDefault.min);
|
|
1391
|
+
const max = finiteNumber(groupDefault.max);
|
|
1392
|
+
if (min === undefined && max === undefined) {
|
|
1393
|
+
return null;
|
|
1394
|
+
}
|
|
1395
|
+
return {
|
|
1396
|
+
...(min !== undefined ? { min } : {}),
|
|
1397
|
+
...(max !== undefined ? { max } : {}),
|
|
1398
|
+
};
|
|
1399
|
+
}
|
|
1400
|
+
// Counts a reset for each list whose sort is not the one it had (`before`,
|
|
1401
|
+
// the sorts by list before the reset). A sort a list lost and one it
|
|
1402
|
+
// gained both count; the authored sort is no entry either side.
|
|
1403
|
+
_countSortResets(before) {
|
|
1404
|
+
const moved = [...new Set([...before.keys(), ...this._listSorts.keys()])]
|
|
1405
|
+
.filter((componentId) => {
|
|
1406
|
+
const was = before.get(componentId);
|
|
1407
|
+
const now = this._listSorts.get(componentId) ?? null;
|
|
1408
|
+
return was ? !sameSort(was, now) : now !== null;
|
|
1409
|
+
});
|
|
1410
|
+
if (!moved.length) {
|
|
1411
|
+
return;
|
|
1412
|
+
}
|
|
1413
|
+
const counts = new Map(this._listSortResets());
|
|
1414
|
+
moved.forEach((componentId) => counts.set(componentId, (counts.get(componentId) ?? 0) + 1));
|
|
1415
|
+
this._listSortResets.set(counts);
|
|
1416
|
+
}
|
|
773
1417
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
774
1418
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService });
|
|
775
1419
|
}
|
|
776
1420
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, decorators: [{
|
|
777
1421
|
type: Injectable
|
|
778
1422
|
}] });
|
|
779
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFDTCxTQUFTLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsR0FDN0IsTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUNMLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsR0FDakYsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUlMLG1CQUFtQixHQVVwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUd0Riw4RUFBOEU7QUFDOUUscUVBQXFFO0FBQ3JFLE1BQU0sZUFBZSxHQUFzQztJQUN6RCxRQUFRLEVBQUUsSUFBSTtJQUNkLFFBQVEsRUFBRSxJQUFJO0lBQ2QsU0FBUyxFQUFFLElBQUk7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R0FBRyxFQUFFLENBQUM7WUFDbEQsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxZQUFZO2dCQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUMvQztnQkFDRSxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzt3R0Exd0JVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBlbmRPZldlZWssIHN0YXJ0T2ZNb250aCwgc3RhcnRPZlF1YXJ0ZXIsIHN0YXJ0T2ZXZWVrLCBzdGFydE9mWWVhcixcbiAgc3ViRGF5cywgc3ViTW9udGhzLCBzdWJXZWVrcyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSBmcm9tICcuLi9jb25zdHMvcmVwb3J0LXdlZWsuY29uc3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwgZ2V0Wm9uZWROb3csIHJlc29sdmVGb3JtYXRDb250ZXh0LCByZXNvbHZlUmVwb3J0VGltZXpvbmUsXG59IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBGaWx0ZXJHcm91cERlZmF1bHQsXG4gIEZpbHRlckdyb3VwVmFsdWUsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0UmVsYXRpdmVSYW5nZSxcbiAgUmVwb3J0U29ydCxcbiAgUmVwb3J0VXJsUGFyYW1zLFxuICBSZXBvcnRVcmxTbmFwc2hvdCxcbiAgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGxpc3RIaWRkZW5Db2x1bW5zLCBsaXN0U29ydFRlcm1zIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kU3RyaW5nLCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBkZWNvZGVDb2x1bW5MaXN0LCBkZWNvZGVGaWx0ZXJWYWx1ZSwgZGVjb2RlU29ydCB9IGZyb20gJy4uL3JlcG9ydC11cmwtc3RhdGUnO1xuXG5cbi8vIEV2ZXJ5IHJlbGF0aXZlIHJhbmdlIG5hbWUgdGhlIHNlcnZlciBrbm93cy4gQSByZWNvcmQgcmF0aGVyIHRoYW4gYSBsaXN0LCBzb1xuLy8gdGhlIGJ1aWxkIGZhaWxzIHdoZW4gUmVwb3J0UmVsYXRpdmVSYW5nZSBnYWlucyBhIG5hbWUgdGhpcyBtaXNzZXMuXG5jb25zdCBSRUxBVElWRV9SQU5HRVM6IFJlY29yZDxSZXBvcnRSZWxhdGl2ZVJhbmdlLCB0cnVlPiA9IHtcbiAgdGhpc1dlZWs6IHRydWUsXG4gIGxhc3RXZWVrOiB0cnVlLFxuICBsYXN0N0RheXM6IHRydWUsXG4gIGxhc3QzMERheXM6IHRydWUsXG4gIGxhc3QzTW9udGhzOiB0cnVlLFxuICBsYXN0Nk1vbnRoczogdHJ1ZSxcbiAgbGFzdDEyTW9udGhzOiB0cnVlLFxuICB0aGlzTW9udGg6IHRydWUsXG4gIHRoaXNRdWFydGVyOiB0cnVlLFxuICB0aGlzWWVhcjogdHJ1ZSxcbiAgeWVhclRvRGF0ZTogdHJ1ZSxcbn07XG5cblxuLy8gV2hldGhlciBhIHN0b3JlZCBwcmVzZXQgbmFtZSBpcyBvbmUgdGhlIHNlcnZlciByZXNvbHZlcyAoUmVwb3J0UmVsYXRpdmVSYW5nZSkuXG5mdW5jdGlvbiBpc1JlbGF0aXZlUmFuZ2UobmFtZTogc3RyaW5nKTogbmFtZSBpcyBSZXBvcnRSZWxhdGl2ZVJhbmdlIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSRUxBVElWRV9SQU5HRVMsIG5hbWUpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBmaWx0ZXItZ3JvdXAgZGVmYXVsdHMgYXJlIHRoZSBzYW1lLiBDb21wYXJlZCBvbiB0aGUgZmllbGRzIGFcbi8vIGRlZmF1bHQgY2FuIGFjdHVhbGx5IGNhcnJ5LCBzbyBrZXkgb3JkZXIgaW4gdGhlIHBheWxvYWQgY2FuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRGVmYXVsdChcbiAgYTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbiAgYjogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICByZXR1cm4gYS5zdGFydCA9PT0gYi5zdGFydFxuICAgICYmIGEuZW5kID09PSBiLmVuZFxuICAgICYmIGEudmFsdWUgPT09IGIudmFsdWVcbiAgICAmJiBhLnJlbGF0aXZlID09PSBiLnJlbGF0aXZlXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5sZW5ndGggPT09IChiLnZhbHVlcyA/PyBbXSkubGVuZ3RoXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gKGIudmFsdWVzID8/IFtdKVtpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGxpc3Qgc29ydHMgb3JkZXIgdGhlIHJvd3MgdGhlIHNhbWUgd2F5LiBObyBkaXJlY3Rpb24gcmVhZHMgYXNcbi8vIGFzY2VuZGluZywgdGhlIHdheSB0aGUgbGlzdCBhcHBsaWVzIGl0LlxuZnVuY3Rpb24gc2FtZVNvcnQoYTogUmVwb3J0U29ydCwgYjogUmVwb3J0U29ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhYlxuICAgICYmIGEuY29sdW1uID09PSBiLmNvbHVtblxuICAgICYmIChhLmRpcmVjdGlvbiA/PyAnYXNjJykgPT09IChiLmRpcmVjdGlvbiA/PyAnYXNjJyk7XG59XG5cblxuLy8gV2hldGhlciBhIHZhbHVlIHJlYWQgb2ZmIGEgZmlsdGVyIGJhciBpcyB0aGUgdmFsdWUgYWxyZWFkeSBzdG9yZWQgZm9yIGl0c1xuLy8gZ3JvdXA6IHRoZSBzYW1lIGNhbGVuZGFyIGRheXMsIHRoZSBzYW1lIHNlbGVjdCB2YWx1ZXMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kXG4vLyB0aGUgc2FtZSB0cmltbWVkIHRleHQuIEEgYmFyIHJlLXJlYWRzIGV2ZXJ5IGdyb3VwIGl0IHNob3dzIG9uIGFueSBjaGFuZ2UsIHNvXG4vLyB0aGlzIGlzIHdoYXQgdGVsbHMgdGhlIGdyb3VwIHRoYXQgY2hhbmdlZCBmcm9tIHRoZSBvbmVzIHRoYXQgZGlkIG5vdC5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRmlsdGVyVmFsdWUoXG4gIGE6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBiOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSAodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpID0+ICh2YWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpO1xuXG4gIHJldHVybiBzYW1lRGF5cyhhLCBiKVxuICAgICYmIHZhbHVlcyhhKS5qb2luKCdcXHUwMDAwJykgPT09IHZhbHVlcyhiKS5qb2luKCdcXHUwMDAwJylcbiAgICAmJiB2YWx1ZXMoYSkubGVuZ3RoID09PSB2YWx1ZXMoYikubGVuZ3RoXG4gICAgJiYgKGEudmFsdWUgPz8gJycpLnRyaW0oKSA9PT0gKGIudmFsdWUgPz8gJycpLnRyaW0oKTtcbn1cblxuXG4vLyBUaGUgZ3JvdXBzIGEgYmFyIHJlLXJlYWQgdGhhdCBpdCBub3cgc2hvd3Mgd2l0aCBhIHZhbHVlIG90aGVyIHRoYW4gdGhlIG9uZVxuLy8gaXQgbGFzdCByZXBvcnRlZCwgcmVjb3JkaW5nIGVhY2ggbmV3IHZhbHVlIGluIGBsYXN0UmVwb3J0ZWRgLiBBIGJhciBpc1xuLy8gY29tcGFyZWQgd2l0aCBpdHNlbGYsIG5ldmVyIHdpdGggdGhlIHN0b3JlZCB2YWx1ZTogYSBncm91cCBzaG93biBpbiB0d28gYmFyc1xuLy8gKGxldmVsICdib3RoJykgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIG90aGVyIG9uZSwgYW5kIHRoaXMgYmFyIGlzIG5vdFxuLy8gcmVwYWludGVkLCBzbyBpdHMgc3RhbGUgdmFsdWUgbXVzdCBub3QgYmUgc2V0IGJhY2sgd2hlbiB0aGUgdmlld2VyIGNoYW5nZXNcbi8vIGFub3RoZXIgb2YgaXRzIGl0ZW1zICh0aGUgbGlzdCBzZWFyY2ggYm94LCBzYXkpLlxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVkR3JvdXBWYWx1ZXMoXG4gIGxhc3RSZXBvcnRlZDogTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGw+LFxuICByZXBvcnRlZDogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10sXG4pOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSB7XG4gIHJldHVybiByZXBvcnRlZC5maWx0ZXIoKHsgZ3JvdXBJZCwgdmFsdWUgfSkgPT4ge1xuICAgIGlmIChzYW1lRmlsdGVyVmFsdWUobGFzdFJlcG9ydGVkLmdldChncm91cElkKSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGFzdFJlcG9ydGVkLnNldChncm91cElkLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cblxuLy8gQSBsaXN0J3Mgc2VhcmNoIHRleHQgYXMgdGhlIHNlcnZlciBhcHBsaWVzIGl0OiB0cmltbWVkLCB0aGVuIGN1dCB0b1xuLy8gTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cywgYXMgdGhlIHNlcnZlciBjb3VudHMgdGhlbSkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFsuLi50ZXh0LnRyaW0oKV0uc2xpY2UoMCwgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCkuam9pbignJyk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdHMgb2YgY29sdW1uIG5hbWVzIGFyZSB0aGUgc2FtZSBuYW1lcyBpbiB0aGUgc2FtZSBvcmRlci5cbmZ1bmN0aW9uIHNhbWVOYW1lcyhhOiByZWFkb25seSBzdHJpbmdbXSwgYjogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KChuYW1lLCBpbmRleCkgPT4gbmFtZSA9PT0gYltpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGhpZGRlbi1jb2x1bW4gbWFwcyBoaWRlIHRoZSBzYW1lIGNvbHVtbnMgb24gdGhlIHNhbWUgbGlzdHMuXG5mdW5jdGlvbiBzYW1lSGlkZGVuKFxuICBhOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbiAgYjogUmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuc2l6ZSA9PT0gYi5zaXplXG4gICAgJiYgWy4uLmFdLmV2ZXJ5KChbY29tcG9uZW50SWQsIG5hbWVzXSkgPT4gc2FtZU5hbWVzKG5hbWVzLCBiLmdldChjb21wb25lbnRJZCkgPz8gW10pKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBkYXRlLXJhbmdlIHZhbHVlcyBjb3ZlciB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLlxuZnVuY3Rpb24gc2FtZURheXMoYTogRmlsdGVyR3JvdXBWYWx1ZSwgYjogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZGF0ZUJvdW5kU3RyaW5nKGEuc3RhcnQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5zdGFydClcbiAgICAmJiBkYXRlQm91bmRTdHJpbmcoYS5lbmQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5lbmQpO1xufVxuXG5cbi8vIEEgc3RhYmxlIHNpZ25hdHVyZSBmb3IgYSBncm91cCdzIHN0b3JlZCBkZWZhdWx0LiBUaGUgcmVwb3J0IHRvb2xiYXIga2V5cyBpdHNcbi8vIGZzLWZpbHRlciBvbiB0aGlzLCBiZWNhdXNlIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCDigJQgd2l0aG91dCBhXG4vLyBrZXkgY2hhbmdlIGl0IGtlZXBzIHJlbmRlcmluZyB0aGUgdmFsdWVzIGl0IHdhcyBjcmVhdGVkIHdpdGggZXZlbiBhZnRlciB0aGVcbi8vIGNvbmZpZyBiZWhpbmQgaXQgaGFzIGJlZW4gcmVidWlsdC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2lnbmF0dXJlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IHN0cmluZyB7XG4gIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcblxuICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5lbmQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnZhbHVlID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSA/PyAnJyxcbiAgICAoZ3JvdXBEZWZhdWx0LnZhbHVlcyA/PyBbXSkuam9pbignLCcpLFxuICBdLmpvaW4oJ34nKTtcbn1cblxuXG4vLyBWaWV3ZXIgZmlsdGVyIHN0YXRlIGZvciB0aGUgb3BlbiByZXBvcnQuIEZpbHRlciBWQUxVRVMgYXJlIG5ldmVyIHNhdmVkIHRvXG4vLyB0aGUgcmVwb3J0IOKAlCB0aGlzIHNlcnZpY2UgaG9sZHMgdGhlbSBwZXIgZmlsdGVyIEdST1VQICh0aGUgcHJvcGFnYXRpb24gdW5pdCksXG4vLyByZXNvbHZlcyB0aGVtIGludG8gcGVyLWNvbXBvbmVudCBtZW1iZXItZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBkYXRhIHJlcXVlc3QsXG4vLyBhbmQgbm90aWZpZXMgdGhlIGNvbXBvbmVudHMgd2hvc2UgZ3JvdXBzIGNoYW5nZWQgc28gb25seSB0aGV5IHJlZmV0Y2guXG4vL1xuLy8gSXQgaXMgYWxzbyB0aGUgb25lIHNvdXJjZSBvZiB0aGUgdmlld2VyIHN0YXRlIHRoZSByZXBvcnQgVVJMIGNhcnJpZXMgKGdyb3VwXG4vLyB2YWx1ZXMsIHRoZSBncm91cC1ieSBncmFpbiwgbGlzdCBzb3J0cywgc2VhcmNoZXMgYW5kIGhpZGRlbiBjb2x1bW5zKTpcbi8vIHVybFNuYXBzaG90KCkgc2F5cyB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgYXV0aG9yZWQgZGVmYXVsdHMsIGluaXQoKSByZXN0b3Jlc1xuLy8gaXQsIGFuZCB1cmxDaGFuZ2VzKCkgdGVsbHMgdGhlIGhvc3QncyBzaW5nbGUgVVJMIHdyaXRlciB3aGVuIHRvIHdyaXRlLlxuLy9cbi8vIFNlc3Npb24tb25seSwgbmV2ZXIgaW4gdGhlIFVSTDogcGVyLWZpbHRlciBlbmFibGUvZGlzYWJsZSB0b2dnbGVzIGZyb20gYVxuLy8gY29tcG9uZW50J3MgZmlsdGVyIG1lbnUgKHRoZSBgZW5hYmxlZGAgY29sdW1uIGlzIHRoZSBhdXRob3JlZCBkZWZhdWx0OyBhXG4vLyB2aWV3ZXIncyB0b2dnbGUgc2hvdWxkbid0IHdyaXRlIHRvIHRoZSByZXBvcnQpLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgZWZmZWN0aXZlIHpvbmUgKHJlc29sdmVSZXBvcnRUaW1lem9uZSkuIFJlbGF0aXZlIHByZXNldHNcbiAgLy8gcmVzb2x2ZSBhZ2FpbnN0IHRvZGF5IGluIGl0LCBhbmQgZGF0ZSBjZWxscyByZW5kZXIgaW4gaXQuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IHNpZ25hbDxzdHJpbmc+KCdVVEMnKTtcblxuICAvLyBIb3cgdGhlIG9wZW4gcmVwb3J0IHdyaXRlcyBpdHMgbnVtYmVycyBhbmQgZGF0ZXMgKHJlc29sdmVGb3JtYXRDb250ZXh0KTpcbiAgLy8gaXRzIGxvY2FsZSwgaXRzIGN1cnJlbmN5IGFuZCB3aGV0aGVyIHBlcmNlbnRzIGFycml2ZSBhcyByYXRpb3MuIEV2ZXJ5IEtQSSxcbiAgLy8gY2hhcnQsIGRhdGUgY2VsbCBhbmQgZXhwb3J0IHJlYWRzIGl0IGhlcmUuIENvbXBhcmVkIGJ5IHZhbHVlLCBzbyBhIHJlbG9hZFxuICAvLyBvZiBhbiB1bmNoYW5nZWQgcmVwb3J0IHJlLXJlbmRlcnMgbm90aGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdENvbnRleHQgPSBzaWduYWw8UmVwb3J0Rm9ybWF0Q29udGV4dD4oREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwge1xuICAgIGVxdWFsOiAoYSwgYikgPT4gYS5sb2NhbGUgPT09IGIubG9jYWxlXG4gICAgICAmJiBhLmN1cnJlbmN5ID09PSBiLmN1cnJlbmN5XG4gICAgICAmJiBhLnJhdGlvUGVyY2VudCA9PT0gYi5yYXRpb1BlcmNlbnQsXG4gIH0pO1xuXG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gZWFjaCBwbGFpbiBsaXN0IChsaXN0SGlkZGVuQ29sdW1ucyksXG4gIC8vIGJ5IGNvbXBvbmVudCBpZDsgYSBsaXN0IHNob3dpbmcgZXZlcnkgY29sdW1uIGhhcyBubyBlbnRyeS4gQSBzaWduYWwsIHNvIGFcbiAgLy8gbGlzdCBoaWRlcyBhbmQgc2hvd3MgaXRzIGNvbHVtbnMgaW4gcGxhY2U6IHRoZSByb3dzIGRvIG5vdCBjaGFuZ2UsIHNvXG4gIC8vIG5vdGhpbmcgcmVmZXRjaGVzLiBDb21wYXJlZCBieSB2YWx1ZSwgc28gYSByZWxvYWQgdGhhdCBrZWVwcyBldmVyeSBjb2x1bW5cbiAgLy8gcmVwYWludHMgbm90aGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGxpc3RIaWRkZW4gPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4+KG5ldyBNYXAoKSwge1xuICAgIGVxdWFsOiBzYW1lSGlkZGVuLFxuICB9KTtcblxuICBwcml2YXRlIF92YWx1ZXMgPSBuZXcgTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZT4oKTtcbiAgcHJpdmF0ZSBfZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuICBwcml2YXRlIF9zZXNzaW9uRGlzYWJsZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBHcm91cHMgdGhhdCBoYXZlIGEgZGVmYXVsdCB0aGUgdmlld2VyIGNsZWFyZWQuIFdpdGhvdXQgdGhpcyBhIHJlbG9hZCBvZiB0aGVcbiAgLy8gcmVwb3J0IChhIGNoYXQgZWRpdCwgYSBkaWFsb2cpIHdvdWxkIGZpbmQgbm8gdmFsdWUgZm9yIHRoZSBncm91cCBhbmQgc2VlZFxuICAvLyBpdHMgZGVmYXVsdCBzdHJhaWdodCBiYWNrLiBBIGNoYW5nZSB0byB0aGUgc3RvcmVkIGRlZmF1bHQgcmVsZWFzZXMgaXQuXG4gIHByaXZhdGUgX2NsZWFyZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbDogYSBzaW5nbGUgcmVwb3J0LXdpZGUgYnVja2V0IG92ZXJyaWRlIGZvciBhbGxcbiAgLy8gdGltZS1zZXJpZXMgY2hhcnRzLiBVbnNldCA9IGVhY2ggY2hhcnQgdXNlcyBpdHMgYXV0aG9yZWQgZ3JhbnVsYXJpdHkuIE5ldmVyXG4gIC8vIHNhdmVkIHRvIHRoZSByZXBvcnQgKHRoZSBVUkwgY2FycmllcyBpdCksIGFuZCBjYXJyaWVkIGluIHRoZSBkYXRhIHJlcXVlc3Qnc1xuICAvLyBgc3RhdGVgLCBzbyBpdCBwcm9wYWdhdGVzIHRocm91Z2ggdG8gdGhlIFBERi9Qb3dlclBvaW50IGV4cG9ydHMgdG9vLiBOYW1lZFxuICAvLyBmb3IgdGhlIGBmcmVxdWVuY3lgIHdpcmUga2V5IGl0IHRyYXZlbHMgdW5kZXIsIG5vdCBmb3IgdGhlIGNvbnRyb2wncyBsYWJlbC5cbiAgcHJpdmF0ZSBfZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2ZyZXF1ZW5jeUNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBFYWNoIGxpc3QncyB2aWV3ZXItY2hvc2VuIHNvcnQsIGJ5IGNvbXBvbmVudCBpZC4gSGVsZCBoZXJlIHJhdGhlciB0aGFuIG9ubHlcbiAgLy8gaW4gdGhlIGxpc3QncyBGc0xpc3Qgc28gaXQgc3Vydml2ZXMgdGhlIGxpc3QgYmVpbmcgcmVjcmVhdGVkIChhIHBhZ2Ugc3dpdGNoLFxuICAvLyBhIHJlbG9hZCBhZnRlciBhbiBlZGl0KSBhbmQgc28gZXZlcnkgY29uc3VtZXIgb2Ygdmlld2VyIHN0YXRlIHJlYWRzIG9uZSBwbGFjZS5cbiAgcHJpdmF0ZSBfbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KCk7XG5cbiAgLy8gRWFjaCBsaXN0J3Mgc2VhcmNoIGJveCB0ZXh0IChsaXN0U2VhcmNoVGV4dCksIGJ5IGNvbXBvbmVudCBpZC4gQSBsaXN0IHdpdGhcbiAgLy8gYW4gZW1wdHkgYm94IGhhcyBubyBlbnRyeS4gSGVsZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb25zIGFzIHRoZSBzb3J0cywgYW5kXG4gIC8vIGJlY2F1c2UgdGhlIGJveCBsaXZlcyBpbiB0aGUgY29tcG9uZW50IGhlYWRlciwgbm90IGluIHRoZSBsaXN0LlxuICBwcml2YXRlIF9saXN0U2VhcmNoZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGxpc3RzLCBieSBjb21wb25lbnQgaWQsIHNvIGEgZmlsdGVyIHRvZ2dsZSBjYW4gdGVsbFxuICAvLyB3aGljaCBvZiB0aGVtIGxvc2UgdGhlaXIgc2VhcmNoIGJveCAobGlzdFNlYXJjaGFibGUpLlxuICBwcml2YXRlIF9saXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgLy8gV2hldGhlciB0aGUgc2VydmVyIGFuc3dlcnMgYSBsaXN0IHNlYXJjaC4gTGlzdCBzZWFyY2ggYW5kIGVmZmVjdGl2ZUxvY2FsZVxuICAvLyBzaGlwIGluIHRoZSBzYW1lIGZyYW1ld29yayBjaGFuZ2Ugc2V0LCBzbyBhIHNlcnZlciB0aGF0IHNlbmRzIG5vXG4gIC8vIGVmZmVjdGl2ZUxvY2FsZSBoYXMgbmVpdGhlciwgYW5kIGl0cyBsaXN0cyBzaG93IG5vIHNlYXJjaCBib3guXG4gIHByaXZhdGUgX3NlcnZlclNlYXJjaGVzID0gZmFsc2U7XG5cbiAgLy8gRW1pdHMgdGhlIGlkIG9mIHRoZSBsaXN0IHdob3NlIHNlYXJjaCB0ZXh0IGNoYW5nZWQuXG4gIHByaXZhdGUgX2xpc3RTZWFyY2hDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICAvLyBFbWl0cyB0aGUgZ3JvdXAgaWQgdGhhdCBjaGFuZ2VkOyBjb21wb25lbnRzIGxpc3RlbiBmaWx0ZXJlZCB0byB0aGVpciBvd25cbiAgLy8gZ3JvdXAgaWRzLiBudWxsID0gZXZlcnl0aGluZyBjaGFuZ2VkIChyZS1pbml0KS5cbiAgcHJpdmF0ZSBfY2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXIgfCBudWxsPigpO1xuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIGFueXRoaW5nIHRoZSBVUkwgY2FycmllcyBtYXkgaGF2ZSBjaGFuZ2VkLlxuICBwcml2YXRlIF91cmxDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycyksIGFuZCBzbyBkb2VzIGEgZ3JvdXAgdGhlIHZpZXdlclxuICAvLyBjbGVhcmVkIOKAlCBVTkxFU1MgdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQgaXRzZWxmIGNoYW5nZWQsIHdoaWNoIG9ubHlcbiAgLy8gaGFwcGVucyB3aGVuIGFuIG9wZXJhdG9yIHNhdmVkIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0IHNldHRpbmdzIG9yIHRoZVxuICAvLyBhZ2VudCBzZXQgb25lLiBUaGF0IGlzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJlLXNlZWQsIHNvIGl0IHdpbnMgb3ZlclxuICAvLyB0aGUgc3Vydml2aW5nIHNlc3Npb24gdmFsdWU7IHdpdGhvdXQgaXQgdGhlIGJhciBrZWVwcyBzaG93aW5nIHdoYXRldmVyIGl0XG4gIC8vIHdhcyBmaXJzdCBzZWVkZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gIC8vXG4gIC8vIEEgY2hhbmdlIG9mIHRoZSByZXBvcnQncyB6b25lIG1vdmVzIFwidG9kYXlcIiwgc28gYSB2YWx1ZSBzdGlsbCBjYXJyeWluZyBpdHNcbiAgLy8gZ3JvdXAgZGVmYXVsdCdzIHByZXNldCBuYW1lIGlzIHJlc29sdmVkIGFnYWluIGluIHRoZSBuZXcgem9uZS4gQSB2YWx1ZSB0aGVcbiAgLy8gdmlld2VyIHBpY2tlZCwgb3Igb25lIGNhcnJ5aW5nIGFub3RoZXIgcHJlc2V0IG5hbWUsIGlzIGtlcHQgYXMgaXQgaXMuXG4gIC8vXG4gIC8vIGByZXN0b3JlYCBpcyB0aGUgdmlld2VyIHN0YXRlIHJlYWQgZnJvbSB0aGUgVVJMLiBUaGUgaG9zdCBwYXNzZXMgaXQgb25seSBvblxuICAvLyB0aGUgZmlyc3QgbG9hZCBvZiBhIHJlcG9ydDsgYSByZWxvYWQgYWZ0ZXIgYSBjaGF0IG9yIGRpYWxvZyBlZGl0IHBhc3Nlc1xuICAvLyBudWxsLCBzbyB0aGUgaW4tbWVtb3J5IHN0YXRlIHdpbnMuIFBhcmFtcyB0aGF0IG5hbWUgYSBncm91cCwgbGlzdCBvciBjb2x1bW5cbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciB0aGF0IGRvIG5vdCBkZWNvZGUsIGFyZSBpZ25vcmVkLlxuICBwdWJsaWMgaW5pdChyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1RpbWV6b25lID0gdGhpcy50aW1lem9uZSgpO1xuXG4gICAgLy8gU2V0IGZpcnN0OiB0aGUgZGVmYXVsdHMgc2VlZGVkIGJlbG93IHJlc29sdmUgdGhlaXIgcmVsYXRpdmUgcHJlc2V0cyBpbiBpdC5cbiAgICB0aGlzLnRpbWV6b25lLnNldChyZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSk7XG4gICAgdGhpcy5mb3JtYXRDb250ZXh0LnNldChyZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQpKTtcbiAgICAvLyBCZWZvcmUgYW55IHNlYXJjaCByZXN0b3JlOiBsaXN0U2VhcmNoYWJsZSByZWFkcyBpdC5cbiAgICB0aGlzLl9zZXJ2ZXJTZWFyY2hlcyA9IHJlcG9ydC5lZmZlY3RpdmVMb2NhbGUgIT09IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHRpbWV6b25lQ2hhbmdlZCA9IHByZXZpb3VzVGltZXpvbmUgIT09IHRoaXMudGltZXpvbmUoKTtcbiAgICBjb25zdCBwcmV2aW91c0dyb3VwcyA9IHRoaXMuX2dyb3VwcztcbiAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIHRoaXMuX2dyb3Vwcy5zZXQoZ3JvdXAuaWQsIGdyb3VwKTtcbiAgICAgIHRoaXMuX3NlZWQoZ3JvdXAsIHByZXZpb3VzR3JvdXBzLmdldChncm91cC5pZCkgPz8gbnVsbCwgdGltZXpvbmVDaGFuZ2VkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgaWYgKHJlc3RvcmUpIHtcbiAgICAgIHRoaXMuX3Jlc3RvcmUocmVwb3J0LCByZXN0b3JlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcnVuZShyZXBvcnQpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUoZ3JvdXBJZDogbnVtYmVyKTogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCk7XG4gIH1cblxuICAvLyBBIGJhcidzIHZhbHVlIGZvciBhIGdyb3VwLiBBIGRhdGUgcmFuZ2Uga2VlcHMgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSBvbmx5XG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSBzdGlsbCB0aGUgc3RvcmVkIGRheXM6IHRoZSBiYXJzIHJlLXNldCBldmVyeSBncm91cCB0aGV5XG4gIC8vIHNob3cgd2hlbmV2ZXIgYW55IG9uZSBvZiB0aGVtIGNoYW5nZXMsIGFuZCBhbiB1bnRvdWNoZWQgcm9sbGluZyByYW5nZSBtdXN0XG4gIC8vIGtlZXAgaXRzIG5hbWUgcmF0aGVyIHRoYW4gdHVybiBpbnRvIHR3byBmaXhlZCBkYXRlcy4gQW55IG90aGVyIHJhbmdlLCBhXG4gIC8vIHBpY2tlciBzaG9ydGN1dCBpbmNsdWRlZCwgaXMgc3RvcmVkIGFzIHRoZSBmaXhlZCBkYXRlcyBpdCBzaG93cy5cbiAgcHVibGljIHNldFZhbHVlKGdyb3VwSWQ6IG51bWJlciwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICBpZiAodGhpcy5fZ3JvdXBzLmdldChncm91cElkKT8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuYWRkKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwSWQsIHRoaXMuX3dpdGhQcmVzZXQodGhpcy5fdmFsdWVzLmdldChncm91cElkKSwgdmFsdWUpKTtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgbmFtZSBhcyB0b2RheSdzIHJhbmdlIGluIHRoZSByZXBvcnQncyB6b25lLCBvciBudWxsIGZvclxuICAvLyBhIG5hbWUgaXQgZG9lcyBub3Qga25vdy4gVGhlIFVSTCBjb2RlYyBkZWNvZGVzIHByZXNldCBuYW1lcyB0aHJvdWdoIHRoaXMuXG4gIHB1YmxpYyByZXNvbHZlUmVsYXRpdmUobmFtZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZShuYW1lKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgZ3JvdXAtYnkgZ3JhaW4sIG9yIG51bGwgd2hlbiB0aGUgdmlld2VyIGhhc24ndCBjaG9zZW4gb25lLlxuICBwdWJsaWMgZnJlcXVlbmN5KCk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5O1xuICB9XG5cbiAgcHVibGljIHNldEZyZXF1ZW5jeShmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gZnJlcXVlbmN5O1xuICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgZ3JvdXAtYnkgZ3JhaW4gY2hhbmdlcyDigJQgZXZlcnkgdGltZS1zZXJpZXMgY2hhcnQgbGlzdGVuc1xuICAvLyBzbyBpdCByZWZldGNoZXMgYW5kIHJlLWJ1Y2tldHMgKHRoZSBvdmVycmlkZSBpc24ndCBzY29wZWQgdG8gYW55IGZpbHRlclxuICAvLyBncm91cCwgc28gY2hhbmdlc0ZvcigpIGNhbid0IGNhcnJ5IGl0KS5cbiAgcHVibGljIGZyZXF1ZW5jeUNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gVGhlIHNvcnQgdGhlIHZpZXdlciBsYXN0IGZldGNoZWQgYSBsaXN0IHdpdGgsIG9yIG51bGwgd2hlbiBpdCBoYXNuJ3Qgc29ydGVkXG4gIC8vICh0aGUgbGlzdCB0aGVuIGZhbGxzIGJhY2sgdG8gaXRzIGF1dGhvcmVkIHNvcnQpLlxuICBwdWJsaWMgbGlzdFNvcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc29ydCB3aGVuIGl0IGlzIHRoZSB2aWV3ZXIncyBvd246IGEgc29ydCB0aGF0IGlzIHRoZVxuICAvLyBsaXN0J3MgYXV0aG9yZWQgZmlyc3QgdGVybSBpcyB0aGUgbGlzdCdzIGRlZmF1bHQsIG5vdCBhIGNob2ljZSwgc28gaXRcbiAgLy8gY2xlYXJzIHRoZSBlbnRyeSBpbnN0ZWFkICh0aGUgcnVsZSB0aGUgVVJMIHNuYXBzaG90IGFwcGxpZXMpLiBPdGhlcndpc2UgYVxuICAvLyBsaXN0J3MgZmlyc3QgZmV0Y2ggd291bGQgcmVjb3JkIGl0cyBzZWVkZWQgYXV0aG9yZWQgdGVybSwgYW5kIGEgbGlzdCB0aGVcbiAgLy8gYWdlbnQgcmUtc29ydHMgbGF0ZXIgaW4gdGhlIHNlc3Npb24gd291bGQga2VlcCBzZW5kaW5nIHRoZSBvbGQgdGVybVxuICAvLyBmaXJzdC4gRGVsaWJlcmF0ZWx5IGVtaXRzIG5vIGNoYW5nZTogdGhlIGxpc3Qgc2V0cyB0aGlzIGZyb20gdGhlIGZldGNoXG4gIC8vIHRoYXQgYWxyZWFkeSByYW4gd2l0aCB0aGF0IHNvcnQsIHNvIGEgbm90aWZpY2F0aW9uIHdvdWxkIG9ubHkgbWFrZSBpdFxuICAvLyByZWZldGNoIHRoZSBzYW1lIHJvd3MuIE9ubHkgdGhlIFVSTCBoZWFycyBhYm91dCBpdC5cbiAgcHVibGljIHNldExpc3RTb3J0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBzb3J0OiBSZXBvcnRTb3J0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGNvbXBvbmVudC5pZCwgc29ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5kZWxldGUoY29tcG9uZW50LmlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgdGV4dCBhIGxpc3QgaXMgc2VhcmNoZWQgYnksIG9yIG51bGwgd2hlbiBpdHMgc2VhcmNoIGJveCBpcyBlbXB0eS5cbiAgcHVibGljIGxpc3RTZWFyY2goY29tcG9uZW50SWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudElkKSA/PyBudWxsO1xuICB9XG5cbiAgLy8gV2hldGhlciBhIGxpc3Qgc2hvd3MgdGhlIHNlYXJjaCBib3ggb3ZlciBpdHMgdGV4dCBjb2x1bW5zOiBpdCBkb2VzIHdoZW4gdGhlXG4gIC8vIHNlcnZlciBhbnN3ZXJzIGEgbGlzdCBzZWFyY2ggKHNlZSBfc2VydmVyU2VhcmNoZXMpLCB1bmxlc3Mgb25lIG9mIGl0cyBsaXZlXG4gIC8vIGZpbHRlcnMgYmVsb25ncyB0byBhIGtleXdvcmQgZ3JvdXAgaXRzIGhlYWRlciBzaG93cy4gQSBiYXIgc2hvd3Mgb25lIHNlYXJjaFxuICAvLyBib3ggKGl0cyBsYXN0IGtleXdvcmQgaXRlbSksIGFuZCB0aGF0IG9uZSBpcyB0aGUgYXV0aG9yJ3MuIFRoZSBoZWFkZXIsIHRoZVxuICAvLyBVUkwgcmVzdG9yZSwgdGhlIHBydW5pbmcsIHRoZSBkYXRhIHJlcXVlc3Qgc3RhdGUgYW5kIHRoZSBleHBvcnRzIGFsbCByZWFkXG4gIC8vIHRoaXMgb25lIHJ1bGUsIHNvIG5vIHNlYXJjaCBuYXJyb3dzIGEgbGlzdCB3aG9zZSBzY3JlZW4gaGFzIG5vIGJveCBzaG93aW5nXG4gIC8vIGl0LCBhbmQgbm8gZXhwb3J0IHRpdGxlcyBhIHNlYXJjaCB0aGUgc2VydmVyIGRpZCBub3QgYXBwbHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoYWJsZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJTZWFyY2hlc1xuICAgICAgJiYgY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgJiYgIShjb21wb25lbnQuZmlsdGVycyA/PyBbXSkuc29tZSgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlci5lbmFibGVkXG4gICAgICAgICAgJiYgIXRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKVxuICAgICAgICAgICYmIGdyb3VwPy50eXBlID09PSAna2V5d29yZCdcbiAgICAgICAgICAmJiAoZ3JvdXAubGV2ZWwgPT09ICdjb21wb25lbnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpOyBhbiBlbXB0eSBib3ggY2xlYXJzXG4gIC8vIGl0LiBUaGUgaGVhZGVyIGNhbGxzIHRoaXMgb24gZXZlcnkgY2hhbmdlIG9mIGFueSBvZiBpdHMgaXRlbXMsIHNvIHRoZVxuICAvLyBsaXN0IGFuZCB0aGUgVVJMIGhlYXIgYWJvdXQgaXQgb25seSB3aGVuIHRoZSBzdG9yZWQgdGV4dCBhY3R1YWxseSBjaGFuZ2VkLlxuICBwdWJsaWMgc2V0TGlzdFNlYXJjaChjb21wb25lbnRJZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZWFyY2ggPSBsaXN0U2VhcmNoVGV4dCh0ZXh0KTtcblxuICAgIGlmIChzZWFyY2ggPT09ICh0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudElkKSA/PyAnJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoKSB7XG4gICAgICB0aGlzLl9saXN0U2VhcmNoZXMuc2V0KGNvbXBvbmVudElkLCBzZWFyY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0U2VhcmNoZXMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0U2VhcmNoQ2hhbmdlZCQubmV4dChjb21wb25lbnRJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW4gbmFtZXMgYSB2aWV3ZXIgaGlkIG9uIGEgbGlzdDsgbm9uZSB3aGVuIGl0IHNob3dzIHRoZW0gYWxsLlxuICBwdWJsaWMgaGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxpc3RIaWRkZW4oKS5nZXQoY29tcG9uZW50SWQpID8/IFtdO1xuICB9XG5cbiAgLy8gUmVjb3JkcyB0aGUgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBsaXN0LCBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zOlxuICAvLyBuYW1lcyB0aGUgbGlzdCBjYW5ub3QgaGlkZSBhcmUgZHJvcHBlZCwgYW5kIG5vbmUgKG9yIGV2ZXJ5IGNvbHVtbikgY2xlYXJzXG4gIC8vIHRoZSBlbnRyeS4gT25seSB0aGUgVVJMIGhlYXJzIGFib3V0IGl0LCBhbmQgb25seSBvbiBhIHJlYWwgY2hhbmdlLlxuICBwdWJsaWMgc2V0SGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBoaWRkZW4gPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgIGlmIChzYW1lTmFtZXMoaGlkZGVuLCB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMubGlzdEhpZGRlbigpKTtcblxuICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgb25lIGxpc3QncyBzZWFyY2ggdGV4dCBjaGFuZ2VzLCBzbyB0aGF0IGxpc3QgcmVmZXRjaGVzLlxuICBwdWJsaWMgbGlzdFNlYXJjaENoYW5nZXMoY29tcG9uZW50SWQ6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9saXN0U2VhcmNoQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoaWQpID0+IGlkID09PSBjb21wb25lbnRJZCksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIHRoZSB2aWV3ZXIgc3RhdGUgdGhlIFVSTCBjYXJyaWVzIG1heSBoYXZlIGNoYW5nZWQ6IGEgZ3JvdXBcbiAgLy8gdmFsdWUsIHRoZSBncmFpbiwgYSBsaXN0IHNvcnQsIHNlYXJjaCBvciBoaWRkZW4gY29sdW1ucywgb3IgYSAocmUpbG9hZCBvZlxuICAvLyB0aGUgcmVwb3J0LlxuICBwdWJsaWMgdXJsQ2hhbmdlcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fdXJsQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyBUaGUgdmlld2VyIHN0YXRlIHRoZSBVUkwgc2hvdWxkIGNhcnJ5IGZvciBgcmVwb3J0YDogb25seSB3aGF0IGRpZmZlcnMgZnJvbVxuICAvLyB0aGUgYXV0aG9yZWQgZGVmYXVsdHMsIHNvIGFuIHVudG91Y2hlZCByZXBvcnQgaGFzIGEgYmFyZSBVUkwgYW5kIGtlZXBzXG4gIC8vIGZvbGxvd2luZyBpdHMgZGVmYXVsdHMgd2hlbiB0aGV5IGNoYW5nZS4gQSBncm91cCB0aGUgdmlld2VyIGNsZWFyZWQgaXNcbiAgLy8gbnVsbC4gQSBkYXRlIHJhbmdlIGlzIGNvbXBhcmVkIG9uIGl0cyBkYXlzIGFnYWluc3QgaXRzIGRlZmF1bHQgcmVzb2x2ZWRcbiAgLy8gdG9kYXksIHNvIGEgdmFsdWUgdGhhdCBpcyB0aGUgZGVmYXVsdCB1bmRlciBhbm90aGVyIHByZXNldCBuYW1lICh0aGlzWWVhclxuICAvLyBhZ2FpbnN0IGEgeWVhclRvRGF0ZSBkZWZhdWx0KSBpcyBzdGlsbCB0aGUgZGVmYXVsdC5cbiAgcHVibGljIHVybFNuYXBzaG90KHJlcG9ydDogUmVwb3J0KTogUmVwb3J0VXJsU25hcHNob3Qge1xuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4oKTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fZ3JvdXBzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpO1xuXG4gICAgICBpZiAodGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXAuaWQpKSB7XG4gICAgICAgIGdyb3Vwcy5zZXQoZ3JvdXAuaWQsIG51bGwpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiAhdGhpcy5faXNEZWZhdWx0KGdyb3VwLCB2YWx1ZSkpIHtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cC5pZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RTb3J0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRTb3J0PigpO1xuICAgIGNvbnN0IGxpc3RTZWFyY2hlcyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbGlzdEhpZGRlbiA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmdbXT4oKTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkpIHtcbiAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBoaWRkZW4gPSB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50LmlkKTtcblxuICAgICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgICAgbGlzdFNvcnRzLnNldChjb21wb25lbnQuaWQsIHNvcnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgIGxpc3RTZWFyY2hlcy5zZXQoY29tcG9uZW50LmlkLCBzZWFyY2gpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICBsaXN0SGlkZGVuLnNldChjb21wb25lbnQuaWQsIFsuLi5oaWRkZW5dKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBncm91cHMsIGxpc3RTb3J0cywgbGlzdFNlYXJjaGVzLCBsaXN0SGlkZGVuLCBmcmVxdWVuY3k6IHRoaXMuX2ZyZXF1ZW5jeSB9O1xuICB9XG5cbiAgcHVibGljIGlzRmlsdGVyRGlzYWJsZWQoZmlsdGVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlcklkKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgZ3JvdXBJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpKSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZGVsZXRlKGZpbHRlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmFkZChmaWx0ZXJJZCk7XG4gICAgfVxuXG4gICAgLy8gVHVybmluZyBhIGtleXdvcmQgZmlsdGVyIGJhY2sgb24gdGFrZXMgaXRzIGxpc3QncyBzZWFyY2ggYm94IGF3YXksIGFuZFxuICAgIC8vIHRoZSBzZWFyY2ggd2l0aCBpdC4gVGhlIGxpc3QgcmVmZXRjaGVzIG9uIHRoZSBncm91cCBjaGFuZ2UgYmVsb3cuXG4gICAgdGhpcy5fZHJvcFVuc2VhcmNoYWJsZSgpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBOb3RpZmljYXRpb25zIHJlbGV2YW50IHRvIE9ORSBjb21wb25lbnQ6IGFueSBjaGFuZ2UgdG8gYSBncm91cCBvbmUgb2YgaXRzXG4gIC8vIGZpbHRlcnMgYmVsb25ncyB0byAob3IgYSBmdWxsIHJlLWluaXQpLlxuICBwdWJsaWMgY2hhbmdlc0Zvcihjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdyb3VwSWRzID0gbmV3IFNldCgoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyR3JvdXBJZCkpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGdyb3VwSWQpID0+IGdyb3VwSWQgPT09IG51bGwgfHwgZ3JvdXBJZHMuaGFzKGdyb3VwSWQpKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ3JvdXAgdmFsdWVzIHJlc29sdmVkIGludG8gdGhpcyBjb21wb25lbnQncyBtZW1iZXItZmlsdGVyIHZhbHVlcyDigJRcbiAgLy8gd2hhdCB0aGUgZGF0YSByZXF1ZXN0IGNhcnJpZXMuIERpc2FibGVkIGZpbHRlcnMgKGF1dGhvcmVkIG9yIHNlc3Npb24pIGFyZVxuICAvLyBza2lwcGVkIGVudGlyZWx5LlxuICBwdWJsaWMgcmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY29tcG9uZW50LmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghZmlsdGVyLmVuYWJsZWQgfHwgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgY29uc3QgZmllbGRzID0gdmFsdWUgPyB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSkgOiBudWxsO1xuXG4gICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgIHJlc29sdmVkLnB1c2goeyBmaWx0ZXJJZDogZmlsdGVyLmlkLCAuLi5maWVsZHMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLy8gV2hhdCB0aGUgdmlld2VyIGhhcyBzZXQsIG9uZSBlbnRyeSBwZXIgZmlsdGVyIGdyb3VwLCBmb3IgdGhlIHJlcG9ydCBjaGF0OlxuICAvLyB0aGUgYWdlbnQgcmVhZHMgaXQgdG8ga25vdyB3aGF0IGlzIG9uIHNjcmVlbi4gR3JvdXAgb3JkZXIsIG5vdCB0aGUgb3JkZXJcbiAgLy8gdGhlIHZhbHVlcyB3ZXJlIHNldCBpbiwgc28gdGhlIHNhbWUgc3RhdGUgYWx3YXlzIHJlYWRzIHRoZSBzYW1lLiBBIGdyb3VwXG4gIC8vIHdpdGggbm90aGluZyBpbiBpdCBpcyBsZWZ0IG91dCwgYW5kIGEgc2F2ZWQgZGVmYXVsdCBjb3VudHMgdW50aWwgdGhlXG4gIC8vIHZpZXdlciBjaGFuZ2VzIGl0LiBQZXItZmlsdGVyIHRvZ2dsZXMgYXJlIGEgY29tcG9uZW50J3Mgb3duIGJ1c2luZXNzLCBzb1xuICAvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBpdC5cbiAgcHVibGljIHZpZXdlckZpbHRlcnMoKTogUmVwb3J0Q2hhdFZpZXdlckZpbHRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3ZhbHVlcy5lbnRyaWVzKCldXG4gICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEgLSBiKVxuICAgICAgLm1hcCgoW2dyb3VwSWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkcyA/IHsgZ3JvdXBJZCwgLi4uZmllbGRzIH0gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciA9PiBlbnRyeSAhPT0gbnVsbCk7XG4gIH1cblxuICAvLyBFdmVyeSBjb21wb25lbnQncyByZXNvbHZlZCB2YWx1ZXMgaW4gb25lIGFycmF5IOKAlCB3aGF0IGEgcmVwb3J0LWxldmVsIGV4cG9ydFxuICAvLyBjYXJyaWVzIHNvIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIHRoZSBzY3JlZW4gaXMuXG4gIC8vIEZpbHRlciBpZHMgYXJlIHVuaXF1ZSBwZXIgY29tcG9uZW50LCBzbyB0aGUgYmFja2VuZCBwaWNrcyBlYWNoIGNvbXBvbmVudCdzXG4gIC8vIG93biBvdXQgb2YgdGhlIHBpbGUuIEEgcGFnZSBpZCBuYXJyb3dzIGl0IHRvIHRoYXQgcGFnZS5cbiAgcHVibGljIHJlc29sdmVGb3JSZXBvcnQocmVwb3J0OiBSZXBvcnQsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHBhZ2VzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKTtcblxuICAgIHJldHVybiBwYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpKSk7XG4gIH1cblxuICAvLyBBIGdyb3VwIHZhbHVlIGFzIHRoZSBmaWVsZHMgYSByZXF1ZXN0IGNhcnJpZXM6IGRhdGUgYm91bmRzIGFzIGNhbGVuZGFyXG4gIC8vIGRheXMsIHNlbGVjdCB2YWx1ZXMgd2hlbiBhbnkgYXJlIHBpY2tlZCwga2V5d29yZCB0ZXh0IHRyaW1tZWQuIE51bGwgd2hlblxuICAvLyBhbGwgb2YgdGhlbSBhcmUgZW1wdHkuIEEgZGF0ZSByYW5nZSBhbHNvIG5hbWVzIHRoZSByZWxhdGl2ZSByYW5nZSBpdFxuICAvLyBzdGlsbCBpcyAoX2xpdmVQcmVzZXQpLCBzbyB0aGUgc2VydmVyIGtub3dzIHdoaWNoIHBlcmlvZCB0aGUgZGF5cyBjb3ZlcjtcbiAgLy8gdGhlIGRheXMgc3RheSB0aGUgd2luZG93IGVpdGhlciB3YXkuIENvbXBvbmVudCBkYXRhLCB0aGUgcmVwb3J0IGFuZCBwYWdlXG4gIC8vIGV4cG9ydHMgYW5kIHRoZSBjaGF0J3Mgdmlld2VyIGZpbHRlcnMgYWxsIHJlYWQgdGhlaXIgZmllbGRzIGhlcmUsIHNvIGFsbFxuICAvLyB0aHJlZSBjYXJyeSBpdC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZWRGaWVsZHModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+ID0ge307XG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgIGZpZWxkcy5zdGFydCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIGZpZWxkcy5lbmQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKTtcbiAgICB9XG4gICAgaWYgKHByZXNldCkge1xuICAgICAgZmllbGRzLnByZXNldCA9IHByZXNldDtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICBmaWVsZHMudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgZmllbGRzLnZhbHVlID0gdmFsdWUudmFsdWUudHJpbSgpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZHMuc3RhcnQgfHwgZmllbGRzLmVuZCB8fCBmaWVsZHMudmFsdWVzIHx8IGZpZWxkcy52YWx1ZVxuICAgICAgPyBmaWVsZHNcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSByZWxhdGl2ZSByYW5nZSBhIGRhdGUgdmFsdWUgc3RpbGwgaXM6IHRoZSBwcmVzZXQgbmFtZSBpdCBjYXJyaWVzLFxuICAvLyB3aGlsZSBpdHMgZGF5cyBhcmUgdGhhdCByYW5nZSByZXNvbHZlZCB0b2RheSBpbiB0aGUgcmVwb3J0J3Mgem9uZS4gQVxuICAvLyB2YWx1ZSB3aG9zZSBkYXlzIHRoZSB2aWV3ZXIgY2hhbmdlZCwgb3Igb25lIHNlZWRlZCBiZWZvcmUgbWlkbmlnaHQgdGhhdFxuICAvLyBpcyBub3cgYSBkYXkgYmVoaW5kLCBuYW1lcyBub25lLCBhbmQgdGhlIHNlcnZlciByZWFkcyBpdHMgZGF5cyBhbG9uZS5cbiAgcHJpdmF0ZSBfbGl2ZVByZXNldCh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IFJlcG9ydFJlbGF0aXZlUmFuZ2UgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlLnByZXNldCB8fCAhaXNSZWxhdGl2ZVJhbmdlKHZhbHVlLnByZXNldCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZSh2YWx1ZS5wcmVzZXQpO1xuXG4gICAgcmV0dXJuIHJhbmdlICYmIHNhbWVEYXlzKHZhbHVlLCByYW5nZSkgPyB2YWx1ZS5wcmVzZXQgOiBudWxsO1xuICB9XG5cbiAgLy8gU2VlZHMgb25lIGdyb3VwIG9uIChyZSlsb2FkOyBzZWUgaW5pdCgpLiBgcHJldmlvdXNgIGlzIHRoZSBncm91cCBhcyB0aGVcbiAgLy8gbGFzdCBsb2FkIGhhZCBpdCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5ldy5cbiAgcHJpdmF0ZSBfc2VlZChcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcHJldmlvdXM6IFJlcG9ydEZpbHRlckdyb3VwIHwgbnVsbCxcbiAgICB0aW1lem9uZUNoYW5nZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRDaGFuZ2VkID0gIXNhbWVEZWZhdWx0KHByZXZpb3VzPy5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCwgZ3JvdXAuY29uZmlnPy5kZWZhdWx0ID8/IG51bGwpO1xuXG4gICAgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG4gICAgY29uc3QgcHJlc2V0VG9SZXNvbHZlID0gdGltZXpvbmVDaGFuZ2VkXG4gICAgICAmJiAhIXZhbHVlPy5wcmVzZXRcbiAgICAgICYmIHZhbHVlLnByZXNldCA9PT0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5yZWxhdGl2ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhZGVmYXVsdENoYW5nZWQgJiYgIXByZXNldFRvUmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCBkZWZhdWx0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIC8vIFRoZSBkZWZhdWx0IHdhcyBjbGVhcmVkLCBzbyB0aGUgdmFsdWUgaXQgc2VlZGVkIGdvZXMgd2l0aCBpdC5cbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHZpZXdlciBzdGF0ZSByZWFkIGZyb20gdGhlIFVSTCBvbiB0b3Agb2YgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgcHJpdmF0ZSBfcmVzdG9yZShyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzdG9yZUdyb3VwcyhyZXN0b3JlKTtcbiAgICB0aGlzLl9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydCwgcmVzdG9yZSk7XG4gICAgdGhpcy5fcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQsIHJlc3RvcmUpO1xuICAgIHRoaXMuX3Jlc3RvcmVMaXN0SGlkZGVuKHJlc3RvcmUpO1xuXG4gICAgLy8gVGhlIFVSTCBpcyB0aGUgd2hvbGUgdHJ1dGggb24gYSBmaXJzdCBsb2FkOiBubyBncmFpbiBpbiBpdCBtZWFucyB0aGVcbiAgICAvLyBhdXRob3JlZCBvbmVzLiBUaGUgaG9zdCBzdGlsbCBkcm9wcyBhIGdyYWluIHRoZSByZXBvcnQgZG9lcyBub3Qgb2ZmZXIuXG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gR1JBTlVMQVJJVFlfT1BUSU9OU1xuICAgICAgLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSByZXN0b3JlLmdyb3VwQnkpPy52YWx1ZSA/PyBudWxsO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGdyb3VwIHZhbHVlcy4gQW4gZW1wdHkgb25lIGlzIGFuIGV4cGxpY2l0IGNsZWFyIG9mIHRoZSBncm91cC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUdyb3VwcyhyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICByZXN0b3JlLmdyb3Vwcy5mb3JFYWNoKChyYXcsIGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ3JvdXBcbiAgICAgICAgPyBkZWNvZGVGaWx0ZXJWYWx1ZShncm91cC50eXBlLCByYXcsIChuYW1lKSA9PiB0aGlzLnJlc29sdmVSZWxhdGl2ZShuYW1lKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICAgIGlmIChncm91cD8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGxpc3Qgc29ydHMsIGVhY2gga2VwdCBvbmx5IGZvciBhIGxpc3QgdGhlIHJlcG9ydCBoYXMgYW5kIGFcbiAgLy8gY29sdW1uIHRoYXQgbGlzdCBjYW4gYmUgc29ydGVkIGJ5LlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydDogUmVwb3J0LCByZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgcmVzdG9yZS5saXN0U29ydHMuZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgIGNvbnN0IHNvcnQgPSBkZWNvZGVTb3J0KHJhdyk7XG5cbiAgICAgIGlmIChjb21wb25lbnQgJiYgc29ydCAmJiB0aGlzLl9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50KS5pbmNsdWRlcyhzb3J0LmNvbHVtbikpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNvcnRzLnNldChjb21wb25lbnRJZCwgc29ydCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgVVJMJ3MgbGlzdCBzZWFyY2hlcywgZWFjaCBrZXB0IG9ubHkgZm9yIGEgbGlzdCB0aGUgcmVwb3J0IGhhcyB0aGF0XG4gIC8vIHNob3dzIGEgc2VhcmNoIGJveCAobGlzdFNlYXJjaGFibGUpLiBUaGUgdGV4dCBpcyByZWFkIGFzIGxpc3RTZWFyY2hUZXh0LFxuICAvLyBhbmQgYW4gZW1wdHkgb25lIGlzIG5vIHNlYXJjaC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcblxuICAgIHJlc3RvcmUubGlzdFNlYXJjaGVzLmZvckVhY2goKHJhdywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGxpc3RzLmdldChjb21wb25lbnRJZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSBsaXN0U2VhcmNoVGV4dChyYXcpO1xuXG4gICAgICBpZiAoY29tcG9uZW50ICYmIHRoaXMubGlzdFNlYXJjaGFibGUoY29tcG9uZW50KSAmJiBzZWFyY2gpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnRJZCwgc2VhcmNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBVUkwncyBoaWRkZW4gY29sdW1ucywgZWFjaCBsaXN0J3Mga2VwdCB0byBsaXN0SGlkZGVuQ29sdW1uczogb25seSB0aGVcbiAgLy8gY29uZmlndXJlZCBjb2x1bW5zIG9mIGEgcGxhaW4gbGlzdCB0aGUgcmVwb3J0IGhhcywgYW5kIG5vbmUgd2hlbiB0aGV5XG4gIC8vIHdvdWxkIGhpZGUgZXZlcnkgY29sdW1uLlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdEhpZGRlbihyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLmxpc3RIaWRkZW4oKSk7XG5cbiAgICByZXN0b3JlLmxpc3RIaWRkZW4uZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgaGlkZGVuID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBkZWNvZGVDb2x1bW5MaXN0KHJhdykpO1xuXG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gIH1cblxuICAvLyBEcm9wcyB0aGUgc2VhcmNoIG9mIGV2ZXJ5IGxpc3QgdGhhdCBubyBsb25nZXIgc2hvd3MgYSBzZWFyY2ggYm94OiBvbmVcbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciBvbmUgd2hvc2UgaGVhZGVyIG5vdyBoYXMgYSBrZXl3b3JkIGdyb3VwLlxuICBwcml2YXRlIF9kcm9wVW5zZWFyY2hhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5mb3JFYWNoKChzZWFyY2gsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5saXN0U2VhcmNoYWJsZShjb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJvcHMgc3RhdGUga2VwdCBmb3IgZ3JvdXBzLCBsaXN0cyBhbmQgZmlsdGVycyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMuXG4gIC8vIEEgbGlzdCBzb3J0IGFsc28gZ29lcyB3aGVuIGl0cyBjb2x1bW4gZG9lczogdGhlIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lXG4gIC8vIGl0LCBhbmQgdGhlIHJlY3JlYXRlZCBsaXN0IHdvdWxkIHNlbmQgYSBjb2x1bW4gdGhlIHF1ZXJ5IGRvZXMgbm90IGtub3cuXG4gIC8vIEEgbGlzdCBzZWFyY2ggZ29lcyB3aXRoIGl0cyBsaXN0IChvciB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm8gbG9uZ2VyIGFcbiAgLy8gbGlzdCksIGFuZCB3aGVuIHRoZSBsaXN0IGdhaW5zIGEga2V5d29yZCBncm91cCBhbmQgc28gbG9zZXMgaXRzIGJveC5cbiAgLy8gSGlkZGVuIGNvbHVtbnMga2VlcCBvbmx5IHRoZSBuYW1lcyB0aGVpciBsaXN0IHN0aWxsIGhhcyBhcyBjb2x1bW5zICh0aGVcbiAgLy8gYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWUgb25lLCBvciB0dXJuIHRoZSBsaXN0IGludG8gYSBjcm9zcy10YWIpLCBhbmQgZ29cbiAgLy8gd2hlbiB3aGF0IGlzIGxlZnQgd291bGQgaGlkZSBldmVyeSBjb2x1bW4uXG4gIHByaXZhdGUgX3BydW5lKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBncm91cElkIG9mIFsuLi50aGlzLl92YWx1ZXMua2V5cygpLCAuLi50aGlzLl9jbGVhcmVkXSkge1xuICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTb3J0cy5mb3JFYWNoKChzb3J0LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbHRlcklkcyA9IG5ldyBTZXQodGhpcy5fY29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuaWQpKSk7XG5cbiAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZm9yRWFjaCgoZmlsdGVySWQpID0+IHtcbiAgICAgIGlmICghZmlsdGVySWRzLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgTWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+KCk7XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4oKS5mb3JFYWNoKChuYW1lcywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGtlcHQgPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgICAgaWYgKGtlcHQubGVuZ3RoKSB7XG4gICAgICAgIGhpZGRlbi5zZXQoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChoaWRkZW4pO1xuICB9XG5cbiAgLy8gVGhlIHZhbHVlIGEgYmFyIHNldHMsIGtlZXBpbmcgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSB3aGlsZSB0aGUgZGF5cyBhcmVcbiAgLy8gc3RpbGwgdGhlIHN0b3JlZCBkYXlzIChzZWUgc2V0VmFsdWUpLlxuICBwcml2YXRlIF93aXRoUHJlc2V0KHN0b3JlZDogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBGaWx0ZXJHcm91cFZhbHVlIHtcbiAgICBjb25zdCBmaXhlZDogRmlsdGVyR3JvdXBWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICBkZWxldGUgZml4ZWQucHJlc2V0O1xuXG4gICAgcmV0dXJuIHN0b3JlZD8ucHJlc2V0ICYmIHNhbWVEYXlzKHN0b3JlZCwgZml4ZWQpXG4gICAgICA/IHsgLi4uZml4ZWQsIHByZXNldDogc3RvcmVkLnByZXNldCB9XG4gICAgICA6IGZpeGVkO1xuICB9XG5cbiAgLy8gV2hldGhlciBhIHZhbHVlIGlzIHRoZSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIGJ5IHR5cGU6IGEgZGF0ZSByYW5nZSBvblxuICAvLyBpdHMgZGF5cyAodGhlIGRlZmF1bHQgcmVzb2x2ZWQgdG9kYXkpLCBhIHNlbGVjdCBvbiBpdHMgdmFsdWVzIGluIGFueVxuICAvLyBvcmRlciwgYSBrZXl3b3JkIG9uIGl0cyB0ZXh0LlxuICBwcml2YXRlIF9pc0RlZmF1bHQoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG4gICAgaWYgKCFkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIC8vIEFuIHVudG91Y2hlZCByb2xsaW5nIGRlZmF1bHQgc3RpbGwgY2FycmllcyBpdHMgcHJlc2V0IG5hbWUuIEl0cyBkYXlzXG4gICAgICAgIC8vIHdlcmUgcmVzb2x2ZWQgd2hlbiBpdCB3YXMgc2VlZGVkLCBhbmQgYWZ0ZXIgbWlkbmlnaHQgdGhleSBubyBsb25nZXJcbiAgICAgICAgLy8gbWF0Y2ggdG9kYXkncywgYnV0IGl0IGlzIHN0aWxsIHRoZSBkZWZhdWx0IGFuZCBzdGF5cyBvdXQgb2YgdGhlIFVSTC5cbiAgICAgICAgaWYgKHZhbHVlLnByZXNldCAmJiB2YWx1ZS5wcmVzZXQgPT09IGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8ucmVsYXRpdmUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzYW1lRGF5cyh2YWx1ZSwgZGVmYXVsdFZhbHVlKTtcblxuICAgICAgY2FzZSAnc2VsZWN0Jzoge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSAodmFsdWUudmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gKGRlZmF1bHRWYWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLnNvcnQoKTtcblxuICAgICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gZGVmYXVsdHMubGVuZ3RoXG4gICAgICAgICAgJiYgdmFsdWVzLmV2ZXJ5KChpdGVtLCBpbmRleCkgPT4gaXRlbSA9PT0gZGVmYXVsdHNbaW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICh2YWx1ZS52YWx1ZSA/PyAnJykudHJpbSgpID09PSAoZGVmYXVsdFZhbHVlLnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgY29tcG9uZW50IG9mIHRoZSByZXBvcnQ6IGl0cyBwYWdlcycgYW5kIGl0cyBoZWFkZXIgYW5kIGZvb3RlcidzLlxuICBwcml2YXRlIF9jb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocmVwb3J0LnBhZ2VzID8/IFtdKS5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMgPz8gW10pLFxuICAgICAgLi4uKHJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIF9saXN0Q29tcG9uZW50cyhyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCcpO1xuICB9XG5cbiAgLy8gVGhlIGNvbHVtbnMgYSBsaXN0IGNhbiBiZSBzb3J0ZWQgYnk6IGV2ZXJ5IGF1dGhvcmVkIGNvbHVtbiwgb3IgYVxuICAvLyBjcm9zcy10YWIncyByb3cgY29sdW1uIG9ubHkgKGl0cyBwaXZvdCBjb2x1bW5zIGNvbWUgYW5kIGdvIHdpdGggdGhlIGRhdGEpLlxuICBwcml2YXRlIF9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZztcblxuICAgIGlmIChjb25maWc/LnBpdm90Qnk/LmNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbmZpZy5yb3dCeT8uY29sdW1uID8gW2NvbmZpZy5yb3dCeS5jb2x1bW5dIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIChjb25maWc/LmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uY29sdW1uKTtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LCBtYXBwZWQgdG8gYSBzZXNzaW9uIHZhbHVlIGJ5IHR5cGUuIFJlbGF0aXZlXG4gIC8vIGRhdGUgcHJlc2V0cyByZXNvbHZlIGFnYWluc3QgXCJub3dcIiBlYWNoIHRpbWUgdGhlIHJlcG9ydCBvcGVucywgc28gYSBzYXZlZFxuICAvLyBcImxhc3QgMTIgbW9udGhzXCIgc3RheXMgcmVsYXRpdmUgYW5kIGNhcnJpZXMgaXRzIHByZXNldCBuYW1lOyBhIGZpeGVkXG4gIC8vIHJhbmdlLCBzZWxlY3QgdmFsdWVzIGFuZCBrZXl3b3JkIHRleHQgc2VlZCB2ZXJiYXRpbS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogZ3JvdXBEZWZhdWx0LnJlbGF0aXZlIH0gOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQuc3RhcnQgfHwgZ3JvdXBEZWZhdWx0LmVuZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGdyb3VwRGVmYXVsdC5zdGFydCA/PyBudWxsLFxuICAgICAgICBlbmQ6IGdyb3VwRGVmYXVsdC5lbmQgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBncm91cERlZmF1bHQudmFsdWVzIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGdyb3VwRGVmYXVsdC52YWx1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
1423
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQzdCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEdBQ2pGLE1BQU0sV0FBVyxDQUFDO0FBT25CLE9BQU8sRUFJTCxtQkFBbUIsR0FVcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdE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QUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO3dHQXZoRFUsd0JBQXdCOzRHQUF4Qix3QkFBd0I7OzRGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBmaWx0ZXIgYXMgcnhGaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBzY2FuIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBlbmRPZldlZWssIHN0YXJ0T2ZNb250aCwgc3RhcnRPZlF1YXJ0ZXIsIHN0YXJ0T2ZXZWVrLCBzdGFydE9mWWVhcixcbiAgc3ViRGF5cywgc3ViTW9udGhzLCBzdWJXZWVrcyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSBmcm9tICcuLi9jb25zdHMvcmVwb3J0LXdlZWsuY29uc3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwgZ2V0Wm9uZWROb3csIHJlc29sdmVGb3JtYXRDb250ZXh0LCByZXNvbHZlUmVwb3J0VGltZXpvbmUsXG59IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnREcmlsbFN0ZXAgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1kcmlsbC1zdGVwLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJNYXRjaCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1tYXRjaC50eXBlJztcbmltcG9ydCB7IFJlcG9ydFRlbXBvcmFyeVN0YXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdGVtcG9yYXJ5LXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRUaWxlU3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC10aWxlLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3Q29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdmlldy1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIEZpbHRlckdyb3VwRGVmYXVsdCxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRSZWxhdGl2ZVJhbmdlLFxuICBSZXBvcnRTb3J0LFxuICBSZXBvcnRVcmxQYXJhbXMsXG4gIFJlcG9ydFVybFNuYXBzaG90LFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgbGlzdEhpZGRlbkNvbHVtbnMsIGxpc3RTb3J0VGVybXMgfSBmcm9tICcuLi9saXN0LWNvbmZpZyc7XG5pbXBvcnQgeyBkYXRlQm91bmRTdHJpbmcsIExJU1RfU0VBUkNIX01BWF9MRU5HVEggfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGdyb3VwVmFsdWVTaWduYXR1cmUgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGlzVGlsZSB9IGZyb20gJy4uL3JlcG9ydC10aWxlJztcbmltcG9ydCB7IGRlY29kZUNvbHVtbkxpc3QsIGRlY29kZVNvcnQgfSBmcm9tICcuLi9yZXBvcnQtdXJsLXN0YXRlJztcbmltcG9ydCB7IGlzUmVsYXRpdmVSYW5nZSB9IGZyb20gJy4uL3JlcG9ydC12aWV3LWNvbmZpZyc7XG5pbXBvcnQge1xuICBSRVBPUlRfVklFV19DT05GSUdfVkVSU0lPTiwgY2xlYW5EcmlsbFBhdGgsIGdyb3VwVmFsdWVGcm9tU3RvcmVkLCBpc0NoYXJ0R3JhbnVsYXJpdHksXG4gIHNhbWVEcmlsbFBhdGgsIHRvTGl2ZUdyb3VwVmFsdWUsIHRvU3RvcmVkR3JvdXBWYWx1ZSwgdmlld0RpZmZlcnMsXG59IGZyb20gJy4uL3JlcG9ydC12aWV3LWNvbmZpZyc7XG5pbXBvcnQgeyBmaW5pdGVOdW1iZXIgfSBmcm9tICcuLi9yZXBvcnQtdmlldy1jb25maWcnO1xuaW1wb3J0IHsgc2FtZVN0b3JlZEdyb3VwVmFsdWUgfSBmcm9tICcuLi9yZXBvcnQtdmlldy1jb25maWcnO1xuaW1wb3J0IHsgQ29tcG9uZW50RGF0YVN0YXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IHRpbGVEYXRhU3RhdGUgfSBmcm9tICcuLi90aWxlLWRhdGEtc3RhdGUnO1xuaW1wb3J0IHsgcmVwb3J0Q29tcG9uZW50cyB9IGZyb20gJy4uL3ZhbHVlcyc7XG5cblxuLy8gV2hldGhlciB0d28gc3RvcmVkIGZpbHRlci1ncm91cCBkZWZhdWx0cyBhcmUgdGhlIHNhbWUuIENvbXBhcmVkIG9uIHRoZSBmaWVsZHMgYVxuLy8gZGVmYXVsdCBjYW4gYWN0dWFsbHkgY2FycnksIHNvIGtleSBvcmRlciBpbiB0aGUgcGF5bG9hZCBjYW4ndCByZWFkIGFzIGEgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVEZWZhdWx0KFxuICBhOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuICBiOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGlmICghYSB8fCAhYikge1xuICAgIHJldHVybiAhYSAmJiAhYjtcbiAgfVxuXG4gIHJldHVybiBhLnN0YXJ0ID09PSBiLnN0YXJ0XG4gICAgJiYgYS5lbmQgPT09IGIuZW5kXG4gICAgJiYgYS52YWx1ZSA9PT0gYi52YWx1ZVxuICAgICYmIGEucmVsYXRpdmUgPT09IGIucmVsYXRpdmVcbiAgICAmJiBzYW1lTGlzdChhLnZhbHVlcywgYi52YWx1ZXMpXG4gICAgJiYgc2FtZUxpc3QoYS5leGNsdWRlVmFsdWVzLCBiLmV4Y2x1ZGVWYWx1ZXMpXG4gICAgJiYgYS5taW4gPT09IGIubWluXG4gICAgJiYgYS5tYXggPT09IGIubWF4O1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBsaXN0cyBob2xkIHRoZSBzYW1lIHZhbHVlcyBpbiB0aGUgc2FtZSBvcmRlci5cbmZ1bmN0aW9uIHNhbWVMaXN0KGE6IHVua25vd25bXSB8IHVuZGVmaW5lZCwgYjogdW5rbm93bltdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAoYSA/PyBbXSkubGVuZ3RoID09PSAoYiA/PyBbXSkubGVuZ3RoXG4gICAgJiYgKGEgPz8gW10pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSAoYiA/PyBbXSlbaW5kZXhdKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBzZWxlY3QgcGljayBsaXN0cyBob2xkIHRoZSBzYW1lIHBpY2tzIGluIGFueSBvcmRlciwgYSBudW1iZXJcbi8vIGFuZCBpdHMgdGV4dCBiZWluZyB0aGUgc2FtZSBwaWNrLlxuZnVuY3Rpb24gc2FtZVBpY2tzKGE6IHVua25vd25bXSB8IHVuZGVmaW5lZCwgYjogdW5rbm93bltdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBpY2tzID0gKGxpc3Q6IHVua25vd25bXSB8IHVuZGVmaW5lZCkgPT4gKGxpc3QgPz8gW10pLm1hcChTdHJpbmcpLnNvcnQoKTtcblxuICByZXR1cm4gc2FtZUxpc3QocGlja3MoYSksIHBpY2tzKGIpKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBsaXN0IHNvcnRzIG9yZGVyIHRoZSByb3dzIHRoZSBzYW1lIHdheS4gTm8gZGlyZWN0aW9uIHJlYWRzIGFzXG4vLyBhc2NlbmRpbmcsIHRoZSB3YXkgdGhlIGxpc3QgYXBwbGllcyBpdC5cbmZ1bmN0aW9uIHNhbWVTb3J0KGE6IFJlcG9ydFNvcnQsIGI6IFJlcG9ydFNvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWJcbiAgICAmJiBhLmNvbHVtbiA9PT0gYi5jb2x1bW5cbiAgICAmJiAoYS5kaXJlY3Rpb24gPz8gJ2FzYycpID09PSAoYi5kaXJlY3Rpb24gPz8gJ2FzYycpO1xufVxuXG5cbi8vIFdoZXRoZXIgYSB2YWx1ZSByZWFkIG9mZiBhIGZpbHRlciBiYXIgaXMgdGhlIHZhbHVlIGFscmVhZHkgc3RvcmVkIGZvciBpdHNcbi8vIGdyb3VwOiB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLCB0aGUgc2FtZSBzZWxlY3QgdmFsdWVzIGtlcHQgb3IgbGVmdCBvdXQgaW5cbi8vIHRoZSBzYW1lIG9yZGVyLCB0aGUgc2FtZSB0cmltbWVkIHRleHQgYW5kIHRoZSBzYW1lIG51bWJlciByYW5nZSBlbmRzLiBBXG4vLyBiYXIgcmUtcmVhZHMgZXZlcnkgZ3JvdXAgaXQgc2hvd3Mgb24gYW55IGNoYW5nZSwgc28gdGhpcyBpcyB3aGF0IHRlbGxzIHRoZVxuLy8gZ3JvdXAgdGhhdCBjaGFuZ2VkIGZyb20gdGhlIG9uZXMgdGhhdCBkaWQgbm90LlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVGaWx0ZXJWYWx1ZShcbiAgYTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGI6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBncm91cFZhbHVlU2lnbmF0dXJlKGEpID09PSBncm91cFZhbHVlU2lnbmF0dXJlKGIpO1xufVxuXG5cbi8vIFRoZSBncm91cHMgYSBiYXIgcmUtcmVhZCB0aGF0IGl0IG5vdyBzaG93cyB3aXRoIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGUgb25lXG4vLyBpdCBsYXN0IHJlcG9ydGVkLCByZWNvcmRpbmcgZWFjaCBuZXcgdmFsdWUgaW4gYGxhc3RSZXBvcnRlZGAuIEEgYmFyIGlzXG4vLyBjb21wYXJlZCB3aXRoIGl0c2VsZiwgbmV2ZXIgd2l0aCB0aGUgc3RvcmVkIHZhbHVlOiBhIGdyb3VwIHNob3duIGluIHR3byBiYXJzXG4vLyAobGV2ZWwgJ2JvdGgnKSBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgb3RoZXIgb25lLCBhbmQgdGhpcyBiYXIgaXMgbm90XG4vLyByZXBhaW50ZWQsIHNvIGl0cyBzdGFsZSB2YWx1ZSBtdXN0IG5vdCBiZSBzZXQgYmFjayB3aGVuIHRoZSB2aWV3ZXIgY2hhbmdlc1xuLy8gYW5vdGhlciBvZiBpdHMgaXRlbXMgKHRoZSBsaXN0IHNlYXJjaCBib3gsIHNheSkuXG5leHBvcnQgZnVuY3Rpb24gbW92ZWRHcm91cFZhbHVlcyhcbiAgbGFzdFJlcG9ydGVkOiBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4sXG4gIHJlcG9ydGVkOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSxcbik6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdIHtcbiAgcmV0dXJuIHJlcG9ydGVkLmZpbHRlcigoeyBncm91cElkLCB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKHNhbWVGaWx0ZXJWYWx1ZShsYXN0UmVwb3J0ZWQuZ2V0KGdyb3VwSWQpLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsYXN0UmVwb3J0ZWQuc2V0KGdyb3VwSWQsIHZhbHVlKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuXG4vLyBBIGxpc3QncyBzZWFyY2ggdGV4dCBhcyB0aGUgc2VydmVyIGFwcGxpZXMgaXQ6IHRyaW1tZWQsIHRoZW4gY3V0IHRvXG4vLyBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIIGNoYXJhY3RlcnMgKGNvZGUgcG9pbnRzLCBhcyB0aGUgc2VydmVyIGNvdW50cyB0aGVtKS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0U2VhcmNoVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gWy4uLnRleHQudHJpbSgpXS5zbGljZSgwLCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIKS5qb2luKCcnKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBsaXN0cyBvZiBjb2x1bW4gbmFtZXMgYXJlIHRoZSBzYW1lIG5hbWVzIGluIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gc2FtZU5hbWVzKGE6IHJlYWRvbmx5IHN0cmluZ1tdLCBiOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKG5hbWUsIGluZGV4KSA9PiBuYW1lID09PSBiW2luZGV4XSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gaGlkZGVuLWNvbHVtbiBtYXBzIGhpZGUgdGhlIHNhbWUgY29sdW1ucyBvbiB0aGUgc2FtZSBsaXN0cy5cbmZ1bmN0aW9uIHNhbWVIaWRkZW4oXG4gIGE6IFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+LFxuICBiOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5zaXplID09PSBiLnNpemVcbiAgICAmJiBbLi4uYV0uZXZlcnkoKFtjb21wb25lbnRJZCwgbmFtZXNdKSA9PiBzYW1lTmFtZXMobmFtZXMsIGIuZ2V0KGNvbXBvbmVudElkKSA/PyBbXSkpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGRhdGUtcmFuZ2UgdmFsdWVzIGNvdmVyIHRoZSBzYW1lIGNhbGVuZGFyIGRheXMuXG5mdW5jdGlvbiBzYW1lRGF5cyhhOiBGaWx0ZXJHcm91cFZhbHVlLCBiOiBGaWx0ZXJHcm91cFZhbHVlKTogYm9vbGVhbiB7XG4gIHJldHVybiBkYXRlQm91bmRTdHJpbmcoYS5zdGFydCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLnN0YXJ0KVxuICAgICYmIGRhdGVCb3VuZFN0cmluZyhhLmVuZCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLmVuZCk7XG59XG5cblxuLy8gQSBzdGFibGUgc2lnbmF0dXJlIGZvciBhIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQuIFRoZSByZXBvcnQgdG9vbGJhciBrZXlzIGl0c1xuLy8gZnMtZmlsdGVyIG9uIHRoaXMsIGJlY2F1c2UgZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0IOKAlCB3aXRob3V0IGFcbi8vIGtleSBjaGFuZ2UgaXQga2VlcHMgcmVuZGVyaW5nIHRoZSB2YWx1ZXMgaXQgd2FzIGNyZWF0ZWQgd2l0aCBldmVuIGFmdGVyIHRoZVxuLy8gY29uZmlnIGJlaGluZCBpdCBoYXMgYmVlbiByZWJ1aWx0LlxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRTaWduYXR1cmUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogc3RyaW5nIHtcbiAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuXG4gIGlmICghZ3JvdXBEZWZhdWx0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBncm91cERlZmF1bHQuc3RhcnQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LmVuZCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQudmFsdWUgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnJlbGF0aXZlID8/ICcnLFxuICAgIChncm91cERlZmF1bHQudmFsdWVzID8/IFtdKS5qb2luKCcsJyksXG4gICAgKGdyb3VwRGVmYXVsdC5leGNsdWRlVmFsdWVzID8/IFtdKS5qb2luKCcsJyksXG4gICAgZ3JvdXBEZWZhdWx0Lm1pbiA/PyAnJyxcbiAgICBncm91cERlZmF1bHQubWF4ID8/ICcnLFxuICBdLmpvaW4oJ34nKTtcbn1cblxuXG4vLyBUaGUgdGVtcG9yYXJ5IGxheWVyIHdpdGggbm90aGluZyBwaWNrZWQuXG5mdW5jdGlvbiBlbXB0eVRlbXBvcmFyeVN0YXRlKCk6IFJlcG9ydFRlbXBvcmFyeVN0YXRlIHtcbiAgcmV0dXJuIHsgY3Jvc3NGaWx0ZXJzOiBbXSwgZGV0YWlsOiBudWxsIH07XG59XG5cblxuLy8gVmlld2VyIGZpbHRlciBzdGF0ZSBmb3IgdGhlIG9wZW4gcmVwb3J0LiBGaWx0ZXIgVkFMVUVTIGFyZSBuZXZlciBzYXZlZCB0b1xuLy8gdGhlIHJlcG9ydCDigJQgdGhpcyBzZXJ2aWNlIGhvbGRzIHRoZW0gcGVyIGZpbHRlciBHUk9VUCAodGhlIHByb3BhZ2F0aW9uIHVuaXQpLFxuLy8gcmVzb2x2ZXMgdGhlbSBpbnRvIHBlci1jb21wb25lbnQgbWVtYmVyLWZpbHRlciB2YWx1ZXMgZm9yIGVhY2ggZGF0YSByZXF1ZXN0LFxuLy8gYW5kIG5vdGlmaWVzIHRoZSBjb21wb25lbnRzIHdob3NlIGdyb3VwcyBjaGFuZ2VkIHNvIG9ubHkgdGhleSByZWZldGNoLlxuLy9cbi8vIEl0IGlzIGFsc28gdGhlIG9uZSBzb3VyY2Ugb2YgdGhlIHZpZXdlciBzdGF0ZSB0aGUgcmVwb3J0IFVSTCBjYXJyaWVzIChncm91cFxuLy8gdmFsdWVzLCB0aGUgZ3JvdXAtYnkgZ3JhaW4sIGxpc3Qgc29ydHMsIHNlYXJjaGVzIGFuZCBoaWRkZW4gY29sdW1ucyk6XG4vLyB1cmxTbmFwc2hvdCgpIHNheXMgd2hhdCBkaWZmZXJzIGZyb20gdGhlIGF1dGhvcmVkIGRlZmF1bHRzLCBpbml0KCkgcmVzdG9yZXNcbi8vIGl0LCBhbmQgdXJsQ2hhbmdlcygpIHRlbGxzIHRoZSBob3N0J3Mgc2luZ2xlIFVSTCB3cml0ZXIgd2hlbiB0byB3cml0ZS5cbi8vXG4vLyBUaGUgc2FtZSBkdXJhYmxlIHN0YXRlLCB3aXRoIHRoZSBwYWdlLCB0aGUgbWF0Y2ggYW5kIGVhY2ggY2hhcnQncyBkcmlsbFxuLy8gcGF0aCwgaXMgb25lIHZpZXcgZG9jdW1lbnQ6IHNuYXBzaG90KCkgd3JpdGVzIGl0LCBhcHBseSgpIG9wZW5zIGEgdmlldyAoYW5kXG4vLyBhIGxpbmsncyBjaGFuZ2VzIG9uIHRvcCksIGFuZCBiYXNlIGFuZCB2aWV3Q2hhbmdlZCBzYXkgd2hldGhlciB0aGUgc2NyZWVuXG4vLyBzdGlsbCBzaG93cyB0aGF0IHZpZXcuIFRoZSB0ZW1wb3JhcnkgbGF5ZXIgKGEgY3Jvc3MtZmlsdGVyLCBhbiBvcGVuIHJvd3Ncbi8vIHBhbmVsKSBpcyBpdHMgb3duIHNlY3Rpb24sIHNvIG5vIHZpZXcgb3IgbGluayBldmVyIGNhcnJpZXMgaXQuXG4vL1xuLy8gU2Vzc2lvbi1vbmx5LCBuZXZlciBpbiB0aGUgVVJMOiBwZXItZmlsdGVyIGVuYWJsZS9kaXNhYmxlIHRvZ2dsZXMgZnJvbSBhXG4vLyBjb21wb25lbnQncyBmaWx0ZXIgbWVudSAodGhlIGBlbmFibGVkYCBjb2x1bW4gaXMgdGhlIGF1dGhvcmVkIGRlZmF1bHQ7IGFcbi8vIHZpZXdlcidzIHRvZ2dsZSBzaG91bGRuJ3Qgd3JpdGUgdG8gdGhlIHJlcG9ydCkuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIHtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBlZmZlY3RpdmUgem9uZSAocmVzb2x2ZVJlcG9ydFRpbWV6b25lKS4gUmVsYXRpdmUgcHJlc2V0c1xuICAvLyByZXNvbHZlIGFnYWluc3QgdG9kYXkgaW4gaXQsIGFuZCBkYXRlIGNlbGxzIHJlbmRlciBpbiBpdC5cbiAgcHVibGljIHJlYWRvbmx5IHRpbWV6b25lID0gc2lnbmFsPHN0cmluZz4oJ1VUQycpO1xuXG4gIC8vIEhvdyB0aGUgb3BlbiByZXBvcnQgd3JpdGVzIGl0cyBudW1iZXJzIGFuZCBkYXRlcyAocmVzb2x2ZUZvcm1hdENvbnRleHQpOlxuICAvLyBpdHMgbG9jYWxlLCBpdHMgY3VycmVuY3kgYW5kIHdoZXRoZXIgcGVyY2VudHMgYXJyaXZlIGFzIHJhdGlvcy4gRXZlcnkgS1BJLFxuICAvLyBjaGFydCwgZGF0ZSBjZWxsIGFuZCBleHBvcnQgcmVhZHMgaXQgaGVyZS4gQ29tcGFyZWQgYnkgdmFsdWUsIHNvIGEgcmVsb2FkXG4gIC8vIG9mIGFuIHVuY2hhbmdlZCByZXBvcnQgcmUtcmVuZGVycyBub3RoaW5nLlxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWF0Q29udGV4dCA9IHNpZ25hbDxSZXBvcnRGb3JtYXRDb250ZXh0PihERUZBVUxUX0ZPUk1BVF9DT05URVhULCB7XG4gICAgZXF1YWw6IChhLCBiKSA9PiBhLmxvY2FsZSA9PT0gYi5sb2NhbGVcbiAgICAgICYmIGEuY3VycmVuY3kgPT09IGIuY3VycmVuY3lcbiAgICAgICYmIGEucmF0aW9QZXJjZW50ID09PSBiLnJhdGlvUGVyY2VudCxcbiAgfSk7XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBlYWNoIHBsYWluIGxpc3QgKGxpc3RIaWRkZW5Db2x1bW5zKSxcbiAgLy8gYnkgY29tcG9uZW50IGlkOyBhIGxpc3Qgc2hvd2luZyBldmVyeSBjb2x1bW4gaGFzIG5vIGVudHJ5LiBBIHNpZ25hbCwgc28gYVxuICAvLyBsaXN0IGhpZGVzIGFuZCBzaG93cyBpdHMgY29sdW1ucyBpbiBwbGFjZTogdGhlIHJvd3MgZG8gbm90IGNoYW5nZSwgc29cbiAgLy8gbm90aGluZyByZWZldGNoZXMuIENvbXBhcmVkIGJ5IHZhbHVlLCBzbyBhIHJlbG9hZCB0aGF0IGtlZXBzIGV2ZXJ5IGNvbHVtblxuICAvLyByZXBhaW50cyBub3RoaW5nLlxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdEhpZGRlbiA9IHNpZ25hbDxSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPj4obmV3IE1hcCgpLCB7XG4gICAgZXF1YWw6IHNhbWVIaWRkZW4sXG4gIH0pO1xuXG4gIC8vIE1vdmVzIGVhY2ggdGltZSBhcHBseSgpIG9yIHJlc2V0VG9CYXNlKCkgcmVwbGFjZXMgdGhlIHdob2xlIGR1cmFibGVcbiAgLy8gc3RhdGUuIEJhcnMgYW5kIHRpbGVzIGtleSBvbiBpdCwgc28gYW4gYXBwbGllZCB2aWV3IHJlcGFpbnRzIGFsbCBvZiB0aGVtLlxuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVWZXJzaW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fc3RhdGVWZXJzaW9uKCkpO1xuXG4gIC8vIE1vdmVzIGVhY2ggdGltZSBhcHBseSgpIG9wZW5zIGEgdmlldyAob3IgdGhlIHJlcG9ydCdzIGRlZmF1bHRzKS4gVGhlXG4gIC8vIGNhbnZhcyBrZXlzIGl0cyB0aWxlcyBvbiBpdCwgc28gYW4gb3BlbmVkIHZpZXcgZHJhd3MgZWFjaCBvbmUgYWdhaW4uXG4gIC8vIHJlc2V0VG9CYXNlKCkgbGVhdmVzIGl0OiBhIHJlc2V0IHJlZmV0Y2hlcyB0aGUgdGlsZXMgaW4gcGxhY2UsIHNvIHRoZWlyXG4gIC8vIGRhdGEgc3RheXMgb24gc2NyZWVuIHdoaWxlIHRoZXkgcmVsb2FkLlxuICBwdWJsaWMgcmVhZG9ubHkgYXBwbGllZFZlcnNpb24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9hcHBsaWVkVmVyc2lvbigpKTtcblxuICAvLyBCeSBsaXN0IGNvbXBvbmVudCBpZCwgaG93IG1hbnkgcmVzZXRzIG1vdmVkIHRoYXQgbGlzdCdzIHNvcnQuIEZzTGlzdFxuICAvLyByZWFkcyBpdHMgc29ydCBvbmx5IHdoZW4gaXQgaXMgY3JlYXRlZCwgc28gYSBsaXN0IHdob3NlIHNvcnQgYSByZXNldFxuICAvLyBtb3ZlZCBpcyBkcmF3biBhZ2FpbiAoa2V5ZWQgb24gaXRzIGNvdW50KTsgZXZlcnkgb3RoZXIgdGlsZSByZWxvYWRzIGluXG4gIC8vIHBsYWNlLlxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdFNvcnRSZXNldHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9saXN0U29ydFJlc2V0cygpKTtcblxuICAvLyBUaGUgb3BlbiBwYWdlLCBvciBudWxsIGJlZm9yZSB0aGUgaG9zdCByZXBvcnRzIG9uZSAoc2V0UGFnZSkuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcGFnZUlkKCkpO1xuXG4gIC8vIEhvdyB0aGUgZ3JvdXBzIGNvbWJpbmU6ICdhbGwnIGtlZXBzIHRoZSByb3dzIGV2ZXJ5IGdyb3VwIGtlZXBzLCAnYW55J1xuICAvLyB0aGUgcm93cyBhdCBsZWFzdCBvbmUgZWxpZ2libGUgZ3JvdXAga2VlcHMgKHNldE1hdGNoKS5cbiAgcHVibGljIHJlYWRvbmx5IG1hdGNoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fbWF0Y2goKSk7XG5cbiAgLy8gVGhlIHZpZXdlciBmZWF0dXJlcyB0aGUgb3BlbiByZXBvcnQncyBzZXJ2ZXIgc2VydmVzIChSZXBvcnQudmlld2VyRmVhdHVyZXMpOlxuICAvLyBhIGZpbHRlciBiYXIgb2ZmZXJzIGEgY29udHJvbCBvbmx5IHdoZW4gaXRzIGZlYXR1cmUgaXMgbGlzdGVkLiBFbXB0eVxuICAvLyBiZWZvcmUgYSByZXBvcnQgaXMgb3BlbiBhbmQgZnJvbSBhbiBvbGRlciBzZXJ2ZXIuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3ZXJGZWF0dXJlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3JlcG9ydCgpPy52aWV3ZXJGZWF0dXJlcyA/PyBbXSk7XG5cbiAgLy8gVGhlIHJlcG9ydCBpbml0KCkgbGFzdCByZWFkLCBvciBudWxsIGJlZm9yZSBvbmUgaXMgb3Blbi4gQSB0aWxlIGhlYWRlclxuICAvLyBsaXN0cyBpdHMgc2VsZWN0IG9wdGlvbnMgZnJvbSBpdCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcmVwb3J0KCkpO1xuXG4gIC8vIFRoZSBzdGF0ZSB0aGUgc2NyZWVuIGlzIGNvbXBhcmVkIHdpdGg6IHRoZSBiYXNlIGFwcGx5KCkgd2FzIGdpdmVuICh0aGVcbiAgLy8gb3BlbiB2aWV3IGFzIGl0IGFwcGxpZWQpLCBvciB0aGUgcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHNcbiAgLy8gKGF1dGhvcmVkQ29uZmlnKCkpIHdoZW4gbm8gdmlldyBpcyBvcGVuLiBJdCBob2xkcyBvbmx5IHRoZSBncm91cHMgdGhlXG4gIC8vIHZpZXcgaGVsZDsgZXZlcnkgb3RoZXIgZ3JvdXAgZm9sbG93cyBpdHMgYXV0aG9yZWQgZGVmYXVsdC5cbiAgcHVibGljIHJlYWRvbmx5IGJhc2UgPSBjb21wdXRlZDxSZXBvcnRWaWV3Q29uZmlnPigoKSA9PiB7XG4gICAgdGhpcy5fcmV2aXNpb24oKTtcblxuICAgIHJldHVybiB0aGlzLl9iYXNlQ29uZmlnKCkgPz8gdGhpcy5hdXRob3JlZENvbmZpZygpO1xuICB9KTtcblxuICAvLyBXaGV0aGVyIHRoZSBzY3JlZW4gZGlmZmVycyBmcm9tIGJhc2UgKHZpZXdEaWZmZXJzKTogd2hhdCBhIHZpZXcgcGlja2VyXG4gIC8vIG1hcmtzICcoZWRpdGVkKScuIEEgc3dpdGNoIG9mIHBhZ2UgZG9lcyBub3QgY291bnQsIGFuZCB0aGUgdGVtcG9yYXJ5XG4gIC8vIHN0YXRlIG5ldmVyIGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3Q2hhbmdlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICB0aGlzLl9yZXZpc2lvbigpO1xuXG4gICAgcmV0dXJuIHZpZXdEaWZmZXJzKHRoaXMuYmFzZSgpLCB0aGlzLnNuYXBzaG90KCksIHRoaXMuYXV0aG9yZWRDb25maWcoKSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgX3ZhbHVlcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlPigpO1xuICBwcml2YXRlIF9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG4gIHByaXZhdGUgX3Nlc3Npb25EaXNhYmxlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIEdyb3VwcyB0aGF0IGhhdmUgYSBkZWZhdWx0IHRoZSB2aWV3ZXIgY2xlYXJlZC4gV2l0aG91dCB0aGlzIGEgcmVsb2FkIG9mIHRoZVxuICAvLyByZXBvcnQgKGEgY2hhdCBlZGl0LCBhIGRpYWxvZykgd291bGQgZmluZCBubyB2YWx1ZSBmb3IgdGhlIGdyb3VwIGFuZCBzZWVkXG4gIC8vIGl0cyBkZWZhdWx0IHN0cmFpZ2h0IGJhY2suIEEgY2hhbmdlIHRvIHRoZSBzdG9yZWQgZGVmYXVsdCByZWxlYXNlcyBpdC5cbiAgcHJpdmF0ZSBfY2xlYXJlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sOiBhIHNpbmdsZSByZXBvcnQtd2lkZSBidWNrZXQgb3ZlcnJpZGUgZm9yIGFsbFxuICAvLyB0aW1lLXNlcmllcyBjaGFydHMuIFVuc2V0ID0gZWFjaCBjaGFydCB1c2VzIGl0cyBhdXRob3JlZCBncmFudWxhcml0eS4gTmV2ZXJcbiAgLy8gc2F2ZWQgdG8gdGhlIHJlcG9ydCAodGhlIFVSTCBjYXJyaWVzIGl0KSwgYW5kIGNhcnJpZWQgaW4gdGhlIGRhdGEgcmVxdWVzdCdzXG4gIC8vIGBzdGF0ZWAsIHNvIGl0IHByb3BhZ2F0ZXMgdGhyb3VnaCB0byB0aGUgUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0b28uIE5hbWVkXG4gIC8vIGZvciB0aGUgYGZyZXF1ZW5jeWAgd2lyZSBrZXkgaXQgdHJhdmVscyB1bmRlciwgbm90IGZvciB0aGUgY29udHJvbCdzIGxhYmVsLlxuICBwcml2YXRlIF9mcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZnJlcXVlbmN5Q2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHZpZXdlci1jaG9zZW4gc29ydCwgYnkgY29tcG9uZW50IGlkLiBIZWxkIGhlcmUgcmF0aGVyIHRoYW4gb25seVxuICAvLyBpbiB0aGUgbGlzdCdzIEZzTGlzdCBzbyBpdCBzdXJ2aXZlcyB0aGUgbGlzdCBiZWluZyByZWNyZWF0ZWQgKGEgcGFnZSBzd2l0Y2gsXG4gIC8vIGEgcmVsb2FkIGFmdGVyIGFuIGVkaXQpIGFuZCBzbyBldmVyeSBjb25zdW1lciBvZiB2aWV3ZXIgc3RhdGUgcmVhZHMgb25lIHBsYWNlLlxuICBwcml2YXRlIF9saXN0U29ydHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0U29ydD4oKTtcblxuICAvLyBFYWNoIGxpc3QncyBzZWFyY2ggYm94IHRleHQgKGxpc3RTZWFyY2hUZXh0KSwgYnkgY29tcG9uZW50IGlkLiBBIGxpc3Qgd2l0aFxuICAvLyBhbiBlbXB0eSBib3ggaGFzIG5vIGVudHJ5LiBIZWxkIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbnMgYXMgdGhlIHNvcnRzLCBhbmRcbiAgLy8gYmVjYXVzZSB0aGUgYm94IGxpdmVzIGluIHRoZSBjb21wb25lbnQgaGVhZGVyLCBub3QgaW4gdGhlIGxpc3QuXG4gIHByaXZhdGUgX2xpc3RTZWFyY2hlcyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgbGlzdHMsIGJ5IGNvbXBvbmVudCBpZCwgc28gYSBmaWx0ZXIgdG9nZ2xlIGNhbiB0ZWxsXG4gIC8vIHdoaWNoIG9mIHRoZW0gbG9zZSB0aGVpciBzZWFyY2ggYm94IChsaXN0U2VhcmNoYWJsZSkuXG4gIHByaXZhdGUgX2xpc3RzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydENvbXBvbmVudD4oKTtcblxuICAvLyBXaGV0aGVyIHRoZSBzZXJ2ZXIgYW5zd2VycyBhIGxpc3Qgc2VhcmNoLiBMaXN0IHNlYXJjaCBhbmQgZWZmZWN0aXZlTG9jYWxlXG4gIC8vIHNoaXAgaW4gdGhlIHNhbWUgZnJhbWV3b3JrIGNoYW5nZSBzZXQsIHNvIGEgc2VydmVyIHRoYXQgc2VuZHMgbm9cbiAgLy8gZWZmZWN0aXZlTG9jYWxlIGhhcyBuZWl0aGVyLCBhbmQgaXRzIGxpc3RzIHNob3cgbm8gc2VhcmNoIGJveC5cbiAgcHJpdmF0ZSBfc2VydmVyU2VhcmNoZXMgPSBmYWxzZTtcblxuICAvLyBFbWl0cyB0aGUgaWQgb2YgdGhlIGxpc3Qgd2hvc2Ugc2VhcmNoIHRleHQgY2hhbmdlZC5cbiAgcHJpdmF0ZSBfbGlzdFNlYXJjaENoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8vIEVtaXRzIHRoZSBncm91cCBpZCB0aGF0IGNoYW5nZWQ7IGNvbXBvbmVudHMgbGlzdGVuIGZpbHRlcmVkIHRvIHRoZWlyIG93blxuICAvLyBncm91cCBpZHMuIG51bGwgPSBldmVyeXRoaW5nIGNoYW5nZWQgKHJlLWluaXQpLlxuICBwcml2YXRlIF9jaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlciB8IG51bGw+KCk7XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgYW55dGhpbmcgdGhlIFVSTCBjYXJyaWVzIG1heSBoYXZlIGNoYW5nZWQuXG4gIHByaXZhdGUgX3VybENoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBDb3VudHMgdGhlIGNoYW5nZXMgdXJsQ2hhbmdlcygpIHJlcG9ydHMuIFRoZSBncm91cCB2YWx1ZXMsIHRoZSBncmFpbiBhbmRcbiAgLy8gdGhlIGxpc3Qgc3RhdGUgdGhhdCBiYXNlIGFuZCB2aWV3Q2hhbmdlZCBjb21wYXJlIGFyZSB0aGUgcGxhaW4gZmllbGRzXG4gIC8vIGFib3ZlLCB3aGljaCBldmVyeSBzZXR0ZXIgcmVwb3J0cyB0aHJvdWdoIHVybENoYW5nZXMoKSAodGhleSBhcmUgc2hhcmVkXG4gIC8vIHdpdGggdGhlIGlubGluZSB2YWx1ZXMgYnVpbGQsIHNvIHRoZXkgc3RheSBhcyB0aGV5IGFyZSk7IHRoaXMgY291bnRlciBpc1xuICAvLyBob3cgdGhlIHR3byBjb21wdXRlZHMgaGVhciBvZiB0aGVtLiBUaGUgdmlldyBzdGF0ZSBiZWxvdyBpcyBzaWduYWxzIGFuZFxuICAvLyBpcyByZWFkIGRpcmVjdGx5LiBUaGUgc3ViamVjdCBpcyB0aGlzIHNlcnZpY2UncyBvd24gYW5kIGlzIG5ldmVyXG4gIC8vIGNvbXBsZXRlZCwgc28gdGhlIHNpZ25hbCBsaXN0ZW5zIHRvIGl0IGV4YWN0bHkgYXMgbG9uZyBhcyB0aGUgc2VydmljZVxuICAvLyBsaXZlcy5cbiAgcHJpdmF0ZSBfcmV2aXNpb24gPSB0b1NpZ25hbCh0aGlzLl91cmxDaGFuZ2VkJC5waXBlKHNjYW4oKGNvdW50KSA9PiBjb3VudCArIDEsIDApKSwge1xuICAgIGluaXRpYWxWYWx1ZTogMCxcbiAgICBtYW51YWxDbGVhbnVwOiB0cnVlLFxuICB9KTtcblxuICBwcml2YXRlIF9zdGF0ZVZlcnNpb24gPSBzaWduYWwoMCk7XG5cbiAgcHJpdmF0ZSBfYXBwbGllZFZlcnNpb24gPSBzaWduYWwoMCk7XG5cbiAgcHJpdmF0ZSBfbGlzdFNvcnRSZXNldHMgPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCBudW1iZXI+PihuZXcgTWFwKCkpO1xuXG4gIC8vIFRoZSByZXBvcnQgaW5pdCgpIGxhc3QgcmVhZDogdGhlIHRpbGVzIGFuZCBwYWdlcyBhIHZpZXcncyBzdGF0ZSBpc1xuICAvLyBjaGVja2VkIGFnYWluc3QuXG4gIHByaXZhdGUgX3JlcG9ydCA9IHNpZ25hbDxSZXBvcnQgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgb3BlbiBwYWdlLCBzZXQgYnkgdGhlIGhvc3QgYXMgdGhlIHZpZXdlciBtb3ZlcyBiZXR3ZWVuIHBhZ2VzLiBBIHZpZXdcbiAgLy8gc3RvcmVzIGl0LCBidXQgbW92aW5nIHRvIGFub3RoZXIgcGFnZSBuZXZlciBlZGl0cyBhIHZpZXcuXG4gIHByaXZhdGUgX3BhZ2VJZCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBIb3cgdGhlIGdyb3VwcyBjb21iaW5lOiAnYWxsJyAodGhlIGRlZmF1bHQpIG9yICdhbnknLlxuICBwcml2YXRlIF9tYXRjaCA9IHNpZ25hbDxSZXBvcnRGaWx0ZXJNYXRjaD4oJ2FsbCcpO1xuXG4gIC8vIEVhY2ggY2hhcnQncyBkcmlsbCBwYXRoLCB0b3AgZmlyc3QsIGJ5IGNvbXBvbmVudCBpZC4gQSBjaGFydCBhdCBpdHMgdG9wXG4gIC8vIGhhcyBubyBlbnRyeSwgYW5kIG9ubHkgYSBjaGFydCBoYXMgb25lLlxuICBwcml2YXRlIF9kcmlsbHMgPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXT4+KG5ldyBNYXAoKSk7XG5cbiAgLy8gRW1pdHMgdGhlIGlkIG9mIHRoZSBjaGFydCB3aG9zZSBkcmlsbCBwYXRoIGNoYW5nZWQuXG4gIHByaXZhdGUgX2RyaWxsQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgLy8gVGhlIGJhc2UgYXMgYXBwbHkoKSBhcHBsaWVkIGl0LCBvciBudWxsIHdoZW4gdGhlIGJhc2UgaXMgdGhlIGF1dGhvcmVkXG4gIC8vIGRlZmF1bHRzIChzZWUgYmFzZSkuXG4gIHByaXZhdGUgX2Jhc2VDb25maWcgPSBzaWduYWw8UmVwb3J0Vmlld0NvbmZpZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSB0ZW1wb3JhcnkgbGF5ZXI6IGtlcHQgYXBhcnQgZnJvbSBldmVyeXRoaW5nIGFib3ZlLCBzbyBzbmFwc2hvdCgpLFxuICAvLyB1cmxTbmFwc2hvdCgpIGFuZCB2aWV3Q2hhbmdlZCBuZXZlciByZWFkIGl0LlxuICBwcml2YXRlIF90ZW1wb3JhcnkgPSBzaWduYWw8UmVwb3J0VGVtcG9yYXJ5U3RhdGU+KGVtcHR5VGVtcG9yYXJ5U3RhdGUoKSk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycyksIGFuZCBzbyBkb2VzIGEgZ3JvdXAgdGhlIHZpZXdlclxuICAvLyBjbGVhcmVkIOKAlCBVTkxFU1MgdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQgaXRzZWxmIGNoYW5nZWQsIHdoaWNoIG9ubHlcbiAgLy8gaGFwcGVucyB3aGVuIGFuIG9wZXJhdG9yIHNhdmVkIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0IHNldHRpbmdzIG9yIHRoZVxuICAvLyBhZ2VudCBzZXQgb25lLiBUaGF0IGlzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJlLXNlZWQsIHNvIGl0IHdpbnMgb3ZlclxuICAvLyB0aGUgc3Vydml2aW5nIHNlc3Npb24gdmFsdWU7IHdpdGhvdXQgaXQgdGhlIGJhciBrZWVwcyBzaG93aW5nIHdoYXRldmVyIGl0XG4gIC8vIHdhcyBmaXJzdCBzZWVkZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gIC8vXG4gIC8vIEEgY2hhbmdlIG9mIHRoZSByZXBvcnQncyB6b25lIG1vdmVzIFwidG9kYXlcIiwgc28gYSB2YWx1ZSBzdGlsbCBjYXJyeWluZyBpdHNcbiAgLy8gZ3JvdXAgZGVmYXVsdCdzIHByZXNldCBuYW1lIGlzIHJlc29sdmVkIGFnYWluIGluIHRoZSBuZXcgem9uZS4gQSB2YWx1ZSB0aGVcbiAgLy8gdmlld2VyIHBpY2tlZCwgb3Igb25lIGNhcnJ5aW5nIGFub3RoZXIgcHJlc2V0IG5hbWUsIGlzIGtlcHQgYXMgaXQgaXMuXG4gIC8vXG4gIC8vIGByZXN0b3JlYCBpcyB0aGUgdmlld2VyIHN0YXRlIHJlYWQgZnJvbSB0aGUgVVJMLiBUaGUgaG9zdCBwYXNzZXMgaXQgb25seSBvblxuICAvLyB0aGUgZmlyc3QgbG9hZCBvZiBhIHJlcG9ydDsgYSByZWxvYWQgYWZ0ZXIgYSBjaGF0IG9yIGRpYWxvZyBlZGl0IHBhc3Nlc1xuICAvLyBudWxsLCBzbyB0aGUgaW4tbWVtb3J5IHN0YXRlIHdpbnMuIFBhcmFtcyB0aGF0IG5hbWUgYSBncm91cCwgbGlzdCBvciBjb2x1bW5cbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciB0aGF0IGRvIG5vdCBkZWNvZGUsIGFyZSBpZ25vcmVkLlxuICBwdWJsaWMgaW5pdChyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1RpbWV6b25lID0gdGhpcy50aW1lem9uZSgpO1xuXG4gICAgLy8gU2V0IGZpcnN0OiB0aGUgZGVmYXVsdHMgc2VlZGVkIGJlbG93IHJlc29sdmUgdGhlaXIgcmVsYXRpdmUgcHJlc2V0cyBpbiBpdC5cbiAgICB0aGlzLnRpbWV6b25lLnNldChyZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSk7XG4gICAgdGhpcy5mb3JtYXRDb250ZXh0LnNldChyZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQpKTtcbiAgICAvLyBCZWZvcmUgYW55IHNlYXJjaCByZXN0b3JlOiBsaXN0U2VhcmNoYWJsZSByZWFkcyBpdC5cbiAgICB0aGlzLl9zZXJ2ZXJTZWFyY2hlcyA9IHJlcG9ydC5lZmZlY3RpdmVMb2NhbGUgIT09IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHRpbWV6b25lQ2hhbmdlZCA9IHByZXZpb3VzVGltZXpvbmUgIT09IHRoaXMudGltZXpvbmUoKTtcbiAgICBjb25zdCBwcmV2aW91c0dyb3VwcyA9IHRoaXMuX2dyb3VwcztcbiAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIHRoaXMuX2dyb3Vwcy5zZXQoZ3JvdXAuaWQsIGdyb3VwKTtcbiAgICAgIHRoaXMuX3NlZWQoZ3JvdXAsIHByZXZpb3VzR3JvdXBzLmdldChncm91cC5pZCkgPz8gbnVsbCwgdGltZXpvbmVDaGFuZ2VkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgaWYgKHJlc3RvcmUpIHtcbiAgICAgIHRoaXMuX3Jlc3RvcmUocmVwb3J0LCByZXN0b3JlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcnVuZShyZXBvcnQpO1xuICAgIHRoaXMuX3BydW5lVmlld1N0YXRlKHJlcG9ydCwgcHJldmlvdXNHcm91cHMpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUoZ3JvdXBJZDogbnVtYmVyKTogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCk7XG4gIH1cblxuICAvLyBBIGJhcidzIHZhbHVlIGZvciBhIGdyb3VwLiBBIGRhdGUgcmFuZ2Uga2VlcHMgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSBvbmx5XG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSBzdGlsbCB0aGUgc3RvcmVkIGRheXM6IHRoZSBiYXJzIHJlLXNldCBldmVyeSBncm91cCB0aGV5XG4gIC8vIHNob3cgd2hlbmV2ZXIgYW55IG9uZSBvZiB0aGVtIGNoYW5nZXMsIGFuZCBhbiB1bnRvdWNoZWQgcm9sbGluZyByYW5nZSBtdXN0XG4gIC8vIGtlZXAgaXRzIG5hbWUgcmF0aGVyIHRoYW4gdHVybiBpbnRvIHR3byBmaXhlZCBkYXRlcy4gQW55IG90aGVyIHJhbmdlLCBhXG4gIC8vIGRhdGUgcGlja2VyIHByZXNldCBpbmNsdWRlZCwgaXMgc3RvcmVkIGFzIHRoZSBmaXhlZCBkYXRlcyBpdCBzaG93cy5cbiAgcHVibGljIHNldFZhbHVlKGdyb3VwSWQ6IG51bWJlciwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICBpZiAodGhpcy5fZ3JvdXBzLmdldChncm91cElkKT8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuYWRkKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwSWQsIHRoaXMuX3dpdGhQcmVzZXQodGhpcy5fdmFsdWVzLmdldChncm91cElkKSwgdmFsdWUpKTtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgbmFtZSBhcyB0b2RheSdzIHJhbmdlIGluIHRoZSByZXBvcnQncyB6b25lLCBvciBudWxsIGZvclxuICAvLyBhIG5hbWUgaXQgZG9lcyBub3Qga25vdy4gQSB2aWV3J3Mgcm9sbGluZyByYW5nZSBpcyBvcGVuZWQgdGhyb3VnaCB0aGlzLCBhbmRcbiAgLy8gYSBsaW5rIHdyaXRlcyBvbmUgYXMgdGhlIGRheXMgaXQgZ2l2ZXMgKFJlcG9ydFZpZXdTZXJ2aWNlKS5cbiAgcHVibGljIHJlc29sdmVSZWxhdGl2ZShuYW1lOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZWxhdGl2ZVJhbmdlKG5hbWUpO1xuICB9XG5cbiAgLy8gVGhlIGFjdGl2ZSBncm91cC1ieSBncmFpbiwgb3IgbnVsbCB3aGVuIHRoZSB2aWV3ZXIgaGFzbid0IGNob3NlbiBvbmUuXG4gIHB1YmxpYyBmcmVxdWVuY3koKTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9mcmVxdWVuY3k7XG4gIH1cblxuICBwdWJsaWMgc2V0RnJlcXVlbmN5KGZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9mcmVxdWVuY3kgPSBmcmVxdWVuY3k7XG4gICAgdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQubmV4dCgpO1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIHRoZSBncm91cC1ieSBncmFpbiBjaGFuZ2VzIOKAlCBldmVyeSB0aW1lLXNlcmllcyBjaGFydCBsaXN0ZW5zXG4gIC8vIHNvIGl0IHJlZmV0Y2hlcyBhbmQgcmUtYnVja2V0cyAodGhlIG92ZXJyaWRlIGlzbid0IHNjb3BlZCB0byBhbnkgZmlsdGVyXG4gIC8vIGdyb3VwLCBzbyBjaGFuZ2VzRm9yKCkgY2FuJ3QgY2FycnkgaXQpLlxuICBwdWJsaWMgZnJlcXVlbmN5Q2hhbmdlcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyBUaGUgc29ydCB0aGUgdmlld2VyIGxhc3QgZmV0Y2hlZCBhIGxpc3Qgd2l0aCwgb3IgbnVsbCB3aGVuIGl0IGhhc24ndCBzb3J0ZWRcbiAgLy8gKHRoZSBsaXN0IHRoZW4gZmFsbHMgYmFjayB0byBpdHMgYXV0aG9yZWQgc29ydCkuXG4gIHB1YmxpYyBsaXN0U29ydChjb21wb25lbnRJZDogbnVtYmVyKTogUmVwb3J0U29ydCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudElkKSA/PyBudWxsO1xuICB9XG5cbiAgLy8gUmVjb3JkcyBhIGxpc3QncyBzb3J0IHdoZW4gaXQgaXMgdGhlIHZpZXdlcidzIG93bjogYSBzb3J0IHRoYXQgaXMgdGhlXG4gIC8vIGxpc3QncyBhdXRob3JlZCBmaXJzdCB0ZXJtIGlzIHRoZSBsaXN0J3MgZGVmYXVsdCwgbm90IGEgY2hvaWNlLCBzbyBpdFxuICAvLyBjbGVhcnMgdGhlIGVudHJ5IGluc3RlYWQgKHRoZSBydWxlIHRoZSBVUkwgc25hcHNob3QgYXBwbGllcykuIE90aGVyd2lzZSBhXG4gIC8vIGxpc3QncyBmaXJzdCBmZXRjaCB3b3VsZCByZWNvcmQgaXRzIHNlZWRlZCBhdXRob3JlZCB0ZXJtLCBhbmQgYSBsaXN0IHRoZVxuICAvLyBhZ2VudCByZS1zb3J0cyBsYXRlciBpbiB0aGUgc2Vzc2lvbiB3b3VsZCBrZWVwIHNlbmRpbmcgdGhlIG9sZCB0ZXJtXG4gIC8vIGZpcnN0LiBEZWxpYmVyYXRlbHkgZW1pdHMgbm8gY2hhbmdlOiB0aGUgbGlzdCBzZXRzIHRoaXMgZnJvbSB0aGUgZmV0Y2hcbiAgLy8gdGhhdCBhbHJlYWR5IHJhbiB3aXRoIHRoYXQgc29ydCwgc28gYSBub3RpZmljYXRpb24gd291bGQgb25seSBtYWtlIGl0XG4gIC8vIHJlZmV0Y2ggdGhlIHNhbWUgcm93cy4gT25seSB0aGUgVVJMIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0TGlzdFNvcnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNvcnQ6IFJlcG9ydFNvcnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5zZXQoY29tcG9uZW50LmlkLCBzb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdFNvcnRzLmRlbGV0ZShjb21wb25lbnQuaWQpO1xuICAgIH1cblxuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSB0ZXh0IGEgbGlzdCBpcyBzZWFyY2hlZCBieSwgb3IgbnVsbCB3aGVuIGl0cyBzZWFyY2ggYm94IGlzIGVtcHR5LlxuICBwdWJsaWMgbGlzdFNlYXJjaChjb21wb25lbnRJZDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG4gIH1cblxuICAvLyBXaGV0aGVyIGEgbGlzdCBzaG93cyB0aGUgc2VhcmNoIGJveCBvdmVyIGl0cyB0ZXh0IGNvbHVtbnM6IGl0IGRvZXMgd2hlbiB0aGVcbiAgLy8gc2VydmVyIGFuc3dlcnMgYSBsaXN0IHNlYXJjaCAoc2VlIF9zZXJ2ZXJTZWFyY2hlcyksIHVubGVzcyBvbmUgb2YgaXRzIGxpdmVcbiAgLy8gZmlsdGVycyBiZWxvbmdzIHRvIGEga2V5d29yZCBncm91cCBpdHMgaGVhZGVyIHNob3dzLiBBIGJhciBzaG93cyBvbmUgc2VhcmNoXG4gIC8vIGJveCAoaXRzIGxhc3Qga2V5d29yZCBpdGVtKSwgYW5kIHRoYXQgb25lIGlzIHRoZSBhdXRob3Incy4gVGhlIGhlYWRlciwgdGhlXG4gIC8vIFVSTCByZXN0b3JlLCB0aGUgcHJ1bmluZywgdGhlIGRhdGEgcmVxdWVzdCBzdGF0ZSBhbmQgdGhlIGV4cG9ydHMgYWxsIHJlYWRcbiAgLy8gdGhpcyBvbmUgcnVsZSwgc28gbm8gc2VhcmNoIG5hcnJvd3MgYSBsaXN0IHdob3NlIHNjcmVlbiBoYXMgbm8gYm94IHNob3dpbmdcbiAgLy8gaXQsIGFuZCBubyBleHBvcnQgdGl0bGVzIGEgc2VhcmNoIHRoZSBzZXJ2ZXIgZGlkIG5vdCBhcHBseS5cbiAgcHVibGljIGxpc3RTZWFyY2hhYmxlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlclNlYXJjaGVzXG4gICAgICAmJiBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICAmJiAhKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5zb21lKChmaWx0ZXIpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyLmVuYWJsZWRcbiAgICAgICAgICAmJiAhdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpXG4gICAgICAgICAgJiYgZ3JvdXA/LnR5cGUgPT09ICdrZXl3b3JkJ1xuICAgICAgICAgICYmIChncm91cC5sZXZlbCA9PT0gJ2NvbXBvbmVudCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc2VhcmNoIGJveCB0ZXh0IChsaXN0U2VhcmNoVGV4dCk7IGFuIGVtcHR5IGJveCBjbGVhcnNcbiAgLy8gaXQuIFRoZSBoZWFkZXIgY2FsbHMgdGhpcyBvbiBldmVyeSBjaGFuZ2Ugb2YgYW55IG9mIGl0cyBpdGVtcywgc28gdGhlXG4gIC8vIGxpc3QgYW5kIHRoZSBVUkwgaGVhciBhYm91dCBpdCBvbmx5IHdoZW4gdGhlIHN0b3JlZCB0ZXh0IGFjdHVhbGx5IGNoYW5nZWQuXG4gIHB1YmxpYyBzZXRMaXN0U2VhcmNoKGNvbXBvbmVudElkOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNlYXJjaCA9IGxpc3RTZWFyY2hUZXh0KHRleHQpO1xuXG4gICAgaWYgKHNlYXJjaCA9PT0gKHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50SWQpID8/ICcnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5zZXQoY29tcG9uZW50SWQsIHNlYXJjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5uZXh0KGNvbXBvbmVudElkKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgY29uZmlnIGNvbHVtbiBuYW1lcyBhIHZpZXdlciBoaWQgb24gYSBsaXN0OyBub25lIHdoZW4gaXQgc2hvd3MgdGhlbSBhbGwuXG4gIHB1YmxpYyBoaWRkZW5Db2x1bW5zKGNvbXBvbmVudElkOiBudW1iZXIpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdEhpZGRlbigpLmdldChjb21wb25lbnRJZCkgPz8gW107XG4gIH1cblxuICAvLyBSZWNvcmRzIHRoZSBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBhIGxpc3QsIGtlcHQgdG8gbGlzdEhpZGRlbkNvbHVtbnM6XG4gIC8vIG5hbWVzIHRoZSBsaXN0IGNhbm5vdCBoaWRlIGFyZSBkcm9wcGVkLCBhbmQgbm9uZSAob3IgZXZlcnkgY29sdW1uKSBjbGVhcnNcbiAgLy8gdGhlIGVudHJ5LiBPbmx5IHRoZSBVUkwgaGVhcnMgYWJvdXQgaXQsIGFuZCBvbmx5IG9uIGEgcmVhbCBjaGFuZ2UuXG4gIHB1YmxpYyBzZXRIaWRkZW5Db2x1bW5zKGNvbXBvbmVudElkOiBudW1iZXIsIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGhpZGRlbiA9IGxpc3RIaWRkZW5Db2x1bW5zKHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk/LmNvbmZpZywgbmFtZXMpO1xuXG4gICAgaWYgKHNhbWVOYW1lcyhoaWRkZW4sIHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5saXN0SGlkZGVuKCkpO1xuXG4gICAgaWYgKGhpZGRlbi5sZW5ndGgpIHtcbiAgICAgIG5leHQuc2V0KGNvbXBvbmVudElkLCBoaWRkZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0LmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChuZXh0KTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciBvbmUgbGlzdCdzIHNlYXJjaCB0ZXh0IGNoYW5nZXMsIHNvIHRoYXQgbGlzdCByZWZldGNoZXMuXG4gIHB1YmxpYyBsaXN0U2VhcmNoQ2hhbmdlcyhjb21wb25lbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChpZCkgPT4gaWQgPT09IGNvbXBvbmVudElkKSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIHZpZXdlciBzdGF0ZSB0aGUgVVJMIGNhcnJpZXMgbWF5IGhhdmUgY2hhbmdlZDogYSBncm91cFxuICAvLyB2YWx1ZSwgdGhlIGdyYWluLCBhIGxpc3Qgc29ydCwgc2VhcmNoIG9yIGhpZGRlbiBjb2x1bW5zLCBvciBhIChyZSlsb2FkIG9mXG4gIC8vIHRoZSByZXBvcnQuXG4gIHB1YmxpYyB1cmxDaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl91cmxDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIFRoZSB2aWV3ZXIgc3RhdGUgdGhlIFVSTCBzaG91bGQgY2FycnkgZm9yIGByZXBvcnRgOiBvbmx5IHdoYXQgZGlmZmVycyBmcm9tXG4gIC8vIHRoZSBhdXRob3JlZCBkZWZhdWx0cywgc28gYW4gdW50b3VjaGVkIHJlcG9ydCBoYXMgYSBiYXJlIFVSTCBhbmQga2VlcHNcbiAgLy8gZm9sbG93aW5nIGl0cyBkZWZhdWx0cyB3aGVuIHRoZXkgY2hhbmdlLiBBIGdyb3VwIHRoZSB2aWV3ZXIgY2xlYXJlZCBpc1xuICAvLyBudWxsLiBBIGRhdGUgcmFuZ2UgaXMgY29tcGFyZWQgb24gaXRzIGRheXMgYWdhaW5zdCBpdHMgZGVmYXVsdCByZXNvbHZlZFxuICAvLyB0b2RheSwgc28gYSB2YWx1ZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHVuZGVyIGFub3RoZXIgcHJlc2V0IG5hbWUgKHRoaXNZZWFyXG4gIC8vIGFnYWluc3QgYSB5ZWFyVG9EYXRlIGRlZmF1bHQpIGlzIHN0aWxsIHRoZSBkZWZhdWx0LlxuICBwdWJsaWMgdXJsU25hcHNob3QocmVwb3J0OiBSZXBvcnQpOiBSZXBvcnRVcmxTbmFwc2hvdCB7XG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWUgfCBudWxsPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9ncm91cHMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG5cbiAgICAgIGlmICh0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZCkpIHtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cC5pZCwgbnVsbCk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmICF0aGlzLl9pc0RlZmF1bHQoZ3JvdXAsIHZhbHVlKSkge1xuICAgICAgICBncm91cHMuc2V0KGdyb3VwLmlkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KCk7XG4gICAgY29uc3QgbGlzdFNlYXJjaGVzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBjb25zdCBsaXN0SGlkZGVuID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZ1tdPigpO1xuXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KSkge1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnQuaWQpO1xuXG4gICAgICBpZiAoc29ydCAmJiAhc2FtZVNvcnQoc29ydCwgbGlzdFNvcnRUZXJtcyhjb21wb25lbnQuY29uZmlnKVswXSA/PyBudWxsKSkge1xuICAgICAgICBsaXN0U29ydHMuc2V0KGNvbXBvbmVudC5pZCwgc29ydCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnQuaWQsIHNlYXJjaCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICAgIGxpc3RIaWRkZW4uc2V0KGNvbXBvbmVudC5pZCwgWy4uLmhpZGRlbl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGdyb3VwcywgbGlzdFNvcnRzLCBsaXN0U2VhcmNoZXMsIGxpc3RIaWRkZW4sIGZyZXF1ZW5jeTogdGhpcy5fZnJlcXVlbmN5IH07XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCBncm91cElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuYWRkKGZpbHRlcklkKTtcbiAgICB9XG5cbiAgICAvLyBUdXJuaW5nIGEga2V5d29yZCBmaWx0ZXIgYmFjayBvbiB0YWtlcyBpdHMgbGlzdCdzIHNlYXJjaCBib3ggYXdheSwgYW5kXG4gICAgLy8gdGhlIHNlYXJjaCB3aXRoIGl0LiBUaGUgbGlzdCByZWZldGNoZXMgb24gdGhlIGdyb3VwIGNoYW5nZSBiZWxvdy5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbnMgcmVsZXZhbnQgdG8gT05FIGNvbXBvbmVudDogYW55IGNoYW5nZSB0byBhIGdyb3VwIG9uZSBvZiBpdHNcbiAgLy8gZmlsdGVycyBiZWxvbmdzIHRvIChvciBhIGZ1bGwgcmUtaW5pdCkuXG4gIHB1YmxpYyBjaGFuZ2VzRm9yKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZ3JvdXBJZHMgPSBuZXcgU2V0KChjb21wb25lbnQuZmlsdGVycyA/PyBbXSkubWFwKChmaWx0ZXIpID0+IGZpbHRlci5maWx0ZXJHcm91cElkKSk7XG5cbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoZ3JvdXBJZCkgPT4gZ3JvdXBJZCA9PT0gbnVsbCB8fCBncm91cElkcy5oYXMoZ3JvdXBJZCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbnMgcmVsZXZhbnQgdG8gQU5ZIG9mIGEgc2V0IG9mIGNvbXBvbmVudHMgdGhhdCBjb21lcyBhbmQgZ29lc1xuICAvLyAoYSBwYWdlJ3MgdmFsdWVzKTogYSBjaGFuZ2UgdG8gYSBncm91cCBvbmUgb2YgdGhlaXIgZmlsdGVycyBiZWxvbmdzIHRvLlxuICAvLyBVbmxpa2UgY2hhbmdlc0ZvciwgdGhlIHNldCBpcyByZWFkIG9uIGVhY2ggZXZlbnQgcmF0aGVyIHRoYW4gY2FwdHVyZWQgYXRcbiAgLy8gc3Vic2NyaWJlLCBzbyBvbmUgc3Vic2NyaXB0aW9uIGZvbGxvd3MgdGhlIHNldCBhcyB0aGUgcmVwb3J0IHJlbG9hZHMuIEFcbiAgLy8gZnVsbCByZS1pbml0IChudWxsKSBpcyBub3QgcGFzc2VkIG9uOiBpbml0KCkgcnVucyBvbiBhIHJlcG9ydFxuICAvLyAocmUpbG9hZCwgYW5kIGEgY2FsbGVyIG9mIHRoaXMgY2hlY2tzIG9uIHRoYXQgcmVsb2FkIGl0c2VsZiB3aGV0aGVyIHRoZVxuICAvLyBmaWx0ZXIgdmFsdWVzIGl0cyBjb21wb25lbnRzIGFyZSByZWFkIHdpdGggbW92ZWQuXG4gIHB1YmxpYyBjaGFuZ2VzRm9yQW55KGNvbXBvbmVudHM6ICgpID0+IFJlcG9ydENvbXBvbmVudFtdKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoZ3JvdXBJZCk6IGdyb3VwSWQgaXMgbnVtYmVyID0+IGdyb3VwSWQgIT09IG51bGxcbiAgICAgICAgICAmJiBjb21wb25lbnRzKCkuc29tZSgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pXG4gICAgICAgICAgICAuc29tZSgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyR3JvdXBJZCA9PT0gZ3JvdXBJZCkpKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ3JvdXAgdmFsdWVzIHJlc29sdmVkIGludG8gdGhpcyBjb21wb25lbnQncyBtZW1iZXItZmlsdGVyIHZhbHVlcyDigJRcbiAgLy8gd2hhdCB0aGUgZGF0YSByZXF1ZXN0IGNhcnJpZXMuIERpc2FibGVkIGZpbHRlcnMgKGF1dGhvcmVkIG9yIHNlc3Npb24pIGFyZVxuICAvLyBza2lwcGVkIGVudGlyZWx5LlxuICBwdWJsaWMgcmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY29tcG9uZW50LmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghZmlsdGVyLmVuYWJsZWQgfHwgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgY29uc3QgZmllbGRzID0gdmFsdWUgPyB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSkgOiBudWxsO1xuXG4gICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgIHJlc29sdmVkLnB1c2goeyBmaWx0ZXJJZDogZmlsdGVyLmlkLCAuLi5maWVsZHMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLy8gV2hhdCB0aGUgdmlld2VyIGhhcyBzZXQsIG9uZSBlbnRyeSBwZXIgZmlsdGVyIGdyb3VwLCBmb3IgdGhlIHJlcG9ydCBjaGF0OlxuICAvLyB0aGUgYWdlbnQgcmVhZHMgaXQgdG8ga25vdyB3aGF0IGlzIG9uIHNjcmVlbi4gR3JvdXAgb3JkZXIsIG5vdCB0aGUgb3JkZXJcbiAgLy8gdGhlIHZhbHVlcyB3ZXJlIHNldCBpbiwgc28gdGhlIHNhbWUgc3RhdGUgYWx3YXlzIHJlYWRzIHRoZSBzYW1lLiBBIGdyb3VwXG4gIC8vIHdpdGggbm90aGluZyBpbiBpdCBpcyBsZWZ0IG91dCwgYW5kIGEgc2F2ZWQgZGVmYXVsdCBjb3VudHMgdW50aWwgdGhlXG4gIC8vIHZpZXdlciBjaGFuZ2VzIGl0LiBQZXItZmlsdGVyIHRvZ2dsZXMgYXJlIGEgY29tcG9uZW50J3Mgb3duIGJ1c2luZXNzLCBzb1xuICAvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBpdC5cbiAgcHVibGljIHZpZXdlckZpbHRlcnMoKTogUmVwb3J0Q2hhdFZpZXdlckZpbHRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3ZhbHVlcy5lbnRyaWVzKCldXG4gICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEgLSBiKVxuICAgICAgLm1hcCgoW2dyb3VwSWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkcyA/IHsgZ3JvdXBJZCwgLi4uZmllbGRzIH0gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciA9PiBlbnRyeSAhPT0gbnVsbCk7XG4gIH1cblxuICAvLyBFdmVyeSB0aWxlJ3MgcmVzb2x2ZWQgdmFsdWVzIGluIG9uZSBhcnJheSDigJQgd2hhdCBhIHJlcG9ydC1sZXZlbCBleHBvcnRcbiAgLy8gY2FycmllcyBzbyBlYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUgaXMgZmlsdGVyZWQgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGlzLlxuICAvLyBGaWx0ZXIgaWRzIGFyZSB1bmlxdWUgcGVyIGNvbXBvbmVudCwgc28gdGhlIGJhY2tlbmQgcGlja3MgZWFjaCBjb21wb25lbnQnc1xuICAvLyBvd24gb3V0IG9mIHRoZSBwaWxlLiBPbmx5IGEgdGlsZSBiZWNvbWVzIGEgZmlsZSAoaXNUaWxlKSwgc28gbm8gb3RoZXJcbiAgLy8gY29tcG9uZW50J3MgZW50cmllcyByaWRlIGFsb25nLiBBIHBhZ2UgaWQgbmFycm93cyBpdCB0byB0aGF0IHBhZ2UuXG4gIHB1YmxpYyByZXNvbHZlRm9yUmVwb3J0KHJlcG9ydDogUmVwb3J0LCBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsKTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCBwYWdlcyA9IChyZXBvcnQucGFnZXMgPz8gW10pXG4gICAgICAuZmlsdGVyKChwYWdlKSA9PiAhcGFnZUlkIHx8IHBhZ2UuaWQgPT09IHBhZ2VJZCk7XG5cbiAgICByZXR1cm4gcGFnZXNcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiAocGFnZS5jb21wb25lbnRzID8/IFtdKVxuICAgICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGlzVGlsZShjb21wb25lbnQpKVxuICAgICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB0aGlzLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KSkpO1xuICB9XG5cbiAgcHVibGljIHNldFBhZ2UocGFnZUlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHBhZ2VJZCA9PT0gdGhpcy5fcGFnZUlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYWdlSWQuc2V0KHBhZ2VJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSBjaGFuZ2Ugb2YgbWF0Y2ggY2FuIGNoYW5nZSBldmVyeSB0aWxlIGEgZ3JvdXAgd2l0aCBhIHZhbHVlIG5hcnJvd3MsIHNvXG4gIC8vIGV2ZXJ5IHRpbGUgaGVhcnMgYWJvdXQgaXQuXG4gIHB1YmxpYyBzZXRNYXRjaChtYXRjaDogUmVwb3J0RmlsdGVyTWF0Y2gpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0OiBSZXBvcnRGaWx0ZXJNYXRjaCA9IG1hdGNoID09PSAnYW55JyA/ICdhbnknIDogJ2FsbCc7XG4gICAgaWYgKG5leHQgPT09IHRoaXMuX21hdGNoKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXRjaC5zZXQobmV4dCk7XG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBBIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdG9wIGZpcnN0OyBlbXB0eSB3aGlsZSB0aGUgY2hhcnQgaXMgYXQgaXRzIHRvcC5cbiAgLy8gSXQgcmVhZHMgYSBzaWduYWwsIHNvIGEgdGVtcGxhdGUgdGhhdCBzaG93cyBpdCByZXBhaW50cyB3aGVuIGl0IG1vdmVzLlxuICBwdWJsaWMgZHJpbGwoY29tcG9uZW50SWQ6IG51bWJlcik6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZHJpbGxzKCkuZ2V0KGNvbXBvbmVudElkKSA/PyBbXTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBjaGFydCdzIGRyaWxsIHBhdGgsIGtlcHQgdG8gY2xlYW5EcmlsbFBhdGg7IGFuIGVtcHR5IHBhdGggaXNcbiAgLy8gdGhlIGNoYXJ0J3MgdG9wLiBPbmx5IGEgY2hhcnQgb2YgdGhlIG9wZW4gcmVwb3J0IGRyaWxsczogYSBwYXRoIGZvciBhbnlcbiAgLy8gb3RoZXIgY29tcG9uZW50IGlzIGlnbm9yZWQuIE9ubHkgdGhhdCBjaGFydCBhbmQgdGhlIFVSTCBoZWFyIGFib3V0IGl0LFxuICAvLyBhbmQgb25seSBvbiBhIHJlYWwgY2hhbmdlLlxuICBwdWJsaWMgc2V0RHJpbGwoY29tcG9uZW50SWQ6IG51bWJlciwgcGF0aDogcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10pOiB2b2lkIHtcbiAgICBjb25zdCBrZXB0ID0gY2xlYW5EcmlsbFBhdGgocGF0aCk7XG4gICAgaWYgKCF0aGlzLl9pc0NoYXJ0KGNvbXBvbmVudElkKSB8fCBzYW1lRHJpbGxQYXRoKGtlcHQsIHRoaXMuZHJpbGwoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3NldERyaWxsUGF0aChjb21wb25lbnRJZCwga2VwdCk7XG4gICAgdGhpcy5fZHJpbGxDaGFuZ2VkJC5uZXh0KGNvbXBvbmVudElkKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciBvbmUgY2hhcnQncyBkcmlsbCBwYXRoIGNoYW5nZXMsIHNvIHRoYXQgY2hhcnQgcmVmZXRjaGVzLlxuICBwdWJsaWMgZHJpbGxDaGFuZ2VzKGNvbXBvbmVudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZHJpbGxDaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChpZCkgPT4gaWQgPT09IGNvbXBvbmVudElkKSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGFrZXMgdGhlIGRyaWxsIHBhdGggYSBjaGFydCdzIGFuc3dlciBhcHBsaWVkIGFzIHRoZSBjaGFydCdzIG93bjogdGhlXG4gIC8vIHNlcnZlciBrZWVwcyB0aGUgbG9uZ2VzdCBwYXJ0IG9mIGEgc2VudCBwYXRoIGl0IGNhbiBhcHBseSwgc28gdGhlIFVSTCBhbmRcbiAgLy8gYSBsYXRlciBzYXZlIGhvbGQgdGhhdCBwYXJ0IG9ubHkuIFRoZSBjaGFydCBoYXMganVzdCByZWFkIHRoYXQgcGF0aCwgc29cbiAgLy8gb25seSB0aGUgVVJMIGhlYXJzIGFib3V0IGl0LiBUcnVlIHdoZW4gdGhlIHBhdGggY2hhbmdlZC5cbiAgcHVibGljIGFkb3B0RHJpbGwoY29tcG9uZW50SWQ6IG51bWJlciwgcGF0aDogcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXB0ID0gY2xlYW5EcmlsbFBhdGgocGF0aCk7XG4gICAgaWYgKCF0aGlzLl9pc0NoYXJ0KGNvbXBvbmVudElkKSB8fCBzYW1lRHJpbGxQYXRoKGtlcHQsIHRoaXMuZHJpbGwoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX3NldERyaWxsUGF0aChjb21wb25lbnRJZCwga2VwdCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBUaGUgZHVyYWJsZSBzdGF0ZSBvbiBzY3JlZW4gYXMgb25lIHZpZXcgZG9jdW1lbnQ6IHRoZSBwYWdlLCBldmVyeSBncm91cFxuICAvLyB0aGUgcmVwb3J0IGhhcyAobnVsbCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcsIGEgY2xlYXJlZCBkZWZhdWx0IGluY2x1ZGVkKSxcbiAgLy8gdGhlIG1hdGNoLCB0aGUgZ3JhaW4sIGFuZCBlYWNoIHRpbGUncyBzb3J0LCBzZWFyY2gsIGhpZGRlbiBjb2x1bW5zIGFuZFxuICAvLyBkcmlsbCBwYXRoIHdoZXJlIHRoZXkgZGlmZmVyIGZyb20gdGhlIGF1dGhvcmVkIHRpbGUuIEEgZGF0ZSByYW5nZSB0aGF0XG4gIC8vIHN0aWxsIGNhcnJpZXMgaXRzIHJlbGF0aXZlIHByZXNldCBpcyB3cml0dGVuIGFzIHRoYXQgcHJlc2V0LCB3aGF0ZXZlclxuICAvLyB0b2RheSBpcyAodG9TdG9yZWRHcm91cFZhbHVlKS4gVGhlIHRlbXBvcmFyeSBsYXllciBpcyBuZXZlciBwYXJ0IG9mIGl0LlxuICBwdWJsaWMgc25hcHNob3QoKTogUmVwb3J0Vmlld0NvbmZpZyB7XG4gICAgY29uc3QgY29uZmlnOiBSZXBvcnRWaWV3Q29uZmlnID0geyB2OiBSRVBPUlRfVklFV19DT05GSUdfVkVSU0lPTiB9O1xuXG4gICAgaWYgKHRoaXMuX3BhZ2VJZCgpKSB7XG4gICAgICBjb25maWcucGFnZUlkID0gdGhpcy5fcGFnZUlkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZyZXF1ZW5jeSkge1xuICAgICAgY29uZmlnLmdyb3VwQnkgPSB0aGlzLl9mcmVxdWVuY3k7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21hdGNoKCkgPT09ICdhbnknKSB7XG4gICAgICBjb25maWcubWF0Y2ggPSAnYW55JztcbiAgICB9XG5cbiAgICBjb25maWcuZ3JvdXBzID0gdGhpcy5fc25hcHNob3RHcm91cHMoKTtcblxuICAgIGNvbnN0IHRpbGVzID0gdGhpcy5fc25hcHNob3RUaWxlcygpO1xuICAgIGlmIChPYmplY3Qua2V5cyh0aWxlcykubGVuZ3RoKSB7XG4gICAgICBjb25maWcudGlsZXMgPSB0aWxlcztcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzIGFzIGEgdmlldyBkb2N1bWVudDogZXZlcnkgZ3JvdXAgYXQgaXRzXG4gIC8vIGF1dGhvcmVkIGRlZmF1bHQgKG51bGwgd2hlbiBpdCBoYXMgbm9uZSksIG5vIG1hdGNoLCBncmFpbiBvciB0aWxlIHN0YXRlLlxuICBwdWJsaWMgYXV0aG9yZWRDb25maWcoKTogUmVwb3J0Vmlld0NvbmZpZyB7XG4gICAgY29uc3QgZ3JvdXBzOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsPiA9IHt9O1xuXG4gICAgdGhpcy5fZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBncm91cHNbZ3JvdXAuaWRdID0gdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgdjogUkVQT1JUX1ZJRVdfQ09ORklHX1ZFUlNJT04sIGdyb3VwcyB9O1xuICB9XG5cbiAgLy8gUmVwbGFjZXMgdGhlIGR1cmFibGUgc3RhdGUgd2l0aCBhIHZpZXcncyAoYGNvbmZpZ2A7IG51bGwgPSB0aGUgcmVwb3J0J3NcbiAgLy8gYXV0aG9yZWQgZGVmYXVsdHMpLCB0aGVuIGFwcGxpZXMgYSBsaW5rJ3MgY2hhbmdlcyBvbiB0b3Agb2YgaXRcbiAgLy8gKGB1cmxEaWZmYCkuIEEgZ3JvdXAgdGhlIHZpZXcgZG9lcyBub3QgaG9sZCBvcGVucyBhdCBpdHMgYXV0aG9yZWRcbiAgLy8gZGVmYXVsdDsgb25lIHRoZSByZXBvcnQgZG9lcyBub3QgaGF2ZSwgb3Igd2hvc2UgdmFsdWUgZG9lcyBub3QgZml0IHRoZVxuICAvLyBncm91cCdzIHR5cGUsIGlzIHNraXBwZWQuIEEga2V5IHVybERpZmYgZG9lcyBub3QgY2Fycnkga2VlcHMgdGhlIHZhbHVlXG4gIC8vIGJlbG93IGl0LCBhbmQgaXRzIHBhZ2UgYmVhdHMgdGhlIHZpZXcncy4gVGhlIHRlbXBvcmFyeSBsYXllciBpcyBrZXB0LlxuICAvL1xuICAvLyBgYmFzZWAgaXMgd2hhdCB0aGUgc2NyZWVuIGlzIGNvbXBhcmVkIHdpdGggZm9yICcoZWRpdGVkKScgYW5kIHdoYXRcbiAgLy8gcmVzZXRUb0Jhc2UoKSByZXR1cm5zIHRvOyBpdCBpcyBgY29uZmlnYCB1bmxlc3MgdGhlIGNhbGxlciBuYW1lc1xuICAvLyBhbm90aGVyIChudWxsID0gdGhlIGF1dGhvcmVkIGRlZmF1bHRzKS4gU286XG4gIC8vIC0gYSBzaGFyZWQgdmlldydzIGxpbmsgKHJ2KTogYXBwbHkoc2hhcmVkVmlldywgZGlmZik7XG4gIC8vIC0gYSBwZXJzb25hbCB2aWV3J3MgbGluayAocnB2KTogYXBwbHkobnVsbCwgZnVsbERpZmYsIHBlcnNvbmFsVmlldykuIFRoZVxuICAvLyAgIHNjcmVlbiBpcyB0aGUgYXV0aG9yZWQgZGVmYXVsdHMgcGx1cyB0aGUgZnVsbCBkaWZmLCBzbyBhIGtleSB0aGUgZGlmZlxuICAvLyAgIGxlYXZlcyBvdXQgKHRoZSBtYXRjaCwgdGhlIGdyYWluLCBhIHRpbGUncyBzb3J0KSBpcyB0aGUgYXV0aG9yZWQgb25lLFxuICAvLyAgIGFuZCB0aGUgcGVyc29uYWwgdmlldyBpcyBzdGlsbCB0aGUgYmFzZS5cbiAgLy8gRXZlcnkgY2hhbmdlIGlzIGFubm91bmNlZCBvbmNlLCBhdCB0aGUgZW5kLlxuICBwdWJsaWMgYXBwbHkoXG4gICAgY29uZmlnOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCxcbiAgICB1cmxEaWZmOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCA9IG51bGwsXG4gICAgYmFzZTogUmVwb3J0Vmlld0NvbmZpZyB8IG51bGwgPSBjb25maWcsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZyZXF1ZW5jeTtcblxuICAgIHRoaXMuX3NldEJhc2UoYmFzZSk7XG5cbiAgICBpZiAoY29uZmlnICE9PSBiYXNlKSB7XG4gICAgICB0aGlzLl9hcHBseUxheWVyKGNvbmZpZywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbHlQYWdlKGNvbmZpZz8ucGFnZUlkKTtcblxuICAgIGlmICh1cmxEaWZmKSB7XG4gICAgICB0aGlzLl9hcHBseUxheWVyKHVybERpZmYsIGZhbHNlKTtcbiAgICAgIHRoaXMuX2FwcGx5UGFnZSh1cmxEaWZmLnBhZ2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbGllZFZlcnNpb24udXBkYXRlKCh2ZXJzaW9uKSA9PiB2ZXJzaW9uICsgMSk7XG4gICAgdGhpcy5fbm90aWZ5QXBwbGllZChmcmVxdWVuY3kpO1xuICB9XG5cbiAgLy8gUHV0cyB0aGUgc2NyZWVuIGJhY2sgb24gaXRzIGJhc2UgKHRoZSBvcGVuIHZpZXcsIGVsc2UgdGhlIGF1dGhvcmVkXG4gIC8vIGRlZmF1bHRzKSBvbiB0aGUgcGFnZSBpdCBpcyBvbiwgYW5kIGNsZWFycyB0aGUgdGVtcG9yYXJ5IGxheWVyLiBUaGVcbiAgLy8gdGlsZXMgc3RheSBhbmQgcmVsb2FkIGluIHBsYWNlIChhcHBsaWVkVmVyc2lvbiBkb2VzIG5vdCBtb3ZlKSwgZXhjZXB0IGFcbiAgLy8gbGlzdCB3aG9zZSBzb3J0IHRoaXMgbW92ZWQgKGxpc3RTb3J0UmVzZXRzKS5cbiAgcHVibGljIHJlc2V0VG9CYXNlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZyZXF1ZW5jeTtcbiAgICBjb25zdCBzb3J0cyA9IG5ldyBNYXAodGhpcy5fbGlzdFNvcnRzKTtcblxuICAgIHRoaXMuX3RlbXBvcmFyeS5zZXQoZW1wdHlUZW1wb3JhcnlTdGF0ZSgpKTtcbiAgICB0aGlzLl9hcHBseUxheWVyKHRoaXMuX2Jhc2VDb25maWcoKSwgdHJ1ZSk7XG4gICAgdGhpcy5fY291bnRTb3J0UmVzZXRzKHNvcnRzKTtcbiAgICB0aGlzLl9ub3RpZnlBcHBsaWVkKGZyZXF1ZW5jeSk7XG4gIH1cblxuICAvLyBUaGUgc2NyZWVuIGFzIGl0IGlzIGJlY29tZXMgdGhlIGJhc2UsIHdpdGggbm90aGluZyBhcHBsaWVkOiB3aGF0IGEgdmlld1xuICAvLyBqdXN0IHNhdmVkIGZyb20gdGhlIHNjcmVlbiBob2xkcy4gVGhlIHBhZ2Ugb24gc2NyZWVuIGlzIHRoZSBiYXNlJ3MuXG4gIHB1YmxpYyBzZXRCYXNlVG9TY3JlZW4oKTogdm9pZCB7XG4gICAgdGhpcy5fYmFzZUNvbmZpZy5zZXQodGhpcy5zbmFwc2hvdCgpKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHMgYmVjb21lIHRoZSBiYXNlIGFnYWluICh0aGUgb3BlbiB2aWV3IHdhc1xuICAvLyBkZWxldGVkKTsgdGhlIHNjcmVlbiBzdGF5cyBhcyBpdCBpcy5cbiAgcHVibGljIGNsZWFyQmFzZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9iYXNlQ29uZmlnLnNldChudWxsKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBQdXRzIG9ubHkgYGdyb3VwSWRzYCBiYWNrIG9uIHRoZSBiYXNlOiB0aGUgb3BlbiB2aWV3J3MgdmFsdWUgZm9yIGEgZ3JvdXBcbiAgLy8gaXQgaG9sZHMsIGVsc2UgdGhlIGdyb3VwJ3MgYXV0aG9yZWQgZGVmYXVsdC4gQSB0aWxlIGhlYWRlcidzICdDbGVhclxuICAvLyBmaWx0ZXJzJyBvd25zIG9ubHkgaXRzIG93biBncm91cHM7IHRoZSByZXBvcnQgYmFyJ3MgY2FsbHMgcmVzZXRUb0Jhc2UoKS5cbiAgLy8gRWFjaCBncm91cCBpcyBhbm5vdW5jZWQgYXMgYSB2aWV3ZXIncyBjaGFuZ2UgdG8gaXQgaXMsIHNvIHRoZSB0aWxlcyBpblxuICAvLyBpdCByZWZldGNoIGFuZCBhIGJhciBzaG93aW5nIGl0IHdpdGggYW5vdGhlciB2YWx1ZSBpcyBidWlsdCBhZ2Fpbi5cbiAgcHVibGljIHJlc2V0R3JvdXBzVG9CYXNlKGdyb3VwSWRzOiByZWFkb25seSBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IGhlbGQgPSB0aGlzLl9iYXNlQ29uZmlnKCk/Lmdyb3VwcyA/PyB7fTtcblxuICAgIGdyb3VwSWRzLmZvckVhY2goKGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoZWxkLCBncm91cElkKSB8fCAhdGhpcy5fYXBwbHlHcm91cChncm91cCwgaGVsZFtncm91cElkXSkpIHtcbiAgICAgICAgdGhpcy5fc2VlZEF1dGhvcmVkKGdyb3VwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgb25lIG9mIGBncm91cElkc2Agc2hvd3MgYSB2YWx1ZSBvdGhlciB0aGFuIGl0cyBiYXNlOiB0aGUgb3BlblxuICAvLyB2aWV3J3MgdmFsdWUgZm9yIGEgZ3JvdXAgaXQgaG9sZHMsIGVsc2UgdGhlIGdyb3VwJ3MgYXV0aG9yZWQgZGVmYXVsdCxcbiAgLy8gdGhlIHZhbHVlIHJlc2V0R3JvdXBzVG9CYXNlKCkgcHV0cyBiYWNrIGFuZCB2aWV3Q2hhbmdlZCBjb21wYXJlcy4gQSB0aWxlXG4gIC8vIGhlYWRlcidzIENsZWFyIGNoaXAgc2hvd3MgZXhhY3RseSB3aGlsZSBvbmUgb2YgaXRzIG93biBncm91cHMgZG9lcy4gSXRcbiAgLy8gcmVhZHMgdGhlIHJldmlzaW9uIHZpZXdDaGFuZ2VkIHJlYWRzLCBzbyBhIGNhbGxlciBvbiBlYWNoIGNoZWNrIG9mIGFuXG4gIC8vIE9uUHVzaCB2aWV3IHN0YXlzIGN1cnJlbnQuXG4gIHB1YmxpYyBncm91cHNEaWZmZXJGcm9tQmFzZShncm91cElkczogcmVhZG9ubHkgbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICB0aGlzLl9yZXZpc2lvbigpO1xuICAgIGNvbnN0IGhlbGQgPSB0aGlzLl9iYXNlQ29uZmlnKCk/Lmdyb3VwcyA/PyB7fTtcblxuICAgIHJldHVybiBncm91cElkcy5zb21lKChncm91cElkKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk7XG4gICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoZWxkLCBncm91cElkKVxuICAgICAgICA/IGhlbGRbZ3JvdXBJZF1cbiAgICAgICAgOiB0b1N0b3JlZEdyb3VwVmFsdWUoZ3JvdXAudHlwZSwgdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKSk7XG4gICAgICBjb25zdCBzY3JlZW4gPSB0aGlzLl9jbGVhcmVkLmhhcyhncm91cElkKSA/IG51bGwgOiB0b1N0b3JlZEdyb3VwVmFsdWUoZ3JvdXAudHlwZSwgdGhpcy5fdmFsdWVzLmdldChncm91cElkKSk7XG5cbiAgICAgIHJldHVybiAhc2FtZVN0b3JlZEdyb3VwVmFsdWUoYmFzZSwgc2NyZWVuKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFza3MgdGhlIGhvc3QncyBVUkwgd3JpdGVyIHRvIHdyaXRlIGFnYWluLCB3aXRoIG5vdGhpbmcgb24gc2NyZWVuXG4gIC8vIGNoYW5nZWQ6IHNoYXJpbmcgdGhlIG9wZW4gdmlldywgb3Igbm8gbG9uZ2VyIHNoYXJpbmcgaXQsIG1vdmVzIHRoZSBrZXlcbiAgLy8gdGhhdCBuYW1lcyBpdCBpbiBhIGxpbmsgKHJ2IG9yIHJwdikuXG4gIHB1YmxpYyByZXdyaXRlVXJsKCk6IHZvaWQge1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSBpbnRlcmFjdGlvbiBzdGF0ZSBhIHRpbGUncyBkYXRhIHJlcXVlc3QgY2FycmllcyBub3c6IHRpbGVEYXRhU3RhdGVcbiAgLy8gb3ZlciB0aGUgb3BlbiByZXBvcnQgYW5kIHRoZSBzY3JlZW4ncyBzbmFwc2hvdCgpLlxuICBwdWJsaWMgdGlsZVN0YXRlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogQ29tcG9uZW50RGF0YVN0YXRlIHtcbiAgICByZXR1cm4gdGlsZURhdGFTdGF0ZSh0aGlzLl9yZXBvcnQoKSwgY29tcG9uZW50LCB0aGlzLnNuYXBzaG90KCkpO1xuICB9XG5cbiAgLy8gVGhlIHJlbGF0aXZlIHJhbmdlIGEgZ3JvdXAncyB2YWx1ZSBzdGlsbCBpcywgYXMgYSBkYXRhIHJlcXVlc3QgbmFtZXMgaXRcbiAgLy8gKGl0cyBwcmVzZXQgd2hpbGUgaXRzIGRheXMgYXJlIHRoYXQgcmFuZ2UgcmVzb2x2ZWQgdG9kYXkpLCBvciBudWxsLiBUaGVcbiAgLy8gZXhwb3J0IHdvcmRpbmcgbmFtZXMgYSBsaXZlIHByZXNldCBieSBpdC5cbiAgcHVibGljIGxpdmVQcmVzZXQoZ3JvdXBJZDogbnVtYmVyKTogUmVwb3J0UmVsYXRpdmVSYW5nZSB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cElkKTtcblxuICAgIHJldHVybiB2YWx1ZSA/IHRoaXMuX2xpdmVQcmVzZXQodmFsdWUpIDogbnVsbDtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAgdmFsdWUgYXMgdGhlIGZpZWxkcyBhIHJlcXVlc3QgY2FycmllczogZGF0ZSBib3VuZHMgYXMgY2FsZW5kYXJcbiAgLy8gZGF5cywgc2VsZWN0IHZhbHVlcyB3aGVuIGFueSBhcmUgcGlja2VkIChlbHNlIHRoZSB2YWx1ZXMgbGVmdCBvdXQpLFxuICAvLyBrZXl3b3JkIHRleHQgdHJpbW1lZCwgYSBudW1iZXIgcmFuZ2UncyBlbmRzLiBOdWxsIHdoZW4gYWxsIG9mIHRoZW0gYXJlXG4gIC8vIGVtcHR5LiBBIGRhdGUgcmFuZ2UgYWxzbyBuYW1lcyB0aGUgcmVsYXRpdmUgcmFuZ2UgaXQgc3RpbGwgaXNcbiAgLy8gKF9saXZlUHJlc2V0KSwgc28gdGhlIHNlcnZlciBrbm93cyB3aGljaCBwZXJpb2QgdGhlIGRheXMgY292ZXI7XG4gIC8vIHRoZSBkYXlzIHN0YXkgdGhlIHdpbmRvdyBlaXRoZXIgd2F5LiBDb21wb25lbnQgZGF0YSwgdGhlIHJlcG9ydCBhbmQgcGFnZVxuICAvLyBleHBvcnRzIGFuZCB0aGUgY2hhdCdzIHZpZXdlciBmaWx0ZXJzIGFsbCByZWFkIHRoZWlyIGZpZWxkcyBoZXJlLCBzbyBhbGxcbiAgLy8gdGhyZWUgY2FycnkgaXQuXG4gIHByaXZhdGUgX3Jlc29sdmVkRmllbGRzKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogT21pdDxSZXNvbHZlZEZpbHRlclZhbHVlLCAnZmlsdGVySWQnPiB8IG51bGwge1xuICAgIGNvbnN0IGZpZWxkczogT21pdDxSZXNvbHZlZEZpbHRlclZhbHVlLCAnZmlsdGVySWQnPiA9IHt9O1xuICAgIGNvbnN0IHByZXNldCA9IHRoaXMuX2xpdmVQcmVzZXQodmFsdWUpO1xuXG4gICAgaWYgKHZhbHVlLnN0YXJ0KSB7XG4gICAgICBmaWVsZHMuc3RhcnQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuZW5kKSB7XG4gICAgICBmaWVsZHMuZW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLmVuZCk7XG4gICAgfVxuICAgIGlmIChwcmVzZXQpIHtcbiAgICAgIGZpZWxkcy5wcmVzZXQgPSBwcmVzZXQ7XG4gICAgfVxuICAgIGlmICh2YWx1ZS52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgZmllbGRzLnZhbHVlcyA9IHZhbHVlLnZhbHVlcztcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlPy50cmltKCkpIHtcbiAgICAgIGZpZWxkcy52YWx1ZSA9IHZhbHVlLnZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvbHZlRXhjbHVkZUFuZFJhbmdlKHZhbHVlLCBmaWVsZHMpO1xuXG4gICAgcmV0dXJuIGZpZWxkcy5zdGFydCB8fCBmaWVsZHMuZW5kIHx8IGZpZWxkcy52YWx1ZXMgfHwgZmllbGRzLnZhbHVlXG4gICAgICB8fCBmaWVsZHMuZXhjbHVkZVZhbHVlcyB8fCBmaWVsZHMubWluICE9PSB1bmRlZmluZWQgfHwgZmllbGRzLm1heCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZpZWxkc1xuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gVGhlIHJlbGF0aXZlIHJhbmdlIGEgZGF0ZSB2YWx1ZSBzdGlsbCBpczogdGhlIHByZXNldCBuYW1lIGl0IGNhcnJpZXMsXG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSB0aGF0IHJhbmdlIHJlc29sdmVkIHRvZGF5IGluIHRoZSByZXBvcnQncyB6b25lLiBBXG4gIC8vIHZhbHVlIHdob3NlIGRheXMgdGhlIHZpZXdlciBjaGFuZ2VkLCBvciBvbmUgc2VlZGVkIGJlZm9yZSBtaWRuaWdodCB0aGF0XG4gIC8vIGlzIG5vdyBhIGRheSBiZWhpbmQsIG5hbWVzIG5vbmUsIGFuZCB0aGUgc2VydmVyIHJlYWRzIGl0cyBkYXlzIGFsb25lLlxuICBwcml2YXRlIF9saXZlUHJlc2V0KHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogUmVwb3J0UmVsYXRpdmVSYW5nZSB8IG51bGwge1xuICAgIGlmICghdmFsdWUucHJlc2V0IHx8ICFpc1JlbGF0aXZlUmFuZ2UodmFsdWUucHJlc2V0KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yZWxhdGl2ZVJhbmdlKHZhbHVlLnByZXNldCk7XG5cbiAgICByZXR1cm4gcmFuZ2UgJiYgc2FtZURheXModmFsdWUsIHJhbmdlKSA/IHZhbHVlLnByZXNldCA6IG51bGw7XG4gIH1cblxuICAvLyBTZWVkcyBvbmUgZ3JvdXAgb24gKHJlKWxvYWQ7IHNlZSBpbml0KCkuIGBwcmV2aW91c2AgaXMgdGhlIGdyb3VwIGFzIHRoZVxuICAvLyBsYXN0IGxvYWQgaGFkIGl0LCBvciBudWxsIHdoZW4gaXQgaXMgbmV3LlxuICBwcml2YXRlIF9zZWVkKFxuICAgIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgICBwcmV2aW91czogUmVwb3J0RmlsdGVyR3JvdXAgfCBudWxsLFxuICAgIHRpbWV6b25lQ2hhbmdlZDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdENoYW5nZWQgPSAhc2FtZURlZmF1bHQocHJldmlvdXM/LmNvbmZpZz8uZGVmYXVsdCA/PyBudWxsLCBncm91cC5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCk7XG5cbiAgICBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXAuaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwLmlkKTtcbiAgICBjb25zdCBwcmVzZXRUb1Jlc29sdmUgPSB0aW1lem9uZUNoYW5nZWRcbiAgICAgICYmICEhdmFsdWU/LnByZXNldFxuICAgICAgJiYgdmFsdWUucHJlc2V0ID09PSBncm91cC5jb25maWc/LmRlZmF1bHQ/LnJlbGF0aXZlO1xuXG4gICAgaWYgKHZhbHVlICYmICFkZWZhdWx0Q2hhbmdlZCAmJiAhcHJlc2V0VG9SZXNvbHZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKTtcblxuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXAuaWQsIGRlZmF1bHRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChkZWZhdWx0Q2hhbmdlZCkge1xuICAgICAgLy8gVGhlIGRlZmF1bHQgd2FzIGNsZWFyZWQsIHNvIHRoZSB2YWx1ZSBpdCBzZWVkZWQgZ29lcyB3aXRoIGl0LlxuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBwbGllcyB0aGUgdmlld2VyIHN0YXRlIHJlYWQgZnJvbSB0aGUgVVJMIG9uIHRvcCBvZiB0aGUgc2VlZGVkIGRlZmF1bHRzLlxuICBwcml2YXRlIF9yZXN0b3JlKHJlcG9ydDogUmVwb3J0LCByZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXN0b3JlR3JvdXBzKHJlc3RvcmUpO1xuICAgIHRoaXMuX3Jlc3RvcmVMaXN0U29ydHMocmVwb3J0LCByZXN0b3JlKTtcbiAgICB0aGlzLl9yZXN0b3JlTGlzdFNlYXJjaGVzKHJlcG9ydCwgcmVzdG9yZSk7XG4gICAgdGhpcy5fcmVzdG9yZUxpc3RIaWRkZW4ocmVzdG9yZSk7XG5cbiAgICAvLyBUaGUgVVJMIGlzIHRoZSB3aG9sZSB0cnV0aCBvbiBhIGZpcnN0IGxvYWQ6IG5vIGdyYWluIGluIGl0IG1lYW5zIHRoZVxuICAgIC8vIGF1dGhvcmVkIG9uZXMuIFRoZSBob3N0IHN0aWxsIGRyb3BzIGEgZ3JhaW4gdGhlIHJlcG9ydCBkb2VzIG5vdCBvZmZlci5cbiAgICB0aGlzLl9mcmVxdWVuY3kgPSBHUkFOVUxBUklUWV9PUFRJT05TXG4gICAgICAuZmluZCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUgPT09IHJlc3RvcmUuZ3JvdXBCeSk/LnZhbHVlID8/IG51bGw7XG4gIH1cblxuICAvLyBUaGUgVVJMJ3MgZ3JvdXAgdmFsdWVzLCBhcHBsaWVkIGFzIGEgdmlldydzIGFyZS4gQW4gZW1wdHkgb25lIGlzIGFuXG4gIC8vIGV4cGxpY2l0IGNsZWFyIG9mIHRoZSBncm91cC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUdyb3VwcyhyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICByZXN0b3JlLmdyb3Vwcy5mb3JFYWNoKChzdG9yZWQsIGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcblxuICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgIHRoaXMuX2FwcGx5R3JvdXAoZ3JvdXAsIHN0b3JlZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgVVJMJ3MgbGlzdCBzb3J0cywgZWFjaCBrZXB0IG9ubHkgZm9yIGEgbGlzdCB0aGUgcmVwb3J0IGhhcyBhbmQgYVxuICAvLyBjb2x1bW4gdGhhdCBsaXN0IGNhbiBiZSBzb3J0ZWQgYnkuXG4gIHByaXZhdGUgX3Jlc3RvcmVMaXN0U29ydHMocmVwb3J0OiBSZXBvcnQsIHJlc3RvcmU6IFJlcG9ydFVybFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IGxpc3RzID0gbmV3IE1hcCh0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpLm1hcCgoY29tcG9uZW50KSA9PiBbY29tcG9uZW50LmlkLCBjb21wb25lbnRdKSk7XG5cbiAgICByZXN0b3JlLmxpc3RTb3J0cy5mb3JFYWNoKChyYXcsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBsaXN0cy5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgY29uc3Qgc29ydCA9IGRlY29kZVNvcnQocmF3KTtcblxuICAgICAgaWYgKGNvbXBvbmVudCAmJiBzb3J0ICYmIHRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGNvbXBvbmVudElkLCBzb3J0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBVUkwncyBsaXN0IHNlYXJjaGVzLCBlYWNoIGtlcHQgb25seSBmb3IgYSBsaXN0IHRoZSByZXBvcnQgaGFzIHRoYXRcbiAgLy8gc2hvd3MgYSBzZWFyY2ggYm94IChsaXN0U2VhcmNoYWJsZSkuIFRoZSB0ZXh0IGlzIHJlYWQgYXMgbGlzdFNlYXJjaFRleHQsXG4gIC8vIGFuZCBhbiBlbXB0eSBvbmUgaXMgbm8gc2VhcmNoLlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdFNlYXJjaGVzKHJlcG9ydDogUmVwb3J0LCByZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgcmVzdG9yZS5saXN0U2VhcmNoZXMuZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IGxpc3RTZWFyY2hUZXh0KHJhdyk7XG5cbiAgICAgIGlmIChjb21wb25lbnQgJiYgdGhpcy5saXN0U2VhcmNoYWJsZShjb21wb25lbnQpICYmIHNlYXJjaCkge1xuICAgICAgICB0aGlzLl9saXN0U2VhcmNoZXMuc2V0KGNvbXBvbmVudElkLCBzZWFyY2gpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGhpZGRlbiBjb2x1bW5zLCBlYWNoIGxpc3QncyBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zOiBvbmx5IHRoZVxuICAvLyBjb25maWd1cmVkIGNvbHVtbnMgb2YgYSBwbGFpbiBsaXN0IHRoZSByZXBvcnQgaGFzLCBhbmQgbm9uZSB3aGVuIHRoZXlcbiAgLy8gd291bGQgaGlkZSBldmVyeSBjb2x1bW4uXG4gIHByaXZhdGUgX3Jlc3RvcmVMaXN0SGlkZGVuKHJlc3RvcmU6IFJlcG9ydFVybFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMubGlzdEhpZGRlbigpKTtcblxuICAgIHJlc3RvcmUubGlzdEhpZGRlbi5mb3JFYWNoKChyYXcsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBoaWRkZW4gPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIGRlY29kZUNvbHVtbkxpc3QocmF3KSk7XG5cbiAgICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICAgIG5leHQuc2V0KGNvbXBvbmVudElkLCBoaWRkZW4pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChuZXh0KTtcbiAgfVxuXG4gIC8vIERyb3BzIHRoZSBzZWFyY2ggb2YgZXZlcnkgbGlzdCB0aGF0IG5vIGxvbmdlciBzaG93cyBhIHNlYXJjaCBib3g6IG9uZVxuICAvLyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMsIG9yIG9uZSB3aG9zZSBoZWFkZXIgbm93IGhhcyBhIGtleXdvcmQgZ3JvdXAuXG4gIHByaXZhdGUgX2Ryb3BVbnNlYXJjaGFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5fbGlzdFNlYXJjaGVzLmZvckVhY2goKHNlYXJjaCwgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk7XG5cbiAgICAgIGlmICghY29tcG9uZW50IHx8ICF0aGlzLmxpc3RTZWFyY2hhYmxlKGNvbXBvbmVudCkpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBEcm9wcyBzdGF0ZSBrZXB0IGZvciBncm91cHMsIGxpc3RzIGFuZCBmaWx0ZXJzIHRoZSByZXBvcnQgbm8gbG9uZ2VyIGhhcy5cbiAgLy8gQSBsaXN0IHNvcnQgYWxzbyBnb2VzIHdoZW4gaXRzIGNvbHVtbiBkb2VzOiB0aGUgYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWVcbiAgLy8gaXQsIGFuZCB0aGUgcmVjcmVhdGVkIGxpc3Qgd291bGQgc2VuZCBhIGNvbHVtbiB0aGUgcXVlcnkgZG9lcyBub3Qga25vdy5cbiAgLy8gQSBsaXN0IHNlYXJjaCBnb2VzIHdpdGggaXRzIGxpc3QgKG9yIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBubyBsb25nZXIgYVxuICAvLyBsaXN0KSwgYW5kIHdoZW4gdGhlIGxpc3QgZ2FpbnMgYSBrZXl3b3JkIGdyb3VwIGFuZCBzbyBsb3NlcyBpdHMgYm94LlxuICAvLyBIaWRkZW4gY29sdW1ucyBrZWVwIG9ubHkgdGhlIG5hbWVzIHRoZWlyIGxpc3Qgc3RpbGwgaGFzIGFzIGNvbHVtbnMgKHRoZVxuICAvLyBhZ2VudCBjYW4gcmVtb3ZlIG9yIHJlbmFtZSBvbmUsIG9yIHR1cm4gdGhlIGxpc3QgaW50byBhIGNyb3NzLXRhYiksIGFuZCBnb1xuICAvLyB3aGVuIHdoYXQgaXMgbGVmdCB3b3VsZCBoaWRlIGV2ZXJ5IGNvbHVtbi5cbiAgcHJpdmF0ZSBfcHJ1bmUocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGdyb3VwSWQgb2YgWy4uLnRoaXMuX3ZhbHVlcy5rZXlzKCksIC4uLnRoaXMuX2NsZWFyZWRdKSB7XG4gICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoZ3JvdXBJZCkpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcbiAgICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdFNvcnRzLmZvckVhY2goKHNvcnQsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5fc29ydGFibGVDb2x1bW5zKGNvbXBvbmVudCkuaW5jbHVkZXMoc29ydC5jb2x1bW4pKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTb3J0cy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVmFsdWVzIGluY2x1ZGVkOiBvbmUgaXMgbmV2ZXIgZHJhd24sIGJ1dCBpdHMgZmlsdGVycyBhcmUgdGhlIHJlcG9ydCdzXG4gICAgLy8gbGlrZSBhbnkgb3RoZXIgY29tcG9uZW50J3MsIGFuZCBzbyBhcmUgdGhlaXIgc2Vzc2lvbiB0b2dnbGVzLlxuICAgIGNvbnN0IGZpbHRlcklkcyA9IG5ldyBTZXQocmVwb3J0Q29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuaWQpKSk7XG5cbiAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZm9yRWFjaCgoZmlsdGVySWQpID0+IHtcbiAgICAgIGlmICghZmlsdGVySWRzLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgTWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+KCk7XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4oKS5mb3JFYWNoKChuYW1lcywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGtlcHQgPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgICAgaWYgKGtlcHQubGVuZ3RoKSB7XG4gICAgICAgIGhpZGRlbi5zZXQoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChoaWRkZW4pO1xuICB9XG5cbiAgLy8gVGhlIHZhbHVlIGEgYmFyIHNldHMsIGtlZXBpbmcgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSB3aGlsZSB0aGUgZGF5cyBhcmVcbiAgLy8gc3RpbGwgdGhlIHN0b3JlZCBkYXlzIChzZWUgc2V0VmFsdWUpLlxuICBwcml2YXRlIF93aXRoUHJlc2V0KHN0b3JlZDogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBGaWx0ZXJHcm91cFZhbHVlIHtcbiAgICBjb25zdCBmaXhlZDogRmlsdGVyR3JvdXBWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICBkZWxldGUgZml4ZWQucHJlc2V0O1xuXG4gICAgcmV0dXJuIHN0b3JlZD8ucHJlc2V0ICYmIHNhbWVEYXlzKHN0b3JlZCwgZml4ZWQpXG4gICAgICA/IHsgLi4uZml4ZWQsIHByZXNldDogc3RvcmVkLnByZXNldCB9XG4gICAgICA6IGZpeGVkO1xuICB9XG5cbiAgLy8gV2hldGhlciBhIHZhbHVlIGlzIHRoZSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIGJ5IHR5cGU6IGEgZGF0ZSByYW5nZSBvblxuICAvLyBpdHMgZGF5cyAodGhlIGRlZmF1bHQgcmVzb2x2ZWQgdG9kYXkpLCBhIHNlbGVjdCBvbiBpdHMgdmFsdWVzIGluIGFueVxuICAvLyBvcmRlciwgYSBrZXl3b3JkIG9uIGl0cyB0ZXh0LlxuICBwcml2YXRlIF9pc0RlZmF1bHQoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG4gICAgaWYgKCFkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIC8vIEFuIHVudG91Y2hlZCByb2xsaW5nIGRlZmF1bHQgc3RpbGwgY2FycmllcyBpdHMgcHJlc2V0IG5hbWUuIEl0cyBkYXlzXG4gICAgICAgIC8vIHdlcmUgcmVzb2x2ZWQgd2hlbiBpdCB3YXMgc2VlZGVkLCBhbmQgYWZ0ZXIgbWlkbmlnaHQgdGhleSBubyBsb25nZXJcbiAgICAgICAgLy8gbWF0Y2ggdG9kYXkncywgYnV0IGl0IGlzIHN0aWxsIHRoZSBkZWZhdWx0IGFuZCBzdGF5cyBvdXQgb2YgdGhlIFVSTC5cbiAgICAgICAgaWYgKHZhbHVlLnByZXNldCAmJiB2YWx1ZS5wcmVzZXQgPT09IGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8ucmVsYXRpdmUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzYW1lRGF5cyh2YWx1ZSwgZGVmYXVsdFZhbHVlKTtcblxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHNhbWVQaWNrcyh2YWx1ZS52YWx1ZXMsIGRlZmF1bHRWYWx1ZS52YWx1ZXMpXG4gICAgICAgICAgJiYgc2FtZVBpY2tzKHZhbHVlLmV4Y2x1ZGVWYWx1ZXMsIGRlZmF1bHRWYWx1ZS5leGNsdWRlVmFsdWVzKTtcblxuICAgICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgICByZXR1cm4gZmluaXRlTnVtYmVyKHZhbHVlLm1pbikgPT09IGZpbml0ZU51bWJlcihkZWZhdWx0VmFsdWUubWluKVxuICAgICAgICAgICYmIGZpbml0ZU51bWJlcih2YWx1ZS5tYXgpID09PSBmaW5pdGVOdW1iZXIoZGVmYXVsdFZhbHVlLm1heCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAodmFsdWUudmFsdWUgPz8gJycpLnRyaW0oKSA9PT0gKGRlZmF1bHRWYWx1ZS52YWx1ZSA/PyAnJykudHJpbSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RDb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiByZXBvcnRDb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0Jyk7XG4gIH1cblxuICAvLyBUaGUgY29sdW1ucyBhIGxpc3QgY2FuIGJlIHNvcnRlZCBieTogZXZlcnkgYXV0aG9yZWQgY29sdW1uLCBvciBhXG4gIC8vIGNyb3NzLXRhYidzIHJvdyBjb2x1bW4gb25seSAoaXRzIHBpdm90IGNvbHVtbnMgY29tZSBhbmQgZ28gd2l0aCB0aGUgZGF0YSkuXG4gIHByaXZhdGUgX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnO1xuXG4gICAgaWYgKGNvbmZpZz8ucGl2b3RCeT8uY29sdW1uKSB7XG4gICAgICByZXR1cm4gY29uZmlnLnJvd0J5Py5jb2x1bW4gPyBbY29uZmlnLnJvd0J5LmNvbHVtbl0gOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNvbmZpZz8uY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+IGNvbHVtbi5jb2x1bW4pO1xuICB9XG5cbiAgLy8gQSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIG1hcHBlZCB0byBhIHNlc3Npb24gdmFsdWUgYnkgdHlwZS4gUmVsYXRpdmVcbiAgLy8gZGF0ZSBwcmVzZXRzIHJlc29sdmUgYWdhaW5zdCBcIm5vd1wiIGVhY2ggdGltZSB0aGUgcmVwb3J0IG9wZW5zLCBzbyBhIHNhdmVkXG4gIC8vIFwibGFzdCAxMiBtb250aHNcIiBzdGF5cyByZWxhdGl2ZSBhbmQgY2FycmllcyBpdHMgcHJlc2V0IG5hbWU7IGEgZml4ZWRcbiAgLy8gcmFuZ2UsIHNlbGVjdCB2YWx1ZXMgYW5kIGtleXdvcmQgdGV4dCBzZWVkIHZlcmJhdGltLlxuICBwcml2YXRlIF9kZWZhdWx0VmFsdWUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICAgIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcbiAgICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yZWxhdGl2ZVJhbmdlKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSk7XG5cbiAgICAgIHJldHVybiByYW5nZSA/IHsgc3RhcnQ6IHJhbmdlLnN0YXJ0LCBlbmQ6IHJhbmdlLmVuZCwgcHJlc2V0OiBncm91cERlZmF1bHQucmVsYXRpdmUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5zdGFydCB8fCBncm91cERlZmF1bHQuZW5kKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/IG51bGwsXG4gICAgICAgIGVuZDogZ3JvdXBEZWZhdWx0LmVuZCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZXM6IGdyb3VwRGVmYXVsdC52YWx1ZXMgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogZ3JvdXBEZWZhdWx0LnZhbHVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVPclJhbmdlRGVmYXVsdChncm91cERlZmF1bHQpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgZ3JvdXAgaW4gaXRzIHN0b3JlZCBzaGFwZTogbnVsbCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcsIGEgZGVmYXVsdFxuICAvLyB0aGUgdmlld2VyIGNsZWFyZWQgaW5jbHVkZWQuXG4gIHByaXZhdGUgX3NuYXBzaG90R3JvdXBzKCk6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cHM6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+ID0ge307XG5cbiAgICB0aGlzLl9ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGdyb3Vwc1tncm91cC5pZF0gPSB0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZClcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICAvLyBFYWNoIHRpbGUncyBzdGF0ZSB3aGVyZSBpdCBkaWZmZXJzIGZyb20gdGhlIGF1dGhvcmVkIHRpbGUuIEEgbGlzdCBzb3J0XG4gIC8vIHRoYXQgaXMgdGhlIGxpc3QncyBhdXRob3JlZCBmaXJzdCB0ZXJtIGlzIGl0cyBkZWZhdWx0LCBub3QgYSBjaG9pY2UuXG4gIHByaXZhdGUgX3NuYXBzaG90VGlsZXMoKTogUmVjb3JkPG51bWJlciwgUmVwb3J0VGlsZVN0YXRlPiB7XG4gICAgY29uc3QgdGlsZXM6IFJlY29yZDxudW1iZXIsIFJlcG9ydFRpbGVTdGF0ZT4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuX3RpbGVzKCkpIHtcbiAgICAgIGNvbnN0IHRpbGU6IFJlcG9ydFRpbGVTdGF0ZSA9IHt9O1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnQuaWQpO1xuICAgICAgY29uc3QgZHJpbGwgPSB0aGlzLmRyaWxsKGNvbXBvbmVudC5pZCk7XG5cbiAgICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICAgIHRpbGUuc29ydCA9IHsgLi4uc29ydCB9O1xuICAgICAgfVxuICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICB0aWxlLnNlYXJjaCA9IHNlYXJjaDtcbiAgICAgIH1cbiAgICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuaGlkZGVuID0gWy4uLmhpZGRlbl07XG4gICAgICB9XG4gICAgICBpZiAoZHJpbGwubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZHJpbGwgPSBkcmlsbC5tYXAoKHN0ZXApID0+ICh7IC4uLnN0ZXAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmtleXModGlsZSkubGVuZ3RoKSB7XG4gICAgICAgIHRpbGVzW2NvbXBvbmVudC5pZF0gPSB0aWxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aWxlcztcbiAgfVxuXG4gIC8vIFRoZSBiYXNlIGFwcGx5KCkgd2FzIGdpdmVuLCBhcHBsaWVkIGFzIHRoZSBzY3JlZW4ncyBzdGF0ZSAodGhlIGNhbGxlclxuICAvLyBhcHBsaWVzIHRoZSBzY3JlZW4ncyBvd24gbGF5ZXIgbmV4dCwgdW5sZXNzIGl0IGlzIHRoZSBzYW1lIGRvY3VtZW50KS5cbiAgLy8gV2hhdCBpcyBrZXB0IGlzIHRoZSBzbmFwc2hvdCBvZiBpdCwgd2l0aCBvbmx5IHRoZSBncm91cHMgaXQgaGVsZDogYVxuICAvLyBncm91cCBpdCBkaWQgbm90IGhvbGQsIG9yIGhlbGQgaW4gYSBzaGFwZSB0aGF0IGRvZXMgbm90IGZpdCwgZm9sbG93cyBpdHNcbiAgLy8gYXV0aG9yZWQgZGVmYXVsdCAodmlld0RpZmZlcnMgY29tcGFyZXMgaXQgd2l0aCBhdXRob3JlZENvbmZpZygpKS5cbiAgcHJpdmF0ZSBfc2V0QmFzZShiYXNlOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGhlbGQgPSB0aGlzLl9hcHBseUxheWVyKGJhc2UsIHRydWUpO1xuXG4gICAgaWYgKCFiYXNlKSB7XG4gICAgICB0aGlzLl9iYXNlQ29uZmlnLnNldChudWxsKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBwYWdlIGlzIHRoZSBiYXNlJ3Mgb3duLCBub3QgdGhlIG9uZSBvbiBzY3JlZW4uXG4gICAgY29uc3QgYXBwbGllZCA9IHRoaXMuc25hcHNob3QoKTtcbiAgICBkZWxldGUgYXBwbGllZC5wYWdlSWQ7XG4gICAgYXBwbGllZC5ncm91cHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXBwbGllZC5ncm91cHMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbZ3JvdXBJZF0pID0+IGhlbGQuaGFzKE51bWJlcihncm91cElkKSkpKTtcblxuICAgIGlmIChiYXNlLnBhZ2VJZCAmJiAodGhpcy5fcmVwb3J0KCk/LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiBwYWdlLmlkID09PSBiYXNlLnBhZ2VJZCkpIHtcbiAgICAgIGFwcGxpZWQucGFnZUlkID0gYmFzZS5wYWdlSWQ7XG4gICAgfVxuXG4gICAgdGhpcy5fYmFzZUNvbmZpZy5zZXQoYXBwbGllZCk7XG4gIH1cblxuICAvLyBBcHBsaWVzIG9uZSBsYXllciBvZiB2aWV3IHN0YXRlIGFuZCBnaXZlcyB0aGUgaWRzIG9mIHRoZSBncm91cHMgaXQgc2V0LlxuICAvLyBBIGJhc2UgbGF5ZXIgKGByZXNldGApIHJlcGxhY2VzIGl0IGFsbDogd2hhdCBgY29uZmlnYCBkb2VzIG5vdCBob2xkIGdvZXNcbiAgLy8gYmFjayB0byB0aGUgYXV0aG9yZWQgcmVwb3J0LiBBIGxpbmsncyBsYXllciBjaGFuZ2VzIG9ubHkgd2hhdCBpdFxuICAvLyBjYXJyaWVzLCBhbmQgYSBrZXkgaXQgY2FycmllcyB0aGF0IGRvZXMgbm90IGZpdCBpcyBpZ25vcmVkLiBOb3RoaW5nIGlzXG4gIC8vIGFubm91bmNlZCBoZXJlOiB0aGUgY2FsbGVyIGFubm91bmNlcyBvbmNlIChfbm90aWZ5QXBwbGllZCkuXG4gIHByaXZhdGUgX2FwcGx5TGF5ZXIoY29uZmlnOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCwgcmVzZXQ6IGJvb2xlYW4pOiBTZXQ8bnVtYmVyPiB7XG4gICAgY29uc3QgaGVsZCA9IHRoaXMuX2FwcGx5R3JvdXBzKGNvbmZpZz8uZ3JvdXBzID8/IHt9LCByZXNldCk7XG5cbiAgICBjb25zdCBtYXRjaCA9IGNvbmZpZz8ubWF0Y2g7XG4gICAgaWYgKHJlc2V0IHx8IG1hdGNoID09PSAnYWxsJyB8fCBtYXRjaCA9PT0gJ2FueScpIHtcbiAgICAgIHRoaXMuX21hdGNoLnNldChtYXRjaCA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cEJ5ID0gY29uZmlnPy5ncm91cEJ5O1xuICAgIGlmIChyZXNldCB8fCBpc0NoYXJ0R3JhbnVsYXJpdHkoZ3JvdXBCeSkpIHtcbiAgICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IGlzQ2hhcnRHcmFudWxhcml0eShncm91cEJ5KSA/IGdyb3VwQnkgOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXNldCkge1xuICAgICAgdGhpcy5fY2xlYXJUaWxlcygpO1xuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKGNvbmZpZz8udGlsZXMgPz8ge30pXG4gICAgICAuZm9yRWFjaCgoW2NvbXBvbmVudElkLCB0aWxlXSkgPT4gdGhpcy5fYXBwbHlUaWxlKE51bWJlcihjb21wb25lbnRJZCksIHRpbGUgPz8ge30pKTtcblxuICAgIHJldHVybiBoZWxkO1xuICB9XG5cbiAgLy8gRWFjaCBncm91cCdzIHZhbHVlIGZyb20gYSBsYXllcjsgb24gYSBiYXNlIGxheWVyIGEgZ3JvdXAgaXQgZG9lcyBub3RcbiAgLy8gc2V0IGdvZXMgYmFjayB0byBpdHMgYXV0aG9yZWQgZGVmYXVsdC4gQSBsaW5rIGNhcnJpZXMgZGF5cywgbmV2ZXIgYVxuICAvLyBwcmVzZXQgbmFtZSwgc28gYSBsaW5rJ3MgZGF5cyB0aGF0IGFyZSB0aGUgYmFzZSdzIHJvbGxpbmcgcmFuZ2UgdG9kYXlcbiAgLy8ga2VlcCBpdCByb2xsaW5nIChfcm9sbGluZ1ZhbHVlKSwgYXMgYW4gdW50b3VjaGVkIHJhbmdlIGRvZXMgaW4gdGhlIGJhci5cbiAgcHJpdmF0ZSBfYXBwbHlHcm91cHMoZ3JvdXBzOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsPiwgcmVzZXQ6IGJvb2xlYW4pOiBTZXQ8bnVtYmVyPiB7XG4gICAgY29uc3QgaGVsZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gICAgdGhpcy5fZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGdyb3VwcywgZ3JvdXAuaWQpICYmIHRoaXMuX2FwcGx5R3JvdXAoZ3JvdXAsIGdyb3Vwc1tncm91cC5pZF0sICFyZXNldCkpIHtcbiAgICAgICAgaGVsZC5hZGQoZ3JvdXAuaWQpO1xuICAgICAgfSBlbHNlIGlmIChyZXNldCkge1xuICAgICAgICB0aGlzLl9zZWVkQXV0aG9yZWQoZ3JvdXApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhlbGQ7XG4gIH1cblxuICAvLyBPbmUgZ3JvdXAncyBzdG9yZWQgdmFsdWUsIG9yIGZhbHNlIHdoZW4gdGhlIGdyb3VwJ3MgdHlwZSBjYW5ub3QgaG9sZCBpdFxuICAvLyAoaXQgaXMgdGhlbiBkcm9wcGVkIHdob2xlLCBhbmQgdGhlIGdyb3VwIHN0YXlzIGFzIHRoZSBsYXllciBiZWxvdyBsZWZ0XG4gIC8vIGl0KS4gbnVsbCwgb3IgYSB2YWx1ZSB0aGF0IGhvbGRzIG5vdGhpbmcsIGNsZWFycyB0aGUgZ3JvdXAuIFdpdGhcbiAgLy8gYGtlZXBSb2xsaW5nYCwgZGF5cyB0aGF0IGFyZSB0aGUgYmFzZSdzIHJvbGxpbmcgcmFuZ2Uga2VlcCBpdHMgbmFtZS5cbiAgcHJpdmF0ZSBfYXBwbHlHcm91cChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHN0b3JlZDogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCwga2VlcFJvbGxpbmcgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtlcHQgPSBzdG9yZWQgPT09IG51bGwgPyB7fSA6IGdyb3VwVmFsdWVGcm9tU3RvcmVkKHN0b3JlZCwgZ3JvdXAudHlwZSk7XG5cbiAgICBpZiAoa2VwdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdG9MaXZlR3JvdXBWYWx1ZShncm91cC50eXBlLCBrZXB0LCAobmFtZSkgPT4gdGhpcy5yZXNvbHZlUmVsYXRpdmUobmFtZSkpO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCBrZWVwUm9sbGluZyA/IHRoaXMuX3dpdGhQcmVzZXQodGhpcy5fcm9sbGluZ1ZhbHVlKGdyb3VwLmlkKSwgdmFsdWUpIDogdmFsdWUpO1xuICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwLmlkKTtcblxuICAgICAgaWYgKGdyb3VwLmNvbmZpZz8uZGVmYXVsdCkge1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmFkZChncm91cC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBUaGUgcm9sbGluZyByYW5nZSBhIGxpbmsncyBkYXlzIGFyZSBjb21wYXJlZCB3aXRoOiB0aGUgb25lIHRoZSBiYXNlXG4gIC8vIGhvbGRzIGZvciB0aGUgZ3JvdXAgKGEgdmlldydzLCByZXNvbHZlZCB0b2RheSksIGVsc2UgdGhlIHZhbHVlIG9uIHNjcmVlblxuICAvLyAodGhlIGF1dGhvcmVkIGRlZmF1bHQgdGhlIGJhc2UgbGF5ZXIgc2VlZGVkKS5cbiAgcHJpdmF0ZSBfcm9sbGluZ1ZhbHVlKGdyb3VwSWQ6IG51bWJlcik6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhlbGQgPSB0aGlzLl9iYXNlQ29uZmlnKCk/Lmdyb3Vwcz8uW2dyb3VwSWRdO1xuXG4gICAgcmV0dXJuIGhlbGQ/LnJlbGF0aXZlXG4gICAgICA/IHRvTGl2ZUdyb3VwVmFsdWUoJ2RhdGVSYW5nZScsIGhlbGQsIChuYW1lKSA9PiB0aGlzLnJlc29sdmVSZWxhdGl2ZShuYW1lKSkgPz8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCk7XG4gIH1cblxuICAvLyBBIGdyb3VwIGJhY2sgYXQgaXRzIGF1dGhvcmVkIGRlZmF1bHQuXG4gIHByaXZhdGUgX3NlZWRBdXRob3JlZChncm91cDogUmVwb3J0RmlsdGVyR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXAuaWQsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgdGlsZSBiYWNrIGF0IGl0cyBhdXRob3JlZCBzdGF0ZS5cbiAgcHJpdmF0ZSBfY2xlYXJUaWxlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9saXN0U29ydHMuY2xlYXIoKTtcbiAgICB0aGlzLl9saXN0U2VhcmNoZXMuY2xlYXIoKTtcbiAgICB0aGlzLmxpc3RIaWRkZW4uc2V0KG5ldyBNYXAoKSk7XG4gICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKCkpO1xuICB9XG5cbiAgLy8gT25lIHRpbGUncyBzdG9yZWQgc3RhdGUsIGVhY2gga2V5IGNoZWNrZWQgYXMgdGhlIFVSTCByZXN0b3JlIGNoZWNrcyBpdDpcbiAgLy8gYSBzb3J0IG9uIGEgY29sdW1uIHRoZSBsaXN0IGNhbiBzb3J0IGJ5LCBhIHNlYXJjaCBvbiBhIGxpc3QgdGhhdCBzaG93c1xuICAvLyB0aGUgYm94LCBoaWRkZW4gY29sdW1ucyB0aGUgbGlzdCBjYW4gaGlkZSwgYSBkcmlsbCBwYXRoIG9uIGEgY2hhcnQuXG4gIHByaXZhdGUgX2FwcGx5VGlsZShjb21wb25lbnRJZDogbnVtYmVyLCB0aWxlOiBSZXBvcnRUaWxlU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgIGlmIChsaXN0KSB7XG4gICAgICB0aGlzLl9hcHBseUxpc3RUaWxlKGxpc3QsIHRpbGUpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRpbGUuZHJpbGwpICYmIHRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpKSB7XG4gICAgICB0aGlzLl9zZXREcmlsbFBhdGgoY29tcG9uZW50SWQsIGNsZWFuRHJpbGxQYXRoKHRpbGUuZHJpbGwpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGxpc3QncyBzb3J0LCBzZWFyY2ggYW5kIGhpZGRlbiBjb2x1bW5zIGZyb20gYSB0aWxlIHN0YXRlLCBrZXB0IGJ5IHRoZVxuICAvLyBydWxlcyBzZXRMaXN0U29ydCwgc2V0TGlzdFNlYXJjaCBhbmQgc2V0SGlkZGVuQ29sdW1ucyBhcHBseSwgYnV0IHNldFxuICAvLyBzdHJhaWdodCBvbiB0aGUgbWFwczogdGhvc2Ugc2V0dGVycyBlYWNoIGFubm91bmNlIGEgY2hhbmdlLCBhbmQgYW4gYXBwbHlcbiAgLy8gYW5ub3VuY2VzIG9uY2UsIGF0IGl0cyBlbmQuIEEgc29ydCB0aGF0IGlzIHRoZSBsaXN0J3MgYXV0aG9yZWQgZmlyc3RcbiAgLy8gdGVybSBpcyBpdHMgZGVmYXVsdCwgc28gaXQgY2xlYXJzIHRoZSBlbnRyeS5cbiAgcHJpdmF0ZSBfYXBwbHlMaXN0VGlsZShsaXN0OiBSZXBvcnRDb21wb25lbnQsIHRpbGU6IFJlcG9ydFRpbGVTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHNvcnQgPSB0aWxlLnNvcnQ7XG5cbiAgICBpZiAoc29ydD8uY29sdW1uICYmIHRoaXMuX3NvcnRhYmxlQ29sdW1ucyhsaXN0KS5pbmNsdWRlcyhzb3J0LmNvbHVtbikpIHtcbiAgICAgIGlmIChzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGxpc3QuY29uZmlnKVswXSA/PyBudWxsKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGxpc3QuaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbGlzdFNvcnRzLnNldChsaXN0LmlkLCB7IC4uLnNvcnQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aWxlLnNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IGxpc3RTZWFyY2hUZXh0KHRpbGUuc2VhcmNoKTtcblxuICAgICAgaWYgKHNlYXJjaCAmJiB0aGlzLmxpc3RTZWFyY2hhYmxlKGxpc3QpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5zZXQobGlzdC5pZCwgc2VhcmNoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUobGlzdC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGlsZS5oaWRkZW4pKSB7XG4gICAgICBjb25zdCBoaWRkZW4gPSBsaXN0SGlkZGVuQ29sdW1ucyhsaXN0LmNvbmZpZywgdGlsZS5oaWRkZW4pO1xuICAgICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5saXN0SGlkZGVuKCkpO1xuXG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICBuZXh0LnNldChsaXN0LmlkLCBoaWRkZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dC5kZWxldGUobGlzdC5pZCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gT25lIGNoYXJ0J3MgZHJpbGwgcGF0aDsgYW4gZW1wdHkgcGF0aCBpcyB0aGUgY2hhcnQncyB0b3AuXG4gIHByaXZhdGUgX3NldERyaWxsUGF0aChjb21wb25lbnRJZDogbnVtYmVyLCBwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMuX2RyaWxscygpKTtcblxuICAgIGlmIChwYXRoLmxlbmd0aCkge1xuICAgICAgbmV4dC5zZXQoY29tcG9uZW50SWQsIHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0LmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZHJpbGxzLnNldChuZXh0KTtcbiAgfVxuXG4gIC8vIFRoZSBwYWdlIGEgbGF5ZXIgbmFtZXMsIHdoZW4gdGhlIHJlcG9ydCBoYXMgaXQuXG4gIHByaXZhdGUgX2FwcGx5UGFnZShwYWdlSWQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAocGFnZUlkICYmICh0aGlzLl9yZXBvcnQoKT8ucGFnZXMgPz8gW10pLnNvbWUoKHBhZ2UpID0+IHBhZ2UuaWQgPT09IHBhZ2VJZCkpIHtcbiAgICAgIHRoaXMuX3BhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZnRlciBhcHBseSgpIG9yIHJlc2V0VG9CYXNlKCk6IGV2ZXJ5IGJhciBhbmQgdGlsZSByZXBhaW50cywgYW5kIHRoZVxuICAvLyB0aW1lLXNlcmllcyBjaGFydHMgcmVmZXRjaCB3aGVuIHRoZSBncmFpbiBtb3ZlZC5cbiAgcHJpdmF0ZSBfbm90aWZ5QXBwbGllZChmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGVWZXJzaW9uLnVwZGF0ZSgodmVyc2lvbikgPT4gdmVyc2lvbiArIDEpO1xuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG5cbiAgICBpZiAoZnJlcXVlbmN5ICE9PSB0aGlzLl9mcmVxdWVuY3kpIHtcbiAgICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgdGlsZXMgb2YgdGhlIHJlcG9ydCBpbml0KCkgbGFzdCByZWFkLlxuICBwcml2YXRlIF90aWxlcygpOiBSZXBvcnRDb21wb25lbnRbXSB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fcmVwb3J0KCk7XG5cbiAgICByZXR1cm4gcmVwb3J0XG4gICAgICA/IHJlcG9ydENvbXBvbmVudHMocmVwb3J0KS5maWx0ZXIoaXNUaWxlKVxuICAgICAgOiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzQ2hhcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl90aWxlcygpXG4gICAgICAuc29tZSgoY29tcG9uZW50KSA9PiBjb21wb25lbnQuaWQgPT09IGNvbXBvbmVudElkICYmIGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnKTtcbiAgfVxuXG4gIC8vIEtlZXBzIHRoZSB2aWV3IHN0YXRlIHRvIHdoYXQgdGhlIHJlcG9ydCAocmUpbG9hZGVkIGJ5IGluaXQoKSBzdGlsbCBoYXM6XG4gIC8vIGRyaWxsIHBhdGhzIG9uIGNoYXJ0cyBpdCBzdGlsbCBoYXMsIHRoZSBwYWdlIHdoaWxlIGl0IGhhcyBpdCwgYW5kIHRoZVxuICAvLyBiYXNlIHRvIHdoYXQgdGhlIHNjcmVlbiBjYW4gc3RpbGwgc2hvdyAoX3BydW5lQmFzZSkuIE9uIGFub3RoZXIgcmVwb3J0IGl0XG4gIC8vIHN0YXJ0cyBhZ2Fpbjogbm8gb3BlbiB2aWV3LCBtYXRjaCAnYWxsJywgbm8gZHJpbGwgYW5kIG5vdGhpbmcgdGVtcG9yYXJ5LlxuICBwcml2YXRlIF9wcnVuZVZpZXdTdGF0ZShyZXBvcnQ6IFJlcG9ydCwgcHJldmlvdXNHcm91cHM6IFJlYWRvbmx5TWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3JlcG9ydCgpPy5pZCAhPT0gcmVwb3J0LmlkKSB7XG4gICAgICB0aGlzLl9iYXNlQ29uZmlnLnNldChudWxsKTtcbiAgICAgIHRoaXMuX21hdGNoLnNldCgnYWxsJyk7XG4gICAgICB0aGlzLl9wYWdlSWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKCkpO1xuICAgICAgdGhpcy5fdGVtcG9yYXJ5LnNldChlbXB0eVRlbXBvcmFyeVN0YXRlKCkpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcG9ydC5zZXQocmVwb3J0KTtcbiAgICB0aGlzLl9kcmlsbHMuc2V0KG5ldyBNYXAoWy4uLnRoaXMuX2RyaWxscygpXVxuICAgICAgLmZpbHRlcigoW2NvbXBvbmVudElkXSkgPT4gdGhpcy5faXNDaGFydChjb21wb25lbnRJZCkpKSk7XG5cbiAgICBpZiAodGhpcy5fcGFnZUlkKCkgJiYgIShyZXBvcnQucGFnZXMgPz8gW10pLnNvbWUoKHBhZ2UpID0+IHBhZ2UuaWQgPT09IHRoaXMuX3BhZ2VJZCgpKSkge1xuICAgICAgdGhpcy5fcGFnZUlkLnNldChudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcnVuZUJhc2UocHJldmlvdXNHcm91cHMpO1xuICB9XG5cbiAgLy8gS2VlcHMgdGhlIGJhc2UgdG8gd2hhdCB0aGUgc2NyZWVuIGNhbiBzdGlsbCBzaG93LCBieSB0aGUgcnVsZXMgdGhlIGxpdmVcbiAgLy8gc3RhdGUgaXMgcHJ1bmVkIGJ5IChfcHJ1bmUsIF9zZWVkIGFuZCB0aGUgZHJpbGwgcHJ1bmluZyBhYm92ZSksIHNvIGFuXG4gIC8vIGVkaXQgb2YgdGhlIHJlcG9ydCBhbG9uZSBuZXZlciByZWFkcyBhcyAnKGVkaXRlZCknLiBBIGdyb3VwIHdob3NlXG4gIC8vIGF1dGhvcmVkIGRlZmF1bHQgY2hhbmdlZCBsZWF2ZXMgdGhlIGJhc2UgYW5kIGZvbGxvd3MgdGhlIG5ldyBkZWZhdWx0LFxuICAvLyBhcyB0aGUgbGl2ZSB2YWx1ZSBkb2VzIChfc2VlZCByZS1zZWVkcyBpdCk7IHNvIGRvZXMgYSBncm91cCB0aGUgcmVwb3J0XG4gIC8vIG5vIGxvbmdlciBoYXMuIEVhY2ggdGlsZSBrZWVwcyBvbmx5IHRoZSBzdGF0ZSBpdHMgY29tcG9uZW50IGNhbiBzdGlsbFxuICAvLyB0YWtlIChfYmFzZVRpbGUpLlxuICBwcml2YXRlIF9wcnVuZUJhc2UocHJldmlvdXNHcm91cHM6IFJlYWRvbmx5TWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KTogdm9pZCB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuX2Jhc2VDb25maWcoKTtcbiAgICBpZiAoIWJhc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYmFzZS5ncm91cHMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbZ3JvdXBJZF0pID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KE51bWJlcihncm91cElkKSk7XG5cbiAgICAgICAgcmV0dXJuICEhZ3JvdXBcbiAgICAgICAgICAmJiBzYW1lRGVmYXVsdChwcmV2aW91c0dyb3Vwcy5nZXQoZ3JvdXAuaWQpPy5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCwgZ3JvdXAuY29uZmlnPy5kZWZhdWx0ID8/IG51bGwpO1xuICAgICAgfSkpO1xuXG4gICAgY29uc3QgdGlsZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYmFzZS50aWxlcyA/PyB7fSlcbiAgICAgIC5tYXAoKFtjb21wb25lbnRJZCwgdGlsZV0pID0+IFtjb21wb25lbnRJZCwgdGhpcy5fYmFzZVRpbGUoTnVtYmVyKGNvbXBvbmVudElkKSwgdGlsZSldIGFzIGNvbnN0KVxuICAgICAgLmZpbHRlcigoWywgdGlsZV0pID0+IE9iamVjdC5rZXlzKHRpbGUpLmxlbmd0aCkpO1xuXG4gICAgY29uc3QgcHJ1bmVkOiBSZXBvcnRWaWV3Q29uZmlnID0geyAuLi5iYXNlLCBncm91cHMgfTtcbiAgICBkZWxldGUgcHJ1bmVkLnRpbGVzO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRpbGVzKS5sZW5ndGgpIHtcbiAgICAgIHBydW5lZC50aWxlcyA9IHRpbGVzO1xuICAgIH1cblxuICAgIHRoaXMuX2Jhc2VDb25maWcuc2V0KHBydW5lZCk7XG4gIH1cblxuICAvLyBBIGJhc2UgdGlsZSdzIHN0YXRlLCBrZXB0IHRvIHdoYXQgaXRzIGNvbXBvbmVudCBjYW4gc3RpbGwgdGFrZTogYSBzb3J0XG4gIC8vIG9uIGEgY29sdW1uIHRoZSBsaXN0IGNhbiBzdGlsbCBzb3J0IGJ5IHRoYXQgaXMgbm90IG5vdyBpdHMgYXV0aG9yZWRcbiAgLy8gZmlyc3QgdGVybSwgYSBzZWFyY2ggd2hpbGUgdGhlIGxpc3Qgc2hvd3MgdGhlIGJveCwgdGhlIGhpZGRlbiBjb2x1bW5zXG4gIC8vIHRoZSBsaXN0IHN0aWxsIGhhcywgYSBkcmlsbCBwYXRoIHdoaWxlIHRoZSBjb21wb25lbnQgaXMgYSBjaGFydC5cbiAgcHJpdmF0ZSBfYmFzZVRpbGUoY29tcG9uZW50SWQ6IG51bWJlciwgdGlsZTogUmVwb3J0VGlsZVN0YXRlKTogUmVwb3J0VGlsZVN0YXRlIHtcbiAgICBjb25zdCBrZXB0OiBSZXBvcnRUaWxlU3RhdGUgPSB7fTtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICBjb25zdCBoaWRkZW4gPSBsaXN0ICYmIHRpbGUuaGlkZGVuID8gbGlzdEhpZGRlbkNvbHVtbnMobGlzdC5jb25maWcsIHRpbGUuaGlkZGVuKSA6IFtdO1xuXG4gICAgaWYgKGxpc3QgJiYgdGlsZS5zb3J0ICYmIHRoaXMuX3NvcnRhYmxlQ29sdW1ucyhsaXN0KS5pbmNsdWRlcyh0aWxlLnNvcnQuY29sdW1uKVxuICAgICAgJiYgIXNhbWVTb3J0KHRpbGUuc29ydCwgbGlzdFNvcnRUZXJtcyhsaXN0LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgIGtlcHQuc29ydCA9IHRpbGUuc29ydDtcbiAgICB9XG4gICAgaWYgKGxpc3QgJiYgdGlsZS5zZWFyY2ggJiYgdGhpcy5saXN0U2VhcmNoYWJsZShsaXN0KSkge1xuICAgICAga2VwdC5zZWFyY2ggPSB0aWxlLnNlYXJjaDtcbiAgICB9XG4gICAgaWYgKGhpZGRlbi5sZW5ndGgpIHtcbiAgICAgIGtlcHQuaGlkZGVuID0gaGlkZGVuO1xuICAgIH1cbiAgICBpZiAodGlsZS5kcmlsbD8ubGVuZ3RoICYmIHRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpKSB7XG4gICAgICBrZXB0LmRyaWxsID0gdGlsZS5kcmlsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ga2VwdDtcbiAgfVxuXG4gIC8vIEEgc2VsZWN0J3MgdmFsdWVzIHRvIGxlYXZlIG91dCAob25seSB3aGVuIGl0IGtlZXBzIG5vbmUpIGFuZCBhIG51bWJlclxuICAvLyByYW5nZSdzIGVuZHMsIGFuIG9wZW4gZW5kIGxlZnQgb3V0IGFuZCAwIGtlcHQsIHdyaXR0ZW4gb250byBgZmllbGRzYC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZUV4Y2x1ZGVBbmRSYW5nZSh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSwgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aCAmJiAhZmllbGRzLnZhbHVlcykge1xuICAgICAgZmllbGRzLmV4Y2x1ZGVWYWx1ZXMgPSB2YWx1ZS5leGNsdWRlVmFsdWVzO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbiA9IGZpbml0ZU51bWJlcih2YWx1ZS5taW4pO1xuICAgIGNvbnN0IG1heCA9IGZpbml0ZU51bWJlcih2YWx1ZS5tYXgpO1xuXG4gICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZHMubWluID0gbWluO1xuICAgIH1cbiAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpZWxkcy5tYXggPSBtYXg7XG4gICAgfVxuICB9XG5cbiAgLy8gQW4gYXV0aG9yZWQgZGVmYXVsdCB0aGF0IGxlYXZlcyBzZWxlY3QgdmFsdWVzIG91dCwgb3IgYSBudW1iZXIgcmFuZ2Unc1xuICAvLyBlbmRzICgwIGtlcHQpLCBhcyBhIHNlc3Npb24gdmFsdWU7IG51bGwgd2hlbiBpdCBob2xkcyBuZWl0aGVyLlxuICBwcml2YXRlIF9leGNsdWRlT3JSYW5nZURlZmF1bHQoZ3JvdXBEZWZhdWx0OiBGaWx0ZXJHcm91cERlZmF1bHQpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gICAgaWYgKGdyb3VwRGVmYXVsdC5leGNsdWRlVmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IGV4Y2x1ZGVWYWx1ZXM6IGdyb3VwRGVmYXVsdC5leGNsdWRlVmFsdWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWluID0gZmluaXRlTnVtYmVyKGdyb3VwRGVmYXVsdC5taW4pO1xuICAgIGNvbnN0IG1heCA9IGZpbml0ZU51bWJlcihncm91cERlZmF1bHQubWF4KTtcblxuICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCAmJiBtYXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihtaW4gIT09IHVuZGVmaW5lZCA/IHsgbWluIH0gOiB7fSksXG4gICAgICAuLi4obWF4ICE9PSB1bmRlZmluZWQgPyB7IG1heCB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvLyBDb3VudHMgYSByZXNldCBmb3IgZWFjaCBsaXN0IHdob3NlIHNvcnQgaXMgbm90IHRoZSBvbmUgaXQgaGFkIChgYmVmb3JlYCxcbiAgLy8gdGhlIHNvcnRzIGJ5IGxpc3QgYmVmb3JlIHRoZSByZXNldCkuIEEgc29ydCBhIGxpc3QgbG9zdCBhbmQgb25lIGl0XG4gIC8vIGdhaW5lZCBib3RoIGNvdW50OyB0aGUgYXV0aG9yZWQgc29ydCBpcyBubyBlbnRyeSBlaXRoZXIgc2lkZS5cbiAgcHJpdmF0ZSBfY291bnRTb3J0UmVzZXRzKGJlZm9yZTogUmVhZG9ubHlNYXA8bnVtYmVyLCBSZXBvcnRTb3J0Pik6IHZvaWQge1xuICAgIGNvbnN0IG1vdmVkID0gWy4uLm5ldyBTZXQoWy4uLmJlZm9yZS5rZXlzKCksIC4uLnRoaXMuX2xpc3RTb3J0cy5rZXlzKCldKV1cbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgIGNvbnN0IHdhcyA9IGJlZm9yZS5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgICBjb25zdCBub3cgPSB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudElkKSA/PyBudWxsO1xuXG4gICAgICAgIHJldHVybiB3YXMgPyAhc2FtZVNvcnQod2FzLCBub3cpIDogbm93ICE9PSBudWxsO1xuICAgICAgfSk7XG5cbiAgICBpZiAoIW1vdmVkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBNYXAodGhpcy5fbGlzdFNvcnRSZXNldHMoKSk7XG4gICAgbW92ZWQuZm9yRWFjaCgoY29tcG9uZW50SWQpID0+IGNvdW50cy5zZXQoY29tcG9uZW50SWQsIChjb3VudHMuZ2V0KGNvbXBvbmVudElkKSA/PyAwKSArIDEpKTtcbiAgICB0aGlzLl9saXN0U29ydFJlc2V0cy5zZXQoY291bnRzKTtcbiAgfVxufVxuIl19
|