@ogidor/dashboard 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -0
- package/app/app.module.d.ts +22 -0
- package/app/dashboard-state.service.d.ts +49 -0
- package/app/dashboard.component.d.ts +80 -0
- package/app/models.d.ts +73 -0
- package/app/widget-renderer.component.d.ts +40 -0
- package/esm2020/app/app.module.mjs +64 -0
- package/esm2020/app/dashboard-state.service.mjs +218 -0
- package/esm2020/app/dashboard.component.mjs +703 -0
- package/esm2020/app/models.mjs +2 -0
- package/esm2020/app/widget-renderer.component.mjs +163 -0
- package/esm2020/ogidor-dashboard.mjs +5 -0
- package/esm2020/public-api.mjs +9 -0
- package/fesm2015/ogidor-dashboard.mjs +1153 -0
- package/fesm2015/ogidor-dashboard.mjs.map +1 -0
- package/fesm2020/ogidor-dashboard.mjs +1144 -0
- package/fesm2020/ogidor-dashboard.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +70 -0
- package/public-api.d.ts +5 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class DashboardStateService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.STORAGE_KEY = 'xtb_dashboard_layout';
|
|
7
|
+
this.initialPages = [
|
|
8
|
+
{
|
|
9
|
+
id: 'page-1',
|
|
10
|
+
name: 'Default Workspace',
|
|
11
|
+
widgets: [
|
|
12
|
+
{
|
|
13
|
+
id: 'w-1',
|
|
14
|
+
type: 'LINE',
|
|
15
|
+
x: 0,
|
|
16
|
+
y: 0,
|
|
17
|
+
cols: 4,
|
|
18
|
+
rows: 4,
|
|
19
|
+
title: 'Market Trend',
|
|
20
|
+
data: { series: [{ name: 'Price', data: [30, 40, 35, 50, 49, 60, 70, 91, 125] }] }
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 'w-2',
|
|
24
|
+
type: 'DONUT',
|
|
25
|
+
x: 4,
|
|
26
|
+
y: 0,
|
|
27
|
+
cols: 2,
|
|
28
|
+
rows: 4,
|
|
29
|
+
title: 'Asset Allocation',
|
|
30
|
+
data: { series: [44, 55, 41, 17, 15] }
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
];
|
|
35
|
+
this.pagesSubject = new BehaviorSubject(this.initialPages);
|
|
36
|
+
this.activePageIdSubject = new BehaviorSubject(this.initialPages[0].id);
|
|
37
|
+
/**
|
|
38
|
+
* Emits whenever a widget's data is updated programmatically.
|
|
39
|
+
* Key = widget id, value = new data payload.
|
|
40
|
+
*/
|
|
41
|
+
this.widgetDataSubject = new Subject();
|
|
42
|
+
this.widgetData$ = this.widgetDataSubject.asObservable();
|
|
43
|
+
this.pages$ = this.pagesSubject.asObservable();
|
|
44
|
+
this.activePageId$ = this.activePageIdSubject.asObservable();
|
|
45
|
+
const saved = localStorage.getItem(this.STORAGE_KEY);
|
|
46
|
+
if (saved) {
|
|
47
|
+
try {
|
|
48
|
+
this.loadLayout(JSON.parse(saved));
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
console.error('Failed to load saved layout', e);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
getActivePage() {
|
|
56
|
+
return this.pagesSubject.value.find(p => p.id === this.activePageIdSubject.value);
|
|
57
|
+
}
|
|
58
|
+
setActivePage(id) {
|
|
59
|
+
this.activePageIdSubject.next(id);
|
|
60
|
+
}
|
|
61
|
+
addPage(name) {
|
|
62
|
+
const newPage = {
|
|
63
|
+
id: `page-${Date.now()}`,
|
|
64
|
+
name,
|
|
65
|
+
widgets: []
|
|
66
|
+
};
|
|
67
|
+
const updatedPages = [...this.pagesSubject.value, newPage];
|
|
68
|
+
this.pagesSubject.next(updatedPages);
|
|
69
|
+
this.activePageIdSubject.next(newPage.id);
|
|
70
|
+
this.saveToLocalStorage();
|
|
71
|
+
}
|
|
72
|
+
removePage(id) {
|
|
73
|
+
const pages = this.pagesSubject.value;
|
|
74
|
+
if (pages.length <= 1)
|
|
75
|
+
return;
|
|
76
|
+
const updatedPages = pages.filter(p => p.id !== id);
|
|
77
|
+
this.pagesSubject.next(updatedPages);
|
|
78
|
+
if (this.activePageIdSubject.value === id) {
|
|
79
|
+
this.activePageIdSubject.next(updatedPages[0].id);
|
|
80
|
+
}
|
|
81
|
+
this.saveToLocalStorage();
|
|
82
|
+
}
|
|
83
|
+
addWidget(type) {
|
|
84
|
+
const activePage = this.getActivePage();
|
|
85
|
+
if (!activePage)
|
|
86
|
+
return;
|
|
87
|
+
const newWidget = {
|
|
88
|
+
id: `widget-${Date.now()}`,
|
|
89
|
+
type,
|
|
90
|
+
x: 0, y: 0,
|
|
91
|
+
cols: type === 'DONUT' ? 2 : 4,
|
|
92
|
+
rows: 4,
|
|
93
|
+
title: `${type.charAt(0) + type.slice(1).toLowerCase()} Chart`,
|
|
94
|
+
data: this.getDefaultDataForType(type)
|
|
95
|
+
};
|
|
96
|
+
activePage.widgets.push(newWidget);
|
|
97
|
+
this.updatePages(this.pagesSubject.value);
|
|
98
|
+
}
|
|
99
|
+
addWidgetWithData(type, title, data) {
|
|
100
|
+
const activePage = this.getActivePage();
|
|
101
|
+
if (!activePage)
|
|
102
|
+
return;
|
|
103
|
+
const newWidget = {
|
|
104
|
+
id: `widget-${Date.now()}`,
|
|
105
|
+
type,
|
|
106
|
+
x: 0, y: 0,
|
|
107
|
+
cols: type === 'DONUT' ? 3 : 6,
|
|
108
|
+
rows: 4,
|
|
109
|
+
title,
|
|
110
|
+
data
|
|
111
|
+
};
|
|
112
|
+
activePage.widgets.push(newWidget);
|
|
113
|
+
this.updatePages(this.pagesSubject.value);
|
|
114
|
+
}
|
|
115
|
+
getDefaultDataForType(type) {
|
|
116
|
+
if (type === 'DONUT') {
|
|
117
|
+
return { series: [30, 20, 50] };
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
series: [{
|
|
121
|
+
name: 'Sample Data',
|
|
122
|
+
data: Array.from({ length: 10 }, () => Math.floor(Math.random() * 100))
|
|
123
|
+
}]
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
updateWidgetPosition(pageId, widgetId, x, y, cols, rows) {
|
|
127
|
+
const pages = this.pagesSubject.value;
|
|
128
|
+
const page = pages.find(p => p.id === pageId);
|
|
129
|
+
if (page) {
|
|
130
|
+
const widget = page.widgets.find(w => w.id === widgetId);
|
|
131
|
+
if (widget) {
|
|
132
|
+
widget.x = x;
|
|
133
|
+
widget.y = y;
|
|
134
|
+
widget.cols = cols;
|
|
135
|
+
widget.rows = rows;
|
|
136
|
+
this.updatePages(pages);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
removeWidget(widgetId) {
|
|
141
|
+
const activePage = this.getActivePage();
|
|
142
|
+
if (activePage) {
|
|
143
|
+
activePage.widgets = activePage.widgets.filter(w => w.id !== widgetId);
|
|
144
|
+
this.updatePages(this.pagesSubject.value);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Push new data into a widget by its id.
|
|
149
|
+
* The widget's chart will re-render immediately.
|
|
150
|
+
*
|
|
151
|
+
* @param widgetId The `id` of the target widget.
|
|
152
|
+
* @param data New data — `LineBarData` for LINE/BAR, `DonutData` for DONUT.
|
|
153
|
+
*/
|
|
154
|
+
updateWidgetData(widgetId, data) {
|
|
155
|
+
const pages = this.pagesSubject.value;
|
|
156
|
+
for (const page of pages) {
|
|
157
|
+
const widget = page.widgets.find(w => w.id === widgetId);
|
|
158
|
+
if (widget) {
|
|
159
|
+
widget.data = data;
|
|
160
|
+
this.widgetDataSubject.next({ widgetId, data });
|
|
161
|
+
this.updatePages(pages);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
console.warn(`[Dashboard] updateWidgetData: widget "${widgetId}" not found.`);
|
|
166
|
+
}
|
|
167
|
+
updateWidgetMeta(widgetId, meta) {
|
|
168
|
+
const pages = this.pagesSubject.value;
|
|
169
|
+
for (const page of pages) {
|
|
170
|
+
const widget = page.widgets.find(w => w.id === widgetId);
|
|
171
|
+
if (widget) {
|
|
172
|
+
if (meta.title !== undefined)
|
|
173
|
+
widget.title = meta.title;
|
|
174
|
+
if (meta.colors !== undefined)
|
|
175
|
+
widget.colors = meta.colors;
|
|
176
|
+
if (meta.cardColor !== undefined)
|
|
177
|
+
widget.cardColor = meta.cardColor;
|
|
178
|
+
if (meta.data !== undefined) {
|
|
179
|
+
widget.data = meta.data;
|
|
180
|
+
this.widgetDataSubject.next({ widgetId, data: meta.data });
|
|
181
|
+
}
|
|
182
|
+
this.updatePages(pages);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
updatePages(pages) {
|
|
188
|
+
this.pagesSubject.next([...pages]);
|
|
189
|
+
this.saveToLocalStorage();
|
|
190
|
+
}
|
|
191
|
+
serializeLayout() {
|
|
192
|
+
const config = {
|
|
193
|
+
pages: this.pagesSubject.value,
|
|
194
|
+
activePageId: this.activePageIdSubject.value
|
|
195
|
+
};
|
|
196
|
+
return JSON.stringify(config);
|
|
197
|
+
}
|
|
198
|
+
loadLayout(config) {
|
|
199
|
+
if (config && config.pages) {
|
|
200
|
+
this.pagesSubject.next(config.pages);
|
|
201
|
+
if (config.activePageId) {
|
|
202
|
+
this.activePageIdSubject.next(config.activePageId);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
saveToLocalStorage() {
|
|
207
|
+
localStorage.setItem(this.STORAGE_KEY, this.serializeLayout());
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
DashboardStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
211
|
+
DashboardStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardStateService, providedIn: 'root' });
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardStateService, decorators: [{
|
|
213
|
+
type: Injectable,
|
|
214
|
+
args: [{
|
|
215
|
+
providedIn: 'root'
|
|
216
|
+
}]
|
|
217
|
+
}], ctorParameters: function () { return []; } });
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLXN0YXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2Rhc2hib2FyZC1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBTWhELE1BQU0sT0FBTyxxQkFBcUI7SUE2Q2hDO1FBNUNpQixnQkFBVyxHQUFHLHNCQUFzQixDQUFDO1FBRTlDLGlCQUFZLEdBQVc7WUFDN0I7Z0JBQ0UsRUFBRSxFQUFFLFFBQVE7Z0JBQ1osSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsT0FBTyxFQUFFO29CQUNQO3dCQUNFLEVBQUUsRUFBRSxLQUFLO3dCQUNULElBQUksRUFBRSxNQUFNO3dCQUNaLENBQUMsRUFBRSxDQUFDO3dCQUNKLENBQUMsRUFBRSxDQUFDO3dCQUNKLElBQUksRUFBRSxDQUFDO3dCQUNQLElBQUksRUFBRSxDQUFDO3dCQUNQLEtBQUssRUFBRSxjQUFjO3dCQUNyQixJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7cUJBQ25GO29CQUNEO3dCQUNFLEVBQUUsRUFBRSxLQUFLO3dCQUNULElBQUksRUFBRSxPQUFPO3dCQUNiLENBQUMsRUFBRSxDQUFDO3dCQUNKLENBQUMsRUFBRSxDQUFDO3dCQUNKLElBQUksRUFBRSxDQUFDO3dCQUNQLElBQUksRUFBRSxDQUFDO3dCQUNQLEtBQUssRUFBRSxrQkFBa0I7d0JBQ3pCLElBQUksRUFBRSxFQUFF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RSxDQUFDO0lBQzVCLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxNQUFNLEdBQW9CO1lBQzlCLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUs7WUFDOUIsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO1NBQzdDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFXO1FBQ3BCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtnQkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7O21IQS9OVSxxQkFBcUI7dUhBQXJCLHFCQUFxQixjQUZwQixNQUFNOzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBhZ2UsIFdpZGdldCwgRGFzaGJvYXJkQ29uZmlnLCBXaWRnZXRUeXBlLCBMaW5lQmFyRGF0YSwgRG9udXREYXRhIH0gZnJvbSAnLi9tb2RlbHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRTdGF0ZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFNUT1JBR0VfS0VZID0gJ3h0Yl9kYXNoYm9hcmRfbGF5b3V0JztcbiAgXG4gIHByaXZhdGUgaW5pdGlhbFBhZ2VzOiBQYWdlW10gPSBbXG4gICAge1xuICAgICAgaWQ6ICdwYWdlLTEnLFxuICAgICAgbmFtZTogJ0RlZmF1bHQgV29ya3NwYWNlJyxcbiAgICAgIHdpZGdldHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAndy0xJyxcbiAgICAgICAgICB0eXBlOiAnTElORScsXG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIGNvbHM6IDQsXG4gICAgICAgICAgcm93czogNCxcbiAgICAgICAgICB0aXRsZTogJ01hcmtldCBUcmVuZCcsXG4gICAgICAgICAgZGF0YTogeyBzZXJpZXM6IFt7IG5hbWU6ICdQcmljZScsIGRhdGE6IFszMCwgNDAsIDM1LCA1MCwgNDksIDYwLCA3MCwgOTEsIDEyNV0gfV0gfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICd3LTInLFxuICAgICAgICAgIHR5cGU6ICdET05VVCcsXG4gICAgICAgICAgeDogNCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIGNvbHM6IDIsXG4gICAgICAgICAgcm93czogNCxcbiAgICAgICAgICB0aXRsZTogJ0Fzc2V0IEFsbG9jYXRpb24nLFxuICAgICAgICAgIGRhdGE6IHsgc2VyaWVzOiBbNDQsIDU1LCA0MSwgMTcsIDE1XSB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIF07XG5cbiAgcHJpdmF0ZSBwYWdlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhZ2VbXT4odGhpcy5pbml0aWFsUGFnZXMpO1xuICBwcml2YXRlIGFjdGl2ZVBhZ2VJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odGhpcy5pbml0aWFsUGFnZXNbMF0uaWQpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuZXZlciBhIHdpZGdldCdzIGRhdGEgaXMgdXBkYXRlZCBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKiBLZXkgPSB3aWRnZXQgaWQsIHZhbHVlID0gbmV3IGRhdGEgcGF5bG9hZC5cbiAgICovXG4gIHByaXZhdGUgd2lkZ2V0RGF0YVN1YmplY3QgPSBuZXcgU3ViamVjdDx7IHdpZGdldElkOiBzdHJpbmc7IGRhdGE6IExpbmVCYXJEYXRhIHwgRG9udXREYXRhIH0+KCk7XG4gIHdpZGdldERhdGEkID0gdGhpcy53aWRnZXREYXRhU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwYWdlcyQgPSB0aGlzLnBhZ2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgYWN0aXZlUGFnZUlkJCA9IHRoaXMuYWN0aXZlUGFnZUlkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuU1RPUkFHRV9LRVkpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5sb2FkTGF5b3V0KEpTT04ucGFyc2Uoc2F2ZWQpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2F2ZWQgbGF5b3V0JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlUGFnZSgpOiBQYWdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlc1N1YmplY3QudmFsdWUuZmluZChwID0+IHAuaWQgPT09IHRoaXMuYWN0aXZlUGFnZUlkU3ViamVjdC52YWx1ZSk7XG4gIH1cblxuICBzZXRBY3RpdmVQYWdlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZVBhZ2VJZFN1YmplY3QubmV4dChpZCk7XG4gIH1cblxuICBhZGRQYWdlKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IG5ld1BhZ2U6IFBhZ2UgPSB7XG4gICAgICBpZDogYHBhZ2UtJHtEYXRlLm5vdygpfWAsXG4gICAgICBuYW1lLFxuICAgICAgd2lkZ2V0czogW11cbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZWRQYWdlcyA9IFsuLi50aGlzLnBhZ2VzU3ViamVjdC52YWx1ZSwgbmV3UGFnZV07XG4gICAgdGhpcy5wYWdlc1N1YmplY3QubmV4dCh1cGRhdGVkUGFnZXMpO1xuICAgIHRoaXMuYWN0aXZlUGFnZUlkU3ViamVjdC5uZXh0KG5ld1BhZ2UuaWQpO1xuICAgIHRoaXMuc2F2ZVRvTG9jYWxTdG9yYWdlKCk7XG4gIH1cblxuICByZW1vdmVQYWdlKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYWdlcyA9IHRoaXMucGFnZXNTdWJqZWN0LnZhbHVlO1xuICAgIGlmIChwYWdlcy5sZW5ndGggPD0gMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdXBkYXRlZFBhZ2VzID0gcGFnZXMuZmlsdGVyKHAgPT4gcC5pZCAhPT0gaWQpO1xuICAgIHRoaXMucGFnZXNTdWJqZWN0Lm5leHQodXBkYXRlZFBhZ2VzKTtcbiAgICBcbiAgICBpZiAodGhpcy5hY3RpdmVQYWdlSWRTdWJqZWN0LnZhbHVlID09PSBpZCkge1xuICAgICAgdGhpcy5hY3RpdmVQYWdlSWRTdWJqZWN0Lm5leHQodXBkYXRlZFBhZ2VzWzBdLmlkKTtcbiAgICB9XG4gICAgdGhpcy5zYXZlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgfVxuXG4gIGFkZFdpZGdldCh0eXBlOiBXaWRnZXRUeXBlKSB7XG4gICAgY29uc3QgYWN0aXZlUGFnZSA9IHRoaXMuZ2V0QWN0aXZlUGFnZSgpO1xuICAgIGlmICghYWN0aXZlUGFnZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3V2lkZ2V0OiBXaWRnZXQgPSB7XG4gICAgICBpZDogYHdpZGdldC0ke0RhdGUubm93KCl9YCxcbiAgICAgIHR5cGUsXG4gICAgICB4OiAwLCB5OiAwLFxuICAgICAgY29sczogdHlwZSA9PT0gJ0RPTlVUJyA/IDIgOiA0LFxuICAgICAgcm93czogNCxcbiAgICAgIHRpdGxlOiBgJHt0eXBlLmNoYXJBdCgwKSArIHR5cGUuc2xpY2UoMSkudG9Mb3dlckNhc2UoKX0gQ2hhcnRgLFxuICAgICAgZGF0YTogdGhpcy5nZXREZWZhdWx0RGF0YUZvclR5cGUodHlwZSlcbiAgICB9O1xuXG4gICAgYWN0aXZlUGFnZS53aWRnZXRzLnB1c2gobmV3V2lkZ2V0KTtcbiAgICB0aGlzLnVwZGF0ZVBhZ2VzKHRoaXMucGFnZXNTdWJqZWN0LnZhbHVlKTtcbiAgfVxuXG4gIGFkZFdpZGdldFdpdGhEYXRhKHR5cGU6IFdpZGdldFR5cGUsIHRpdGxlOiBzdHJpbmcsIGRhdGE6IExpbmVCYXJEYXRhIHwgRG9udXREYXRhKSB7XG4gICAgY29uc3QgYWN0aXZlUGFnZSA9IHRoaXMuZ2V0QWN0aXZlUGFnZSgpO1xuICAgIGlmICghYWN0aXZlUGFnZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3V2lkZ2V0OiBXaWRnZXQgPSB7XG4gICAgICBpZDogYHdpZGdldC0ke0RhdGUubm93KCl9YCxcbiAgICAgIHR5cGUsXG4gICAgICB4OiAwLCB5OiAwLFxuICAgICAgY29sczogdHlwZSA9PT0gJ0RPTlVUJyA/IDMgOiA2LFxuICAgICAgcm93czogNCxcbiAgICAgIHRpdGxlLFxuICAgICAgZGF0YVxuICAgIH07XG5cbiAgICBhY3RpdmVQYWdlLndpZGdldHMucHVzaChuZXdXaWRnZXQpO1xuICAgIHRoaXMudXBkYXRlUGFnZXModGhpcy5wYWdlc1N1YmplY3QudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0RGF0YUZvclR5cGUodHlwZTogV2lkZ2V0VHlwZSkge1xuICAgIGlmICh0eXBlID09PSAnRE9OVVQnKSB7XG4gICAgICByZXR1cm4geyBzZXJpZXM6IFszMCwgMjAsIDUwXSB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2VyaWVzOiBbe1xuICAgICAgICBuYW1lOiAnU2FtcGxlIERhdGEnLFxuICAgICAgICBkYXRhOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAoKSA9PiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDApKVxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlV2lkZ2V0UG9zaXRpb24ocGFnZUlkOiBzdHJpbmcsIHdpZGdldElkOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcikge1xuICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5wYWdlc1N1YmplY3QudmFsdWU7XG4gICAgY29uc3QgcGFnZSA9IHBhZ2VzLmZpbmQocCA9PiBwLmlkID09PSBwYWdlSWQpO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBjb25zdCB3aWRnZXQgPSBwYWdlLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHdpZGdldElkKTtcbiAgICAgIGlmICh3aWRnZXQpIHtcbiAgICAgICAgd2lkZ2V0LnggPSB4O1xuICAgICAgICB3aWRnZXQueSA9IHk7XG4gICAgICAgIHdpZGdldC5jb2xzID0gY29scztcbiAgICAgICAgd2lkZ2V0LnJvd3MgPSByb3dzO1xuICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VzKHBhZ2VzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVXaWRnZXQod2lkZ2V0SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZVBhZ2UgPSB0aGlzLmdldEFjdGl2ZVBhZ2UoKTtcbiAgICBpZiAoYWN0aXZlUGFnZSkge1xuICAgICAgYWN0aXZlUGFnZS53aWRnZXRzID0gYWN0aXZlUGFnZS53aWRnZXRzLmZpbHRlcih3ID0+IHcuaWQgIT09IHdpZGdldElkKTtcbiAgICAgIHRoaXMudXBkYXRlUGFnZXModGhpcy5wYWdlc1N1YmplY3QudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoIG5ldyBkYXRhIGludG8gYSB3aWRnZXQgYnkgaXRzIGlkLlxuICAgKiBUaGUgd2lkZ2V0J3MgY2hhcnQgd2lsbCByZS1yZW5kZXIgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBwYXJhbSB3aWRnZXRJZCAgVGhlIGBpZGAgb2YgdGhlIHRhcmdldCB3aWRnZXQuXG4gICAqIEBwYXJhbSBkYXRhICAgICAgTmV3IGRhdGEg4oCUIGBMaW5lQmFyRGF0YWAgZm9yIExJTkUvQkFSLCBgRG9udXREYXRhYCBmb3IgRE9OVVQuXG4gICAqL1xuICB1cGRhdGVXaWRnZXREYXRhKHdpZGdldElkOiBzdHJpbmcsIGRhdGE6IExpbmVCYXJEYXRhIHwgRG9udXREYXRhKSB7XG4gICAgY29uc3QgcGFnZXMgPSB0aGlzLnBhZ2VzU3ViamVjdC52YWx1ZTtcbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcbiAgICAgIGNvbnN0IHdpZGdldCA9IHBhZ2Uud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0SWQpO1xuICAgICAgaWYgKHdpZGdldCkge1xuICAgICAgICB3aWRnZXQuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMud2lkZ2V0RGF0YVN1YmplY3QubmV4dCh7IHdpZGdldElkLCBkYXRhIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VzKHBhZ2VzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLndhcm4oYFtEYXNoYm9hcmRdIHVwZGF0ZVdpZGdldERhdGE6IHdpZGdldCBcIiR7d2lkZ2V0SWR9XCIgbm90IGZvdW5kLmApO1xuICB9XG5cbiAgdXBkYXRlV2lkZ2V0TWV0YSh3aWRnZXRJZDogc3RyaW5nLCBtZXRhOiB7IHRpdGxlPzogc3RyaW5nOyBjb2xvcnM/OiBzdHJpbmdbXTsgY2FyZENvbG9yPzogc3RyaW5nOyBkYXRhPzogTGluZUJhckRhdGEgfCBEb251dERhdGEgfSkge1xuICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5wYWdlc1N1YmplY3QudmFsdWU7XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG4gICAgICBjb25zdCB3aWRnZXQgPSBwYWdlLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHdpZGdldElkKTtcbiAgICAgIGlmICh3aWRnZXQpIHtcbiAgICAgICAgaWYgKG1ldGEudGl0bGUgICAgICE9PSB1bmRlZmluZWQpIHdpZGdldC50aXRsZSAgICAgPSBtZXRhLnRpdGxlO1xuICAgICAgICBpZiAobWV0YS5jb2xvcnMgICAgIT09IHVuZGVmaW5lZCkgd2lkZ2V0LmNvbG9ycyAgICA9IG1ldGEuY29sb3JzO1xuICAgICAgICBpZiAobWV0YS5jYXJkQ29sb3IgIT09IHVuZGVmaW5lZCkgd2lkZ2V0LmNhcmRDb2xvciA9IG1ldGEuY2FyZENvbG9yO1xuICAgICAgICBpZiAobWV0YS5kYXRhICAgICAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHdpZGdldC5kYXRhID0gbWV0YS5kYXRhO1xuICAgICAgICAgIHRoaXMud2lkZ2V0RGF0YVN1YmplY3QubmV4dCh7IHdpZGdldElkLCBkYXRhOiBtZXRhLmRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQYWdlcyhwYWdlcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2VzKHBhZ2VzOiBQYWdlW10pIHtcbiAgICB0aGlzLnBhZ2VzU3ViamVjdC5uZXh0KFsuLi5wYWdlc10pO1xuICAgIHRoaXMuc2F2ZVRvTG9jYWxTdG9yYWdlKCk7XG4gIH1cblxuICBzZXJpYWxpemVMYXlvdXQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb25maWc6IERhc2hib2FyZENvbmZpZyA9IHtcbiAgICAgIHBhZ2VzOiB0aGlzLnBhZ2VzU3ViamVjdC52YWx1ZSxcbiAgICAgIGFjdGl2ZVBhZ2VJZDogdGhpcy5hY3RpdmVQYWdlSWRTdWJqZWN0LnZhbHVlXG4gICAgfTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZmlnKTtcbiAgfVxuXG4gIGxvYWRMYXlvdXQoY29uZmlnOiBhbnkpIHtcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5wYWdlcykge1xuICAgICAgdGhpcy5wYWdlc1N1YmplY3QubmV4dChjb25maWcucGFnZXMpO1xuICAgICAgaWYgKGNvbmZpZy5hY3RpdmVQYWdlSWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYWdlSWRTdWJqZWN0Lm5leHQoY29uZmlnLmFjdGl2ZVBhZ2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlVG9Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5TVE9SQUdFX0tFWSwgdGhpcy5zZXJpYWxpemVMYXlvdXQoKSk7XG4gIH1cbn1cbiJdfQ==
|