@dbg-riskit/angular-testing 9999.9999.9999-rc.269037 → 9999.9999.9999-rc.2856422
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/docs/README.md +5 -6
- package/esm2022/lib/definitions/data.table.definition.mjs +556 -0
- package/esm2022/lib/definitions/download.menu.page.mjs +90 -0
- package/{esm2020 → esm2022}/lib/definitions/highlighter.directive.page.mjs +5 -5
- package/{esm2020 → esm2022}/lib/definitions/layout.component.page.mjs +6 -6
- package/esm2022/lib/definitions/login.page.mjs +51 -0
- package/esm2022/lib/definitions/message.def.mjs +15 -0
- package/{esm2020 → esm2022}/lib/definitions/message.page.mjs +6 -6
- package/esm2022/lib/definitions/page.base.mjs +64 -0
- package/esm2022/lib/events.mjs +60 -0
- package/{esm2020 → esm2022}/lib/stubs/auth/auth.routing.flow.service.stub.mjs +6 -6
- package/{esm2020 → esm2022}/lib/stubs/auth/auth.service.stub.mjs +5 -5
- package/{esm2020 → esm2022}/lib/stubs/auth/well.known.service.stub.mjs +4 -4
- package/esm2022/lib/stubs/http.service.stub.mjs +54 -0
- package/{esm2020 → esm2022}/lib/stubs/login.menu.stub.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/stubs/router/activated.route.stub.mjs +4 -4
- package/esm2022/lib/stubs/router/router.link.stub.mjs +46 -0
- package/esm2022/lib/stubs/router/router.module.stub.mjs +44 -0
- package/{esm2020 → esm2022}/lib/stubs/router/router.outlet.stub.component.mjs +4 -4
- package/esm2022/lib/stubs/router/router.stub.mjs +79 -0
- package/esm2022/lib/testing.module.mjs +50 -0
- package/esm2022/lib/utils.mjs +48 -0
- package/esm2022/public_api.mjs +48 -0
- package/{fesm2020 → fesm2022}/dbg-riskit-angular-testing.mjs +81 -84
- package/fesm2022/dbg-riskit-angular-testing.mjs.map +1 -0
- package/lib/definitions/data.table.definition.d.ts +1 -1
- package/lib/definitions/download.menu.page.d.ts +1 -1
- package/lib/definitions/highlighter.directive.page.d.ts +1 -1
- package/lib/definitions/layout.component.page.d.ts +1 -1
- package/lib/definitions/message.page.d.ts +1 -1
- package/lib/stubs/login.menu.stub.component.d.ts +1 -1
- package/lib/stubs/router/router.link.stub.d.ts +1 -1
- package/lib/stubs/router/router.module.stub.d.ts +1 -1
- package/lib/stubs/router/router.outlet.stub.component.d.ts +1 -1
- package/package.json +21 -27
- package/esm2020/lib/definitions/data.table.definition.mjs +0 -556
- package/esm2020/lib/definitions/download.menu.page.mjs +0 -90
- package/esm2020/lib/definitions/login.page.mjs +0 -51
- package/esm2020/lib/definitions/message.def.mjs +0 -15
- package/esm2020/lib/definitions/page.base.mjs +0 -64
- package/esm2020/lib/events.mjs +0 -60
- package/esm2020/lib/stubs/http.service.stub.mjs +0 -54
- package/esm2020/lib/stubs/router/router.link.stub.mjs +0 -46
- package/esm2020/lib/stubs/router/router.module.stub.mjs +0 -45
- package/esm2020/lib/stubs/router/router.stub.mjs +0 -79
- package/esm2020/lib/testing.module.mjs +0 -52
- package/esm2020/lib/utils.mjs +0 -48
- package/esm2020/public_api.mjs +0 -48
- package/fesm2015/dbg-riskit-angular-testing.mjs +0 -1544
- package/fesm2015/dbg-riskit-angular-testing.mjs.map +0 -1
- package/fesm2020/dbg-riskit-angular-testing.mjs.map +0 -1
- /package/{esm2020 → esm2022}/dbg-riskit-angular-testing.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/by.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/definitions/link.definition.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/definitions/link.only.page.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/definitions/login.menu.page.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/environment.mjs +0 -0
- /package/{dbg-riskit-angular-testing.d.ts → index.d.ts} +0 -0
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { MatIconAnchor, MatIconButton } from '@angular/material/button';
|
|
3
|
+
import { MatButtonToggle } from '@angular/material/button-toggle';
|
|
4
|
+
import { MatIcon } from '@angular/material/icon';
|
|
5
|
+
import { MatTooltip } from '@angular/material/tooltip';
|
|
6
|
+
import { By } from '@angular/platform-browser';
|
|
7
|
+
import { secureRandom } from '@dbg-riskit/common';
|
|
8
|
+
import { DataTableComponent, DataTableRowDetailExpanderComponent, HIGHLIGHTER_CLASS, PagingComponent } from '@dbg-riskit/angular-datatable';
|
|
9
|
+
import { click } from '../events';
|
|
10
|
+
import { Page } from './page.base';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@dbg-riskit/angular-datatable";
|
|
13
|
+
export class DataTableDefinition {
|
|
14
|
+
constructor(debugElement, page) {
|
|
15
|
+
this.debugElement = debugElement;
|
|
16
|
+
this.page = page;
|
|
17
|
+
}
|
|
18
|
+
get component() {
|
|
19
|
+
return this.debugElement.componentInstance;
|
|
20
|
+
}
|
|
21
|
+
get data() {
|
|
22
|
+
return this.component.plainData;
|
|
23
|
+
}
|
|
24
|
+
get element() {
|
|
25
|
+
return this.debugElement.query(By.css('.risk-data-table-wrapper > table'));
|
|
26
|
+
}
|
|
27
|
+
get header() {
|
|
28
|
+
return new TableHeader(this.debugElement.query((de) => de.references.mainHeader), this.page);
|
|
29
|
+
}
|
|
30
|
+
get sorting() {
|
|
31
|
+
return new TableSorting(this, this.page);
|
|
32
|
+
}
|
|
33
|
+
get body() {
|
|
34
|
+
return new TableBody(this.debugElement.query((de) => de.references.mainBody), this.page);
|
|
35
|
+
}
|
|
36
|
+
get footer() {
|
|
37
|
+
return new TableFooter(this.debugElement.query((de) => de.references.mainFooter));
|
|
38
|
+
}
|
|
39
|
+
get recordsCount() {
|
|
40
|
+
return new RecordsCount(this.debugElement.query(By.css('.risk-data-table-page-count')));
|
|
41
|
+
}
|
|
42
|
+
get pager() {
|
|
43
|
+
return new Pager(this.debugElement.query(By.directive(PagingComponent)), this.page);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// <editor-fold defaultstate="collapsed" desc="Table header">
|
|
47
|
+
export class TableHeader {
|
|
48
|
+
constructor(element, page) {
|
|
49
|
+
this.element = element;
|
|
50
|
+
this.page = page;
|
|
51
|
+
}
|
|
52
|
+
get rows() {
|
|
53
|
+
return this.element.queryAll(By.css('tr')).map((element) => {
|
|
54
|
+
return new TableHeaderRow(element, this.page);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
get cells() {
|
|
58
|
+
return this.element.queryAll(By.css('th')).map((element) => {
|
|
59
|
+
return new TableHeaderCell(element, this.page);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class TableHeaderRow {
|
|
64
|
+
constructor(element, page) {
|
|
65
|
+
this.element = element;
|
|
66
|
+
this.page = page;
|
|
67
|
+
}
|
|
68
|
+
get cells() {
|
|
69
|
+
return this.element.queryAll(By.css('th')).map((element) => {
|
|
70
|
+
return new TableHeaderCell(element, this.page);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export class TableHeaderCell {
|
|
75
|
+
constructor(element, page) {
|
|
76
|
+
this.element = element;
|
|
77
|
+
this.page = page;
|
|
78
|
+
}
|
|
79
|
+
get sortingHandle() {
|
|
80
|
+
const handle = this.element.query(By.directive(MatIconButton));
|
|
81
|
+
if (handle) {
|
|
82
|
+
return new SortingHandle(this.page, handle);
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
get tooltip() {
|
|
87
|
+
const handle = this.element.query(By.directive(MatTooltip));
|
|
88
|
+
if (handle) {
|
|
89
|
+
return handle.injector.get(MatTooltip).message;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
get title() {
|
|
94
|
+
const textNode = this.element.childNodes.find((node) => node.nativeNode.nodeType === Node.TEXT_NODE);
|
|
95
|
+
if (textNode != null) {
|
|
96
|
+
return textNode
|
|
97
|
+
.nativeNode.textContent.trim();
|
|
98
|
+
}
|
|
99
|
+
return '';
|
|
100
|
+
}
|
|
101
|
+
get colspan() {
|
|
102
|
+
return this.element.nativeElement.colspan;
|
|
103
|
+
}
|
|
104
|
+
get rowspan() {
|
|
105
|
+
return this.element.nativeElement.rowspan;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// <editor-fold defaultstate="collapsed" desc="Sorting">
|
|
109
|
+
export class TableSorting {
|
|
110
|
+
constructor(table, page) {
|
|
111
|
+
this.table = table;
|
|
112
|
+
this.page = page;
|
|
113
|
+
}
|
|
114
|
+
get handles() {
|
|
115
|
+
const handles = this.table.debugElement.query((de) => de.references.mainHeader)
|
|
116
|
+
.queryAll(By.directive(MatIconButton));
|
|
117
|
+
if (!handles) {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
return handles.map((handle) => {
|
|
121
|
+
return new SortingHandle(this.page, handle);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
get detailRowHandles() {
|
|
125
|
+
const handles = this.table.debugElement.query(By.css('.risk-data-table-detail')).query(By.css('thead'))
|
|
126
|
+
.queryAll(By.directive(MatIconButton));
|
|
127
|
+
if (!handles) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
return handles.map((handle) => {
|
|
131
|
+
return new SortingHandle(this.page, handle);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
get currentOrdering() {
|
|
135
|
+
return this.table.component.ordering;
|
|
136
|
+
}
|
|
137
|
+
checkSorting(firstNRows = this.table.component.rows.length, criterium) {
|
|
138
|
+
// WARN: call data once as it calls .map on all table rows
|
|
139
|
+
const data = this.table.data;
|
|
140
|
+
let ordering;
|
|
141
|
+
if (criterium) {
|
|
142
|
+
ordering = [criterium].concat(this.table.component._defaultOrdering);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
ordering = this.currentOrdering;
|
|
146
|
+
}
|
|
147
|
+
for (let i = 1; i < Math.min(data.length, firstNRows); i++) {
|
|
148
|
+
ordering.some((criteria) => {
|
|
149
|
+
//noinspection EqualityComparisonWithCoercionJS
|
|
150
|
+
const valueA = criteria.get(data[i - 1]);
|
|
151
|
+
const valueB = criteria.get(data[i]);
|
|
152
|
+
if (valueA == null && valueB == null) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
expect(valueA).not.toBeNull();
|
|
156
|
+
expect(valueA).not.toBeUndefined();
|
|
157
|
+
if (valueB != null) {
|
|
158
|
+
if (criteria.descending) {
|
|
159
|
+
expect(valueA >= valueB)
|
|
160
|
+
.toBeTruthy('Expect: ' + valueA + ' >= '
|
|
161
|
+
+ valueB);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
expect(valueA <= valueB)
|
|
165
|
+
.toBeTruthy('Expect: ' + valueA + ' <= '
|
|
166
|
+
+ valueB);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return valueA !== valueB;
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
export class SortingHandle {
|
|
175
|
+
constructor(page, handle) {
|
|
176
|
+
this.page = page;
|
|
177
|
+
this.handle = handle;
|
|
178
|
+
}
|
|
179
|
+
click() {
|
|
180
|
+
click(this.handle);
|
|
181
|
+
this.page.detectChanges();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// </editor-fold>
|
|
185
|
+
// </editor-fold>
|
|
186
|
+
// <editor-fold defaultstate="collapsed" desc="Table body">
|
|
187
|
+
export class TableBody {
|
|
188
|
+
constructor(element, page) {
|
|
189
|
+
this.element = element;
|
|
190
|
+
this.page = page;
|
|
191
|
+
}
|
|
192
|
+
get rows() {
|
|
193
|
+
return this.element.queryAll((de) => de.references.masterRow).map((element) => {
|
|
194
|
+
return new TableBodyRow(element, this.page);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
get cells() {
|
|
198
|
+
let cells = [];
|
|
199
|
+
this.element.queryAll((de) => de.references.masterRow).forEach((row) => {
|
|
200
|
+
cells = cells.concat(row.queryAll(By.css('td')).map((cell) => {
|
|
201
|
+
return new TableBodyCell(cell);
|
|
202
|
+
}));
|
|
203
|
+
});
|
|
204
|
+
return cells;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export class TableBodyRow {
|
|
208
|
+
constructor(element, page) {
|
|
209
|
+
this.element = element;
|
|
210
|
+
this.page = page;
|
|
211
|
+
}
|
|
212
|
+
expandRow() {
|
|
213
|
+
click(this.element);
|
|
214
|
+
this.page.detectChanges();
|
|
215
|
+
}
|
|
216
|
+
get expander() {
|
|
217
|
+
return new RowExpander(this.element.query(By.directive(DataTableRowDetailExpanderComponent)).query(By.directive(MatIconAnchor)));
|
|
218
|
+
}
|
|
219
|
+
get cells() {
|
|
220
|
+
return this.element.queryAll(By.css('td')).map((element) => {
|
|
221
|
+
return new TableBodyCell(element);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
get rowDetail() {
|
|
225
|
+
const parent = this.element.parent;
|
|
226
|
+
if (parent != null) {
|
|
227
|
+
const next = parent.children[parent.children.indexOf(this.element) + 1];
|
|
228
|
+
if (next && !next.references.masterRow) {
|
|
229
|
+
return new TableBodyDetail(next, this.page);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
get highlighted() {
|
|
235
|
+
return this.element.nativeElement.classList.contains(HIGHLIGHTER_CLASS);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
export class RowExpander {
|
|
239
|
+
constructor(element) {
|
|
240
|
+
this.element = element;
|
|
241
|
+
}
|
|
242
|
+
get icon() {
|
|
243
|
+
return this.element.query(By.directive(MatIcon)).nativeElement.textContent.trim();
|
|
244
|
+
}
|
|
245
|
+
get opened() {
|
|
246
|
+
return this.icon === 'expand_less';
|
|
247
|
+
}
|
|
248
|
+
get closed() {
|
|
249
|
+
return this.icon === 'expand_more';
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
export class TableBodyCell {
|
|
253
|
+
constructor(element) {
|
|
254
|
+
this.element = element;
|
|
255
|
+
}
|
|
256
|
+
get colspan() {
|
|
257
|
+
return this.element.nativeElement.colspan;
|
|
258
|
+
}
|
|
259
|
+
get rowspan() {
|
|
260
|
+
return this.element.nativeElement.rowspan;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// <editor-fold defaultstate="collapsed" desc="Row detail">
|
|
264
|
+
export class TableBodyDetail {
|
|
265
|
+
constructor(element, page) {
|
|
266
|
+
this.element = element;
|
|
267
|
+
this.page = page;
|
|
268
|
+
}
|
|
269
|
+
header() {
|
|
270
|
+
return new TableHeader(this.element.query(By.css('thead')), this.page);
|
|
271
|
+
}
|
|
272
|
+
get body() {
|
|
273
|
+
return new TableBodyDetailBody(this.element.query(By.css('tbody')));
|
|
274
|
+
}
|
|
275
|
+
get highlighted() {
|
|
276
|
+
return this.element.nativeElement.classList.contains(HIGHLIGHTER_CLASS);
|
|
277
|
+
}
|
|
278
|
+
get colspan() {
|
|
279
|
+
return this.element.children[0].nativeElement.colspan;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
export class TableBodyDetailBody {
|
|
283
|
+
constructor(element) {
|
|
284
|
+
this.element = element;
|
|
285
|
+
}
|
|
286
|
+
get rows() {
|
|
287
|
+
return this.element.queryAll(By.css('tr')).map((element) => {
|
|
288
|
+
return new TableBodyDetailRow(element);
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
get cells() {
|
|
292
|
+
let cells = [];
|
|
293
|
+
this.element.queryAll(By.css('tr')).forEach((row) => {
|
|
294
|
+
cells = cells.concat(row.queryAll(By.css('td')).map((cell) => {
|
|
295
|
+
return new TableBodyCell(cell);
|
|
296
|
+
}));
|
|
297
|
+
});
|
|
298
|
+
return cells;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
export class TableBodyDetailRow {
|
|
302
|
+
constructor(element) {
|
|
303
|
+
this.element = element;
|
|
304
|
+
}
|
|
305
|
+
get cells() {
|
|
306
|
+
return this.element.queryAll(By.css('td')).map((element) => {
|
|
307
|
+
return new TableBodyCell(element);
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// </editor-fold>
|
|
312
|
+
// </editor-fold>
|
|
313
|
+
// <editor-fold defaultstate="collapsed" desc="Table footer">
|
|
314
|
+
export class TableFooter {
|
|
315
|
+
constructor(element) {
|
|
316
|
+
this.element = element;
|
|
317
|
+
}
|
|
318
|
+
get rows() {
|
|
319
|
+
return this.element.queryAll(By.css('tr')).map((element) => {
|
|
320
|
+
return new TableFooterRow(element);
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
get cells() {
|
|
324
|
+
let cells = [];
|
|
325
|
+
this.element.queryAll(By.css('tr')).forEach((row) => {
|
|
326
|
+
cells = cells.concat(row.queryAll(By.css('th')).map((cell) => {
|
|
327
|
+
return new TableBodyCell(cell);
|
|
328
|
+
}));
|
|
329
|
+
});
|
|
330
|
+
return cells;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
export class TableFooterRow {
|
|
334
|
+
constructor(element) {
|
|
335
|
+
this.element = element;
|
|
336
|
+
}
|
|
337
|
+
get cells() {
|
|
338
|
+
return this.element.queryAll(By.css('th')).map((element) => {
|
|
339
|
+
return new TableBodyCell(element);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// </editor-fold>
|
|
344
|
+
export class RecordsCount {
|
|
345
|
+
constructor(element) {
|
|
346
|
+
this.element = element;
|
|
347
|
+
}
|
|
348
|
+
get message() {
|
|
349
|
+
return this.element.nativeElement.textContent;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
export class Pager {
|
|
353
|
+
constructor(element, page) {
|
|
354
|
+
this.element = element;
|
|
355
|
+
this.page = page;
|
|
356
|
+
}
|
|
357
|
+
get pageButtons() {
|
|
358
|
+
return this.element.queryAll(By.directive(MatButtonToggle));
|
|
359
|
+
}
|
|
360
|
+
expectLeadingButtonsDisabled() {
|
|
361
|
+
for (let i = 0; i < 2; i++) {
|
|
362
|
+
expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
|
|
363
|
+
.toBe(true, 'First two are disabled.');
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
expectLeadingButtonsNotDisabled() {
|
|
367
|
+
for (let i = 0; i < 2; i++) {
|
|
368
|
+
expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
|
|
369
|
+
.not.toBe(true, 'First two are not disabled.');
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
expectTrailingButtonsDisabled() {
|
|
373
|
+
for (let i = this.pageButtons.length - 1; i > this.pageButtons.length - 3; i--) {
|
|
374
|
+
expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
|
|
375
|
+
.toBe(true, 'Last two are disabled.');
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
expectTrailingButtonsNotDisabled() {
|
|
379
|
+
for (let i = this.pageButtons.length - 1; i > this.pageButtons.length - 3; i--) {
|
|
380
|
+
expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
|
|
381
|
+
.not.toBe(true, 'Last two are not disabled.');
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
expectButtonNumbers(numbers) {
|
|
385
|
+
for (let i = 0; i < numbers.length; i++) {
|
|
386
|
+
expect(this.pageButtons[i + 2].query(By.css('.mat-button-toggle-label-content'))
|
|
387
|
+
.nativeElement.textContent.trim())
|
|
388
|
+
.toEqual(numbers[i] + '', 'Button numbers are correct');
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
expectButtonActive(index) {
|
|
392
|
+
expect(this.pageButtons[index].classes['mat-button-toggle-checked'])
|
|
393
|
+
.toBe(true, 'Button is active.');
|
|
394
|
+
}
|
|
395
|
+
click(index) {
|
|
396
|
+
click(this.pageButtons[index].query(By.css('.mat-button-toggle-label-content')).nativeElement);
|
|
397
|
+
this.page.detectChanges();
|
|
398
|
+
this.page.advanceAndDetectChanges();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
export function chceckSorting(page, criteria) {
|
|
402
|
+
page.dataTable.sorting.checkSorting(150);
|
|
403
|
+
page.dataTable.sorting.handles.forEach((handle, index) => {
|
|
404
|
+
// Tigger sort based on a handle
|
|
405
|
+
handle.click();
|
|
406
|
+
page.detectChanges();
|
|
407
|
+
// Check the sorting
|
|
408
|
+
page.dataTable.sorting.checkSorting(150, {
|
|
409
|
+
get: criteria[index]
|
|
410
|
+
});
|
|
411
|
+
// Tigger sort based on a handle
|
|
412
|
+
handle.click();
|
|
413
|
+
page.detectChanges();
|
|
414
|
+
// Check the sorting
|
|
415
|
+
page.dataTable.sorting.checkSorting(150, {
|
|
416
|
+
get: criteria[index],
|
|
417
|
+
descending: true
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
export class DataTableDefinitionHosted extends Page {
|
|
422
|
+
constructor(fixture) {
|
|
423
|
+
super(fixture);
|
|
424
|
+
}
|
|
425
|
+
get dataTable() {
|
|
426
|
+
return new DataTableDefinition(this.debugElement.query(By.directive(DataTableComponent)), this);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
export class TestDataTableHostComponent {
|
|
430
|
+
constructor() {
|
|
431
|
+
this.data = [];
|
|
432
|
+
for (let i = 0; i < 500; i++) {
|
|
433
|
+
this.data.push({
|
|
434
|
+
value1: Math.floor(secureRandom() * 20) + ' - value 1',
|
|
435
|
+
value2: Math.floor(secureRandom() * 20) + ' - value 2',
|
|
436
|
+
value3: Math.floor(secureRandom() * 20) + ' - value 3'
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
this.footer = this.data[0];
|
|
440
|
+
}
|
|
441
|
+
get defaultOrdering() {
|
|
442
|
+
return [
|
|
443
|
+
{
|
|
444
|
+
get: (record) => {
|
|
445
|
+
return record.value3;
|
|
446
|
+
},
|
|
447
|
+
descending: true
|
|
448
|
+
},
|
|
449
|
+
(record) => {
|
|
450
|
+
return record.value2;
|
|
451
|
+
}
|
|
452
|
+
];
|
|
453
|
+
}
|
|
454
|
+
get valueGetter() {
|
|
455
|
+
return (record) => {
|
|
456
|
+
return record.value1;
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TestDataTableHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
460
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TestDataTableHostComponent, selector: "ng-component", ngImport: i0, template: `
|
|
461
|
+
<risk-data-table [data]="data"
|
|
462
|
+
[footer]="footer"
|
|
463
|
+
[pageSize]="20"
|
|
464
|
+
[defaultOrdering]="defaultOrdering"
|
|
465
|
+
[striped]="true">
|
|
466
|
+
<risk-data-table-column title="Test Column 1"
|
|
467
|
+
[sortingKey]="valueGetter">
|
|
468
|
+
<ng-template let-record="row" risk-data-table-cell>
|
|
469
|
+
{{record.value1}}
|
|
470
|
+
</ng-template>
|
|
471
|
+
</risk-data-table-column>
|
|
472
|
+
<risk-data-table-column>
|
|
473
|
+
<ng-template risk-data-table-cell let-record="row" let-expanded="expanded">
|
|
474
|
+
<risk-data-table-detail-expander [expanded]="expanded"></risk-data-table-detail-expander>
|
|
475
|
+
</ng-template>
|
|
476
|
+
<ng-template risk-data-table-footer-cell let-footer="footer">
|
|
477
|
+
{{footer.value1}}
|
|
478
|
+
</ng-template>
|
|
479
|
+
</risk-data-table-column>
|
|
480
|
+
<!-- Sub detail -->
|
|
481
|
+
<risk-data-table-detail-row>
|
|
482
|
+
<risk-data-table-column-group>
|
|
483
|
+
<risk-data-table-column title="Test Detail Column 1"
|
|
484
|
+
[sortingKey]="valueGetter">
|
|
485
|
+
<ng-template risk-data-table-cell let-record="row">
|
|
486
|
+
{{record.value1}}
|
|
487
|
+
</ng-template>
|
|
488
|
+
</risk-data-table-column>
|
|
489
|
+
</risk-data-table-column-group>
|
|
490
|
+
<risk-data-table-column-group>
|
|
491
|
+
<risk-data-table-column title="Test Detail Column 2">
|
|
492
|
+
<ng-template risk-data-table-cell let-record="row">
|
|
493
|
+
{{record.value2}}
|
|
494
|
+
</ng-template>
|
|
495
|
+
</risk-data-table-column>
|
|
496
|
+
<risk-data-table-column title="Test Detail Column 3">
|
|
497
|
+
<ng-template risk-data-table-cell let-record="row">
|
|
498
|
+
{{record.value3}}
|
|
499
|
+
</ng-template>
|
|
500
|
+
</risk-data-table-column>
|
|
501
|
+
</risk-data-table-column-group>
|
|
502
|
+
<risk-data-table-column-group></risk-data-table-column-group>
|
|
503
|
+
</risk-data-table-detail-row>
|
|
504
|
+
</risk-data-table>`, isInline: true, dependencies: [{ kind: "component", type: i1.DataTableComponent, selector: "risk-data-table", inputs: ["footer", "pageSize", "striped", "showFooter", "allowEmpty", "trackByRowKey", "highlighting", "stickyHeader", "stickyHeaderOffsetTopPx", "data", "defaultOrdering"], exportAs: ["dataTable"] }, { kind: "directive", type: i1.ɵDataTableColumnDirective, selector: "risk-data-table-column", inputs: ["title", "sortingKey", "tooltip", "contentAlign", "headerAlign", "footerAlign", "class"] }, { kind: "directive", type: i1.ɵDataTableColumnGroupDirective, selector: "risk-data-table-column-group" }, { kind: "directive", type: i1.ɵDataTableColumnCellDirective, selector: "[risk-data-table-cell]" }, { kind: "directive", type: i1.ɵDataTableColumnFooterDirective, selector: "[risk-data-table-footer-cell]" }, { kind: "directive", type: i1.ɵDataTableRowDetailDirective, selector: "risk-data-table-detail-row" }, { kind: "component", type: i1.DataTableRowDetailExpanderComponent, selector: "risk-data-table-detail-expander", inputs: ["expanded"] }] }); }
|
|
505
|
+
}
|
|
506
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TestDataTableHostComponent, decorators: [{
|
|
507
|
+
type: Component,
|
|
508
|
+
args: [{
|
|
509
|
+
template: `
|
|
510
|
+
<risk-data-table [data]="data"
|
|
511
|
+
[footer]="footer"
|
|
512
|
+
[pageSize]="20"
|
|
513
|
+
[defaultOrdering]="defaultOrdering"
|
|
514
|
+
[striped]="true">
|
|
515
|
+
<risk-data-table-column title="Test Column 1"
|
|
516
|
+
[sortingKey]="valueGetter">
|
|
517
|
+
<ng-template let-record="row" risk-data-table-cell>
|
|
518
|
+
{{record.value1}}
|
|
519
|
+
</ng-template>
|
|
520
|
+
</risk-data-table-column>
|
|
521
|
+
<risk-data-table-column>
|
|
522
|
+
<ng-template risk-data-table-cell let-record="row" let-expanded="expanded">
|
|
523
|
+
<risk-data-table-detail-expander [expanded]="expanded"></risk-data-table-detail-expander>
|
|
524
|
+
</ng-template>
|
|
525
|
+
<ng-template risk-data-table-footer-cell let-footer="footer">
|
|
526
|
+
{{footer.value1}}
|
|
527
|
+
</ng-template>
|
|
528
|
+
</risk-data-table-column>
|
|
529
|
+
<!-- Sub detail -->
|
|
530
|
+
<risk-data-table-detail-row>
|
|
531
|
+
<risk-data-table-column-group>
|
|
532
|
+
<risk-data-table-column title="Test Detail Column 1"
|
|
533
|
+
[sortingKey]="valueGetter">
|
|
534
|
+
<ng-template risk-data-table-cell let-record="row">
|
|
535
|
+
{{record.value1}}
|
|
536
|
+
</ng-template>
|
|
537
|
+
</risk-data-table-column>
|
|
538
|
+
</risk-data-table-column-group>
|
|
539
|
+
<risk-data-table-column-group>
|
|
540
|
+
<risk-data-table-column title="Test Detail Column 2">
|
|
541
|
+
<ng-template risk-data-table-cell let-record="row">
|
|
542
|
+
{{record.value2}}
|
|
543
|
+
</ng-template>
|
|
544
|
+
</risk-data-table-column>
|
|
545
|
+
<risk-data-table-column title="Test Detail Column 3">
|
|
546
|
+
<ng-template risk-data-table-cell let-record="row">
|
|
547
|
+
{{record.value3}}
|
|
548
|
+
</ng-template>
|
|
549
|
+
</risk-data-table-column>
|
|
550
|
+
</risk-data-table-column-group>
|
|
551
|
+
<risk-data-table-column-group></risk-data-table-column-group>
|
|
552
|
+
</risk-data-table-detail-row>
|
|
553
|
+
</risk-data-table>`
|
|
554
|
+
}]
|
|
555
|
+
}], ctorParameters: () => [] });
|
|
556
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS50YWJsZS5kZWZpbml0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGtnL2RiZy1yaXNraXQvYW5ndWxhci10ZXN0aW5nL3NyYy9saWIvZGVmaW5pdGlvbnMvZGF0YS50YWJsZS5kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBQyxhQUFhLEVBQUUsYUFBYSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzdDLE9BQU8sRUFBYyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLG1DQUFtQyxFQUNuQyxpQkFBaUIsRUFFakIsZUFBZSxFQUNsQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQzs7O0FBRWpDLE1BQU0sT0FBTyxtQkFBbUI7SUFFNUIsWUFBMEIsWUFBMEIsRUFDekIsSUFBd0U7UUFEekUsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDekIsU0FBSSxHQUFKLElBQUksQ0FBb0U7SUFDbkcsQ0FBQztJQUVELElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQkE0Q2E7OzRGQUVkLDBCQUEwQjtrQkEvQ3RDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQkE0Q2E7aUJBQzFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIERlYnVnRWxlbWVudCwgRGVidWdOb2RlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29tcG9uZW50Rml4dHVyZX0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7TWF0SWNvbkFuY2hvciwgTWF0SWNvbkJ1dHRvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7TWF0QnV0dG9uVG9nZ2xlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24tdG9nZ2xlJztcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQge01hdFRvb2x0aXB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHtCeX0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQge1ZhbHVlR2V0dGVyLCBzZWN1cmVSYW5kb219IGZyb20gJ0BkYmctcmlza2l0L2NvbW1vbic7XG5pbXBvcnQge1xuICAgIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgICBEYXRhVGFibGVSb3dEZXRhaWxFeHBhbmRlckNvbXBvbmVudCxcbiAgICBISUdITElHSFRFUl9DTEFTUyxcbiAgICBPcmRlcmluZ0NyaXRlcmlhLFxuICAgIFBhZ2luZ0NvbXBvbmVudFxufSBmcm9tICdAZGJnLXJpc2tpdC9hbmd1bGFyLWRhdGF0YWJsZSc7XG5pbXBvcnQge2NsaWNrfSBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHtQYWdlfSBmcm9tICcuL3BhZ2UuYmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVEZWZpbml0aW9uIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZGVidWdFbGVtZW50OiBEZWJ1Z0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkLCBhZHZhbmNlQW5kRGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb21wb25lbnQoKTogRGF0YVRhYmxlQ29tcG9uZW50PHVua25vd24sIHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVidWdFbGVtZW50LmNvbXBvbmVudEluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5wbGFpbkRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlbGVtZW50KCk6IERlYnVnRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlYnVnRWxlbWVudC5xdWVyeShCeS5jc3MoJy5yaXNrLWRhdGEtdGFibGUtd3JhcHBlciA+IHRhYmxlJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGVhZGVyKCk6IFRhYmxlSGVhZGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUhlYWRlcih0aGlzLmRlYnVnRWxlbWVudC5xdWVyeSgoZGUpID0+IGRlLnJlZmVyZW5jZXMubWFpbkhlYWRlciksIHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzb3J0aW5nKCk6IFRhYmxlU29ydGluZyB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVTb3J0aW5nKHRoaXMsIHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBib2R5KCk6IFRhYmxlQm9keSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5KHRoaXMuZGVidWdFbGVtZW50LnF1ZXJ5KChkZSkgPT4gZGUucmVmZXJlbmNlcy5tYWluQm9keSksIHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmb290ZXIoKTogVGFibGVGb290ZXIge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlRm9vdGVyKHRoaXMuZGVidWdFbGVtZW50LnF1ZXJ5KChkZSkgPT4gZGUucmVmZXJlbmNlcy5tYWluRm9vdGVyKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZWNvcmRzQ291bnQoKTogUmVjb3Jkc0NvdW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWNvcmRzQ291bnQodGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoQnkuY3NzKCcucmlzay1kYXRhLXRhYmxlLXBhZ2UtY291bnQnKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFnZXIoKTogUGFnZXIge1xuICAgICAgICByZXR1cm4gbmV3IFBhZ2VyKHRoaXMuZGVidWdFbGVtZW50LnF1ZXJ5KEJ5LmRpcmVjdGl2ZShQYWdpbmdDb21wb25lbnQpKSwgdGhpcy5wYWdlKTtcbiAgICB9XG59XG5cbi8vIDxlZGl0b3ItZm9sZCBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiBkZXNjPVwiVGFibGUgaGVhZGVyXCI+XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUhlYWRlciB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCwgcHJpdmF0ZSBwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93cygpOiBUYWJsZUhlYWRlclJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RyJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlSGVhZGVyUm93KGVsZW1lbnQsIHRoaXMucGFnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2VsbHMoKTogVGFibGVIZWFkZXJDZWxsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndGgnKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVIZWFkZXJDZWxsKGVsZW1lbnQsIHRoaXMucGFnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVIZWFkZXJSb3cge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUhlYWRlckNlbGxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0aCcpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUhlYWRlckNlbGwoZWxlbWVudCwgdGhpcy5wYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVIZWFkZXJDZWxsIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzb3J0aW5nSGFuZGxlKCk6IFNvcnRpbmdIYW5kbGUgfCBudWxsIHtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5lbGVtZW50LnF1ZXJ5KEJ5LmRpcmVjdGl2ZShNYXRJY29uQnV0dG9uKSk7XG4gICAgICAgIGlmIChoYW5kbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGluZ0hhbmRsZSh0aGlzLnBhZ2UsIGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmVsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKE1hdFRvb2x0aXApKTtcbiAgICAgICAgaWYgKGhhbmRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS5pbmplY3Rvci5nZXQoTWF0VG9vbHRpcCkubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gdGhpcy5lbGVtZW50LmNoaWxkTm9kZXMuZmluZCgobm9kZTogRGVidWdOb2RlKSA9PiBub2RlLm5hdGl2ZU5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKTtcbiAgICAgICAgaWYgKHRleHROb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0Tm9kZVxuICAgICAgICAgICAgICAgIC5uYXRpdmVOb2RlLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2xzcGFuKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb2xzcGFuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93c3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucm93c3BhbjtcbiAgICB9XG5cbn1cblxuLy8gPGVkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiIGRlc2M9XCJTb3J0aW5nXCI+XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVNvcnRpbmcge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFibGU6IERhdGFUYWJsZURlZmluaXRpb24sIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhbmRsZXMoKTogU29ydGluZ0hhbmRsZVtdIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcyA9IHRoaXMudGFibGUuZGVidWdFbGVtZW50LnF1ZXJ5KChkZSkgPT4gZGUucmVmZXJlbmNlcy5tYWluSGVhZGVyKVxuICAgICAgICAgICAgLnF1ZXJ5QWxsKEJ5LmRpcmVjdGl2ZShNYXRJY29uQnV0dG9uKSk7XG4gICAgICAgIGlmICghaGFuZGxlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVzLm1hcCgoaGFuZGxlOiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGluZ0hhbmRsZSh0aGlzLnBhZ2UsIGhhbmRsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGV0YWlsUm93SGFuZGxlcygpOiBTb3J0aW5nSGFuZGxlW10gfCBudWxsIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcyA9IHRoaXMudGFibGUuZGVidWdFbGVtZW50LnF1ZXJ5KEJ5LmNzcygnLnJpc2stZGF0YS10YWJsZS1kZXRhaWwnKSkucXVlcnkoQnkuY3NzKCd0aGVhZCcpKVxuICAgICAgICAgICAgLnF1ZXJ5QWxsKEJ5LmRpcmVjdGl2ZShNYXRJY29uQnV0dG9uKSk7XG4gICAgICAgIGlmICghaGFuZGxlcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZXMubWFwKChoYW5kbGU6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3J0aW5nSGFuZGxlKHRoaXMucGFnZSwgaGFuZGxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50T3JkZXJpbmcoKTogQXJyYXk8T3JkZXJpbmdDcml0ZXJpYTxhbnk+PiB7XG4gICAgICAgIHJldHVybiAodGhpcy50YWJsZS5jb21wb25lbnQgYXMgYW55KS5vcmRlcmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tTb3J0aW5nKGZpcnN0TlJvd3M6IG51bWJlciA9IHRoaXMudGFibGUuY29tcG9uZW50LnJvd3MubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaXVtPzogT3JkZXJpbmdDcml0ZXJpYTxhbnk+KTogdm9pZCB7XG4gICAgICAgIC8vIFdBUk46IGNhbGwgZGF0YSBvbmNlIGFzIGl0IGNhbGxzIC5tYXAgb24gYWxsIHRhYmxlIHJvd3NcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMudGFibGUuZGF0YTtcblxuICAgICAgICBsZXQgb3JkZXJpbmc6IEFycmF5PE9yZGVyaW5nQ3JpdGVyaWE8YW55Pj47XG4gICAgICAgIGlmIChjcml0ZXJpdW0pIHtcbiAgICAgICAgICAgIG9yZGVyaW5nID0gW2NyaXRlcml1bV0uY29uY2F0KCh0aGlzLnRhYmxlLmNvbXBvbmVudCBhcyBhbnkpLl9kZWZhdWx0T3JkZXJpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3JkZXJpbmcgPSB0aGlzLmN1cnJlbnRPcmRlcmluZztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IE1hdGgubWluKGRhdGEubGVuZ3RoLCBmaXJzdE5Sb3dzKTsgaSsrKSB7XG4gICAgICAgICAgICBvcmRlcmluZy5zb21lKChjcml0ZXJpYTogT3JkZXJpbmdDcml0ZXJpYTxhbnk+KSA9PiB7XG4gICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gRXF1YWxpdHlDb21wYXJpc29uV2l0aENvZXJjaW9uSlNcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUE6IGFueSA9IGNyaXRlcmlhLmdldChkYXRhW2kgLSAxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVCOiBhbnkgPSBjcml0ZXJpYS5nZXQoZGF0YVtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlQSA9PSBudWxsICYmIHZhbHVlQiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXhwZWN0KHZhbHVlQSkubm90LnRvQmVOdWxsKCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHZhbHVlQSkubm90LnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVCICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNyaXRlcmlhLmRlc2NlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWx1ZUEgPj0gdmFsdWVCKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0JlVHJ1dGh5KCdFeHBlY3Q6ICcgKyB2YWx1ZUEgKyAnID49ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlQik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsdWVBIDw9IHZhbHVlQilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9CZVRydXRoeSgnRXhwZWN0OiAnICsgdmFsdWVBICsgJyA8PSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZUIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZUEgIT09IHZhbHVlQjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU29ydGluZ0hhbmRsZSB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSwgcHJpdmF0ZSBoYW5kbGU6IERlYnVnRWxlbWVudCkge1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGljaygpIHtcbiAgICAgICAgY2xpY2sodGhpcy5oYW5kbGUpO1xuICAgICAgICB0aGlzLnBhZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbn1cblxuLy8gPC9lZGl0b3ItZm9sZD5cblxuLy8gPC9lZGl0b3ItZm9sZD5cblxuLy8gPGVkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiIGRlc2M9XCJUYWJsZSBib2R5XCI+XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHkge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd3MoKTogVGFibGVCb2R5Um93W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKChkZSkgPT4gZGUucmVmZXJlbmNlcy5tYXN0ZXJSb3cpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keVJvdyhlbGVtZW50LCB0aGlzLnBhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIGxldCBjZWxsczogVGFibGVCb2R5Q2VsbFtdID0gW107XG4gICAgICAgIHRoaXMuZWxlbWVudC5xdWVyeUFsbCgoZGUpID0+IGRlLnJlZmVyZW5jZXMubWFzdGVyUm93KS5mb3JFYWNoKChyb3c6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY2VsbHMgPSBjZWxscy5jb25jYXQocm93LnF1ZXJ5QWxsKEJ5LmNzcygndGQnKSkubWFwKChjZWxsOiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keUNlbGwoY2VsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5Um93IHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGV4cGFuZFJvdygpOiB2b2lkIHtcbiAgICAgICAgY2xpY2sodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wYWdlLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGV4cGFuZGVyKCk6IFJvd0V4cGFuZGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3dFeHBhbmRlcihcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5xdWVyeShCeS5kaXJlY3RpdmUoRGF0YVRhYmxlUm93RGV0YWlsRXhwYW5kZXJDb21wb25lbnQpKS5xdWVyeShCeS5kaXJlY3RpdmUoTWF0SWNvbkFuY2hvcikpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0ZCcpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlDZWxsKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0RldGFpbCgpOiBUYWJsZUJvZHlEZXRhaWwgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5lbGVtZW50LnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gcGFyZW50LmNoaWxkcmVuW3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMuZWxlbWVudCkgKyAxXTtcbiAgICAgICAgICAgIGlmIChuZXh0ICYmICFuZXh0LnJlZmVyZW5jZXMubWFzdGVyUm93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlEZXRhaWwobmV4dCwgdGhpcy5wYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhpZ2hsaWdodGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKEhJR0hMSUdIVEVSX0NMQVNTKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb3dFeHBhbmRlciB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGljb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeShCeS5kaXJlY3RpdmUoTWF0SWNvbikpLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uID09PSAnZXhwYW5kX2xlc3MnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uID09PSAnZXhwYW5kX21vcmUnO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keUNlbGwge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbHNwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbHNwYW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzcGFuKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5yb3dzcGFuO1xuICAgIH1cbn1cblxuLy8gPGVkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiIGRlc2M9XCJSb3cgZGV0YWlsXCI+XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlEZXRhaWwge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGVhZGVyKCk6IFRhYmxlSGVhZGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUhlYWRlcih0aGlzLmVsZW1lbnQucXVlcnkoQnkuY3NzKCd0aGVhZCcpKSwgdGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJvZHkoKTogVGFibGVCb2R5RGV0YWlsQm9keSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5RGV0YWlsQm9keSh0aGlzLmVsZW1lbnQucXVlcnkoQnkuY3NzKCd0Ym9keScpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoaWdobGlnaHRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhISUdITElHSFRFUl9DTEFTUyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2xzcGFuKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2hpbGRyZW5bMF0ubmF0aXZlRWxlbWVudC5jb2xzcGFuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keURldGFpbEJvZHkge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd3MoKTogVGFibGVCb2R5RGV0YWlsUm93W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndHInKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5RGV0YWlsUm93KGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIGxldCBjZWxsczogVGFibGVCb2R5Q2VsbFtdID0gW107XG4gICAgICAgIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RyJykpLmZvckVhY2goKHJvdzogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjZWxscyA9IGNlbGxzLmNvbmNhdChyb3cucXVlcnlBbGwoQnkuY3NzKCd0ZCcpKS5tYXAoKGNlbGw6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChjZWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlEZXRhaWxSb3cge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0ZCcpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlDZWxsKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIDwvZWRpdG9yLWZvbGQ+XG5cbi8vIDwvZWRpdG9yLWZvbGQ+XG5cbi8vIDxlZGl0b3ItZm9sZCBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiBkZXNjPVwiVGFibGUgZm9vdGVyXCI+XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUZvb3RlciB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93cygpOiBUYWJsZUZvb3RlclJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RyJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlRm9vdGVyUm93KGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIGxldCBjZWxsczogVGFibGVCb2R5Q2VsbFtdID0gW107XG4gICAgICAgIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RyJykpLmZvckVhY2goKHJvdzogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjZWxscyA9IGNlbGxzLmNvbmNhdChyb3cucXVlcnlBbGwoQnkuY3NzKCd0aCcpKS5tYXAoKGNlbGw6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChjZWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUZvb3RlclJvdyB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2VsbHMoKTogVGFibGVCb2R5Q2VsbFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RoJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keUNlbGwoZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gPC9lZGl0b3ItZm9sZD5cblxuZXhwb3J0IGNsYXNzIFJlY29yZHNDb3VudCB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFnZXIge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkLCBhZHZhbmNlQW5kRGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYWdlQnV0dG9ucygpOiBEZWJ1Z0VsZW1lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuZGlyZWN0aXZlKE1hdEJ1dHRvblRvZ2dsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RMZWFkaW5nQnV0dG9uc0Rpc2FibGVkKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaV0uY2xhc3Nlc1snbWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQnXSlcbiAgICAgICAgICAgICAgICAudG9CZSh0cnVlLCAnRmlyc3QgdHdvIGFyZSBkaXNhYmxlZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RMZWFkaW5nQnV0dG9uc05vdERpc2FibGVkKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaV0uY2xhc3Nlc1snbWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQnXSlcbiAgICAgICAgICAgICAgICAubm90LnRvQmUodHJ1ZSwgJ0ZpcnN0IHR3byBhcmUgbm90IGRpc2FibGVkLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGV4cGVjdFRyYWlsaW5nQnV0dG9uc0Rpc2FibGVkKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5wYWdlQnV0dG9ucy5sZW5ndGggLSAxOyBpID4gdGhpcy5wYWdlQnV0dG9ucy5sZW5ndGggLSAzOyBpLS0pIHtcbiAgICAgICAgICAgIGV4cGVjdCh0aGlzLnBhZ2VCdXR0b25zW2ldLmNsYXNzZXNbJ21hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkJ10pXG4gICAgICAgICAgICAgICAgLnRvQmUodHJ1ZSwgJ0xhc3QgdHdvIGFyZSBkaXNhYmxlZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RUcmFpbGluZ0J1dHRvbnNOb3REaXNhYmxlZCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMucGFnZUJ1dHRvbnMubGVuZ3RoIC0gMTsgaSA+IHRoaXMucGFnZUJ1dHRvbnMubGVuZ3RoIC0gMzsgaS0tKSB7XG4gICAgICAgICAgICBleHBlY3QodGhpcy5wYWdlQnV0dG9uc1tpXS5jbGFzc2VzWydtYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCddKVxuICAgICAgICAgICAgICAgIC5ub3QudG9CZSh0cnVlLCAnTGFzdCB0d28gYXJlIG5vdCBkaXNhYmxlZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RCdXR0b25OdW1iZXJzKG51bWJlcnM6IG51bWJlcltdKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaSArIDJdLnF1ZXJ5KEJ5LmNzcygnLm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnQnKSlcbiAgICAgICAgICAgICAgICAubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudC50cmltKCkpXG4gICAgICAgICAgICAgICAgLnRvRXF1YWwobnVtYmVyc1tpXSArICcnLCAnQnV0dG9uIG51bWJlcnMgYXJlIGNvcnJlY3QnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RCdXR0b25BY3RpdmUoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBleHBlY3QodGhpcy5wYWdlQnV0dG9uc1tpbmRleF0uY2xhc3Nlc1snbWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCddKVxuICAgICAgICAgICAgLnRvQmUodHJ1ZSwgJ0J1dHRvbiBpcyBhY3RpdmUuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY2xpY2sodGhpcy5wYWdlQnV0dG9uc1tpbmRleF0ucXVlcnkoQnkuY3NzKCcubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudCcpKS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5wYWdlLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5wYWdlLmFkdmFuY2VBbmREZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hjZWNrU29ydGluZyhwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQsIGRhdGFUYWJsZTogRGF0YVRhYmxlRGVmaW5pdGlvbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWE6IEFycmF5PFZhbHVlR2V0dGVyPGFueT4+KSB7XG4gICAgcGFnZS5kYXRhVGFibGUuc29ydGluZy5jaGVja1NvcnRpbmcoMTUwKTtcblxuICAgIHBhZ2UuZGF0YVRhYmxlLnNvcnRpbmcuaGFuZGxlcy5mb3JFYWNoKChoYW5kbGU6IFNvcnRpbmdIYW5kbGUsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVGlnZ2VyIHNvcnQgYmFzZWQgb24gYSBoYW5kbGVcbiAgICAgICAgaGFuZGxlLmNsaWNrKCk7XG4gICAgICAgIHBhZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBzb3J0aW5nXG4gICAgICAgIHBhZ2UuZGF0YVRhYmxlLnNvcnRpbmcuY2hlY2tTb3J0aW5nKDE1MCwge1xuICAgICAgICAgICAgZ2V0OiBjcml0ZXJpYVtpbmRleF1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGlnZ2VyIHNvcnQgYmFzZWQgb24gYSBoYW5kbGVcbiAgICAgICAgaGFuZGxlLmNsaWNrKCk7XG4gICAgICAgIHBhZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBzb3J0aW5nXG4gICAgICAgIHBhZ2UuZGF0YVRhYmxlLnNvcnRpbmcuY2hlY2tTb3J0aW5nKDE1MCwge1xuICAgICAgICAgICAgZ2V0ICAgICAgIDogY3JpdGVyaWFbaW5kZXhdLFxuICAgICAgICAgICAgZGVzY2VuZGluZzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZURlZmluaXRpb25Ib3N0ZWQgZXh0ZW5kcyBQYWdlPFRlc3REYXRhVGFibGVIb3N0Q29tcG9uZW50PiB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZml4dHVyZTogQ29tcG9uZW50Rml4dHVyZTxUZXN0RGF0YVRhYmxlSG9zdENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoZml4dHVyZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhVGFibGUoKTogRGF0YVRhYmxlRGVmaW5pdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlRGVmaW5pdGlvbih0aGlzLmRlYnVnRWxlbWVudC5xdWVyeShCeS5kaXJlY3RpdmUoRGF0YVRhYmxlQ29tcG9uZW50KSksIHRoaXMpO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPHJpc2stZGF0YS10YWJsZSBbZGF0YV09XCJkYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZm9vdGVyXT1cImZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdE9yZGVyaW5nXT1cImRlZmF1bHRPcmRlcmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0cmlwZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4gdGl0bGU9XCJUZXN0IENvbHVtbiAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0aW5nS2V5XT1cInZhbHVlR2V0dGVyXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yZWNvcmQ9XCJyb3dcIiByaXNrLWRhdGEtdGFibGUtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAge3tyZWNvcmQudmFsdWUxfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHJpc2stZGF0YS10YWJsZS1jZWxsIGxldC1yZWNvcmQ9XCJyb3dcIiBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWRldGFpbC1leHBhbmRlciBbZXhwYW5kZWRdPVwiZXhwYW5kZWRcIj48L3Jpc2stZGF0YS10YWJsZS1kZXRhaWwtZXhwYW5kZXI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcmlzay1kYXRhLXRhYmxlLWZvb3Rlci1jZWxsIGxldC1mb290ZXI9XCJmb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3tmb290ZXIudmFsdWUxfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPCEtLSBTdWIgZGV0YWlsIC0tPlxuICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1kZXRhaWwtcm93PlxuICAgICAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWNvbHVtbiB0aXRsZT1cIlRlc3QgRGV0YWlsIENvbHVtbiAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRpbmdLZXldPVwidmFsdWVHZXR0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSByaXNrLWRhdGEtdGFibGUtY2VsbCBsZXQtcmVjb3JkPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyZWNvcmQudmFsdWUxfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+XG4gICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uIHRpdGxlPVwiVGVzdCBEZXRhaWwgQ29sdW1uIDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSByaXNrLWRhdGEtdGFibGUtY2VsbCBsZXQtcmVjb3JkPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyZWNvcmQudmFsdWUyfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4gdGl0bGU9XCJUZXN0IERldGFpbCBDb2x1bW4gM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHJpc2stZGF0YS10YWJsZS1jZWxsIGxldC1yZWNvcmQ9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3JlY29yZC52YWx1ZTN9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbi1ncm91cD5cbiAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWNvbHVtbi1ncm91cD48L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+XG4gICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1kZXRhaWwtcm93PlxuICAgICAgICA8L3Jpc2stZGF0YS10YWJsZT5gXG59KVxuZXhwb3J0IGNsYXNzIFRlc3REYXRhVGFibGVIb3N0Q29tcG9uZW50IHtcblxuICAgIHB1YmxpYyBkYXRhOiBhbnlbXTtcblxuICAgIHB1YmxpYyBmb290ZXI6IGFueTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTAwOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTE6IE1hdGguZmxvb3Ioc2VjdXJlUmFuZG9tKCkgKiAyMCkgKyAnIC0gdmFsdWUgMScsXG4gICAgICAgICAgICAgICAgdmFsdWUyOiBNYXRoLmZsb29yKHNlY3VyZVJhbmRvbSgpICogMjApICsgJyAtIHZhbHVlIDInLFxuICAgICAgICAgICAgICAgIHZhbHVlMzogTWF0aC5mbG9vcihzZWN1cmVSYW5kb20oKSAqIDIwKSArICcgLSB2YWx1ZSAzJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb290ZXIgPSB0aGlzLmRhdGFbMF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZWZhdWx0T3JkZXJpbmcoKTogQXJyYXk8T3JkZXJpbmdDcml0ZXJpYTxhbnk+IHwgVmFsdWVHZXR0ZXI8YW55Pj4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdldCAgICAgICA6IChyZWNvcmQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkLnZhbHVlMztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlc2NlbmRpbmc6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAocmVjb3JkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkLnZhbHVlMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbHVlR2V0dGVyKCk6IChyZWNvcmQ6IGFueSkgPT4gYW55IHtcbiAgICAgICAgcmV0dXJuIChyZWNvcmQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlY29yZC52YWx1ZTE7XG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
|