@firestitch/report 18.10.2 → 18.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -1
  2. package/app/reports/data/report.data.d.ts +8 -12
  3. package/app/reports/export/report-export-collector.service.d.ts +0 -1
  4. package/app/reports/export/report-filter-lines.d.ts +0 -2
  5. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +0 -2
  6. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -3
  7. package/app/reports/interfaces/report-saved-filter-changes.interface.d.ts +4 -0
  8. package/app/reports/interfaces/report-saved-filter.interface.d.ts +6 -0
  9. package/app/reports/interfaces/{report-view-config.interface.d.ts → report-state-snapshot.interface.d.ts} +1 -2
  10. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -1
  11. package/app/reports/report-chat-viewer-state.d.ts +3 -3
  12. package/app/reports/report-saved-filters.d.ts +3 -0
  13. package/app/reports/report-state.d.ts +15 -0
  14. package/app/reports/services/report-filter-state.service.d.ts +9 -25
  15. package/app/reports/tile-data-state.d.ts +5 -5
  16. package/app/reports/views/report/fs-ai-report.component.d.ts +12 -5
  17. package/esm2022/app/reports/canvas-landing-page.mjs +3 -3
  18. package/esm2022/app/reports/components/component-list/component-list.component.mjs +3 -3
  19. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +8 -12
  20. package/esm2022/app/reports/components/report-component/report-component.component.mjs +25 -30
  21. package/esm2022/app/reports/data/report.data.mjs +24 -41
  22. package/esm2022/app/reports/export/report-export-collector.service.mjs +11 -18
  23. package/esm2022/app/reports/export/report-filter-lines.mjs +5 -15
  24. package/esm2022/app/reports/filter-settings-rules.mjs +2 -2
  25. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
  26. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  27. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
  28. package/esm2022/app/reports/interfaces/report-saved-filter-changes.interface.mjs +2 -0
  29. package/esm2022/app/reports/interfaces/report-saved-filter.interface.mjs +2 -0
  30. package/esm2022/app/reports/interfaces/report-state-snapshot.interface.mjs +2 -0
  31. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
  32. package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +1 -1
  33. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +1 -1
  34. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  35. package/esm2022/app/reports/mark-click.mjs +2 -2
  36. package/esm2022/app/reports/report-chat-viewer-state.mjs +3 -3
  37. package/esm2022/app/reports/report-date-presets.mjs +2 -2
  38. package/esm2022/app/reports/report-saved-filters.mjs +92 -0
  39. package/esm2022/app/reports/report-state.mjs +169 -0
  40. package/esm2022/app/reports/report-viewer-features.mjs +2 -4
  41. package/esm2022/app/reports/services/report-filter-state.service.mjs +83 -310
  42. package/esm2022/app/reports/tile-data-state.mjs +4 -4
  43. package/esm2022/app/reports/tile-loads.mjs +5 -6
  44. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +192 -102
  45. package/esm2022/app/reports/views/report/report.component.mjs +14 -16
  46. package/esm2022/public_api.mjs +4 -8
  47. package/fesm2022/{firestitch-report-echarts-CyHkFToO.mjs → firestitch-report-echarts-B0RWUjR8.mjs} +2 -2
  48. package/fesm2022/{firestitch-report-echarts-CyHkFToO.mjs.map → firestitch-report-echarts-B0RWUjR8.mjs.map} +1 -1
  49. package/fesm2022/{firestitch-report-firestitch-report-DftB7M1o.mjs → firestitch-report-firestitch-report-CJW0lLdW.mjs} +480 -1450
  50. package/fesm2022/firestitch-report-firestitch-report-CJW0lLdW.mjs.map +1 -0
  51. package/fesm2022/firestitch-report.mjs +1 -1
  52. package/package.json +1 -1
  53. package/public_api.d.ts +3 -7
  54. package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +0 -21
  55. package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +0 -13
  56. package/app/reports/interfaces/report-view-create.interface.d.ts +0 -7
  57. package/app/reports/interfaces/report-view-deleted.interface.d.ts +0 -4
  58. package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +0 -7
  59. package/app/reports/interfaces/report-view-dropped.interface.d.ts +0 -5
  60. package/app/reports/interfaces/report-view-menu-item.interface.d.ts +0 -10
  61. package/app/reports/interfaces/report-view-summary.interface.d.ts +0 -11
  62. package/app/reports/interfaces/report-view.interface.d.ts +0 -7
  63. package/app/reports/interfaces/report-views.interface.d.ts +0 -7
  64. package/app/reports/report-view-config.d.ts +0 -34
  65. package/app/reports/report-view-menu.d.ts +0 -15
  66. package/app/reports/services/report-view.service.d.ts +0 -39
  67. package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +0 -115
  68. package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +0 -52
  69. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +0 -2
  70. package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +0 -2
  71. package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +0 -2
  72. package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +0 -2
  73. package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +0 -2
  74. package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +0 -2
  75. package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +0 -2
  76. package/esm2022/app/reports/interfaces/report-view.interface.mjs +0 -2
  77. package/esm2022/app/reports/interfaces/report-views.interface.mjs +0 -2
  78. package/esm2022/app/reports/report-view-config.mjs +0 -587
  79. package/esm2022/app/reports/report-view-menu.mjs +0 -119
  80. package/esm2022/app/reports/services/report-view.service.mjs +0 -218
  81. package/fesm2022/firestitch-report-firestitch-report-DftB7M1o.mjs.map +0 -1
@@ -46,7 +46,6 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
46
46
  readonly masterMode: WritableSignal<boolean>;
47
47
  groups: Map<number, ReportFilterGroup>;
48
48
  readonly selectedComponentId: WritableSignal<number>;
49
- readonly appliedVersion: import("@angular/core").Signal<number>;
50
49
  readonly activePageComponents: import("@angular/core").Signal<ReportComponent[]>;
51
50
  readonly masterComponents: import("@angular/core").Signal<ReportComponent[]>;
52
51
  readonly pageTokens: import("@angular/core").Signal<TextTokenContext>;
@@ -4,10 +4,8 @@ import { ReportExportLine } from '../interfaces/report-export-line.interface';
4
4
  import { ReportFilterGroupChanges } from '../interfaces/report-filter-group-changes.interface';
5
5
  import { ReportFilterOptionsRequest } from '../interfaces/report-filter-options-request.interface';
6
6
  import { ReportFilterOptions } from '../interfaces/report-filter-options.interface';
7
- import { ReportViewCreate } from '../interfaces/report-view-create.interface';
8
- import { ReportViewDeleted } from '../interfaces/report-view-deleted.interface';
9
- import { ReportView } from '../interfaces/report-view.interface';
10
- import { ReportViews } from '../interfaces/report-views.interface';
7
+ import { ReportSavedFilterChanges } from '../interfaces/report-saved-filter-changes.interface';
8
+ import { ReportSavedFilter } from '../interfaces/report-saved-filter.interface';
11
9
  import { ChartGranularity, ComponentDataState, ComponentExportResponse, ReportComponentSql, ReportLocales, ReportPageValue, ReportTree, ResolvedFilterValue } from '../interfaces/report.interface';
12
10
  import * as i0 from "@angular/core";
13
11
  export declare class ReportData<T = any> {
@@ -58,7 +56,7 @@ export declare class ReportData<T = any> {
58
56
  componentData(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, isExport?: boolean, config?: RequestConfig): Observable<T>;
59
57
  pageValues(reportId: number, pageId: number, filters?: ResolvedFilterValue[], isExport?: boolean, config?: RequestConfig, matchAnyGroupIds?: number[]): Observable<ReportPageValue[]>;
60
58
  exportComponent(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, title?: string, config?: RequestConfig): Observable<ComponentExportResponse>;
61
- exportReport(reportId: number, filters?: ResolvedFilterValue[], pageId?: number | null, frequency?: ChartGranularity | null, filterLines?: ReportExportLine[], states?: Record<number, ComponentDataState>, viewId?: number | null, viewChanged?: boolean, titles?: Record<number, string>, config?: RequestConfig): Observable<T>;
59
+ exportReport(reportId: number, filters?: ResolvedFilterValue[], pageId?: number | null, frequency?: ChartGranularity | null, filterLines?: ReportExportLine[], states?: Record<number, ComponentDataState>, titles?: Record<number, string>, config?: RequestConfig): Observable<T>;
62
60
  filterOptions(reportId: number, filterId: number, config?: RequestConfig): Observable<T>;
63
61
  componentSql(reportId: number, componentId: number, config?: RequestConfig): Observable<ReportComponentSql>;
64
62
  componentColumns(reportId: number, componentId: number, config?: RequestConfig): Observable<T>;
@@ -90,13 +88,11 @@ export declare class ReportData<T = any> {
90
88
  }, config?: RequestConfig): Observable<T>;
91
89
  updateFilterGroup(reportId: number, groupId: number, changes: ReportFilterGroupChanges, config?: RequestConfig): Observable<T>;
92
90
  filterOptionsNarrowed(reportId: number, filterId: number, body: ReportFilterOptionsRequest, config?: RequestConfig): Observable<ReportFilterOptions>;
93
- views(reportId: number, config?: RequestConfig): Observable<ReportViews>;
94
- view(reportId: number, reportViewId: number, config?: RequestConfig): Observable<ReportView>;
95
- createView(reportId: number, view: ReportViewCreate, config?: RequestConfig): Observable<ReportView>;
96
- updateView(reportId: number, reportViewId: number, changes: Partial<Pick<ReportViewCreate, 'name' | 'config'>>, config?: RequestConfig): Observable<ReportView>;
97
- deleteView(reportId: number, reportViewId: number, config?: RequestConfig): Observable<ReportViewDeleted>;
98
- shareView(reportId: number, reportViewId: number, shared: boolean, config?: RequestConfig): Observable<ReportView>;
99
- setViewDefault(reportId: number, reportViewId: number, personalDefault: boolean, config?: RequestConfig): Observable<ReportView>;
91
+ savedFilters(reportId: number, config?: RequestConfig): Observable<ReportSavedFilter[]>;
92
+ createSavedFilter(reportId: number, savedFilter: Required<ReportSavedFilterChanges>, config?: RequestConfig): Observable<ReportSavedFilter>;
93
+ updateSavedFilter(reportId: number, reportSavedFilterId: number, changes: ReportSavedFilterChanges, config?: RequestConfig): Observable<ReportSavedFilter>;
94
+ deleteSavedFilter(reportId: number, reportSavedFilterId: number, config?: RequestConfig): Observable<ReportSavedFilter>;
95
+ saveSavedFilterPositions(reportId: number, reportSavedFilterIds: number[], config?: RequestConfig): Observable<ReportSavedFilter[]>;
100
96
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportData<any>, never>;
101
97
  static ɵprov: i0.ɵɵInjectableDeclaration<ReportData<any>>;
102
98
  }
@@ -91,7 +91,6 @@ export declare class ReportExportCollectorService {
91
91
  private _reportData;
92
92
  private _filterState;
93
93
  private _filterOptions;
94
- private _views;
95
94
  collect(report: Report, listRows: number): Observable<CollectedReport>;
96
95
  snapshot(report: Report): ReportExportSnapshot;
97
96
  exportWording(report: Report, snapshot: ReportExportSnapshot, pageId?: number | null): Observable<ReportExportWording>;
@@ -5,7 +5,6 @@ import { ReportExportLinesInput } from '../interfaces/report-export-lines-input.
5
5
  import { ReportFilterLineContext } from '../interfaces/report-filter-line-context.interface';
6
6
  import { ReportFilterLineForm } from '../interfaces/report-filter-line-form.type';
7
7
  import { ReportFilterMatch } from '../interfaces/report-filter-match.type';
8
- import { ReportViewSummary } from '../interfaces/report-view-summary.interface';
9
8
  import { FilterGroupValue, Report, ReportComponent, ReportFilterGroup, ReportFormatContext } from '../interfaces/report.interface';
10
9
  export declare const MATCH_ANY_CHIP = "Match: any filter";
11
10
  export declare const MATCH_ANY_LINE = "Filters in the report bar: match any";
@@ -16,6 +15,5 @@ export declare function excludes(value: FilterGroupValue | null | undefined): bo
16
15
  export declare function valuePicks(value: FilterGroupValue | null | undefined): unknown[];
17
16
  export declare function matchLineText(match: ReportFilterMatch | null | undefined, form: ReportFilterLineForm): string | null;
18
17
  export declare function drillLineText(component: Pick<ReportComponent, 'title'>, path: readonly ReportDrillStep[], formatContext: Pick<ReportFormatContext, 'locale'>): string;
19
- export declare function viewLineText(view: Pick<ReportViewSummary, 'name' | 'shared'> | null | undefined, changed: boolean): string | null;
20
18
  export declare function exportLines(input: ReportExportLinesInput): Observable<ReportExportLine[]>;
21
19
  export declare function exportGroups(report: Report, pageId: number | null): ReportFilterGroup[];
@@ -10,8 +10,6 @@ export interface ReportChatViewerState {
10
10
  selectedComponentId: number | null;
11
11
  filters: ReportChatViewerFilter[];
12
12
  match?: ReportFilterMatch;
13
- viewId?: number | null;
14
- viewChanged?: boolean;
15
13
  crossFilters?: ReportChatViewerCrossFilter[];
16
14
  drills?: ReportChatViewerDrill[];
17
15
  detail?: ReportChatViewerDetail | null;
@@ -1,8 +1,8 @@
1
- import { ReportViewConfig } from './report-view-config.interface';
1
+ import { ReportStateSnapshot } from './report-state-snapshot.interface';
2
2
  import { ReportViewerFeature } from './report-viewer-feature.type';
3
3
  import { ChartGranularity, ComponentDataState, FilterGroupValue, ReportFormatContext, ReportRelativeRange, ResolvedFilterValue } from './report.interface';
4
4
  export interface ReportExportSnapshot {
5
- view: ReportViewConfig;
5
+ state: ReportStateSnapshot;
6
6
  values: Record<number, FilterGroupValue>;
7
7
  presets: Record<number, ReportRelativeRange>;
8
8
  filters: Record<number, ResolvedFilterValue[]>;
@@ -11,5 +11,4 @@ export interface ReportExportSnapshot {
11
11
  frequency: ChartGranularity | null;
12
12
  features: ReportViewerFeature[];
13
13
  formatContext: ReportFormatContext;
14
- viewLine: string | null;
15
14
  }
@@ -0,0 +1,4 @@
1
+ export interface ReportSavedFilterChanges {
2
+ name?: string;
3
+ filters?: Record<string, unknown>;
4
+ }
@@ -0,0 +1,6 @@
1
+ export interface ReportSavedFilter {
2
+ id: number;
3
+ name: string;
4
+ filters: Record<string, unknown>;
5
+ order?: number;
6
+ }
@@ -1,8 +1,7 @@
1
1
  import { ReportFilterMatch } from './report-filter-match.type';
2
2
  import { ReportTileState } from './report-tile-state.interface';
3
3
  import { ChartGranularity, FilterGroupDefault } from './report.interface';
4
- export interface ReportViewConfig {
5
- v: number;
4
+ export interface ReportStateSnapshot {
6
5
  pageId?: number;
7
6
  groupBy?: ChartGranularity;
8
7
  match?: ReportFilterMatch;
@@ -1 +1 @@
1
- export type ReportViewerFeature = 'excludeValues' | 'numberRange' | 'matchAny' | 'pageScope' | 'cascadingOptions' | 'scopeFilters' | 'views' | 'drill' | 'crossFilter' | 'detail';
1
+ export type ReportViewerFeature = 'excludeValues' | 'numberRange' | 'matchAny' | 'pageScope' | 'cascadingOptions' | 'scopeFilters' | 'drill' | 'crossFilter' | 'detail';
@@ -1,8 +1,8 @@
1
1
  import { ReportChatViewerDrill } from './interfaces/report-chat-viewer-drill.interface';
2
2
  import { ReportChatViewerState } from './interfaces/report-chat-viewer-state.interface';
3
- import { ReportViewConfig } from './interfaces/report-view-config.interface';
3
+ import { ReportStateSnapshot } from './interfaces/report-state-snapshot.interface';
4
4
  import { ReportLocaleTag } from './interfaces/report.interface';
5
5
  export declare const CHAT_DRILLS_MAX = 10;
6
6
  export declare const CHAT_LABEL_MAX = 100;
7
- export declare function chatViewerMatch(snapshot: ReportViewConfig): Pick<ReportChatViewerState, 'match'>;
8
- export declare function chatViewerDrills(snapshot: ReportViewConfig, locale: ReportLocaleTag): ReportChatViewerDrill[];
7
+ export declare function chatViewerMatch(snapshot: ReportStateSnapshot): Pick<ReportChatViewerState, 'match'>;
8
+ export declare function chatViewerDrills(snapshot: ReportStateSnapshot, locale: ReportLocaleTag): ReportChatViewerDrill[];
@@ -0,0 +1,3 @@
1
+ import { ReportFilterGroup } from './interfaces/report.interface';
2
+ export declare function savedFilterGroups(groups: readonly ReportFilterGroup[] | null | undefined): ReportFilterGroup[];
3
+ export declare function savedFilterValues(filters: Record<string, unknown> | null | undefined, groups: readonly ReportFilterGroup[]): Record<string, unknown>;
@@ -0,0 +1,15 @@
1
+ import { ReportDrillStep } from './interfaces/report-drill-step.interface';
2
+ import { ReportStateSnapshot } from './interfaces/report-state-snapshot.interface';
3
+ import { ChartGranularity, FilterGroupDefault, FilterGroupValue, ReportFilterType, ReportRelativeRange } from './interfaces/report.interface';
4
+ export declare const DRILL_MAX_DEPTH = 5;
5
+ export declare const RELATIVE_RANGE_NAMES: ReportRelativeRange[];
6
+ export declare function isRelativeRange(name: unknown): name is ReportRelativeRange;
7
+ export declare function isChartGranularity(value: unknown): value is ChartGranularity;
8
+ export declare function isCalendarDay(text: string): boolean;
9
+ export declare function numberFromText(text: string): number | null;
10
+ export declare function toStoredGroupValue(type: ReportFilterType, value: FilterGroupValue | null | undefined): FilterGroupDefault | null;
11
+ export declare function stateDiffers(defaults: ReportStateSnapshot, current: ReportStateSnapshot): boolean;
12
+ export declare function sameStoredGroupValue(a: FilterGroupDefault | null | undefined, b: FilterGroupDefault | null | undefined): boolean;
13
+ export declare function cleanDrillPath(path: readonly unknown[] | null | undefined): ReportDrillStep[];
14
+ export declare function sameDrillPath(a: readonly ReportDrillStep[] | null | undefined, b: readonly ReportDrillStep[] | null | undefined): boolean;
15
+ export declare function finiteNumber(value: unknown): number | undefined;
@@ -2,7 +2,7 @@ import { Observable } from 'rxjs';
2
2
  import { ReportChatViewerFilter } from '../interfaces/report-chat-viewer-filter.interface';
3
3
  import { ReportDrillStep } from '../interfaces/report-drill-step.interface';
4
4
  import { ReportFilterMatch } from '../interfaces/report-filter-match.type';
5
- import { ReportViewConfig } from '../interfaces/report-view-config.interface';
5
+ import { ReportStateSnapshot } from '../interfaces/report-state-snapshot.interface';
6
6
  import { ChartGranularity, FilterGroupDefault, FilterGroupValue, Report, ReportComponent, ReportFilterGroup, ReportFormatContext, ReportRelativeRange, ReportSort, ResolvedFilterValue } from '../interfaces/report.interface';
7
7
  import { ComponentDataState } from '../interfaces/report.interface';
8
8
  import * as i0 from "@angular/core";
@@ -22,14 +22,12 @@ export declare class ReportFilterStateService {
22
22
  readonly formatContext: import("@angular/core").WritableSignal<ReportFormatContext>;
23
23
  readonly listHidden: import("@angular/core").WritableSignal<ReadonlyMap<number, readonly string[]>>;
24
24
  readonly stateVersion: import("@angular/core").Signal<number>;
25
- readonly appliedVersion: import("@angular/core").Signal<number>;
26
25
  readonly listSortResets: import("@angular/core").Signal<ReadonlyMap<number, number>>;
27
26
  readonly page: import("@angular/core").Signal<number>;
28
27
  readonly match: import("@angular/core").Signal<ReportFilterMatch>;
29
28
  readonly viewerFeatures: import("@angular/core").Signal<import("@firestitch/report").ReportViewerFeature[]>;
30
29
  readonly report: import("@angular/core").Signal<Report>;
31
- readonly base: import("@angular/core").Signal<ReportViewConfig>;
32
- readonly viewChanged: import("@angular/core").Signal<boolean>;
30
+ readonly differsFromDefaults: import("@angular/core").Signal<boolean>;
33
31
  private _values;
34
32
  private _groups;
35
33
  private _sessionDisabled;
@@ -45,14 +43,12 @@ export declare class ReportFilterStateService {
45
43
  private _stateChanged$;
46
44
  private _revision;
47
45
  private _stateVersion;
48
- private _appliedVersion;
49
46
  private _listSortResets;
50
47
  private _report;
51
48
  private _pageId;
52
49
  private _match;
53
50
  private _drills;
54
51
  private _drillChanged$;
55
- private _baseConfig;
56
52
  private _temporary;
57
53
  init(report: Report): void;
58
54
  value(groupId: number): FilterGroupValue | undefined;
@@ -86,14 +82,11 @@ export declare class ReportFilterStateService {
86
82
  setDrill(componentId: number, path: readonly ReportDrillStep[]): void;
87
83
  drillChanges(componentId: number): Observable<void>;
88
84
  adoptDrill(componentId: number, path: readonly ReportDrillStep[]): boolean;
89
- snapshot(): ReportViewConfig;
90
- authoredConfig(): ReportViewConfig;
91
- apply(config: ReportViewConfig | null, pageId?: number | null): void;
92
- resetToBase(): void;
93
- setBaseToScreen(): void;
94
- clearBase(): void;
95
- resetGroupsToBase(groupIds: readonly number[]): void;
96
- groupsDifferFromBase(groupIds: readonly number[]): boolean;
85
+ snapshot(): ReportStateSnapshot;
86
+ authoredConfig(): ReportStateSnapshot;
87
+ resetToDefaults(): void;
88
+ resetGroupsToDefaults(groupIds: readonly number[]): void;
89
+ groupsDifferFromDefaults(groupIds: readonly number[]): boolean;
97
90
  tileState(component: ReportComponent): ComponentDataState;
98
91
  livePreset(groupId: number): ReportRelativeRange | null;
99
92
  private _resolvedFields;
@@ -108,22 +101,13 @@ export declare class ReportFilterStateService {
108
101
  private _relativeRange;
109
102
  private _snapshotGroups;
110
103
  private _snapshotTiles;
111
- private _setBase;
112
- private _applyLayer;
113
- private _applyGroups;
114
- private _applyGroup;
115
104
  private _seedAuthored;
116
105
  private _clearTiles;
117
- private _applyTile;
118
- private _applyListTile;
119
106
  private _setDrillPath;
120
- private _applyPage;
121
- private _notifyApplied;
107
+ private _notifyReset;
122
108
  private _tiles;
123
109
  private _isChart;
124
- private _pruneViewState;
125
- private _pruneBase;
126
- private _baseTile;
110
+ private _prunePageState;
127
111
  private _resolveExcludeAndRange;
128
112
  private _excludeOrRangeDefault;
129
113
  private _countSortResets;
@@ -1,7 +1,7 @@
1
- import { ReportViewConfig } from './interfaces/report-view-config.interface';
1
+ import { ReportStateSnapshot } from './interfaces/report-state-snapshot.interface';
2
2
  import { ComponentDataState, Report, ReportComponent } from './interfaces/report.interface';
3
3
  export declare function isTimeSeriesChart(component: ReportComponent): boolean;
4
- export declare function tileDataState(report: Report | null, component: ReportComponent, snapshot: ReportViewConfig): ComponentDataState;
5
- export declare function zipExportStates(report: Report, snapshot: ReportViewConfig, pageId?: number | null): Record<number, ComponentDataState>;
6
- export declare function valuesMatchAnyGroupIds(report: Report | null, layerId: number | null, snapshot: ReportViewConfig): number[];
7
- export declare function tilePageId(report: Report, component: ReportComponent, snapshot: ReportViewConfig): number | null;
4
+ export declare function tileDataState(report: Report | null, component: ReportComponent, snapshot: ReportStateSnapshot): ComponentDataState;
5
+ export declare function zipExportStates(report: Report, snapshot: ReportStateSnapshot, pageId?: number | null): Record<number, ComponentDataState>;
6
+ export declare function valuesMatchAnyGroupIds(report: Report | null, layerId: number | null, snapshot: ReportStateSnapshot): number[];
7
+ export declare function tilePageId(report: Report, component: ReportComponent, snapshot: ReportStateSnapshot): number | null;
@@ -17,24 +17,25 @@ export declare class FsAiReportComponent {
17
17
  readonly reportFilterConfig: import("@angular/core").WritableSignal<FilterConfig>;
18
18
  readonly reportHasFilters: import("@angular/core").Signal<boolean>;
19
19
  readonly reportFilterKey: import("@angular/core").Signal<string>;
20
- readonly viewsServed: import("@angular/core").Signal<boolean>;
21
20
  private _split;
22
21
  private _chatPanel;
23
22
  private _canvas?;
23
+ private _reportBar?;
24
24
  private _reportData;
25
25
  private _reportAiChatData;
26
26
  private _route;
27
+ private _router;
27
28
  private _filterState;
28
29
  private _filterOptions;
29
- private _views;
30
30
  private _exportService;
31
31
  private _collector;
32
32
  private _process;
33
33
  private _dialog;
34
34
  private _destroyRef;
35
35
  private _zone;
36
- private _openedReportId;
37
36
  private readonly _barVersion;
37
+ private _barValuesAtPick;
38
+ private _openedOnSavedFilterReportId;
38
39
  constructor();
39
40
  toggleEditMode(): void;
40
41
  get isMasterMode(): boolean;
@@ -51,12 +52,18 @@ export declare class FsAiReportComponent {
51
52
  onResizeStart(event: PointerEvent): void;
52
53
  private _chatViewerState;
53
54
  private _resizeTo;
55
+ private _writePageToUrl;
54
56
  private _pageIdFromUrl;
55
57
  private _loadReport;
56
- private _openReport;
57
- private _openAppliedPage;
58
58
  private _reportGroups;
59
59
  private _buildReportConfig;
60
+ private _openOnFirstSavedFilter;
61
+ private _savedFiltersConfig;
62
+ private _savedFilterGroups;
63
+ private _barSavedFilter;
64
+ private _keepBarOnPick;
65
+ private _keepOnPick;
66
+ private _keepItemOnPick;
60
67
  private _barChanged;
61
68
  private _groupByItem;
62
69
  private _matchItem;
@@ -3,8 +3,8 @@
3
3
  // - The same report with more pages than before: a page was just added in
4
4
  // this tab, so the canvas lands on the last page. The asked-for page does
5
5
  // not beat it: that is a stale value the host still holds.
6
- // - Otherwise the asked-for page (a ?page= the report opened with, or the
7
- // open view's), when the report has it.
6
+ // - Otherwise the asked-for page (a ?page= the report opened with), when the
7
+ // report has it.
8
8
  // - Another report that asks for no page it has opens on its first page:
9
9
  // the old report's page number means nothing there.
10
10
  // - The same report keeps the page it shows when the asked-for page does not
@@ -23,4 +23,4 @@ export function canvasLandingPage(input) {
23
23
  const index = sameReport ? input.activePageIndex : 0;
24
24
  return index < pageCount ? index : 0;
25
25
  }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLWxhbmRpbmctcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jYW52YXMtbGFuZGluZy1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDRFQUE0RTtBQUM1RSw2REFBNkQ7QUFDN0QsMEVBQTBFO0FBQzFFLDBDQUEwQztBQUMxQyx5RUFBeUU7QUFDekUsc0RBQXNEO0FBQ3RELDZFQUE2RTtBQUM3RSx5RUFBeUU7QUFDekUsdUJBQXVCO0FBQ3ZCLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUF5QjtJQUN6RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztJQUU3RCxJQUFJLFVBQVUsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNyRixPQUFPLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9FLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJELE9BQU8sS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbnZhc0xhbmRpbmdJbnB1dCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jYW52YXMtbGFuZGluZy1pbnB1dC5pbnRlcmZhY2UnO1xuXG5cbi8vIFdoaWNoIHBhZ2UgdGhlIGNhbnZhcyBvcGVucyB3aGVuIGl0cyByZXBvcnQgaW5wdXQgY2hhbmdlcy5cbi8vXG4vLyAtIFRoZSBzYW1lIHJlcG9ydCB3aXRoIG1vcmUgcGFnZXMgdGhhbiBiZWZvcmU6IGEgcGFnZSB3YXMganVzdCBhZGRlZCBpblxuLy8gICB0aGlzIHRhYiwgc28gdGhlIGNhbnZhcyBsYW5kcyBvbiB0aGUgbGFzdCBwYWdlLiBUaGUgYXNrZWQtZm9yIHBhZ2UgZG9lc1xuLy8gICBub3QgYmVhdCBpdDogdGhhdCBpcyBhIHN0YWxlIHZhbHVlIHRoZSBob3N0IHN0aWxsIGhvbGRzLlxuLy8gLSBPdGhlcndpc2UgdGhlIGFza2VkLWZvciBwYWdlIChhID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZCB3aXRoLCBvciB0aGVcbi8vICAgb3BlbiB2aWV3J3MpLCB3aGVuIHRoZSByZXBvcnQgaGFzIGl0LlxuLy8gLSBBbm90aGVyIHJlcG9ydCB0aGF0IGFza3MgZm9yIG5vIHBhZ2UgaXQgaGFzIG9wZW5zIG9uIGl0cyBmaXJzdCBwYWdlOlxuLy8gICB0aGUgb2xkIHJlcG9ydCdzIHBhZ2UgbnVtYmVyIG1lYW5zIG5vdGhpbmcgdGhlcmUuXG4vLyAtIFRoZSBzYW1lIHJlcG9ydCBrZWVwcyB0aGUgcGFnZSBpdCBzaG93cyB3aGVuIHRoZSBhc2tlZC1mb3IgcGFnZSBkb2VzIG5vdFxuLy8gICByZXNvbHZlIChpdCBtYXkgc3RpbGwgYmUgbG9hZGluZyk7IGFuIGluZGV4IHBhc3QgdGhlIGxhc3QgcGFnZSBmYWxsc1xuLy8gICBiYWNrIHRvIHRoZSBmaXJzdC5cbmV4cG9ydCBmdW5jdGlvbiBjYW52YXNMYW5kaW5nUGFnZShpbnB1dDogQ2FudmFzTGFuZGluZ0lucHV0KTogbnVtYmVyIHtcbiAgY29uc3QgcGFnZUNvdW50ID0gaW5wdXQucGFnZUlkcy5sZW5ndGg7XG4gIGNvbnN0IHNhbWVSZXBvcnQgPSBpbnB1dC5yZXBvcnRJZCA9PT0gaW5wdXQucHJldmlvdXNSZXBvcnRJZDtcblxuICBpZiAoc2FtZVJlcG9ydCAmJiBpbnB1dC5wcmV2aW91c1BhZ2VDb3VudCA+IDAgJiYgcGFnZUNvdW50ID4gaW5wdXQucHJldmlvdXNQYWdlQ291bnQpIHtcbiAgICByZXR1cm4gcGFnZUNvdW50IC0gMTtcbiAgfVxuXG4gIGNvbnN0IGxpbmtlZCA9IGlucHV0LnBhZ2VJZCA9PSBudWxsID8gLTEgOiBpbnB1dC5wYWdlSWRzLmluZGV4T2YoaW5wdXQucGFnZUlkKTtcbiAgaWYgKGxpbmtlZCA+IC0xKSB7XG4gICAgcmV0dXJuIGxpbmtlZDtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ID0gc2FtZVJlcG9ydCA/IGlucHV0LmFjdGl2ZVBhZ2VJbmRleCA6IDA7XG5cbiAgcmV0dXJuIGluZGV4IDwgcGFnZUNvdW50ID8gaW5kZXggOiAwO1xufVxuIl19
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLWxhbmRpbmctcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jYW52YXMtbGFuZGluZy1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDRFQUE0RTtBQUM1RSw2REFBNkQ7QUFDN0QsNkVBQTZFO0FBQzdFLG1CQUFtQjtBQUNuQix5RUFBeUU7QUFDekUsc0RBQXNEO0FBQ3RELDZFQUE2RTtBQUM3RSx5RUFBeUU7QUFDekUsdUJBQXVCO0FBQ3ZCLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUF5QjtJQUN6RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztJQUU3RCxJQUFJLFVBQVUsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNyRixPQUFPLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9FLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJELE9BQU8sS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbnZhc0xhbmRpbmdJbnB1dCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jYW52YXMtbGFuZGluZy1pbnB1dC5pbnRlcmZhY2UnO1xuXG5cbi8vIFdoaWNoIHBhZ2UgdGhlIGNhbnZhcyBvcGVucyB3aGVuIGl0cyByZXBvcnQgaW5wdXQgY2hhbmdlcy5cbi8vXG4vLyAtIFRoZSBzYW1lIHJlcG9ydCB3aXRoIG1vcmUgcGFnZXMgdGhhbiBiZWZvcmU6IGEgcGFnZSB3YXMganVzdCBhZGRlZCBpblxuLy8gICB0aGlzIHRhYiwgc28gdGhlIGNhbnZhcyBsYW5kcyBvbiB0aGUgbGFzdCBwYWdlLiBUaGUgYXNrZWQtZm9yIHBhZ2UgZG9lc1xuLy8gICBub3QgYmVhdCBpdDogdGhhdCBpcyBhIHN0YWxlIHZhbHVlIHRoZSBob3N0IHN0aWxsIGhvbGRzLlxuLy8gLSBPdGhlcndpc2UgdGhlIGFza2VkLWZvciBwYWdlIChhID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZCB3aXRoKSwgd2hlbiB0aGVcbi8vICAgcmVwb3J0IGhhcyBpdC5cbi8vIC0gQW5vdGhlciByZXBvcnQgdGhhdCBhc2tzIGZvciBubyBwYWdlIGl0IGhhcyBvcGVucyBvbiBpdHMgZmlyc3QgcGFnZTpcbi8vICAgdGhlIG9sZCByZXBvcnQncyBwYWdlIG51bWJlciBtZWFucyBub3RoaW5nIHRoZXJlLlxuLy8gLSBUaGUgc2FtZSByZXBvcnQga2VlcHMgdGhlIHBhZ2UgaXQgc2hvd3Mgd2hlbiB0aGUgYXNrZWQtZm9yIHBhZ2UgZG9lcyBub3Rcbi8vICAgcmVzb2x2ZSAoaXQgbWF5IHN0aWxsIGJlIGxvYWRpbmcpOyBhbiBpbmRleCBwYXN0IHRoZSBsYXN0IHBhZ2UgZmFsbHNcbi8vICAgYmFjayB0byB0aGUgZmlyc3QuXG5leHBvcnQgZnVuY3Rpb24gY2FudmFzTGFuZGluZ1BhZ2UoaW5wdXQ6IENhbnZhc0xhbmRpbmdJbnB1dCk6IG51bWJlciB7XG4gIGNvbnN0IHBhZ2VDb3VudCA9IGlucHV0LnBhZ2VJZHMubGVuZ3RoO1xuICBjb25zdCBzYW1lUmVwb3J0ID0gaW5wdXQucmVwb3J0SWQgPT09IGlucHV0LnByZXZpb3VzUmVwb3J0SWQ7XG5cbiAgaWYgKHNhbWVSZXBvcnQgJiYgaW5wdXQucHJldmlvdXNQYWdlQ291bnQgPiAwICYmIHBhZ2VDb3VudCA+IGlucHV0LnByZXZpb3VzUGFnZUNvdW50KSB7XG4gICAgcmV0dXJuIHBhZ2VDb3VudCAtIDE7XG4gIH1cblxuICBjb25zdCBsaW5rZWQgPSBpbnB1dC5wYWdlSWQgPT0gbnVsbCA/IC0xIDogaW5wdXQucGFnZUlkcy5pbmRleE9mKGlucHV0LnBhZ2VJZCk7XG4gIGlmIChsaW5rZWQgPiAtMSkge1xuICAgIHJldHVybiBsaW5rZWQ7XG4gIH1cblxuICBjb25zdCBpbmRleCA9IHNhbWVSZXBvcnQgPyBpbnB1dC5hY3RpdmVQYWdlSW5kZXggOiAwO1xuXG4gIHJldHVybiBpbmRleCA8IHBhZ2VDb3VudCA/IGluZGV4IDogMDtcbn1cbiJdfQ==
@@ -81,8 +81,8 @@ export class ComponentListComponent {
81
81
  // How many leading columns stay in view while the list scrolls sideways.
82
82
  pinned = computed(() => listPinnedColumns(this.component().config));
83
83
  columnClasses = columnClasses;
84
- // The config columns the viewer hid on this list (the Columns dialog, or a
85
- // saved view). fs-list hides and shows them in place through [show], so the rows
84
+ // The config columns the viewer hid on this list (the Columns dialog). fs-list
85
+ // hides and shows them in place through [show], so the rows
86
86
  // already fetched stand.
87
87
  hidden = computed(() => new Set(this._filterState.hiddenColumns(this.component().id)));
88
88
  totalLabel = LIST_TOTAL_LABEL;
@@ -348,4 +348,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
348
348
  ReportOutputPipe,
349
349
  ], template: "@if (truncated()) {\n <div class=\"pivot-truncated\">\n This grid was built from a partial result, so some columns or values may be missing. Narrow it with a filter.\n </div>\n}\n\n<!-- The windows a comparison compares, and why it reads as it does. A\n windowed column's own notes are in its header's tooltip. -->\n<app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n</app-report-component-note>\n\n<!-- fs-list reads a column's footer template once, as a direct child of\n fs-list-column, so a list with totals renders its columns in a branch of\n their own rather than wrapping the footer in an @if. Its header template too,\n which every column carries: an output column's tooltip says what it holds.\n Columns are tracked by alignment as well as name, since fs-list reads a\n column's alignment only when it builds the column. -->\n<fs-list\n [config]=\"listConfig\"\n [class.report-totals-empty]=\"!totals()\">\n @if (showTotals()) {\n @for (column of columns(); track column.column + ':' + column.numeric) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [show]=\"!hidden().has(column.column)\"\n [sortable]=\"!pivoted() || $first\"\n [align]=\"column.numeric ? 'right' : 'left'\"\n [class]=\"columnClasses(column, $index, pinned())\">\n <ng-template fs-list-header>\n <ng-container\n [ngTemplateOutlet]=\"headerTpl\"\n [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row[column.column], row: row, column: column }\">\n </ng-container>\n </ng-template>\n <ng-template fs-list-footer>\n @if (totals()?.[column.column] !== undefined) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: totals()?.[column.column], row: totals(), column: column }\">\n </ng-container>\n } @else if (column.column === totalsLabelColumn()) {\n {{ totalLabel }}\n }\n </ng-template>\n </fs-list-column>\n }\n } @else {\n @for (column of columns(); track column.column + ':' + column.numeric) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [show]=\"!hidden().has(column.column)\"\n [sortable]=\"!pivoted() || $first\"\n [align]=\"column.numeric ? 'right' : 'left'\"\n [class]=\"columnClasses(column, $index, pinned())\">\n <ng-template fs-list-header>\n <ng-container\n [ngTemplateOutlet]=\"headerTpl\"\n [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row[column.column], row: row, column: column }\">\n </ng-container>\n </ng-template>\n </fs-list-column>\n }\n }\n</fs-list>\n\n@if (caption()) {\n <div class=\"list-caption small\">\n {{ caption() }}\n </div>\n}\n\n<!-- A column's heading, with what an output column holds as its tooltip (an\n empty one never shows). -->\n<ng-template\n #headerTpl\n let-column=\"column\">\n <span [matTooltip]=\"columnNotes()[column.column] ?? ''\">{{ column.label || column.column }}</span>\n</ng-template>\n\n<!-- One cell, in the body and the totals row alike: an output column by what\n it holds (its row gives a change its prior), a date column as a day in the\n report's zone and locale, any other through its number format. -->\n<ng-template\n #cellTpl\n let-value\n let-row=\"row\"\n let-column=\"column\">\n @if (outputColumns()[column.column]; as output) {\n @if (row | fsReportOutput: column : output : formatContext(); as cell) {\n <span [attr.title]=\"cell.title\">{{ cell.text }}</span>\n }\n } @else if (column.format === ReportListColumnFormat.Date) {\n {{ value | fsReportDate: timezone() : formatContext().locale }}\n } @else {\n {{ value | fsReportNumber: column : formatContext() }}\n }\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;min-height:0}:host ::ng-deep fs-list{display:flex;flex-direction:column;flex:1 1 auto;height:auto;min-height:0}:host ::ng-deep fs-list .fs-list-container{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}:host ::ng-deep fs-list .fs-list-header-container{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-container .fs-list-table-container{flex:1 1 auto;min-height:0;overflow-y:auto!important}:host ::ng-deep fs-list .fs-list-table thead th{position:sticky;top:0;z-index:1;background-color:#fff}:host ::ng-deep fs-list .fs-list-table tfoot td{position:sticky;bottom:0;z-index:1;background-color:#fff;font-weight:500;box-shadow:inset 0 1px #0000001f}:host ::ng-deep fs-list.report-totals-empty tfoot{display:none}:host ::ng-deep fs-list .report-pinned{position:sticky;left:var(--report-pin-left, 0px);z-index:1;background-color:#fff}:host ::ng-deep fs-list .report-pin-0{--report-pin-left: var(--report-pin-left-0, 0px)}:host ::ng-deep fs-list .report-pin-1{--report-pin-left: var(--report-pin-left-1, 0px)}:host ::ng-deep fs-list .report-pin-2{--report-pin-left: var(--report-pin-left-2, 0px)}:host ::ng-deep fs-list .report-pin-last{box-shadow:inset -1px 0 #0000001f}:host ::ng-deep fs-list .fs-list-table thead th.report-pinned{z-index:3}:host ::ng-deep fs-list .fs-list-table tfoot td.report-pinned{z-index:2}:host ::ng-deep fs-list .fs-list-table tfoot td.report-pin-last{box-shadow:inset -1px 0 #0000001f,inset 0 1px #0000001f}:host ::ng-deep fs-list th.report-nowrap,:host ::ng-deep fs-list td.report-nowrap{white-space:nowrap}:host ::ng-deep fs-list fs-list-pagination{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-load-more{position:sticky;bottom:0;background-color:#fff}:host ::ng-deep fs-list .fs-list-load-more button{margin-top:0}.list-caption{flex:0 0 auto;padding-top:4px}.pivot-truncated{flex:0 0 auto;padding:8px 12px;margin-bottom:8px;border-radius:4px;background-color:#fff4e5;color:#663c00}\n"] }]
350
350
  }], ctorParameters: () => [] });
351
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBRVIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU2xFLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixp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QztnQkFDWixTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLHFCQUFxQixLQUFLLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBRWxELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxJQUFJLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO3dHQTdYVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixtWkFLUyxlQUFlLGdFQ3RGM0QsKzVJQXFIQSxzZ0VEN0NJLHNCQUFzQix1SUFDdEIsWUFBWSwreUJBQ1osVUFBVSxpUkFDVixnQkFBZ0IsK0lBQ2hCLGNBQWMsZ0RBQ2QsZ0JBQWdCLGtEQUNoQixnQkFBZ0I7OzRGQUdQLHNCQUFzQjtrQkFoQmxDLFNBQVM7K0JBQ0UsMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclJlbmRlclJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIE9uSW5pdCxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcsIEZzTGlzdE1vZHVsZSwgUGFnaW5hdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgbWVyZ2UsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdFBsYWluTnVtYmVyLCBoYXNOdW1iZXJGb3JtYXQgfSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgQ29tcG9uZW50RGF0YVN0YXRlLFxuICBMaXN0Q29sdW1uLFxuICBMaXN0Q29uZmlnLFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydFNvcnQsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBMSVNUX1RPVEFMX0xBQkVMLFxuICBMaXN0T3V0cHV0Q29sdW1uLFxuICBjb2x1bW5DbGFzc2VzLFxuICBsaXN0T3V0cHV0Q29sdW1ucyxcbiAgbGlzdFBpbm5lZENvbHVtbnMsXG4gIGxpc3RTb3J0VGVybXMsXG4gIGxpc3RUb3RhbHNMYWJlbENvbHVtbixcbn0gZnJvbSAnLi4vLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uLy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVEYXRhLCBvdXRwdXRDb2x1bW5Ob3RlIH0gZnJvbSAnLi4vLi4vb3V0cHV0LW5vdGVzJztcbmltcG9ydCB7IFJlcG9ydERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LWRhdGUucGlwZSc7XG5pbXBvcnQgeyBSZXBvcnROdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LW51bWJlci5waXBlJztcbmltcG9ydCB7IFJlcG9ydE91dHB1dFBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9yZXBvcnQtb3V0cHV0LnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5cbi8vIEEgbGlzdCBjb21wb25lbnQ6IGFuIEZzTGlzdCByZW5kZXJlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjb25maWcuIEl0IGhhcyBub1xuLy8gZmlsdGVyIGJhciBvZiBpdHMgb3duOiBpdHMgZmlsdGVycyBhcmUgZ3JvdXAta2V5ZWQgbGlrZSBldmVyeSBvdGhlclxuLy8gY29tcG9uZW50J3MsIHNvIGNvbXBvbmVudC1sZXZlbCBncm91cHMgcmVuZGVyIGluIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwXG4vLyAoUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50KSBhbmQgcmVwb3J0LWxldmVsIGdyb3VwcyBpbiB0aGUgcmVwb3J0IGJhciwgYW5kXG4vLyBldmVyeSByZXF1ZXN0IHRha2VzIGl0cyB2YWx1ZXMgZnJvbSB0aGUgc2hhcmVkIGZpbHRlci1zdGF0ZSBzZXJ2aWNlLlxuLy8gUGFnaW5nIGFuZCBzb3J0aW5nIGFyZSBwdXNoZWQgaW50byB0aGUgU1FMIHdyYXAgc2VydmVyLXNpZGUuXG4vL1xuLy8gQSBsaXN0IHdob3NlIHF1ZXJ5IGNvbXBhcmVzLCB3aW5kb3dzLCByYW5rcyBvciBzaGFyZXMgc2F5cyBzbzogdGhlIHNoYXJlZFxuLy8gbm90ZSBhYm92ZSBpdCBuYW1lcyB0aGUgd2luZG93cyBhIGNvbXBhcmlzb24gY29tcGFyZXMsIGVhY2ggc3VjaCBjb2x1bW4nc1xuLy8gaGVhZGVyIHRvb2x0aXAgc2F5cyB3aGF0IGl0IGhvbGRzLCBhbmQgaXRzIGNlbGxzICh0b3RhbHMgaW5jbHVkZWQsIHdoaWNoIHRoZVxuLy8gc2VydmVyIGNvbXB1dGVzKSBhcmUgd3JpdHRlbiBieSB3aGF0IHRoZXkgaG9sZC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgRnNMaXN0TW9kdWxlLFxuICAgIE1hdFRvb2x0aXAsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZXBvcnREYXRlUGlwZSxcbiAgICBSZXBvcnROdW1iZXJQaXBlLFxuICAgIFJlcG9ydE91dHB1dFBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdENvbXBvbmVudCA9IHZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpO1xuXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYXV0aG9yZWQgYW5kIGZpeGVkIGF0IGluaXQuIEEgY3Jvc3MtdGFiJ3MgYXJlXG4gIC8vIHRoZSBwaXZvdCBkaW1lbnNpb24ncyBWQUxVRVMsIHNvIHRoZXkgYXJyaXZlIHdpdGggdGhlIHJvd3MgYW5kIGNoYW5nZVxuICAvLyB3aGVuZXZlciB0aGUgZmlsdGVycyBkbyDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgYSBzaWduYWwgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIG9uZS1zaG90IHJlYWQgaXQgdXNlZCB0byBiZS4gYG51bWVyaWNgIG1hcmtzIGEgY29sdW1uIHdob3NlIGNlbGxzIGFyZVxuICAvLyBmb3JtYXR0ZWQgbnVtYmVycywgZGVjaWRlZCBvbmNlIGhlcmUgcmF0aGVyIHRoYW4gcGVyIGNlbGwsIHNvIHRoZSBjb2x1bW5cbiAgLy8gYW5kIGl0cyBoZWFkZXIgYXJlIHJpZ2h0LWFsaWduZWQuXG4gIHB1YmxpYyBjb2x1bW5zID0gc2lnbmFsPChMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH0pW10+KFtdKTtcblxuICAvLyBBIGNyb3NzLXRhYiBzb3J0cyBvbmx5IGJ5IGl0cyByb3cta2V5IGNvbHVtbjogZXZlcnkgb3RoZXIgaGVhZGVyIGlzIGFcbiAgLy8gcGl2b3QgdmFsdWUsIGFuZCB0aGUgc2VydmVyIG9yZGVycyB0aGUgbG9uZyByb3dzIGJlZm9yZSBwaXZvdGluZywgc28gYVxuICAvLyBjbGljayBvbiBcIk1hciAyMDI2XCIgaGFzIG5vdGhpbmcgdG8gb3JkZXIgYnkuXG4gIHB1YmxpYyBwaXZvdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBBIGN1dCByZXN1bHQgaXMgd29yc2UgZm9yIGEgZ3JpZCB0aGFuIGZvciBhIGxpc3Q6IHRoZSBjdXQgbGFuZHMgb24gdGhlIExPTkdcbiAgLy8gcm93cyBiZWZvcmUgdGhlIHJlc2hhcGUsIHNvIGEgcGl2b3QgdmFsdWUgbGl2aW5nIG9ubHkgaW4gdGhlIHRhaWwgdmFuaXNoZXNcbiAgLy8gYXMgYSB3aG9sZSBDT0xVTU4gYW5kIHN0cmFkZGxlZCBjZWxscyBjb21lIGJhY2sgYmxhbmssIGluZGlzdGluZ3Vpc2hhYmxlXG4gIC8vIGZyb20gYSByZWFsIHplcm8uIFRoZSBwYXJlbnQncyB0cnVuY2F0aW9uIGJhbm5lciBuZXZlciBmaXJlcyBmb3IgYSBsaXN0XG4gIC8vIChpdCBvbmx5IHJlbmRlcnMgd2hhdCBfbG9hZCgpIGZldGNoZWQsIHdoaWNoIGxpc3RzIHNraXApLCBzbyB0aGUgd2FybmluZ1xuICAvLyBiZWxvbmdzIGhlcmUuXG4gIHB1YmxpYyB0cnVuY2F0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFdoeSB0aGUgc2VhcmNoIGJveCBkaWQgbm90IG5hcnJvdyB0aGUgcm93cyAodGhlIGxpc3QgaGFzIG5vIHRleHQgY29sdW1uIHRvXG4gIC8vIHNlYXJjaCksIGZyb20gdGhlIGxhdGVzdCBwYWdlIDE7IG51bGwgd2hlbiB0aGUgc2VhcmNoIGFwcGxpZWQgb3Igbm9uZSB3YXNcbiAgLy8gbWFkZS5cbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaE5vdGUgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gY29uZmlnLnRvdGFscywgcmVhZCBvbmNlIGF0IGluaXQ6IGEgbGlzdCB3aXRoIHRvdGFscyByZW5kZXJzIGl0cyBjb2x1bW5zXG4gIC8vIHdpdGggYSBmb290ZXIgdGVtcGxhdGUsIHdoaWNoIGZzLWxpc3QgcmVhZHMgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGVtLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1RvdGFscyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHRvdGFscyByb3cgZnJvbSB0aGUgbGF0ZXN0IHBhZ2UgMSwgcmF3IHZhbHVlcyBrZXllZCBsaWtlIHRoZSBjb2x1bW5zO1xuICAvLyBudWxsIHdoZW4gdGhlIGxpc3QgaGFzIG5vbmUsIG9yIHRoZSBzZXJ2ZXIgc2F5cyB3aHkgaW4gdG90YWxzTm90ZS5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFscyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNOb3RlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBsYXRlc3QgcGFnZSAxJ3MgY29tcGFyaXNvbiB3aW5kb3dzLCB0aW1lZnJhbWUgYW5kIG91dHB1dCBtZXRhZGF0YSwgZm9yXG4gIC8vIHRoZSBub3RlIGFib3ZlIHRoZSBsaXN0LCB0aGUgaGVhZGVyIHRvb2x0aXBzIGFuZCB0aGUgb3V0cHV0IGNlbGxzOyBudWxsXG4gIC8vIHVudGlsIGl0IGFycml2ZXMsIGFuZCBlbXB0eSBvZiBldmVyeSBrZXkgZm9yIGEgbGlzdCB0aGF0IGhhcyBub25lLlxuICBwdWJsaWMgcmVhZG9ubHkgbm90ZURhdGEgPSBzaWduYWw8Q29tcG9uZW50Tm90ZURhdGEgfCBudWxsPihudWxsKTtcblxuICAvLyBIb3cgbWFueSByb3dzIHRoZSBsaXN0IHNob3dzIChsb2FkIG1vcmUgYXBwZW5kcykgb3V0IG9mIGhvdyBtYW55IGl0c1xuICAvLyBmaWx0ZXJzIGtlZXAuIEEgY3Jvc3MtdGFiIGNvdW50cyBncmlkIHJvd3MuXG4gIHB1YmxpYyByZWFkb25seSByb3dDb3VudCA9IHNpZ25hbDx7IHNob3duOiBudW1iZXI7IHRvdGFsOiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgd2hpY2ggZGF0ZSBjZWxscyByZW5kZXIgaW4uIEluamVjdGVkIHJpZ2h0XG4gIC8vIGhlcmUgcmF0aGVyIHRoYW4gcmVhZCBvZmYgX2ZpbHRlclN0YXRlLCB3aGljaCBpcyBkZWNsYXJlZCBmdXJ0aGVyIGRvd24gYW5kXG4gIC8vIGlzIHN0aWxsIHVuZGVmaW5lZCB3aGlsZSB0aGlzIGluaXRpYWxpemVyIHJ1bnMuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLnRpbWV6b25lO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdCBjb250ZXh0OiBkYXRlIGNlbGxzLCBudW1iZXIgY2VsbHMgYW5kIGFcbiAgLy8gY3Jvc3MtdGFiJ3MgcGVyaW9kIGhlYWRpbmdzIGFyZSB3cml0dGVuIGluIGl0cyBsb2NhbGUgKGFuZCBtb25leSBpbiBpdHNcbiAgLy8gY3VycmVuY3kpLiBJbmplY3RlZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24uXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSkuZm9ybWF0Q29udGV4dDtcblxuICBwdWJsaWMgcmVhZG9ubHkgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCA9IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQ7XG5cbiAgLy8gSG93IG1hbnkgbGVhZGluZyBjb2x1bW5zIHN0YXkgaW4gdmlldyB3aGlsZSB0aGUgbGlzdCBzY3JvbGxzIHNpZGV3YXlzLlxuICBwdWJsaWMgcmVhZG9ubHkgcGlubmVkID0gY29tcHV0ZWQoKCkgPT4gbGlzdFBpbm5lZENvbHVtbnModGhpcy5jb21wb25lbnQoKS5jb25maWcpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29sdW1uQ2xhc3NlcyA9IGNvbHVtbkNsYXNzZXM7XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkIG9uIHRoaXMgbGlzdCAodGhlIENvbHVtbnMgZGlhbG9nLCBvciBhXG4gIC8vIHNhdmVkIHZpZXcpLiBmcy1saXN0IGhpZGVzIGFuZCBzaG93cyB0aGVtIGluIHBsYWNlIHRocm91Z2ggW3Nob3ddLCBzbyB0aGUgcm93c1xuICAvLyBhbHJlYWR5IGZldGNoZWQgc3RhbmQuXG4gIHB1YmxpYyByZWFkb25seSBoaWRkZW4gPSBjb21wdXRlZCgoKSA9PiBuZXcgU2V0KHRoaXMuX2ZpbHRlclN0YXRlLmhpZGRlbkNvbHVtbnModGhpcy5jb21wb25lbnQoKS5pZCkpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdG90YWxMYWJlbCA9IExJU1RfVE9UQUxfTEFCRUw7XG5cbiAgLy8gVGhlIGNvbHVtbnMgdGhhdCBob2xkIGEgY29tcGFyZWQsIHdpbmRvd2VkLCByYW5rZWQgb3Igc2hhcmVkIG91dHB1dCwgYnlcbiAgLy8gbmFtZTsgdGhlIHJlc3QgYXJlIHdyaXR0ZW4gYXMgYmVmb3JlLlxuICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0Q29sdW1ucyA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIExpc3RPdXRwdXRDb2x1bW4+PigoKSA9PiBsaXN0T3V0cHV0Q29sdW1ucyhcbiAgICB0aGlzLmNvbHVtbnMoKSxcbiAgICB0aGlzLm5vdGVEYXRhKCksXG4gICAgKCh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZykuY29sdW1ucyA/PyBbXSxcbiAgKSk7XG5cbiAgLy8gRWFjaCBjb2x1bW4ncyBoZWFkZXIgdG9vbHRpcDogd2hhdCBhbiBvdXRwdXQgY29sdW1uIGhvbGRzICgnJyBmb3IgYW55XG4gIC8vIG90aGVyKS5cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbk5vdGVzID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuZm9ybWF0Q29udGV4dCgpLmxvY2FsZTtcblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5jb2x1bW5zKClcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gW2NvbHVtbi5jb2x1bW4sIG91dHB1dENvbHVtbk5vdGUoY29sdW1uLmNvbHVtbiwgdGhpcy5ub3RlRGF0YSgpLCBsb2NhbGUpXSkpO1xuICB9KTtcblxuICAvLyBUaGUgY29sdW1uIHdob3NlIGZvb3RlciBjZWxsIHJlYWRzICdUb3RhbCc6IHRoZSBmaXJzdCBvbmUgc2hvd24sIHVubGVzc1xuICAvLyBpdCBob2xkcyBhIHRvdGFsIGl0c2VsZi5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFsc0xhYmVsQ29sdW1uID0gY29tcHV0ZWQoKCkgPT4gbGlzdFRvdGFsc0xhYmVsQ29sdW1uKFxuICAgIHRoaXMuY29sdW1ucygpLmZpbHRlcigoY29sdW1uKSA9PiAhdGhpcy5oaWRkZW4oKS5oYXMoY29sdW1uLmNvbHVtbikpLFxuICAgIHRoaXMudG90YWxzKCksXG4gICkpO1xuXG4gIC8vIFRoZSBsaW5lIHVuZGVyIHRoZSBsaXN0OiBpdHMgcm93IGNvdW50LCB0aGVuIHdoeSBpdCBoYXMgbm8gdG90YWxzIGFuZCB3aHlcbiAgLy8gaXRzIHNlYXJjaCBuYXJyb3dlZCBub3RoaW5nLiBUaGUgZGlnaXRzIGFyZSB3cml0dGVuIGluIHRoZSByZXBvcnQnc1xuICAvLyBsb2NhbGUsIG5ldmVyIHRoZSBhcHAncy5cbiAgcHVibGljIHJlYWRvbmx5IGNhcHRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLnJvd0NvdW50KCk7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5mb3JtYXRDb250ZXh0KCkubG9jYWxlO1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBjb25zdCB0b3RhbCA9IGZvcm1hdFBsYWluTnVtYmVyKGNvdW50LnRvdGFsLCBsb2NhbGUpO1xuICAgICAgcGFydHMucHVzaChjb3VudC5zaG93biA8IGNvdW50LnRvdGFsXG4gICAgICAgID8gYFNob3dpbmcgJHtmb3JtYXRQbGFpbk51bWJlcihjb3VudC5zaG93biwgbG9jYWxlKX0gb2YgJHt0b3RhbH1gXG4gICAgICAgIDogYCR7dG90YWx9IHJvdyhzKWApO1xuICAgIH1cblxuICAgIHJldHVybiBbLi4ucGFydHMsIHRoaXMudG90YWxzTm90ZSgpLCB0aGlzLnNlYXJjaE5vdGUoKV1cbiAgICAgIC5maWx0ZXIoKHBhcnQpOiBwYXJ0IGlzIHN0cmluZyA9PiAhIXBhcnQpXG4gICAgICAuam9pbignIMK3ICcpO1xuICB9KTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIF9waW5PZmZzZXRzUmVmOiBBZnRlclJlbmRlclJlZiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEhpZGluZyBvciBzaG93aW5nIGEgY29sdW1uIG1vdmVzIHRoZSBwaW5uZWQgY29sdW1ucyBhZnRlciBpdC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5oaWRkZW4oKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoKTtcbiAgICBjb25zdCBjb25maWcgPSAoY29tcG9uZW50LmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcbiAgICB0aGlzLnBpdm90ZWQuc2V0KCEhY29uZmlnLnBpdm90Qnk/LmNvbHVtbik7XG4gICAgdGhpcy5zaG93VG90YWxzLnNldChjb25maWcudG90YWxzID09PSB0cnVlKTtcbiAgICB0aGlzLmNvbHVtbnMuc2V0KChjb25maWcuY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+ICh7IC4uLmNvbHVtbiwgbnVtZXJpYzogaGFzTnVtYmVyRm9ybWF0KGNvbHVtbikgfSkpKTtcblxuICAgIHRoaXMuX2luaXRMaXN0Q29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5fb2JzZXJ2ZVBpbk9mZnNldHMoKTtcblxuICAgIC8vIEEgY2hhbmdlIHRvIGFueSBncm91cCB0aGlzIGxpc3QncyBmaWx0ZXJzIGJlbG9uZyB0byAoZnJvbSB0aGUgcmVwb3J0IGJhclxuICAgIC8vIG9yIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwKSByZS1ydW5zIHRoZSBsaXN0LlxuICAgIC8vIFNvIGRvZXMgYSBjaGFuZ2Ugb2YgdGhlIHRleHQgaW4gaXRzIHNlYXJjaCBib3ggKGluIHRoZSBjb21wb25lbnQgaGVhZGVyKS5cbiAgICBtZXJnZSh0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yKGNvbXBvbmVudCksIHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTZWFyY2hDaGFuZ2VzKGNvbXBvbmVudC5pZCkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHRoaXMubGlzdENvbXBvbmVudCgpPy5yZWxvYWQoKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRMaXN0Q29uZmlnKGNvbmZpZzogTGlzdENvbmZpZyk6IHZvaWQge1xuICAgIC8vIFRoZSB2aWV3ZXIncyBsYXN0IHNvcnQgd2lucyBvdmVyIHRoZSBhdXRob3JlZCBvbmUsIHNvIGEgbGlzdCByZWNyZWF0ZWRcbiAgICAvLyBpbiB0aGUgc2FtZSBzZXNzaW9uIChwYWdlIHN3aXRjaCwgcmVsb2FkIGFmdGVyIGFuIGVkaXQpIGtlZXBzIGl0LlxuICAgIC8vIGZzLWxpc3QgaG9sZHMgb25lIHNvcnRpbmcgY29sdW1uLCBzbyBpdCBzaG93cyB0aGUgYXV0aG9yZWQgc29ydCdzIGZpcnN0XG4gICAgLy8gdGVybTsgdGhlIHJlcXVlc3Qgc2VuZHMgb25seSB0aGF0IHRlcm0gYW5kIHRoZSBzZXJ2ZXIgYXBwZW5kcyB0aGUgcmVzdC5cbiAgICBjb25zdCBzb3J0OiBSZXBvcnRTb3J0IHwgdW5kZWZpbmVkID0gdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNvcnQodGhpcy5jb21wb25lbnQoKS5pZClcbiAgICAgID8/IGxpc3RTb3J0VGVybXMoY29uZmlnKVswXTtcblxuICAgIHRoaXMubGlzdENvbmZpZyA9IHtcbiAgICAgIC8vIEluc2lkZSBhIHJlcG9ydCBjb21wb25lbnQgdGhlIGxpc3QgaXMgYSBjbGVhbiBkYXRhIHBhbmUg4oCUIG5vIHN0YXR1c1xuICAgICAgLy8gYmFyLCBubyByZWxvYWQgYnV0dG9uIChmaWx0ZXIgY2hhbmdlcyBhbHJlYWR5IHJlZmV0Y2gpLlxuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBGc0xpc3QgbmV2ZXIgdG91Y2hlcyB0aGUgVVJMIG9yIHBlcnNpc3RzIHNvcnQvcGFnaW5nIHN0YXRlLiBUaGUgc29ydFxuICAgICAgLy8gaXMga2VwdCBpbiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgKHNldExpc3RTb3J0KSwgYW5kIHBhZ2luZyBzdGF5c1xuICAgICAgLy8gb3V0IG9mIGl0LlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIHNvcnQ6IHNvcnRcbiAgICAgICAgPyB7IHZhbHVlOiBzb3J0LmNvbHVtbiwgZGlyZWN0aW9uOiBzb3J0LmRpcmVjdGlvbiA/PyAnYXNjJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gTG9hZC1tb3JlOiB0aGUgbGlzdCBrZWVwcyBhIGZpeGVkLCBzY3JvbGxhYmxlIGhlaWdodCBhbmQgYXBwZW5kcyB0aGVcbiAgICAgIC8vIG5leHQgcGFnZSBpbiBwbGFjZSBpbnN0ZWFkIG9mIHN3YXBwaW5nIHBhZ2VzLiBUaGUgYnV0dG9uIGlzIHBpbm5lZCB0b1xuICAgICAgLy8gdGhlIGJvdHRvbSBvZiB0aGUgc2Nyb2xsIHBhbmUgKHNlZSBjb21wb25lbnQgU0NTUykuXG4gICAgICAvL1xuICAgICAgLy8gVXNlcyB0aGUgT2Zmc2V0IHN0cmF0ZWd5IChvZmZzZXQgKyBsaW1pdCkgcmF0aGVyIHRoYW4gTWFueTogaW5cbiAgICAgIC8vIEBmaXJlc3RpdGNoL2xpc3QgdGhlIHBhZ2luYXRpb24gdGVtcGxhdGUgcmVzb2x2ZXMgYGhhc01hbnlTdHJhdGVneWBcbiAgICAgIC8vIEJFRk9SRSBgbG9hZE1vcmVFbmFibGVkYCwgYW5kIE1hbnkgcmVuZGVycyBhIGZvcndhcmQtb25seSBwYWdlIHBhZ2VyIOKAlFxuICAgICAgLy8gc28gTWFueSB3b3VsZCBzdXBwcmVzcyB0aGUgbG9hZC1tb3JlIGJ1dHRvbiBlbnRpcmVseS4gT2Zmc2V0ICsgbG9hZE1vcmVcbiAgICAgIC8vIGlzIHRoZSBjb21iaW5hdGlvbiB0aGF0IGFjdHVhbGx5IHJlbmRlcnMgYW5kIGFwcGVuZHMuIGBfZmV0Y2hgIGFscmVhZHlcbiAgICAgIC8vIGRlcml2ZXMgYHBhZ2VgIGZyb20gYG9mZnNldGAsIHNvIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGlzIHVuYWZmZWN0ZWQuXG4gICAgICBwYWdpbmc6IHtcbiAgICAgICAgbGltaXQ6IGNvbmZpZy5wYWdlU2l6ZSA/PyAyNSxcbiAgICAgICAgc3RyYXRlZ3k6IFBhZ2luYXRpb25TdHJhdGVneS5PZmZzZXQsXG4gICAgICB9LFxuICAgICAgbG9hZE1vcmU6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdMb2FkIG1vcmUnLFxuICAgICAgICBidXR0b25UeXBlOiAnc3Ryb2tlZCcsXG4gICAgICB9LFxuICAgICAgZmV0Y2g6IChxdWVyeTogYW55KSA9PiB0aGlzLl9mZXRjaChxdWVyeSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZldGNoKHF1ZXJ5OiBhbnkpOiBPYnNlcnZhYmxlPHsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTsgcGFnaW5nOiBhbnkgfT4ge1xuICAgIC8vIE1hbnkvbG9hZC1tb3JlIHNlbmRzIGBvZmZzZXRgICsgYGxpbWl0YCAobm90IGBwYWdlYCk7IGRlcml2ZSB0aGUgcGFnZSBzb1xuICAgIC8vIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGtlZXBzIHdvcmtpbmcgdW5jaGFuZ2VkLiBQYWdlIHN0cmF0ZWd5IHN0aWxsIHNlbmRzXG4gICAgLy8gYHBhZ2VgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHBhZ2VTaXplID0gcXVlcnkubGltaXQgPz8gMjU7XG4gICAgY29uc3QgcGFnZSA9IHF1ZXJ5LnBhZ2VcbiAgICAgID8/IChxdWVyeS5vZmZzZXQgIT0gbnVsbCA/IE1hdGguZmxvb3IocXVlcnkub2Zmc2V0IC8gcGFnZVNpemUpICsgMSA6IDEpO1xuXG4gICAgY29uc3Qgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHtcbiAgICAgIHBhZ2UsXG4gICAgICBwYWdlU2l6ZSxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JkZXIgPSBTdHJpbmcocXVlcnkub3JkZXIgPz8gJycpO1xuICAgIGlmIChvcmRlcikge1xuICAgICAgY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSA9IG9yZGVyLnNwbGl0KCcsJyk7XG4gICAgICBzdGF0ZS5zb3J0ID0geyBjb2x1bW4sIGRpcmVjdGlvbjogZGlyZWN0aW9uID09PSAnZGVzYycgPyAnZGVzYycgOiAnYXNjJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0TGlzdFNvcnQoY29tcG9uZW50LCBzdGF0ZS5zb3J0ID8/IG51bGwpO1xuXG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNlYXJjaChjb21wb25lbnQuaWQpO1xuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHN0YXRlLnNlYXJjaCA9IHNlYXJjaDtcbiAgICB9XG5cbiAgICAvLyBUaGUgZ3JvdXBzIHRoYXQgbWF0Y2ggJ2FueScsIGFzIGV2ZXJ5IG90aGVyIHJlYWQgb2YgdGhpcyB0aWxlIHNlbmRzXG4gICAgLy8gdGhlbSAodGlsZURhdGFTdGF0ZSkuIFRoZSBzb3J0IGFuZCBwYWdpbmcgYWJvdmUgYXJlIEZzTGlzdCdzIG93bi5cbiAgICBjb25zdCB7IG1hdGNoQW55R3JvdXBJZHMgfSA9IHRoaXMuX2ZpbHRlclN0YXRlLnRpbGVTdGF0ZShjb21wb25lbnQpO1xuICAgIGlmIChtYXRjaEFueUdyb3VwSWRzKSB7XG4gICAgICBzdGF0ZS5tYXRjaEFueUdyb3VwSWRzID0gbWF0Y2hBbnlHcm91cElkcztcbiAgICB9XG5cbiAgICAvLyBPbmUgc291cmNlIGZvciBmaWx0ZXIgdmFsdWVzLCB0aGUgc2FtZSBvbmUgY2hhcnRzLCBLUElzIGFuZCB0aGUgZXhwb3J0c1xuICAgIC8vIHJlYWQsIHNvIHRoZSBsaXN0IGlzIGZpbHRlcmVkIGV4YWN0bHkgYXMgaXRzIGhlYWRlciBzdHJpcCBzaG93cy5cbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGFcbiAgICAgIC5jb21wb25lbnREYXRhKHRoaXMucmVwb3J0SWQoKSwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpID0+IHtcbiAgICAgICAgICAvLyBBIGNyb3NzLXRhYidzIGhlYWRlcnMgY29tZSBiYWNrIHdpdGggdGhlIHJvd3M6IHRoZSByb3cta2V5IGNvbHVtblxuICAgICAgICAgIC8vIGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUuIFJlLXJlYWQgdGhlbSBvbiBldmVyeSBmZXRjaCwgc2luY2VcbiAgICAgICAgICAvLyBhIGZpbHRlciBjaGFuZ2UgY2FuIGFkZCBvciByZW1vdmUgYSBjb2x1bW4uXG4gICAgICAgICAgaWYgKHRoaXMucGl2b3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMuc2V0KHRoaXMuX3Bpdm90Q29sdW1ucyhkYXRhKSk7XG4gICAgICAgICAgICB0aGlzLnRydW5jYXRlZC5zZXQoISFkYXRhLnRydW5jYXRlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT25seSBwYWdlIDEgY2FycmllcyB0aGUgbm90ZXMgYW5kIHRoZSB0b3RhbHM7IGEgbG9hZC1tb3JlIHBhZ2VcbiAgICAgICAgICAvLyBsZWF2ZXMgdGhlbSBhcyB0aGV5IGFyZS5cbiAgICAgICAgICBpZiAoc3RhdGUucGFnZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hOb3RlLnNldChkYXRhLnNlYXJjaE5vdGUgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRvdGFscy5zZXQoZGF0YS50b3RhbHMgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRvdGFsc05vdGUuc2V0KGRhdGEudG90YWxzTm90ZSA/PyBudWxsKTtcbiAgICAgICAgICAgIHRoaXMubm90ZURhdGEuc2V0KHRoaXMuX25vdGVEYXRhKGRhdGEpKTtcbiAgICAgICAgICAgIHRoaXMuX2FsaWduT3V0cHV0Q29sdW1ucyhkYXRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGUgc2VydmVyJ3MgcGFnZSBzaXplIHdoZW4gaXQgc2VuZHMgb25lIChpdCBjbGFtcHMgdGhlIHJlcXVlc3QpLFxuICAgICAgICAgIC8vIHRoZSBzaXplIHRoZSBwYWdpbmcgYmVsb3cgaGFuZHMgZnMtbGlzdCB0b28uXG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZTtcbiAgICAgICAgICBjb25zdCBzaG93biA9IChzdGF0ZS5wYWdlIC0gMSkgKiBzaXplICsgKGRhdGEucm93cz8ubGVuZ3RoID8/IDApO1xuICAgICAgICAgIHRoaXMucm93Q291bnQuc2V0KHsgc2hvd24sIHRvdGFsOiBkYXRhLnBhZ2luZz8udG90YWwgPz8gc2hvd24gfSk7XG5cbiAgICAgICAgICAvLyBOZXcgcm93cyBjYW4gd2lkZW4gYSBwaW5uZWQgY29sdW1uLCB3aGljaCBtb3ZlcyB0aGUgb25lcyBhZnRlciBpdC5cbiAgICAgICAgICB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnJvd3MgPz8gW10sXG4gICAgICAgICAgICBwYWdpbmc6IHtcbiAgICAgICAgICAgICAgbGltaXQ6IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgcmVjb3JkczogZGF0YS5wYWdpbmc/LnRvdGFsID8/IChkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwKSxcbiAgICAgICAgICAgICAgcGFnZTogZGF0YS5wYWdpbmc/LnBhZ2UgPz8gc3RhdGUucGFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSBjcm9zcy10YWIncyBjb2x1bW5zLCBidWlsdCBmcm9tIHRoZSB3aXJlIGJ5IHBpdm90Q29sdW1uU3BlY3MoKTogdGhlIHNhbWVcbiAgLy8gaGVhZGluZ3MgYW5kIGNlbGwgZm9ybWF0IHRoZSBQREYgYW5kIFBvd2VyUG9pbnQgZXhwb3J0cyB1c2UuIEEgY2VsbCBjb2x1bW5cbiAgLy8gd2hvc2UgbWVhc3VyZSBpcyBhIHJhbmsgb3IgYSBzaGFyZSAoY2VsbE1lYXN1cmVzIG5hbWVzIGl0KSBob2xkcyBudW1iZXJzXG4gIC8vIHdoZXRoZXIgb3Igbm90IHRoZSBncmlkIG5hbWVzIGEgY2VsbCBmb3JtYXQuXG4gIHByaXZhdGUgX3Bpdm90Q29sdW1ucyhkYXRhOiBDb21wb25lbnREYXRhKTogKExpc3RDb2x1bW4gJiB7IG51bWVyaWM6IGJvb2xlYW4gfSlbXSB7XG4gICAgY29uc3QgY29uZmlnID0gKHRoaXMuY29tcG9uZW50KCkuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnO1xuICAgIGNvbnN0IG91dHB1dENlbGxzID0gT2JqZWN0LmtleXMobGlzdE91dHB1dENvbHVtbnMoXG4gICAgICAoZGF0YS5jb2x1bW5zID8/IFtdKS5zbGljZSgxKS5tYXAoKGNvbHVtbikgPT4gKHsgY29sdW1uIH0pKSxcbiAgICAgIGRhdGEsXG4gICAgICBbXSxcbiAgICApKTtcblxuICAgIHJldHVybiBwaXZvdENvbHVtblNwZWNzKGNvbmZpZywgZGF0YSwgdGhpcy5mb3JtYXRDb250ZXh0KCkubG9jYWxlKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGNvbHVtbi5udW1lcmljIHx8IG91dHB1dENlbGxzLmluY2x1ZGVzKGNvbHVtbi5jb2x1bW4pIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX25vdGVEYXRhKGRhdGE6IENvbXBvbmVudERhdGEpOiBDb21wb25lbnROb3RlRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmlzb246IGRhdGEuY29tcGFyaXNvbixcbiAgICAgIHRpbWVmcmFtZTogZGF0YS50aW1lZnJhbWUsXG4gICAgICBvdXRwdXRzOiBkYXRhLm91dHB1dHMsXG4gICAgICBjZWxsTWVhc3VyZXM6IGRhdGEuY2VsbE1lYXN1cmVzLFxuICAgICAgd2luZG93czogZGF0YS53aW5kb3dzLFxuICAgICAgZ3JhbnVsYXJpdHk6IGRhdGEuZ3JhbnVsYXJpdHksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgcGxhaW4gbGlzdCdzIGNvbHVtbnMgYXJlIGJ1aWx0IGJlZm9yZSBhbnkgZGF0YSBhcnJpdmVzLCBzbyBhbiBvdXRwdXRcbiAgLy8gY29sdW1uIHRoYXQgbmFtZXMgbm8gZm9ybWF0IG9mIGl0cyBvd24gKGEgcmFuaywgYSBzaGFyZSwgYSBwcmlvciB0aGF0IHRha2VzXG4gIC8vIGl0cyBtZWFzdXJlJ3MgZm9ybWF0KSBsZWFybnMgaXQgaG9sZHMgbnVtYmVycyBmcm9tIHBhZ2UgMS4gZnMtbGlzdCByZWFkcyBhXG4gIC8vIGNvbHVtbidzIGFsaWdubWVudCBvbmx5IHdoZW4gaXQgYnVpbGRzIHRoZSBjb2x1bW4sIHNvIGEgY29sdW1uIHdob3NlXG4gIC8vIGFsaWdubWVudCBjaGFuZ2VzIGlzIHJlYnVpbHQgKHRoZSB0ZW1wbGF0ZSB0cmFja3MgY29sdW1ucyBieSBib3RoKS5cbiAgcHJpdmF0ZSBfYWxpZ25PdXRwdXRDb2x1bW5zKGRhdGE6IENvbXBvbmVudERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5waXZvdGVkKCkgfHwgIWRhdGEub3V0cHV0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMoKTtcbiAgICBjb25zdCBhbGlnbmVkID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKHtcbiAgICAgIC4uLmNvbHVtbixcbiAgICAgIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIHx8ICEhZGF0YS5vdXRwdXRzW2NvbHVtbi5jb2x1bW5dLFxuICAgIH0pKTtcblxuICAgIGlmIChhbGlnbmVkLnNvbWUoKGNvbHVtbiwgaW5kZXgpID0+IGNvbHVtbi5udW1lcmljICE9PSBjb2x1bW5zW2luZGV4XS5udW1lcmljKSkge1xuICAgICAgdGhpcy5jb2x1bW5zLnNldChhbGlnbmVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIHRpbGUgcmVzaXplIHJlZmxvd3MgdGhlIHRhYmxlJ3MgYXV0byBsYXlvdXQsIHNvIHRoZSBwaW5uZWQgY29sdW1ucydcbiAgLy8gd2lkdGhzLCBhbmQgd2l0aCB0aGVtIHRoZWlyIG9mZnNldHMsIGNoYW5nZS5cbiAgcHJpdmF0ZSBfb2JzZXJ2ZVBpbk9mZnNldHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGlubmVkKCkgPCAyIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuX2Rlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuICAvLyBNZWFzdXJlcyB0aGUgcGlubmVkIG9mZnNldHMgb25jZSB0aGUgbmV4dCByZW5kZXIgaGFzIGxhaWQgdGhlIHRhYmxlIG91dC5cbiAgLy8gT25lIHBlbmRpbmcgbWVhc3VyZW1lbnQgY292ZXJzIGV2ZXJ5IHJlcXVlc3QgbWFkZSBiZWZvcmUgaXQgcnVucy4gT25seVxuICAvLyBhZnRlck5leHRSZW5kZXIgZXhpc3RzIGluIGV2ZXJ5IEFuZ3VsYXIgdmVyc2lvbiB0aGlzIGxpYnJhcnkgcnVucyBvbi5cbiAgcHJpdmF0ZSBfc2NoZWR1bGVQaW5PZmZzZXRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpbm5lZCgpIDwgMiB8fCB0aGlzLl9waW5PZmZzZXRzUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGluT2Zmc2V0c1JlZiA9IGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9waW5PZmZzZXRzUmVmID0gbnVsbDtcbiAgICAgIHRoaXMuX3VwZGF0ZVBpbk9mZnNldHMoKTtcbiAgICB9LCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgfVxuXG4gIC8vIEVhY2ggcGlubmVkIGNvbHVtbiBzdGlja3MgYXQgdGhlIHN1bW1lZCB3aWR0aCBvZiB0aGUgdmlzaWJsZSBwaW5uZWRcbiAgLy8gY29sdW1ucyBiZWZvcmUgaXQuIEEgaGlkZGVuIGNvbHVtbiByZW5kZXJzIG5vIGhlYWRlciwgc28gdGhlIG5leHQgcGlubmVkXG4gIC8vIG9uZSB0YWtlcyBpdHMgcGxhY2UuIEEgdmFyaWFibGUgaXMgd3JpdHRlbiBvbmx5IHdoZW4gaXRzIHZhbHVlIGNoYW5nZWQsXG4gIC8vIHdoaWNoIGtlZXBzIGEgcmVzaXplIGZyb20gcmVzdHlsaW5nIHRoZSB0YWJsZSBmb3Igbm90aGluZy5cbiAgcHJpdmF0ZSBfdXBkYXRlUGluT2Zmc2V0cygpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGxldCBsZWZ0ID0gMDtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnBpbm5lZCgpOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBob3N0LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGB0aGVhZCB0aC5yZXBvcnQtcGluLSR7aW5kZXh9YCk7XG5cbiAgICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gYC0tcmVwb3J0LXBpbi1sZWZ0LSR7aW5kZXh9YDtcbiAgICAgIGNvbnN0IHZhbHVlID0gYCR7TWF0aC5yb3VuZChsZWZ0ICogMTAwKSAvIDEwMH1weGA7XG5cbiAgICAgIGlmIChob3N0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgIT09IHZhbHVlKSB7XG4gICAgICAgIGhvc3Quc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBsZWZ0ICs9IGhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAodHJ1bmNhdGVkKCkpIHtcbiAgPGRpdiBjbGFzcz1cInBpdm90LXRydW5jYXRlZFwiPlxuICAgIFRoaXMgZ3JpZCB3YXMgYnVpbHQgZnJvbSBhIHBhcnRpYWwgcmVzdWx0LCBzbyBzb21lIGNvbHVtbnMgb3IgdmFsdWVzIG1heSBiZSBtaXNzaW5nLiBOYXJyb3cgaXQgd2l0aCBhIGZpbHRlci5cbiAgPC9kaXY+XG59XG5cbjwhLS0gVGhlIHdpbmRvd3MgYSBjb21wYXJpc29uIGNvbXBhcmVzLCBhbmQgd2h5IGl0IHJlYWRzIGFzIGl0IGRvZXMuIEFcbiAgICAgd2luZG93ZWQgY29sdW1uJ3Mgb3duIG5vdGVzIGFyZSBpbiBpdHMgaGVhZGVyJ3MgdG9vbHRpcC4gLS0+XG48YXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZVxuICBbZGF0YV09XCJub3RlRGF0YSgpXCJcbiAgW3dpbmRvd05vdGVzXT1cImZhbHNlXCI+XG48L2FwcC1yZXBvcnQtY29tcG9uZW50LW5vdGU+XG5cbjwhLS0gZnMtbGlzdCByZWFkcyBhIGNvbHVtbidzIGZvb3RlciB0ZW1wbGF0ZSBvbmNlLCBhcyBhIGRpcmVjdCBjaGlsZCBvZlxuICAgICBmcy1saXN0LWNvbHVtbiwgc28gYSBsaXN0IHdpdGggdG90YWxzIHJlbmRlcnMgaXRzIGNvbHVtbnMgaW4gYSBicmFuY2ggb2ZcbiAgICAgdGhlaXIgb3duIHJhdGhlciB0aGFuIHdyYXBwaW5nIHRoZSBmb290ZXIgaW4gYW4gQGlmLiBJdHMgaGVhZGVyIHRlbXBsYXRlIHRvbyxcbiAgICAgd2hpY2ggZXZlcnkgY29sdW1uIGNhcnJpZXM6IGFuIG91dHB1dCBjb2x1bW4ncyB0b29sdGlwIHNheXMgd2hhdCBpdCBob2xkcy5cbiAgICAgQ29sdW1ucyBhcmUgdHJhY2tlZCBieSBhbGlnbm1lbnQgYXMgd2VsbCBhcyBuYW1lLCBzaW5jZSBmcy1saXN0IHJlYWRzIGFcbiAgICAgY29sdW1uJ3MgYWxpZ25tZW50IG9ubHkgd2hlbiBpdCBidWlsZHMgdGhlIGNvbHVtbi4gLS0+XG48ZnMtbGlzdFxuICBbY29uZmlnXT1cImxpc3RDb25maWdcIlxuICBbY2xhc3MucmVwb3J0LXRvdGFscy1lbXB0eV09XCIhdG90YWxzKClcIj5cbiAgQGlmIChzaG93VG90YWxzKCkpIHtcbiAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1ucygpOyB0cmFjayBjb2x1bW4uY29sdW1uICsgJzonICsgY29sdW1uLm51bWVyaWMpIHtcbiAgICAgIDxmcy1saXN0LWNvbHVtblxuICAgICAgICBbbmFtZV09XCJjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3RpdGxlXT1cImNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3Nob3ddPVwiIWhpZGRlbigpLmhhcyhjb2x1bW4uY29sdW1uKVwiXG4gICAgICAgIFtzb3J0YWJsZV09XCIhcGl2b3RlZCgpIHx8ICRmaXJzdFwiXG4gICAgICAgIFthbGlnbl09XCJjb2x1bW4ubnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCdcIlxuICAgICAgICBbY2xhc3NdPVwiY29sdW1uQ2xhc3Nlcyhjb2x1bW4sICRpbmRleCwgcGlubmVkKCkpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd1tjb2x1bW4uY29sdW1uXSwgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtZm9vdGVyPlxuICAgICAgICAgIEBpZiAodG90YWxzKCk/Lltjb2x1bW4uY29sdW1uXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHRvdGFscygpPy5bY29sdW1uLmNvbHVtbl0sIHJvdzogdG90YWxzKCksIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbHVtbi5jb2x1bW4gPT09IHRvdGFsc0xhYmVsQ29sdW1uKCkpIHtcbiAgICAgICAgICAgIHt7IHRvdGFsTGFiZWwgfX1cbiAgICAgICAgICB9XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmNvbHVtbiArICc6JyArIGNvbHVtbi5udW1lcmljKSB7XG4gICAgICA8ZnMtbGlzdC1jb2x1bW5cbiAgICAgICAgW25hbWVdPVwiY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFt0aXRsZV09XCJjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFtzaG93XT1cIiFoaWRkZW4oKS5oYXMoY29sdW1uLmNvbHVtbilcIlxuICAgICAgICBbc29ydGFibGVdPVwiIXBpdm90ZWQoKSB8fCAkZmlyc3RcIlxuICAgICAgICBbYWxpZ25dPVwiY29sdW1uLm51bWVyaWMgPyAncmlnaHQnIDogJ2xlZnQnXCJcbiAgICAgICAgW2NsYXNzXT1cImNvbHVtbkNsYXNzZXMoY29sdW1uLCAkaW5kZXgsIHBpbm5lZCgpKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dbY29sdW1uLmNvbHVtbl0sIHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgIH1cbiAgfVxuPC9mcy1saXN0PlxuXG5AaWYgKGNhcHRpb24oKSkge1xuICA8ZGl2IGNsYXNzPVwibGlzdC1jYXB0aW9uIHNtYWxsXCI+XG4gICAge3sgY2FwdGlvbigpIH19XG4gIDwvZGl2PlxufVxuXG48IS0tIEEgY29sdW1uJ3MgaGVhZGluZywgd2l0aCB3aGF0IGFuIG91dHB1dCBjb2x1bW4gaG9sZHMgYXMgaXRzIHRvb2x0aXAgKGFuXG4gICAgIGVtcHR5IG9uZSBuZXZlciBzaG93cykuIC0tPlxuPG5nLXRlbXBsYXRlXG4gICNoZWFkZXJUcGxcbiAgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8c3BhbiBbbWF0VG9vbHRpcF09XCJjb2x1bW5Ob3RlcygpW2NvbHVtbi5jb2x1bW5dID8/ICcnXCI+e3sgY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW4gfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIE9uZSBjZWxsLCBpbiB0aGUgYm9keSBhbmQgdGhlIHRvdGFscyByb3cgYWxpa2U6IGFuIG91dHB1dCBjb2x1bW4gYnkgd2hhdFxuICAgICBpdCBob2xkcyAoaXRzIHJvdyBnaXZlcyBhIGNoYW5nZSBpdHMgcHJpb3IpLCBhIGRhdGUgY29sdW1uIGFzIGEgZGF5IGluIHRoZVxuICAgICByZXBvcnQncyB6b25lIGFuZCBsb2NhbGUsIGFueSBvdGhlciB0aHJvdWdoIGl0cyBudW1iZXIgZm9ybWF0LiAtLT5cbjxuZy10ZW1wbGF0ZVxuICAjY2VsbFRwbFxuICBsZXQtdmFsdWVcbiAgbGV0LXJvdz1cInJvd1wiXG4gIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgQGlmIChvdXRwdXRDb2x1bW5zKClbY29sdW1uLmNvbHVtbl07IGFzIG91dHB1dCkge1xuICAgIEBpZiAocm93IHwgZnNSZXBvcnRPdXRwdXQ6IGNvbHVtbiA6IG91dHB1dCA6IGZvcm1hdENvbnRleHQoKTsgYXMgY2VsbCkge1xuICAgICAgPHNwYW4gW2F0dHIudGl0bGVdPVwiY2VsbC50aXRsZVwiPnt7IGNlbGwudGV4dCB9fTwvc3Bhbj5cbiAgICB9XG4gIH0gQGVsc2UgaWYgKGNvbHVtbi5mb3JtYXQgPT09IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQuRGF0ZSkge1xuICAgIHt7IHZhbHVlIHwgZnNSZXBvcnREYXRlOiB0aW1lem9uZSgpIDogZm9ybWF0Q29udGV4dCgpLmxvY2FsZSB9fVxuICB9IEBlbHNlIHtcbiAgICB7eyB2YWx1ZSB8IGZzUmVwb3J0TnVtYmVyOiBjb2x1bW4gOiBmb3JtYXRDb250ZXh0KCkgfX1cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBRVIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU2xFLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixp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QztnQkFDWixTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLHFCQUFxQixLQUFLLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBRWxELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxJQUFJLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO3dHQTdYVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixtWkFLUyxlQUFlLGdFQ3RGM0QsKzVJQXFIQSxzZ0VEN0NJLHNCQUFzQix1SUFDdEIsWUFBWSwreUJBQ1osVUFBVSxpUkFDVixnQkFBZ0IsK0lBQ2hCLGNBQWMsZ0RBQ2QsZ0JBQWdCLGtEQUNoQixnQkFBZ0I7OzRGQUdQLHNCQUFzQjtrQkFoQmxDLFNBQVM7K0JBQ0UsMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclJlbmRlclJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIE9uSW5pdCxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcsIEZzTGlzdE1vZHVsZSwgUGFnaW5hdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgbWVyZ2UsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdFBsYWluTnVtYmVyLCBoYXNOdW1iZXJGb3JtYXQgfSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgQ29tcG9uZW50RGF0YVN0YXRlLFxuICBMaXN0Q29sdW1uLFxuICBMaXN0Q29uZmlnLFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydFNvcnQsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBMSVNUX1RPVEFMX0xBQkVMLFxuICBMaXN0T3V0cHV0Q29sdW1uLFxuICBjb2x1bW5DbGFzc2VzLFxuICBsaXN0T3V0cHV0Q29sdW1ucyxcbiAgbGlzdFBpbm5lZENvbHVtbnMsXG4gIGxpc3RTb3J0VGVybXMsXG4gIGxpc3RUb3RhbHNMYWJlbENvbHVtbixcbn0gZnJvbSAnLi4vLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uLy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVEYXRhLCBvdXRwdXRDb2x1bW5Ob3RlIH0gZnJvbSAnLi4vLi4vb3V0cHV0LW5vdGVzJztcbmltcG9ydCB7IFJlcG9ydERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LWRhdGUucGlwZSc7XG5pbXBvcnQgeyBSZXBvcnROdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LW51bWJlci5waXBlJztcbmltcG9ydCB7IFJlcG9ydE91dHB1dFBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9yZXBvcnQtb3V0cHV0LnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5cbi8vIEEgbGlzdCBjb21wb25lbnQ6IGFuIEZzTGlzdCByZW5kZXJlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjb25maWcuIEl0IGhhcyBub1xuLy8gZmlsdGVyIGJhciBvZiBpdHMgb3duOiBpdHMgZmlsdGVycyBhcmUgZ3JvdXAta2V5ZWQgbGlrZSBldmVyeSBvdGhlclxuLy8gY29tcG9uZW50J3MsIHNvIGNvbXBvbmVudC1sZXZlbCBncm91cHMgcmVuZGVyIGluIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwXG4vLyAoUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50KSBhbmQgcmVwb3J0LWxldmVsIGdyb3VwcyBpbiB0aGUgcmVwb3J0IGJhciwgYW5kXG4vLyBldmVyeSByZXF1ZXN0IHRha2VzIGl0cyB2YWx1ZXMgZnJvbSB0aGUgc2hhcmVkIGZpbHRlci1zdGF0ZSBzZXJ2aWNlLlxuLy8gUGFnaW5nIGFuZCBzb3J0aW5nIGFyZSBwdXNoZWQgaW50byB0aGUgU1FMIHdyYXAgc2VydmVyLXNpZGUuXG4vL1xuLy8gQSBsaXN0IHdob3NlIHF1ZXJ5IGNvbXBhcmVzLCB3aW5kb3dzLCByYW5rcyBvciBzaGFyZXMgc2F5cyBzbzogdGhlIHNoYXJlZFxuLy8gbm90ZSBhYm92ZSBpdCBuYW1lcyB0aGUgd2luZG93cyBhIGNvbXBhcmlzb24gY29tcGFyZXMsIGVhY2ggc3VjaCBjb2x1bW4nc1xuLy8gaGVhZGVyIHRvb2x0aXAgc2F5cyB3aGF0IGl0IGhvbGRzLCBhbmQgaXRzIGNlbGxzICh0b3RhbHMgaW5jbHVkZWQsIHdoaWNoIHRoZVxuLy8gc2VydmVyIGNvbXB1dGVzKSBhcmUgd3JpdHRlbiBieSB3aGF0IHRoZXkgaG9sZC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgRnNMaXN0TW9kdWxlLFxuICAgIE1hdFRvb2x0aXAsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZXBvcnREYXRlUGlwZSxcbiAgICBSZXBvcnROdW1iZXJQaXBlLFxuICAgIFJlcG9ydE91dHB1dFBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdENvbXBvbmVudCA9IHZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpO1xuXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYXV0aG9yZWQgYW5kIGZpeGVkIGF0IGluaXQuIEEgY3Jvc3MtdGFiJ3MgYXJlXG4gIC8vIHRoZSBwaXZvdCBkaW1lbnNpb24ncyBWQUxVRVMsIHNvIHRoZXkgYXJyaXZlIHdpdGggdGhlIHJvd3MgYW5kIGNoYW5nZVxuICAvLyB3aGVuZXZlciB0aGUgZmlsdGVycyBkbyDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgYSBzaWduYWwgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIG9uZS1zaG90IHJlYWQgaXQgdXNlZCB0byBiZS4gYG51bWVyaWNgIG1hcmtzIGEgY29sdW1uIHdob3NlIGNlbGxzIGFyZVxuICAvLyBmb3JtYXR0ZWQgbnVtYmVycywgZGVjaWRlZCBvbmNlIGhlcmUgcmF0aGVyIHRoYW4gcGVyIGNlbGwsIHNvIHRoZSBjb2x1bW5cbiAgLy8gYW5kIGl0cyBoZWFkZXIgYXJlIHJpZ2h0LWFsaWduZWQuXG4gIHB1YmxpYyBjb2x1bW5zID0gc2lnbmFsPChMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH0pW10+KFtdKTtcblxuICAvLyBBIGNyb3NzLXRhYiBzb3J0cyBvbmx5IGJ5IGl0cyByb3cta2V5IGNvbHVtbjogZXZlcnkgb3RoZXIgaGVhZGVyIGlzIGFcbiAgLy8gcGl2b3QgdmFsdWUsIGFuZCB0aGUgc2VydmVyIG9yZGVycyB0aGUgbG9uZyByb3dzIGJlZm9yZSBwaXZvdGluZywgc28gYVxuICAvLyBjbGljayBvbiBcIk1hciAyMDI2XCIgaGFzIG5vdGhpbmcgdG8gb3JkZXIgYnkuXG4gIHB1YmxpYyBwaXZvdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBBIGN1dCByZXN1bHQgaXMgd29yc2UgZm9yIGEgZ3JpZCB0aGFuIGZvciBhIGxpc3Q6IHRoZSBjdXQgbGFuZHMgb24gdGhlIExPTkdcbiAgLy8gcm93cyBiZWZvcmUgdGhlIHJlc2hhcGUsIHNvIGEgcGl2b3QgdmFsdWUgbGl2aW5nIG9ubHkgaW4gdGhlIHRhaWwgdmFuaXNoZXNcbiAgLy8gYXMgYSB3aG9sZSBDT0xVTU4gYW5kIHN0cmFkZGxlZCBjZWxscyBjb21lIGJhY2sgYmxhbmssIGluZGlzdGluZ3Vpc2hhYmxlXG4gIC8vIGZyb20gYSByZWFsIHplcm8uIFRoZSBwYXJlbnQncyB0cnVuY2F0aW9uIGJhbm5lciBuZXZlciBmaXJlcyBmb3IgYSBsaXN0XG4gIC8vIChpdCBvbmx5IHJlbmRlcnMgd2hhdCBfbG9hZCgpIGZldGNoZWQsIHdoaWNoIGxpc3RzIHNraXApLCBzbyB0aGUgd2FybmluZ1xuICAvLyBiZWxvbmdzIGhlcmUuXG4gIHB1YmxpYyB0cnVuY2F0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFdoeSB0aGUgc2VhcmNoIGJveCBkaWQgbm90IG5hcnJvdyB0aGUgcm93cyAodGhlIGxpc3QgaGFzIG5vIHRleHQgY29sdW1uIHRvXG4gIC8vIHNlYXJjaCksIGZyb20gdGhlIGxhdGVzdCBwYWdlIDE7IG51bGwgd2hlbiB0aGUgc2VhcmNoIGFwcGxpZWQgb3Igbm9uZSB3YXNcbiAgLy8gbWFkZS5cbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaE5vdGUgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gY29uZmlnLnRvdGFscywgcmVhZCBvbmNlIGF0IGluaXQ6IGEgbGlzdCB3aXRoIHRvdGFscyByZW5kZXJzIGl0cyBjb2x1bW5zXG4gIC8vIHdpdGggYSBmb290ZXIgdGVtcGxhdGUsIHdoaWNoIGZzLWxpc3QgcmVhZHMgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGVtLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1RvdGFscyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHRvdGFscyByb3cgZnJvbSB0aGUgbGF0ZXN0IHBhZ2UgMSwgcmF3IHZhbHVlcyBrZXllZCBsaWtlIHRoZSBjb2x1bW5zO1xuICAvLyBudWxsIHdoZW4gdGhlIGxpc3QgaGFzIG5vbmUsIG9yIHRoZSBzZXJ2ZXIgc2F5cyB3aHkgaW4gdG90YWxzTm90ZS5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFscyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNOb3RlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBsYXRlc3QgcGFnZSAxJ3MgY29tcGFyaXNvbiB3aW5kb3dzLCB0aW1lZnJhbWUgYW5kIG91dHB1dCBtZXRhZGF0YSwgZm9yXG4gIC8vIHRoZSBub3RlIGFib3ZlIHRoZSBsaXN0LCB0aGUgaGVhZGVyIHRvb2x0aXBzIGFuZCB0aGUgb3V0cHV0IGNlbGxzOyBudWxsXG4gIC8vIHVudGlsIGl0IGFycml2ZXMsIGFuZCBlbXB0eSBvZiBldmVyeSBrZXkgZm9yIGEgbGlzdCB0aGF0IGhhcyBub25lLlxuICBwdWJsaWMgcmVhZG9ubHkgbm90ZURhdGEgPSBzaWduYWw8Q29tcG9uZW50Tm90ZURhdGEgfCBudWxsPihudWxsKTtcblxuICAvLyBIb3cgbWFueSByb3dzIHRoZSBsaXN0IHNob3dzIChsb2FkIG1vcmUgYXBwZW5kcykgb3V0IG9mIGhvdyBtYW55IGl0c1xuICAvLyBmaWx0ZXJzIGtlZXAuIEEgY3Jvc3MtdGFiIGNvdW50cyBncmlkIHJvd3MuXG4gIHB1YmxpYyByZWFkb25seSByb3dDb3VudCA9IHNpZ25hbDx7IHNob3duOiBudW1iZXI7IHRvdGFsOiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgd2hpY2ggZGF0ZSBjZWxscyByZW5kZXIgaW4uIEluamVjdGVkIHJpZ2h0XG4gIC8vIGhlcmUgcmF0aGVyIHRoYW4gcmVhZCBvZmYgX2ZpbHRlclN0YXRlLCB3aGljaCBpcyBkZWNsYXJlZCBmdXJ0aGVyIGRvd24gYW5kXG4gIC8vIGlzIHN0aWxsIHVuZGVmaW5lZCB3aGlsZSB0aGlzIGluaXRpYWxpemVyIHJ1bnMuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLnRpbWV6b25lO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdCBjb250ZXh0OiBkYXRlIGNlbGxzLCBudW1iZXIgY2VsbHMgYW5kIGFcbiAgLy8gY3Jvc3MtdGFiJ3MgcGVyaW9kIGhlYWRpbmdzIGFyZSB3cml0dGVuIGluIGl0cyBsb2NhbGUgKGFuZCBtb25leSBpbiBpdHNcbiAgLy8gY3VycmVuY3kpLiBJbmplY3RlZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24uXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSkuZm9ybWF0Q29udGV4dDtcblxuICBwdWJsaWMgcmVhZG9ubHkgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCA9IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQ7XG5cbiAgLy8gSG93IG1hbnkgbGVhZGluZyBjb2x1bW5zIHN0YXkgaW4gdmlldyB3aGlsZSB0aGUgbGlzdCBzY3JvbGxzIHNpZGV3YXlzLlxuICBwdWJsaWMgcmVhZG9ubHkgcGlubmVkID0gY29tcHV0ZWQoKCkgPT4gbGlzdFBpbm5lZENvbHVtbnModGhpcy5jb21wb25lbnQoKS5jb25maWcpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29sdW1uQ2xhc3NlcyA9IGNvbHVtbkNsYXNzZXM7XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkIG9uIHRoaXMgbGlzdCAodGhlIENvbHVtbnMgZGlhbG9nKS4gZnMtbGlzdFxuICAvLyBoaWRlcyBhbmQgc2hvd3MgdGhlbSBpbiBwbGFjZSB0aHJvdWdoIFtzaG93XSwgc28gdGhlIHJvd3NcbiAgLy8gYWxyZWFkeSBmZXRjaGVkIHN0YW5kLlxuICBwdWJsaWMgcmVhZG9ubHkgaGlkZGVuID0gY29tcHV0ZWQoKCkgPT4gbmV3IFNldCh0aGlzLl9maWx0ZXJTdGF0ZS5oaWRkZW5Db2x1bW5zKHRoaXMuY29tcG9uZW50KCkuaWQpKSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFsTGFiZWwgPSBMSVNUX1RPVEFMX0xBQkVMO1xuXG4gIC8vIFRoZSBjb2x1bW5zIHRoYXQgaG9sZCBhIGNvbXBhcmVkLCB3aW5kb3dlZCwgcmFua2VkIG9yIHNoYXJlZCBvdXRwdXQsIGJ5XG4gIC8vIG5hbWU7IHRoZSByZXN0IGFyZSB3cml0dGVuIGFzIGJlZm9yZS5cbiAgcHVibGljIHJlYWRvbmx5IG91dHB1dENvbHVtbnMgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBMaXN0T3V0cHV0Q29sdW1uPj4oKCkgPT4gbGlzdE91dHB1dENvbHVtbnMoXG4gICAgdGhpcy5jb2x1bW5zKCksXG4gICAgdGhpcy5ub3RlRGF0YSgpLFxuICAgICgodGhpcy5jb21wb25lbnQoKS5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWcpLmNvbHVtbnMgPz8gW10sXG4gICkpO1xuXG4gIC8vIEVhY2ggY29sdW1uJ3MgaGVhZGVyIHRvb2x0aXA6IHdoYXQgYW4gb3V0cHV0IGNvbHVtbiBob2xkcyAoJycgZm9yIGFueVxuICAvLyBvdGhlcikuXG4gIHB1YmxpYyByZWFkb25seSBjb2x1bW5Ob3RlcyA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCgpID0+IHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmZvcm1hdENvbnRleHQoKS5sb2NhbGU7XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuY29sdW1ucygpXG4gICAgICAubWFwKChjb2x1bW4pID0+IFtjb2x1bW4uY29sdW1uLCBvdXRwdXRDb2x1bW5Ob3RlKGNvbHVtbi5jb2x1bW4sIHRoaXMubm90ZURhdGEoKSwgbG9jYWxlKV0pKTtcbiAgfSk7XG5cbiAgLy8gVGhlIGNvbHVtbiB3aG9zZSBmb290ZXIgY2VsbCByZWFkcyAnVG90YWwnOiB0aGUgZmlyc3Qgb25lIHNob3duLCB1bmxlc3NcbiAgLy8gaXQgaG9sZHMgYSB0b3RhbCBpdHNlbGYuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNMYWJlbENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IGxpc3RUb3RhbHNMYWJlbENvbHVtbihcbiAgICB0aGlzLmNvbHVtbnMoKS5maWx0ZXIoKGNvbHVtbikgPT4gIXRoaXMuaGlkZGVuKCkuaGFzKGNvbHVtbi5jb2x1bW4pKSxcbiAgICB0aGlzLnRvdGFscygpLFxuICApKTtcblxuICAvLyBUaGUgbGluZSB1bmRlciB0aGUgbGlzdDogaXRzIHJvdyBjb3VudCwgdGhlbiB3aHkgaXQgaGFzIG5vIHRvdGFscyBhbmQgd2h5XG4gIC8vIGl0cyBzZWFyY2ggbmFycm93ZWQgbm90aGluZy4gVGhlIGRpZ2l0cyBhcmUgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3NcbiAgLy8gbG9jYWxlLCBuZXZlciB0aGUgYXBwJ3MuXG4gIHB1YmxpYyByZWFkb25seSBjYXB0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yb3dDb3VudCgpO1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuZm9ybWF0Q29udGV4dCgpLmxvY2FsZTtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjb3VudCkge1xuICAgICAgY29uc3QgdG90YWwgPSBmb3JtYXRQbGFpbk51bWJlcihjb3VudC50b3RhbCwgbG9jYWxlKTtcbiAgICAgIHBhcnRzLnB1c2goY291bnQuc2hvd24gPCBjb3VudC50b3RhbFxuICAgICAgICA/IGBTaG93aW5nICR7Zm9ybWF0UGxhaW5OdW1iZXIoY291bnQuc2hvd24sIGxvY2FsZSl9IG9mICR7dG90YWx9YFxuICAgICAgICA6IGAke3RvdGFsfSByb3cocylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gWy4uLnBhcnRzLCB0aGlzLnRvdGFsc05vdGUoKSwgdGhpcy5zZWFyY2hOb3RlKCldXG4gICAgICAuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gISFwYXJ0KVxuICAgICAgLmpvaW4oJyDCtyAnKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSBfcGluT2Zmc2V0c1JlZjogQWZ0ZXJSZW5kZXJSZWYgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBIaWRpbmcgb3Igc2hvd2luZyBhIGNvbHVtbiBtb3ZlcyB0aGUgcGlubmVkIGNvbHVtbnMgYWZ0ZXIgaXQuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuaGlkZGVuKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fc2NoZWR1bGVQaW5PZmZzZXRzKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgdGhpcy5waXZvdGVkLnNldCghIWNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pO1xuICAgIHRoaXMuc2hvd1RvdGFscy5zZXQoY29uZmlnLnRvdGFscyA9PT0gdHJ1ZSk7XG4gICAgdGhpcy5jb2x1bW5zLnNldCgoY29uZmlnLmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIH0pKSk7XG5cbiAgICB0aGlzLl9pbml0TGlzdENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX29ic2VydmVQaW5PZmZzZXRzKCk7XG5cbiAgICAvLyBBIGNoYW5nZSB0byBhbnkgZ3JvdXAgdGhpcyBsaXN0J3MgZmlsdGVycyBiZWxvbmcgdG8gKGZyb20gdGhlIHJlcG9ydCBiYXJcbiAgICAvLyBvciB0aGUgY29tcG9uZW50IGhlYWRlciBzdHJpcCkgcmUtcnVucyB0aGUgbGlzdC5cbiAgICAvLyBTbyBkb2VzIGEgY2hhbmdlIG9mIHRoZSB0ZXh0IGluIGl0cyBzZWFyY2ggYm94IChpbiB0aGUgY29tcG9uZW50IGhlYWRlcikuXG4gICAgbWVyZ2UodGhpcy5fZmlsdGVyU3RhdGUuY2hhbmdlc0Zvcihjb21wb25lbnQpLCB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoQ2hhbmdlcyhjb21wb25lbnQuaWQpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmxpc3RDb21wb25lbnQoKT8ucmVsb2FkKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0TGlzdENvbmZpZyhjb25maWc6IExpc3RDb25maWcpOiB2b2lkIHtcbiAgICAvLyBUaGUgdmlld2VyJ3MgbGFzdCBzb3J0IHdpbnMgb3ZlciB0aGUgYXV0aG9yZWQgb25lLCBzbyBhIGxpc3QgcmVjcmVhdGVkXG4gICAgLy8gaW4gdGhlIHNhbWUgc2Vzc2lvbiAocGFnZSBzd2l0Y2gsIHJlbG9hZCBhZnRlciBhbiBlZGl0KSBrZWVwcyBpdC5cbiAgICAvLyBmcy1saXN0IGhvbGRzIG9uZSBzb3J0aW5nIGNvbHVtbiwgc28gaXQgc2hvd3MgdGhlIGF1dGhvcmVkIHNvcnQncyBmaXJzdFxuICAgIC8vIHRlcm07IHRoZSByZXF1ZXN0IHNlbmRzIG9ubHkgdGhhdCB0ZXJtIGFuZCB0aGUgc2VydmVyIGFwcGVuZHMgdGhlIHJlc3QuXG4gICAgY29uc3Qgc29ydDogUmVwb3J0U29ydCB8IHVuZGVmaW5lZCA9IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTb3J0KHRoaXMuY29tcG9uZW50KCkuaWQpXG4gICAgICA/PyBsaXN0U29ydFRlcm1zKGNvbmZpZylbMF07XG5cbiAgICB0aGlzLmxpc3RDb25maWcgPSB7XG4gICAgICAvLyBJbnNpZGUgYSByZXBvcnQgY29tcG9uZW50IHRoZSBsaXN0IGlzIGEgY2xlYW4gZGF0YSBwYW5lIOKAlCBubyBzdGF0dXNcbiAgICAgIC8vIGJhciwgbm8gcmVsb2FkIGJ1dHRvbiAoZmlsdGVyIGNoYW5nZXMgYWxyZWFkeSByZWZldGNoKS5cbiAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICByZWxvYWQ6IGZhbHNlLFxuICAgICAgLy8gRnNMaXN0IG5ldmVyIHRvdWNoZXMgdGhlIFVSTCBvciBwZXJzaXN0cyBzb3J0L3BhZ2luZyBzdGF0ZS4gVGhlIHNvcnRcbiAgICAgIC8vIGlzIGtlcHQgaW4gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIChzZXRMaXN0U29ydCksIGFuZCBwYWdpbmcgc3RheXNcbiAgICAgIC8vIG91dCBvZiBpdC5cbiAgICAgIHF1ZXJ5UGFyYW06IGZhbHNlLFxuICAgICAgcGVyc2lzdDogZmFsc2UsXG4gICAgICBzb3J0OiBzb3J0XG4gICAgICAgID8geyB2YWx1ZTogc29ydC5jb2x1bW4sIGRpcmVjdGlvbjogc29ydC5kaXJlY3Rpb24gPz8gJ2FzYycgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIExvYWQtbW9yZTogdGhlIGxpc3Qga2VlcHMgYSBmaXhlZCwgc2Nyb2xsYWJsZSBoZWlnaHQgYW5kIGFwcGVuZHMgdGhlXG4gICAgICAvLyBuZXh0IHBhZ2UgaW4gcGxhY2UgaW5zdGVhZCBvZiBzd2FwcGluZyBwYWdlcy4gVGhlIGJ1dHRvbiBpcyBwaW5uZWQgdG9cbiAgICAgIC8vIHRoZSBib3R0b20gb2YgdGhlIHNjcm9sbCBwYW5lIChzZWUgY29tcG9uZW50IFNDU1MpLlxuICAgICAgLy9cbiAgICAgIC8vIFVzZXMgdGhlIE9mZnNldCBzdHJhdGVneSAob2Zmc2V0ICsgbGltaXQpIHJhdGhlciB0aGFuIE1hbnk6IGluXG4gICAgICAvLyBAZmlyZXN0aXRjaC9saXN0IHRoZSBwYWdpbmF0aW9uIHRlbXBsYXRlIHJlc29sdmVzIGBoYXNNYW55U3RyYXRlZ3lgXG4gICAgICAvLyBCRUZPUkUgYGxvYWRNb3JlRW5hYmxlZGAsIGFuZCBNYW55IHJlbmRlcnMgYSBmb3J3YXJkLW9ubHkgcGFnZSBwYWdlciDigJRcbiAgICAgIC8vIHNvIE1hbnkgd291bGQgc3VwcHJlc3MgdGhlIGxvYWQtbW9yZSBidXR0b24gZW50aXJlbHkuIE9mZnNldCArIGxvYWRNb3JlXG4gICAgICAvLyBpcyB0aGUgY29tYmluYXRpb24gdGhhdCBhY3R1YWxseSByZW5kZXJzIGFuZCBhcHBlbmRzLiBgX2ZldGNoYCBhbHJlYWR5XG4gICAgICAvLyBkZXJpdmVzIGBwYWdlYCBmcm9tIGBvZmZzZXRgLCBzbyB0aGUgc2VydmVyLXNpZGUgd3JhcCBpcyB1bmFmZmVjdGVkLlxuICAgICAgcGFnaW5nOiB7XG4gICAgICAgIGxpbWl0OiBjb25maWcucGFnZVNpemUgPz8gMjUsXG4gICAgICAgIHN0cmF0ZWd5OiBQYWdpbmF0aW9uU3RyYXRlZ3kuT2Zmc2V0LFxuICAgICAgfSxcbiAgICAgIGxvYWRNb3JlOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxhYmVsOiAnTG9hZCBtb3JlJyxcbiAgICAgICAgYnV0dG9uVHlwZTogJ3N0cm9rZWQnLFxuICAgICAgfSxcbiAgICAgIGZldGNoOiAocXVlcnk6IGFueSkgPT4gdGhpcy5fZmV0Y2gocXVlcnkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9mZXRjaChxdWVyeTogYW55KTogT2JzZXJ2YWJsZTx7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107IHBhZ2luZzogYW55IH0+IHtcbiAgICAvLyBNYW55L2xvYWQtbW9yZSBzZW5kcyBgb2Zmc2V0YCArIGBsaW1pdGAgKG5vdCBgcGFnZWApOyBkZXJpdmUgdGhlIHBhZ2Ugc29cbiAgICAvLyB0aGUgc2VydmVyLXNpZGUgd3JhcCBrZWVwcyB3b3JraW5nIHVuY2hhbmdlZC4gUGFnZSBzdHJhdGVneSBzdGlsbCBzZW5kc1xuICAgIC8vIGBwYWdlYCBkaXJlY3RseS5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IHF1ZXJ5LmxpbWl0ID8/IDI1O1xuICAgIGNvbnN0IHBhZ2UgPSBxdWVyeS5wYWdlXG4gICAgICA/PyAocXVlcnkub2Zmc2V0ICE9IG51bGwgPyBNYXRoLmZsb29yKHF1ZXJ5Lm9mZnNldCAvIHBhZ2VTaXplKSArIDEgOiAxKTtcblxuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7XG4gICAgICBwYWdlLFxuICAgICAgcGFnZVNpemUsXG4gICAgfTtcblxuICAgIGNvbnN0IG9yZGVyID0gU3RyaW5nKHF1ZXJ5Lm9yZGVyID8/ICcnKTtcbiAgICBpZiAob3JkZXIpIHtcbiAgICAgIGNvbnN0IFtjb2x1bW4sIGRpcmVjdGlvbl0gPSBvcmRlci5zcGxpdCgnLCcpO1xuICAgICAgc3RhdGUuc29ydCA9IHsgY29sdW1uLCBkaXJlY3Rpb246IGRpcmVjdGlvbiA9PT0gJ2Rlc2MnID8gJ2Rlc2MnIDogJ2FzYycgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudCgpO1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldExpc3RTb3J0KGNvbXBvbmVudCwgc3RhdGUuc29ydCA/PyBudWxsKTtcblxuICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTZWFyY2goY29tcG9uZW50LmlkKTtcbiAgICBpZiAoc2VhcmNoKSB7XG4gICAgICBzdGF0ZS5zZWFyY2ggPSBzZWFyY2g7XG4gICAgfVxuXG4gICAgLy8gVGhlIGdyb3VwcyB0aGF0IG1hdGNoICdhbnknLCBhcyBldmVyeSBvdGhlciByZWFkIG9mIHRoaXMgdGlsZSBzZW5kc1xuICAgIC8vIHRoZW0gKHRpbGVEYXRhU3RhdGUpLiBUaGUgc29ydCBhbmQgcGFnaW5nIGFib3ZlIGFyZSBGc0xpc3QncyBvd24uXG4gICAgY29uc3QgeyBtYXRjaEFueUdyb3VwSWRzIH0gPSB0aGlzLl9maWx0ZXJTdGF0ZS50aWxlU3RhdGUoY29tcG9uZW50KTtcbiAgICBpZiAobWF0Y2hBbnlHcm91cElkcykge1xuICAgICAgc3RhdGUubWF0Y2hBbnlHcm91cElkcyA9IG1hdGNoQW55R3JvdXBJZHM7XG4gICAgfVxuXG4gICAgLy8gT25lIHNvdXJjZSBmb3IgZmlsdGVyIHZhbHVlcywgdGhlIHNhbWUgb25lIGNoYXJ0cywgS1BJcyBhbmQgdGhlIGV4cG9ydHNcbiAgICAvLyByZWFkLCBzbyB0aGUgbGlzdCBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIGl0cyBoZWFkZXIgc3RyaXAgc2hvd3MuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhXG4gICAgICAuY29tcG9uZW50RGF0YSh0aGlzLnJlcG9ydElkKCksIGNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBDb21wb25lbnREYXRhKSA9PiB7XG4gICAgICAgICAgLy8gQSBjcm9zcy10YWIncyBoZWFkZXJzIGNvbWUgYmFjayB3aXRoIHRoZSByb3dzOiB0aGUgcm93LWtleSBjb2x1bW5cbiAgICAgICAgICAvLyBmaXJzdCwgdGhlbiBvbmUgcGVyIHBpdm90IHZhbHVlLiBSZS1yZWFkIHRoZW0gb24gZXZlcnkgZmV0Y2gsIHNpbmNlXG4gICAgICAgICAgLy8gYSBmaWx0ZXIgY2hhbmdlIGNhbiBhZGQgb3IgcmVtb3ZlIGEgY29sdW1uLlxuICAgICAgICAgIGlmICh0aGlzLnBpdm90ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnNldCh0aGlzLl9waXZvdENvbHVtbnMoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy50cnVuY2F0ZWQuc2V0KCEhZGF0YS50cnVuY2F0ZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE9ubHkgcGFnZSAxIGNhcnJpZXMgdGhlIG5vdGVzIGFuZCB0aGUgdG90YWxzOyBhIGxvYWQtbW9yZSBwYWdlXG4gICAgICAgICAgLy8gbGVhdmVzIHRoZW0gYXMgdGhleSBhcmUuXG4gICAgICAgICAgaWYgKHN0YXRlLnBhZ2UgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoTm90ZS5zZXQoZGF0YS5zZWFyY2hOb3RlID8/IG51bGwpO1xuICAgICAgICAgICAgdGhpcy50b3RhbHMuc2V0KGRhdGEudG90YWxzID8/IG51bGwpO1xuICAgICAgICAgICAgdGhpcy50b3RhbHNOb3RlLnNldChkYXRhLnRvdGFsc05vdGUgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLm5vdGVEYXRhLnNldCh0aGlzLl9ub3RlRGF0YShkYXRhKSk7XG4gICAgICAgICAgICB0aGlzLl9hbGlnbk91dHB1dENvbHVtbnMoZGF0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGhlIHNlcnZlcidzIHBhZ2Ugc2l6ZSB3aGVuIGl0IHNlbmRzIG9uZSAoaXQgY2xhbXBzIHRoZSByZXF1ZXN0KSxcbiAgICAgICAgICAvLyB0aGUgc2l6ZSB0aGUgcGFnaW5nIGJlbG93IGhhbmRzIGZzLWxpc3QgdG9vLlxuICAgICAgICAgIGNvbnN0IHNpemUgPSBkYXRhLnBhZ2luZz8ucGFnZVNpemUgPz8gc3RhdGUucGFnZVNpemU7XG4gICAgICAgICAgY29uc3Qgc2hvd24gPSAoc3RhdGUucGFnZSAtIDEpICogc2l6ZSArIChkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwKTtcbiAgICAgICAgICB0aGlzLnJvd0NvdW50LnNldCh7IHNob3duLCB0b3RhbDogZGF0YS5wYWdpbmc/LnRvdGFsID8/IHNob3duIH0pO1xuXG4gICAgICAgICAgLy8gTmV3IHJvd3MgY2FuIHdpZGVuIGEgcGlubmVkIGNvbHVtbiwgd2hpY2ggbW92ZXMgdGhlIG9uZXMgYWZ0ZXIgaXQuXG4gICAgICAgICAgdGhpcy5fc2NoZWR1bGVQaW5PZmZzZXRzKCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogZGF0YS5yb3dzID8/IFtdLFxuICAgICAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICAgIGxpbWl0OiBkYXRhLnBhZ2luZz8ucGFnZVNpemUgPz8gc3RhdGUucGFnZVNpemUsXG4gICAgICAgICAgICAgIHJlY29yZHM6IGRhdGEucGFnaW5nPy50b3RhbCA/PyAoZGF0YS5yb3dzPy5sZW5ndGggPz8gMCksXG4gICAgICAgICAgICAgIHBhZ2U6IGRhdGEucGFnaW5nPy5wYWdlID8/IHN0YXRlLnBhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEEgY3Jvc3MtdGFiJ3MgY29sdW1ucywgYnVpbHQgZnJvbSB0aGUgd2lyZSBieSBwaXZvdENvbHVtblNwZWNzKCk6IHRoZSBzYW1lXG4gIC8vIGhlYWRpbmdzIGFuZCBjZWxsIGZvcm1hdCB0aGUgUERGIGFuZCBQb3dlclBvaW50IGV4cG9ydHMgdXNlLiBBIGNlbGwgY29sdW1uXG4gIC8vIHdob3NlIG1lYXN1cmUgaXMgYSByYW5rIG9yIGEgc2hhcmUgKGNlbGxNZWFzdXJlcyBuYW1lcyBpdCkgaG9sZHMgbnVtYmVyc1xuICAvLyB3aGV0aGVyIG9yIG5vdCB0aGUgZ3JpZCBuYW1lcyBhIGNlbGwgZm9ybWF0LlxuICBwcml2YXRlIF9waXZvdENvbHVtbnMoZGF0YTogQ29tcG9uZW50RGF0YSk6IChMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH0pW10ge1xuICAgIGNvbnN0IGNvbmZpZyA9ICh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcbiAgICBjb25zdCBvdXRwdXRDZWxscyA9IE9iamVjdC5rZXlzKGxpc3RPdXRwdXRDb2x1bW5zKFxuICAgICAgKGRhdGEuY29sdW1ucyA/PyBbXSkuc2xpY2UoMSkubWFwKChjb2x1bW4pID0+ICh7IGNvbHVtbiB9KSksXG4gICAgICBkYXRhLFxuICAgICAgW10sXG4gICAgKSk7XG5cbiAgICByZXR1cm4gcGl2b3RDb2x1bW5TcGVjcyhjb25maWcsIGRhdGEsIHRoaXMuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSlcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gKHsgLi4uY29sdW1uLCBudW1lcmljOiBjb2x1bW4ubnVtZXJpYyB8fCBvdXRwdXRDZWxscy5pbmNsdWRlcyhjb2x1bW4uY29sdW1uKSB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9ub3RlRGF0YShkYXRhOiBDb21wb25lbnREYXRhKTogQ29tcG9uZW50Tm90ZURhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJpc29uOiBkYXRhLmNvbXBhcmlzb24sXG4gICAgICB0aW1lZnJhbWU6IGRhdGEudGltZWZyYW1lLFxuICAgICAgb3V0cHV0czogZGF0YS5vdXRwdXRzLFxuICAgICAgY2VsbE1lYXN1cmVzOiBkYXRhLmNlbGxNZWFzdXJlcyxcbiAgICAgIHdpbmRvd3M6IGRhdGEud2luZG93cyxcbiAgICAgIGdyYW51bGFyaXR5OiBkYXRhLmdyYW51bGFyaXR5LFxuICAgIH07XG4gIH1cblxuICAvLyBBIHBsYWluIGxpc3QncyBjb2x1bW5zIGFyZSBidWlsdCBiZWZvcmUgYW55IGRhdGEgYXJyaXZlcywgc28gYW4gb3V0cHV0XG4gIC8vIGNvbHVtbiB0aGF0IG5hbWVzIG5vIGZvcm1hdCBvZiBpdHMgb3duIChhIHJhbmssIGEgc2hhcmUsIGEgcHJpb3IgdGhhdCB0YWtlc1xuICAvLyBpdHMgbWVhc3VyZSdzIGZvcm1hdCkgbGVhcm5zIGl0IGhvbGRzIG51bWJlcnMgZnJvbSBwYWdlIDEuIGZzLWxpc3QgcmVhZHMgYVxuICAvLyBjb2x1bW4ncyBhbGlnbm1lbnQgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGUgY29sdW1uLCBzbyBhIGNvbHVtbiB3aG9zZVxuICAvLyBhbGlnbm1lbnQgY2hhbmdlcyBpcyByZWJ1aWx0ICh0aGUgdGVtcGxhdGUgdHJhY2tzIGNvbHVtbnMgYnkgYm90aCkuXG4gIHByaXZhdGUgX2FsaWduT3V0cHV0Q29sdW1ucyhkYXRhOiBDb21wb25lbnREYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGl2b3RlZCgpIHx8ICFkYXRhLm91dHB1dHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zKCk7XG4gICAgY29uc3QgYWxpZ25lZCA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+ICh7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBudW1lcmljOiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSB8fCAhIWRhdGEub3V0cHV0c1tjb2x1bW4uY29sdW1uXSxcbiAgICB9KSk7XG5cbiAgICBpZiAoYWxpZ25lZC5zb21lKChjb2x1bW4sIGluZGV4KSA9PiBjb2x1bW4ubnVtZXJpYyAhPT0gY29sdW1uc1tpbmRleF0ubnVtZXJpYykpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5zZXQoYWxpZ25lZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSB0aWxlIHJlc2l6ZSByZWZsb3dzIHRoZSB0YWJsZSdzIGF1dG8gbGF5b3V0LCBzbyB0aGUgcGlubmVkIGNvbHVtbnMnXG4gIC8vIHdpZHRocywgYW5kIHdpdGggdGhlbSB0aGVpciBvZmZzZXRzLCBjaGFuZ2UuXG4gIHByaXZhdGUgX29ic2VydmVQaW5PZmZzZXRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpbm5lZCgpIDwgMiB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5fc2NoZWR1bGVQaW5PZmZzZXRzKCkpO1xuICAgIG9ic2VydmVyLm9ic2VydmUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLl9kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuICB9XG5cbiAgLy8gTWVhc3VyZXMgdGhlIHBpbm5lZCBvZmZzZXRzIG9uY2UgdGhlIG5leHQgcmVuZGVyIGhhcyBsYWlkIHRoZSB0YWJsZSBvdXQuXG4gIC8vIE9uZSBwZW5kaW5nIG1lYXN1cmVtZW50IGNvdmVycyBldmVyeSByZXF1ZXN0IG1hZGUgYmVmb3JlIGl0IHJ1bnMuIE9ubHlcbiAgLy8gYWZ0ZXJOZXh0UmVuZGVyIGV4aXN0cyBpbiBldmVyeSBBbmd1bGFyIHZlcnNpb24gdGhpcyBsaWJyYXJ5IHJ1bnMgb24uXG4gIHByaXZhdGUgX3NjaGVkdWxlUGluT2Zmc2V0cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5waW5uZWQoKSA8IDIgfHwgdGhpcy5fcGluT2Zmc2V0c1JlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Bpbk9mZnNldHNSZWYgPSBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5fcGluT2Zmc2V0c1JlZiA9IG51bGw7XG4gICAgICB0aGlzLl91cGRhdGVQaW5PZmZzZXRzKCk7XG4gICAgfSwgeyBpbmplY3RvcjogdGhpcy5faW5qZWN0b3IgfSk7XG4gIH1cblxuICAvLyBFYWNoIHBpbm5lZCBjb2x1bW4gc3RpY2tzIGF0IHRoZSBzdW1tZWQgd2lkdGggb2YgdGhlIHZpc2libGUgcGlubmVkXG4gIC8vIGNvbHVtbnMgYmVmb3JlIGl0LiBBIGhpZGRlbiBjb2x1bW4gcmVuZGVycyBubyBoZWFkZXIsIHNvIHRoZSBuZXh0IHBpbm5lZFxuICAvLyBvbmUgdGFrZXMgaXRzIHBsYWNlLiBBIHZhcmlhYmxlIGlzIHdyaXR0ZW4gb25seSB3aGVuIGl0cyB2YWx1ZSBjaGFuZ2VkLFxuICAvLyB3aGljaCBrZWVwcyBhIHJlc2l6ZSBmcm9tIHJlc3R5bGluZyB0aGUgdGFibGUgZm9yIG5vdGhpbmcuXG4gIHByaXZhdGUgX3VwZGF0ZVBpbk9mZnNldHMoKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBsZXQgbGVmdCA9IDA7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5waW5uZWQoKTsgaW5kZXgrKykge1xuICAgICAgY29uc3QgaGVhZGVyID0gaG9zdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgdGhlYWQgdGgucmVwb3J0LXBpbi0ke2luZGV4fWApO1xuXG4gICAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZSA9IGAtLXJlcG9ydC1waW4tbGVmdC0ke2luZGV4fWA7XG4gICAgICBjb25zdCB2YWx1ZSA9IGAke01hdGgucm91bmQobGVmdCAqIDEwMCkgLyAxMDB9cHhgO1xuXG4gICAgICBpZiAoaG9zdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpICE9PSB2YWx1ZSkge1xuICAgICAgICBob3N0LnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgbGVmdCArPSBoZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgfVxuICB9XG59XG4iLCJAaWYgKHRydW5jYXRlZCgpKSB7XG4gIDxkaXYgY2xhc3M9XCJwaXZvdC10cnVuY2F0ZWRcIj5cbiAgICBUaGlzIGdyaWQgd2FzIGJ1aWx0IGZyb20gYSBwYXJ0aWFsIHJlc3VsdCwgc28gc29tZSBjb2x1bW5zIG9yIHZhbHVlcyBtYXkgYmUgbWlzc2luZy4gTmFycm93IGl0IHdpdGggYSBmaWx0ZXIuXG4gIDwvZGl2PlxufVxuXG48IS0tIFRoZSB3aW5kb3dzIGEgY29tcGFyaXNvbiBjb21wYXJlcywgYW5kIHdoeSBpdCByZWFkcyBhcyBpdCBkb2VzLiBBXG4gICAgIHdpbmRvd2VkIGNvbHVtbidzIG93biBub3RlcyBhcmUgaW4gaXRzIGhlYWRlcidzIHRvb2x0aXAuIC0tPlxuPGFwcC1yZXBvcnQtY29tcG9uZW50LW5vdGVcbiAgW2RhdGFdPVwibm90ZURhdGEoKVwiXG4gIFt3aW5kb3dOb3Rlc109XCJmYWxzZVwiPlxuPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlPlxuXG48IS0tIGZzLWxpc3QgcmVhZHMgYSBjb2x1bW4ncyBmb290ZXIgdGVtcGxhdGUgb25jZSwgYXMgYSBkaXJlY3QgY2hpbGQgb2ZcbiAgICAgZnMtbGlzdC1jb2x1bW4sIHNvIGEgbGlzdCB3aXRoIHRvdGFscyByZW5kZXJzIGl0cyBjb2x1bW5zIGluIGEgYnJhbmNoIG9mXG4gICAgIHRoZWlyIG93biByYXRoZXIgdGhhbiB3cmFwcGluZyB0aGUgZm9vdGVyIGluIGFuIEBpZi4gSXRzIGhlYWRlciB0ZW1wbGF0ZSB0b28sXG4gICAgIHdoaWNoIGV2ZXJ5IGNvbHVtbiBjYXJyaWVzOiBhbiBvdXRwdXQgY29sdW1uJ3MgdG9vbHRpcCBzYXlzIHdoYXQgaXQgaG9sZHMuXG4gICAgIENvbHVtbnMgYXJlIHRyYWNrZWQgYnkgYWxpZ25tZW50IGFzIHdlbGwgYXMgbmFtZSwgc2luY2UgZnMtbGlzdCByZWFkcyBhXG4gICAgIGNvbHVtbidzIGFsaWdubWVudCBvbmx5IHdoZW4gaXQgYnVpbGRzIHRoZSBjb2x1bW4uIC0tPlxuPGZzLWxpc3RcbiAgW2NvbmZpZ109XCJsaXN0Q29uZmlnXCJcbiAgW2NsYXNzLnJlcG9ydC10b3RhbHMtZW1wdHldPVwiIXRvdGFscygpXCI+XG4gIEBpZiAoc2hvd1RvdGFscygpKSB7XG4gICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmNvbHVtbiArICc6JyArIGNvbHVtbi5udW1lcmljKSB7XG4gICAgICA8ZnMtbGlzdC1jb2x1bW5cbiAgICAgICAgW25hbWVdPVwiY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFt0aXRsZV09XCJjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFtzaG93XT1cIiFoaWRkZW4oKS5oYXMoY29sdW1uLmNvbHVtbilcIlxuICAgICAgICBbc29ydGFibGVdPVwiIXBpdm90ZWQoKSB8fCAkZmlyc3RcIlxuICAgICAgICBbYWxpZ25dPVwiY29sdW1uLm51bWVyaWMgPyAncmlnaHQnIDogJ2xlZnQnXCJcbiAgICAgICAgW2NsYXNzXT1cImNvbHVtbkNsYXNzZXMoY29sdW1uLCAkaW5kZXgsIHBpbm5lZCgpKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dbY29sdW1uLmNvbHVtbl0sIHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWZvb3Rlcj5cbiAgICAgICAgICBAaWYgKHRvdGFscygpPy5bY29sdW1uLmNvbHVtbl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjZWxsVHBsXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiB0b3RhbHMoKT8uW2NvbHVtbi5jb2x1bW5dLCByb3c6IHRvdGFscygpLCBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICB9IEBlbHNlIGlmIChjb2x1bW4uY29sdW1uID09PSB0b3RhbHNMYWJlbENvbHVtbigpKSB7XG4gICAgICAgICAgICB7eyB0b3RhbExhYmVsIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICB9XG4gIH0gQGVsc2Uge1xuICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zKCk7IHRyYWNrIGNvbHVtbi5jb2x1bW4gKyAnOicgKyBjb2x1bW4ubnVtZXJpYykge1xuICAgICAgPGZzLWxpc3QtY29sdW1uXG4gICAgICAgIFtuYW1lXT1cImNvbHVtbi5jb2x1bW5cIlxuICAgICAgICBbdGl0bGVdPVwiY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW5cIlxuICAgICAgICBbc2hvd109XCIhaGlkZGVuKCkuaGFzKGNvbHVtbi5jb2x1bW4pXCJcbiAgICAgICAgW3NvcnRhYmxlXT1cIiFwaXZvdGVkKCkgfHwgJGZpcnN0XCJcbiAgICAgICAgW2FsaWduXT1cImNvbHVtbi5udW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0J1wiXG4gICAgICAgIFtjbGFzc109XCJjb2x1bW5DbGFzc2VzKGNvbHVtbiwgJGluZGV4LCBwaW5uZWQoKSlcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtaGVhZGVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlclRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICAgIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjZWxsVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93W2NvbHVtbi5jb2x1bW5dLCByb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICB9XG4gIH1cbjwvZnMtbGlzdD5cblxuQGlmIChjYXB0aW9uKCkpIHtcbiAgPGRpdiBjbGFzcz1cImxpc3QtY2FwdGlvbiBzbWFsbFwiPlxuICAgIHt7IGNhcHRpb24oKSB9fVxuICA8L2Rpdj5cbn1cblxuPCEtLSBBIGNvbHVtbidzIGhlYWRpbmcsIHdpdGggd2hhdCBhbiBvdXRwdXQgY29sdW1uIGhvbGRzIGFzIGl0cyB0b29sdGlwIChhblxuICAgICBlbXB0eSBvbmUgbmV2ZXIgc2hvd3MpLiAtLT5cbjxuZy10ZW1wbGF0ZVxuICAjaGVhZGVyVHBsXG4gIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPHNwYW4gW21hdFRvb2x0aXBdPVwiY29sdW1uTm90ZXMoKVtjb2x1bW4uY29sdW1uXSA/PyAnJ1wiPnt7IGNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBPbmUgY2VsbCwgaW4gdGhlIGJvZHkgYW5kIHRoZSB0b3RhbHMgcm93IGFsaWtlOiBhbiBvdXRwdXQgY29sdW1uIGJ5IHdoYXRcbiAgICAgaXQgaG9sZHMgKGl0cyByb3cgZ2l2ZXMgYSBjaGFuZ2UgaXRzIHByaW9yKSwgYSBkYXRlIGNvbHVtbiBhcyBhIGRheSBpbiB0aGVcbiAgICAgcmVwb3J0J3Mgem9uZSBhbmQgbG9jYWxlLCBhbnkgb3RoZXIgdGhyb3VnaCBpdHMgbnVtYmVyIGZvcm1hdC4gLS0+XG48bmctdGVtcGxhdGVcbiAgI2NlbGxUcGxcbiAgbGV0LXZhbHVlXG4gIGxldC1yb3c9XCJyb3dcIlxuICBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIEBpZiAob3V0cHV0Q29sdW1ucygpW2NvbHVtbi5jb2x1bW5dOyBhcyBvdXRwdXQpIHtcbiAgICBAaWYgKHJvdyB8IGZzUmVwb3J0T3V0cHV0OiBjb2x1bW4gOiBvdXRwdXQgOiBmb3JtYXRDb250ZXh0KCk7IGFzIGNlbGwpIHtcbiAgICAgIDxzcGFuIFthdHRyLnRpdGxlXT1cImNlbGwudGl0bGVcIj57eyBjZWxsLnRleHQgfX08L3NwYW4+XG4gICAgfVxuICB9IEBlbHNlIGlmIChjb2x1bW4uZm9ybWF0ID09PSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0LkRhdGUpIHtcbiAgICB7eyB2YWx1ZSB8IGZzUmVwb3J0RGF0ZTogdGltZXpvbmUoKSA6IGZvcm1hdENvbnRleHQoKS5sb2NhbGUgfX1cbiAgfSBAZWxzZSB7XG4gICAge3sgdmFsdWUgfCBmc1JlcG9ydE51bWJlcjogY29sdW1uIDogZm9ybWF0Q29udGV4dCgpIH19XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=