@myrmidon/paged-data-browsers 2.0.5 → 4.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 +13 -0
- package/fesm2022/myrmidon-paged-data-browsers.mjs +187 -212
- package/fesm2022/myrmidon-paged-data-browsers.mjs.map +1 -1
- package/lib/components/browser-tree-node/browser-tree-node.component.d.ts +15 -16
- package/lib/components/compact-pager/compact-pager.component.d.ts +6 -5
- package/lib/components/range-view/range-view.component.d.ts +7 -9
- package/lib/services/paged-list.store.d.ts +1 -1
- package/lib/services/paged-tree.store.d.ts +13 -8
- package/package.json +7 -9
- package/public-api.d.ts +0 -1
- package/esm2022/lib/components/browser-tree-node/browser-tree-node.component.mjs +0 -88
- package/esm2022/lib/components/compact-pager/compact-pager.component.mjs +0 -47
- package/esm2022/lib/components/range-view/range-view.component.mjs +0 -35
- package/esm2022/lib/paged-data-browsers.module.mjs +0 -92
- package/esm2022/lib/services/lru-cache.mjs +0 -119
- package/esm2022/lib/services/paged-list.store.mjs +0 -172
- package/esm2022/lib/services/paged-tree.store.mjs +0 -419
- package/esm2022/myrmidon-paged-data-browsers.mjs +0 -5
- package/esm2022/public-api.mjs +0 -11
- package/lib/paged-data-browsers.module.d.ts +0 -23
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
import { BehaviorSubject, forkJoin, of, tap } from 'rxjs';
|
|
2
|
-
import { LRUCache } from './lru-cache';
|
|
3
|
-
import { DEFAULT_PAGED_LIST_STORE_OPTIONS } from './paged-list.store';
|
|
4
|
-
/**
|
|
5
|
-
* A store for the node browser component. This store is used to keep a
|
|
6
|
-
* list of nodes, and to load them from the API. It also keeps the root
|
|
7
|
-
* node. Every tree node in the list is extended with page number,
|
|
8
|
-
* page count and total items, plus expansion-related metadata.
|
|
9
|
-
* The store keeps a flat list of these tree nodes, allowing users to
|
|
10
|
-
* expand and collapse them.
|
|
11
|
-
* F is the type of the filter object, E is the type of the paged tree nodes.
|
|
12
|
-
*/
|
|
13
|
-
export class PagedTreeStore {
|
|
14
|
-
/**
|
|
15
|
-
* The size of nodes pages in this store. If you change it, the store
|
|
16
|
-
* is reset. The default value is 20.
|
|
17
|
-
*/
|
|
18
|
-
get pageSize() {
|
|
19
|
-
return this._pageSize;
|
|
20
|
-
}
|
|
21
|
-
set pageSize(value) {
|
|
22
|
-
if (this._pageSize === value) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
this._pageSize = value;
|
|
26
|
-
this.reset();
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Create an instance of the store.
|
|
30
|
-
* @param _service The service used to load nodes.
|
|
31
|
-
* @param options The options to configure this store.
|
|
32
|
-
*/
|
|
33
|
-
constructor(_service, options = DEFAULT_PAGED_LIST_STORE_OPTIONS) {
|
|
34
|
-
this._service = _service;
|
|
35
|
-
this._pageSize = options.pageSize;
|
|
36
|
-
this._cache = new LRUCache(options.cacheSize);
|
|
37
|
-
this._customCacheKeyBuilder = options.buildCacheKey;
|
|
38
|
-
this._nodes$ = new BehaviorSubject([]);
|
|
39
|
-
this.nodes$ = this._nodes$.asObservable();
|
|
40
|
-
this._filter$ = new BehaviorSubject({});
|
|
41
|
-
this.filter$ = this._filter$.asObservable();
|
|
42
|
-
this._dirty = true;
|
|
43
|
-
this._hasMockRoot = options.hasMockRoot || false;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Gets the global filter, eventually overridden with values
|
|
47
|
-
* from the specified node's filter.
|
|
48
|
-
* @param node The optional node.
|
|
49
|
-
* @returns The filter.
|
|
50
|
-
*/
|
|
51
|
-
getFilter(node) {
|
|
52
|
-
return node?.filter
|
|
53
|
-
? {
|
|
54
|
-
...this._filter$.value,
|
|
55
|
-
...node.filter,
|
|
56
|
-
}
|
|
57
|
-
: this._filter$.value;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Checks if this store is empty.
|
|
61
|
-
* @returns True if this store is empty.
|
|
62
|
-
*/
|
|
63
|
-
isEmpty() {
|
|
64
|
-
return this._nodes$.value.length === 0;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Gets all the nodes in the store.
|
|
68
|
-
* @returns The nodes.
|
|
69
|
-
*/
|
|
70
|
-
getNodes() {
|
|
71
|
-
return this._nodes$.value;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Get the root node of the tree.
|
|
75
|
-
* @returns The root node of the tree or undefined if empty.
|
|
76
|
-
*/
|
|
77
|
-
getRootNode() {
|
|
78
|
-
return this._nodes$.value[0];
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Build the cache key for the given page number and filter.
|
|
82
|
-
* The default implementation just returns a stringified object
|
|
83
|
-
* containing the page number and the filter. You may override
|
|
84
|
-
* this method to provide a custom cache key.
|
|
85
|
-
* @param pageNumber The page number.
|
|
86
|
-
* @param filter The filter.
|
|
87
|
-
* @returns A string to be used as cache key.
|
|
88
|
-
*/
|
|
89
|
-
buildCacheKey(pageNumber, filter) {
|
|
90
|
-
if (this._customCacheKeyBuilder) {
|
|
91
|
-
return this._customCacheKeyBuilder(pageNumber, filter);
|
|
92
|
-
}
|
|
93
|
-
return JSON.stringify({ pageNumber, ...filter });
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Get the specified page of nodes, either from cache or from the server.
|
|
97
|
-
* When the page is retrieved from the server, it is stored in cache.
|
|
98
|
-
* @param filter The filter to apply.
|
|
99
|
-
* @param pageNumber The page number to get.
|
|
100
|
-
* @returns Observable of the page of nodes.
|
|
101
|
-
*/
|
|
102
|
-
getPageFromCacheOrServer(filter, pageNumber) {
|
|
103
|
-
const key = this.buildCacheKey(pageNumber, filter);
|
|
104
|
-
const pageInCache = this._cache.get(key);
|
|
105
|
-
if (pageInCache) {
|
|
106
|
-
return of(pageInCache);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
return this._service
|
|
110
|
-
.getNodes(filter, pageNumber, this._pageSize, this._hasMockRoot)
|
|
111
|
-
.pipe(tap((page) => {
|
|
112
|
-
this._cache.put(key, page, 0);
|
|
113
|
-
}));
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Create paged tree nodes from a page of tree nodes, by providing further
|
|
118
|
-
* metadata like page number, page count and total items.
|
|
119
|
-
* @param page The page to create nodes from.
|
|
120
|
-
* @returns Paged nodes.
|
|
121
|
-
*/
|
|
122
|
-
createPageNodes(page) {
|
|
123
|
-
return page.items.map((n) => {
|
|
124
|
-
return {
|
|
125
|
-
...n,
|
|
126
|
-
hasChildren: n.hasChildren,
|
|
127
|
-
paging: {
|
|
128
|
-
pageNumber: page.pageNumber,
|
|
129
|
-
pageCount: page.pageCount,
|
|
130
|
-
total: page.total,
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Sets the filter for this store. Whenever the filter is set,
|
|
137
|
-
* the store is reset.
|
|
138
|
-
* @param filter The filter.
|
|
139
|
-
* @returns true if tree was changed, false otherwise.
|
|
140
|
-
*/
|
|
141
|
-
setFilter(filter) {
|
|
142
|
-
if (this._filter$.value === filter) {
|
|
143
|
-
return Promise.resolve(false);
|
|
144
|
-
}
|
|
145
|
-
this._filter$.next(filter);
|
|
146
|
-
this._dirty = true;
|
|
147
|
-
return this.reset();
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Reset the store, loading the root nodes and their children.
|
|
151
|
-
* @returns true if tree was changed, false otherwise.
|
|
152
|
-
*/
|
|
153
|
-
reset() {
|
|
154
|
-
if (!this._dirty) {
|
|
155
|
-
return Promise.resolve(false);
|
|
156
|
-
}
|
|
157
|
-
this._cache.clear();
|
|
158
|
-
const filter = this._filter$.value;
|
|
159
|
-
return new Promise((resolve, reject) => {
|
|
160
|
-
this._service
|
|
161
|
-
.getNodes({
|
|
162
|
-
...filter,
|
|
163
|
-
parentId: undefined,
|
|
164
|
-
}, 1, this._pageSize, this._hasMockRoot)
|
|
165
|
-
.subscribe({
|
|
166
|
-
next: (page) => {
|
|
167
|
-
this._nodes$.next(this.createPageNodes(page));
|
|
168
|
-
// get the children of each node thus calculating their hasChildren property
|
|
169
|
-
const childrenObservables = this._nodes$.value.map((node) => this.getPageFromCacheOrServer({ ...filter, parentId: node.id }, 1));
|
|
170
|
-
forkJoin(childrenObservables).subscribe((childrenPages) => {
|
|
171
|
-
childrenPages.forEach((page, i) => {
|
|
172
|
-
this._nodes$.value[i].hasChildren = page.total > 0;
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
this._dirty = false;
|
|
176
|
-
resolve(true);
|
|
177
|
-
},
|
|
178
|
-
error: (error) => {
|
|
179
|
-
reject(error);
|
|
180
|
-
},
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Set the node filter for the node with the specified ID.
|
|
186
|
-
* @param id The node ID.
|
|
187
|
-
* @param filter The filter to set.
|
|
188
|
-
* @returns Promise with true if filter was set, false otherwise.
|
|
189
|
-
*/
|
|
190
|
-
setNodeFilter(id, filter) {
|
|
191
|
-
if (!id) {
|
|
192
|
-
return Promise.resolve(false);
|
|
193
|
-
}
|
|
194
|
-
return new Promise((resolve, reject) => {
|
|
195
|
-
const node = this._nodes$.value.find((n) => n.id === id);
|
|
196
|
-
if (!node) {
|
|
197
|
-
reject(`Node ID ${id} not found in store`);
|
|
198
|
-
}
|
|
199
|
-
node.filter = filter || undefined;
|
|
200
|
-
return this.changePage(id, 1);
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Expand the node with the specified ID. If the node is not expandable,
|
|
205
|
-
* or it is already expanded, this method does nothing.
|
|
206
|
-
* @param node The ID of the node to expand.
|
|
207
|
-
* @returns Promise with true if the node was expanded, false otherwise.
|
|
208
|
-
*/
|
|
209
|
-
expand(id) {
|
|
210
|
-
if (!id) {
|
|
211
|
-
return Promise.resolve(false);
|
|
212
|
-
}
|
|
213
|
-
return new Promise((resolve, reject) => {
|
|
214
|
-
const node = this._nodes$.value.find((n) => n.id === id);
|
|
215
|
-
if (!node || node.hasChildren === false || node.expanded) {
|
|
216
|
-
resolve(false);
|
|
217
|
-
}
|
|
218
|
-
this.getPageFromCacheOrServer({ ...this.getFilter(node), parentId: id }, 1).subscribe((page) => {
|
|
219
|
-
// no children, set hasChildren to false
|
|
220
|
-
if (!page.total) {
|
|
221
|
-
node.hasChildren = false;
|
|
222
|
-
resolve(false);
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
this._dirty = true;
|
|
226
|
-
// insert page nodes after the current node
|
|
227
|
-
const nodes = this._nodes$.value;
|
|
228
|
-
const index = nodes.indexOf(node);
|
|
229
|
-
if (index === -1) {
|
|
230
|
-
reject(`Node ID ${id} not found in store`);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
const pageNodes = this.createPageNodes(page);
|
|
234
|
-
nodes.splice(index + 1, 0, ...pageNodes);
|
|
235
|
-
this._nodes$.next(nodes);
|
|
236
|
-
node.hasChildren = true;
|
|
237
|
-
node.expanded = true;
|
|
238
|
-
resolve(true);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Expand all the descendants of the node with the specified ID.
|
|
246
|
-
*
|
|
247
|
-
* @param id The ID of the node to expand.
|
|
248
|
-
* @returns Promise.
|
|
249
|
-
*/
|
|
250
|
-
expandAll(id) {
|
|
251
|
-
if (!id) {
|
|
252
|
-
return Promise.resolve(false);
|
|
253
|
-
}
|
|
254
|
-
// get the parent node to start from
|
|
255
|
-
const nodes = this._nodes$.value;
|
|
256
|
-
const nodeIndex = nodes.findIndex((n) => n.id === id);
|
|
257
|
-
if (nodeIndex === -1) {
|
|
258
|
-
return Promise.resolve(false);
|
|
259
|
-
}
|
|
260
|
-
// collect all the descendant nodes IDs
|
|
261
|
-
let i = nodeIndex + 1;
|
|
262
|
-
while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {
|
|
263
|
-
i++;
|
|
264
|
-
}
|
|
265
|
-
const nodesToExpand = nodes.slice(nodeIndex, i).map((n) => n.id);
|
|
266
|
-
// expand all the descendant nodes
|
|
267
|
-
return new Promise((resolve, reject) => {
|
|
268
|
-
nodesToExpand.forEach((id) => {
|
|
269
|
-
this.expand(id);
|
|
270
|
-
this.expandAll(id);
|
|
271
|
-
});
|
|
272
|
-
resolve(true);
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
getChildren(id) {
|
|
276
|
-
const node = this._nodes$.value.find((n) => n.id === id);
|
|
277
|
-
if (!node || node.hasChildren === false) {
|
|
278
|
-
return [];
|
|
279
|
-
}
|
|
280
|
-
const nodes = this._nodes$.value;
|
|
281
|
-
const index = nodes.indexOf(node);
|
|
282
|
-
if (index === -1) {
|
|
283
|
-
return [];
|
|
284
|
-
}
|
|
285
|
-
const children = [];
|
|
286
|
-
let i = index + 1;
|
|
287
|
-
while (i < nodes.length && nodes[i].y > node.y) {
|
|
288
|
-
children.push(nodes[i]);
|
|
289
|
-
i++;
|
|
290
|
-
}
|
|
291
|
-
return children;
|
|
292
|
-
}
|
|
293
|
-
removeDescendants(nodes, nodeIndex) {
|
|
294
|
-
let i = nodeIndex + 1;
|
|
295
|
-
while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {
|
|
296
|
-
i++;
|
|
297
|
-
}
|
|
298
|
-
nodes.splice(nodeIndex + 1, i - nodeIndex - 1);
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Collapse the node with the specified ID. If the node is not expandable,
|
|
302
|
-
* or it is already collapsed, this method does nothing.
|
|
303
|
-
* @param node The node to collapse.
|
|
304
|
-
* @returns Promise with true if the node was collapsed, false otherwise.
|
|
305
|
-
*/
|
|
306
|
-
collapse(id) {
|
|
307
|
-
if (!id) {
|
|
308
|
-
return Promise.resolve(false);
|
|
309
|
-
}
|
|
310
|
-
return new Promise((resolve, reject) => {
|
|
311
|
-
const node = this._nodes$.value.find((n) => n.id === id);
|
|
312
|
-
if (!node || node.hasChildren === false || !node.expanded) {
|
|
313
|
-
resolve(false);
|
|
314
|
-
}
|
|
315
|
-
// remove all the descendant nodes after the current node
|
|
316
|
-
const nodes = this._nodes$.value;
|
|
317
|
-
const nodeIndex = nodes.indexOf(node);
|
|
318
|
-
if (nodeIndex === -1) {
|
|
319
|
-
reject(`Node ID ${id} not found in store`);
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
this._dirty = true;
|
|
323
|
-
this.removeDescendants(nodes, nodeIndex);
|
|
324
|
-
this._nodes$.next(nodes);
|
|
325
|
-
node.expanded = false;
|
|
326
|
-
resolve(true);
|
|
327
|
-
}
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* Change the page including the node with the specified ID.
|
|
332
|
-
* @param parentId The ID of the parent node whose children are inside the page
|
|
333
|
-
* you want to change.
|
|
334
|
-
* @param pageNumber The new page number.
|
|
335
|
-
* @returns Promise with true if the page was changed, false otherwise.
|
|
336
|
-
*/
|
|
337
|
-
changePage(parentId, pageNumber) {
|
|
338
|
-
return new Promise((resolve, reject) => {
|
|
339
|
-
// get the parent node
|
|
340
|
-
const parentNode = this._nodes$.value.find((n) => n.id === parentId);
|
|
341
|
-
if (!parentNode) {
|
|
342
|
-
resolve(false);
|
|
343
|
-
}
|
|
344
|
-
// get the page
|
|
345
|
-
this.getPageFromCacheOrServer({ ...this.getFilter(parentNode), parentId }, pageNumber).subscribe((page) => {
|
|
346
|
-
// if page is empty do nothing
|
|
347
|
-
if (!page.total) {
|
|
348
|
-
resolve(false);
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
this._dirty = true;
|
|
352
|
-
// remove all the nodes in the same page of node
|
|
353
|
-
// with all their descendants
|
|
354
|
-
const nodes = this._nodes$.value;
|
|
355
|
-
const nodeIndex = nodes.indexOf(parentNode) + 1;
|
|
356
|
-
const pageNodes = this.createPageNodes(page);
|
|
357
|
-
// find the first node of the node's page
|
|
358
|
-
let start = nodeIndex;
|
|
359
|
-
const oldPageNr = nodes[start].paging.pageNumber;
|
|
360
|
-
while (start > 0 &&
|
|
361
|
-
nodes[start - 1].parentId === parentId &&
|
|
362
|
-
nodes[start - 1].paging.pageNumber === oldPageNr) {
|
|
363
|
-
start--;
|
|
364
|
-
}
|
|
365
|
-
// find the last node of the node's page,
|
|
366
|
-
// including all their descendants
|
|
367
|
-
let end = start;
|
|
368
|
-
const y = nodes[start].y;
|
|
369
|
-
while (end < nodes.length && nodes[end].y >= y) {
|
|
370
|
-
end++;
|
|
371
|
-
}
|
|
372
|
-
// replace all these nodes with the new ones
|
|
373
|
-
nodes.splice(start, end - start);
|
|
374
|
-
nodes.splice(start, 0, ...pageNodes);
|
|
375
|
-
// update the parent node paging info
|
|
376
|
-
parentNode.paging.pageNumber = page.pageNumber;
|
|
377
|
-
this._nodes$.next(nodes);
|
|
378
|
-
resolve(true);
|
|
379
|
-
}
|
|
380
|
-
});
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Collapse all the nodes in the store.
|
|
385
|
-
*/
|
|
386
|
-
collapseAll() {
|
|
387
|
-
if (this.isEmpty()) {
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
// collapse the first node
|
|
391
|
-
const root = this._nodes$.value[0];
|
|
392
|
-
this.collapse(root.id);
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Clear the store. The cache is cleared and the nodes are removed.
|
|
396
|
-
*/
|
|
397
|
-
clear() {
|
|
398
|
-
this._cache.clear();
|
|
399
|
-
this._nodes$.next([]);
|
|
400
|
-
this._dirty = true;
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Clear the cache.
|
|
404
|
-
*/
|
|
405
|
-
clearCache() {
|
|
406
|
-
this._cache.clear();
|
|
407
|
-
}
|
|
408
|
-
/**
|
|
409
|
-
* Check if the page with the given number and filter is in cache.
|
|
410
|
-
* @param pageNumber The page number.
|
|
411
|
-
* @param filter The filter.
|
|
412
|
-
* @returns True if the page is in cache, false otherwise.
|
|
413
|
-
*/
|
|
414
|
-
hasCachedPage(pageNumber, filter) {
|
|
415
|
-
const key = this.buildCacheKey(pageNumber, filter);
|
|
416
|
-
return this._cache.has(key);
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtdHJlZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQTZGdEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQTRCekI7OztPQUdHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQ1UsUUFBa0MsRUFDMUMsVUFBaUMsZ0NBQWdDO1FBRHpELGFBQVEsR0FBUixRQUFRLENBQTBCO1FBRzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFxQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBTSxF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TSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLFVBQWtCLEVBQUUsTUFBUztRQUNoRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIG9mLCB0YXAgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IERhdGFQYWdlIH0gZnJvbSAnQG15cm1pZG9uL25nLXRvb2xzJztcclxuXHJcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi9scnUtY2FjaGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX1BBR0VEX0xJU1RfU1RPUkVfT1BUSU9OUyB9IGZyb20gJy4vcGFnZWQtbGlzdC5zdG9yZSc7XHJcblxyXG4vKipcclxuICogQSB0cmVlIG5vZGUuIFlvdXIgZGF0YSBzZXJ2aWNlIHNob3VsZCByZXR1cm4gYSBsaXN0IG9mIHRoZXNlIG5vZGVzXHJcbiAqIG9yIG9mIGFueSB0eXBlIGV4dGVuZGluZyB0aGlzIGludGVyZmFjZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJlZU5vZGUge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgcGFyZW50SWQ/OiBudW1iZXI7XHJcbiAgeTogbnVtYmVyO1xyXG4gIHg6IG51bWJlcjtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHRhZz86IHN0cmluZztcclxuICBoYXNDaGlsZHJlbj86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGZpbHRlciBmb3IgdHJlZSBub2Rlcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJlZU5vZGVGaWx0ZXIge1xyXG4gIHRhZ3M/OiBzdHJpbmdbXTtcclxuICBwYXJlbnRJZD86IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBhZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBwYWdlZCB0cmVlIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luZ0luZm8ge1xyXG4gIHBhZ2VOdW1iZXI6IG51bWJlcjtcclxuICBwYWdlQ291bnQ6IG51bWJlcjtcclxuICB0b3RhbDogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogQSB0cmVlIG5vZGUgd2l0aCBwYWdpbmcgaW5mb3JtYXRpb24sIHVzZWQgaW4gTm9kZUJyb3dzZXJTdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRUcmVlTm9kZTxGIGV4dGVuZHMgVHJlZU5vZGVGaWx0ZXI+IGV4dGVuZHMgVHJlZU5vZGUge1xyXG4gIHBhZ2luZzogUGFnaW5nSW5mbztcclxuICBleHBhbmRlZD86IGJvb2xlYW47XHJcbiAgZmlsdGVyPzogRjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBpbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHNlcnZpY2UgdXNlZCBieSBOb2RlQnJvd3NlclN0b3JlXHJcbiAqIHRvIGxvYWQgbm9kZXMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZVN0b3JlU2VydmljZTxGIGV4dGVuZHMgVHJlZU5vZGVGaWx0ZXI+IHtcclxuICAvKipcclxuICAgKiBHZXQgdGhlIHNwZWNpZmllZCBwYWdlIG9mIG5vZGVzLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VTaXplIFRoZSBwYWdlIHNpemUuXHJcbiAgICogQHBhcmFtIGhhc01vY2tSb290IElmIHRydWUsIHRoZSByb290IG5vZGUgaXMgYSBtb2NrIG5vZGUgcHJvdmlkZWQgYnkgeW91clxyXG4gICAqIHNlcnZpY2UsIHdoaWNoIGltcGxpZXMgdGhhdCBpdHMgWSB2YWx1ZSBpcyAwIHJhdGhlciB0aGFuIDEuIERlZmF1bHQgaXNcclxuICAgKiBmYWxzZSwgbWVhbmluZyB0aGF0IHlvdXIgc2VydmljZSB3aWxsIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUgd2l0aCBZXHJcbiAgICogdmFsdWUgMS5cclxuICAgKi9cclxuICBnZXROb2RlcyhcclxuICAgIGZpbHRlcjogRixcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIHBhZ2VTaXplOiBudW1iZXIsXHJcbiAgICBoYXNNb2NrUm9vdD86IGJvb2xlYW5cclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPFRyZWVOb2RlPj47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciB0aGUgTm9kZUJyb3dzZXJTdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRUcmVlU3RvcmVPcHRpb25zIHtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUgZm9yIHBhZ2VzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBjYWNoZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBBIGN1c3RvbSBmdW5jdGlvbiBmb3IgYnVpbGRpbmcgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyXHJcbiAgICogYW5kIGZpbHRlci5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIGJ1aWxkQ2FjaGVLZXk/OiAocGFnZU51bWJlcjogbnVtYmVyLCBmaWx0ZXI6IGFueSkgPT4gc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIElmIHRydWUsIHRoZSByb290IG5vZGUgaXMgYSBtb2NrIG5vZGUgcHJvdmlkZWQgYnkgeW91ciBzZXJ2aWNlLCB3aGljaFxyXG4gICAqIGltcGxpZXMgdGhhdCBpdHMgWSB2YWx1ZSBpcyAwIHJhdGhlciB0aGFuIDEuIERlZmF1bHQgaXMgZmFsc2UsIG1lYW5pbmdcclxuICAgKiB0aGF0IHlvdXIgc2VydmljZSB3aWxsIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUgd2l0aCBZIHZhbHVlIDEuXHJcbiAgICovXHJcbiAgaGFzTW9ja1Jvb3Q/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQSBzdG9yZSBmb3IgdGhlIG5vZGUgYnJvd3NlciBjb21wb25lbnQuIFRoaXMgc3RvcmUgaXMgdXNlZCB0byBrZWVwIGFcclxuICogbGlzdCBvZiBub2RlcywgYW5kIHRvIGxvYWQgdGhlbSBmcm9tIHRoZSBBUEkuIEl0IGFsc28ga2VlcHMgdGhlIHJvb3RcclxuICogbm9kZS4gRXZlcnkgdHJlZSBub2RlIGluIHRoZSBsaXN0IGlzIGV4dGVuZGVkIHdpdGggcGFnZSBudW1iZXIsXHJcbiAqIHBhZ2UgY291bnQgYW5kIHRvdGFsIGl0ZW1zLCBwbHVzIGV4cGFuc2lvbi1yZWxhdGVkIG1ldGFkYXRhLlxyXG4gKiBUaGUgc3RvcmUga2VlcHMgYSBmbGF0IGxpc3Qgb2YgdGhlc2UgdHJlZSBub2RlcywgYWxsb3dpbmcgdXNlcnMgdG9cclxuICogZXhwYW5kIGFuZCBjb2xsYXBzZSB0aGVtLlxyXG4gKiBGIGlzIHRoZSB0eXBlIG9mIHRoZSBmaWx0ZXIgb2JqZWN0LCBFIGlzIHRoZSB0eXBlIG9mIHRoZSBwYWdlZCB0cmVlIG5vZGVzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBhZ2VkVHJlZVN0b3JlPFxyXG4gIEUgZXh0ZW5kcyBQYWdlZFRyZWVOb2RlPEY+LFxyXG4gIEYgZXh0ZW5kcyBUcmVlTm9kZUZpbHRlclxyXG4+IHtcclxuICBwcml2YXRlIF9ub2RlcyQ6IEJlaGF2aW9yU3ViamVjdDxFW10+O1xyXG4gIHByaXZhdGUgX2ZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxGPjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXN0b21DYWNoZUtleUJ1aWxkZXI/OiAoXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBmaWx0ZXI6IGFueVxyXG4gICkgPT4gc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhY2hlOiBMUlVDYWNoZTxEYXRhUGFnZTxUcmVlTm9kZT4+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc01vY2tSb290OiBib29sZWFuO1xyXG5cclxuICBwcml2YXRlIF9wYWdlU2l6ZTogbnVtYmVyO1xyXG4gIC8vIGRpcnR5IHN0YXRlOiB0aGlzIGlzIHJlc2V0IHdoZW4gdGhlIHN0b3JlIGlzIHJlc2V0LCBhbmQgc2V0IHRvIHRydWVcclxuICAvLyB3aGVuIHRoZSBzdG9yZSBpcyBjaGFuZ2VkXHJcbiAgcHJpdmF0ZSBfZGlydHk/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIHBhZ2VkIG5vZGVzIGluIHRoaXMgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIG5vZGVzJDogT2JzZXJ2YWJsZTxSZWFkb25seTxFW10+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGdsb2JhbCBmaWx0ZXIgZm9yIGFsbCB0aGUgbm9kZXMuXHJcbiAgICovXHJcbiAgcHVibGljIGZpbHRlciQ6IE9ic2VydmFibGU8UmVhZG9ubHk8Rj4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBub2RlcyBwYWdlcyBpbiB0aGlzIHN0b3JlLiBJZiB5b3UgY2hhbmdlIGl0LCB0aGUgc3RvcmVcclxuICAgKiBpcyByZXNldC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjAuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9wYWdlU2l6ZSA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGFnZVNpemUgPSB2YWx1ZTtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc3RvcmUuXHJcbiAgICogQHBhcmFtIF9zZXJ2aWNlIFRoZSBzZXJ2aWNlIHVzZWQgdG8gbG9hZCBub2Rlcy5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBjb25maWd1cmUgdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IFBhZ2VkVHJlZVN0b3JlU2VydmljZTxGPixcclxuICAgIG9wdGlvbnM6IFBhZ2VkVHJlZVN0b3JlT3B0aW9ucyA9IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IG9wdGlvbnMucGFnZVNpemU7XHJcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBMUlVDYWNoZTxEYXRhUGFnZTxUcmVlTm9kZT4+KG9wdGlvbnMuY2FjaGVTaXplKTtcclxuICAgIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlciA9IG9wdGlvbnMuYnVpbGRDYWNoZUtleTtcclxuICAgIHRoaXMuX25vZGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVtdPihbXSk7XHJcbiAgICB0aGlzLm5vZGVzJCA9IHRoaXMuX25vZGVzJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX2ZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEY+KHt9IGFzIEYpO1xyXG4gICAgdGhpcy5maWx0ZXIkID0gdGhpcy5fZmlsdGVyJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgIHRoaXMuX2hhc01vY2tSb290ID0gb3B0aW9ucy5oYXNNb2NrUm9vdCB8fCBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdsb2JhbCBmaWx0ZXIsIGV2ZW50dWFsbHkgb3ZlcnJpZGRlbiB3aXRoIHZhbHVlc1xyXG4gICAqIGZyb20gdGhlIHNwZWNpZmllZCBub2RlJ3MgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBvcHRpb25hbCBub2RlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBmaWx0ZXIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXIobm9kZT86IFBhZ2VkVHJlZU5vZGU8Rj4pOiBGIHtcclxuICAgIHJldHVybiBub2RlPy5maWx0ZXJcclxuICAgICAgPyB7XHJcbiAgICAgICAgICAuLi50aGlzLl9maWx0ZXIkLnZhbHVlLFxyXG4gICAgICAgICAgLi4ubm9kZS5maWx0ZXIsXHJcbiAgICAgICAgfVxyXG4gICAgICA6IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgdGhpcyBzdG9yZSBpcyBlbXB0eS5cclxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoaXMgc3RvcmUgaXMgZW1wdHkuXHJcbiAgICovXHJcbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9kZXMkLnZhbHVlLmxlbmd0aCA9PT0gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICogQHJldHVybnMgVGhlIG5vZGVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXROb2RlcygpOiBSZWFkb25seTxQYWdlZFRyZWVOb2RlPEY+W10+IHtcclxuICAgIHJldHVybiB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZS5cclxuICAgKiBAcmV0dXJucyBUaGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlIG9yIHVuZGVmaW5lZCBpZiBlbXB0eS5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Um9vdE5vZGUoKTogUGFnZWRUcmVlTm9kZTxGPiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9kZXMkLnZhbHVlWzBdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGQgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyIGFuZCBmaWx0ZXIuXHJcbiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIGEgc3RyaW5naWZpZWQgb2JqZWN0XHJcbiAgICogY29udGFpbmluZyB0aGUgcGFnZSBudW1iZXIgYW5kIHRoZSBmaWx0ZXIuIFlvdSBtYXkgb3ZlcnJpZGVcclxuICAgKiB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGEgY3VzdG9tIGNhY2hlIGtleS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBidWlsZENhY2hlS2V5KHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcihwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgcGFnZU51bWJlciwgLi4uZmlsdGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFnZSBvZiBub2RlcywgZWl0aGVyIGZyb20gY2FjaGUgb3IgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqIFdoZW4gdGhlIHBhZ2UgaXMgcmV0cmlldmVkIGZyb20gdGhlIHNlcnZlciwgaXQgaXMgc3RvcmVkIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBhcHBseS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIgdG8gZ2V0LlxyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHBhZ2Ugb2Ygbm9kZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICBmaWx0ZXI6IEYsXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXJcclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPFRyZWVOb2RlPj4ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZENhY2hlS2V5KHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICBjb25zdCBwYWdlSW5DYWNoZSA9IHRoaXMuX2NhY2hlLmdldChrZXkpO1xyXG5cclxuICAgIGlmIChwYWdlSW5DYWNoZSkge1xyXG4gICAgICByZXR1cm4gb2YocGFnZUluQ2FjaGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VcclxuICAgICAgICAuZ2V0Tm9kZXMoZmlsdGVyLCBwYWdlTnVtYmVyLCB0aGlzLl9wYWdlU2l6ZSwgdGhpcy5faGFzTW9ja1Jvb3QpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YXAoKHBhZ2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUucHV0KGtleSwgcGFnZSwgMCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgcGFnZWQgdHJlZSBub2RlcyBmcm9tIGEgcGFnZSBvZiB0cmVlIG5vZGVzLCBieSBwcm92aWRpbmcgZnVydGhlclxyXG4gICAqIG1ldGFkYXRhIGxpa2UgcGFnZSBudW1iZXIsIHBhZ2UgY291bnQgYW5kIHRvdGFsIGl0ZW1zLlxyXG4gICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIGNyZWF0ZSBub2RlcyBmcm9tLlxyXG4gICAqIEByZXR1cm5zIFBhZ2VkIG5vZGVzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlUGFnZU5vZGVzKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPik6IEVbXSB7XHJcbiAgICByZXR1cm4gcGFnZS5pdGVtcy5tYXAoKG4pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5uLFxyXG4gICAgICAgIGhhc0NoaWxkcmVuOiBuLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgcGFnZU51bWJlcjogcGFnZS5wYWdlTnVtYmVyLFxyXG4gICAgICAgICAgcGFnZUNvdW50OiBwYWdlLnBhZ2VDb3VudCxcclxuICAgICAgICAgIHRvdGFsOiBwYWdlLnRvdGFsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGlzIHN0b3JlLiBXaGVuZXZlciB0aGUgZmlsdGVyIGlzIHNldCxcclxuICAgKiB0aGUgc3RvcmUgaXMgcmVzZXQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHJlZSB3YXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIoZmlsdGVyOiBGKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyJC52YWx1ZSA9PT0gZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIHN0b3JlLCBsb2FkaW5nIHRoZSByb290IG5vZGVzIGFuZCB0aGVpciBjaGlsZHJlbi5cclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRyZWUgd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuX2RpcnR5KSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fc2VydmljZVxyXG4gICAgICAgIC5nZXROb2RlcyhcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLi4uZmlsdGVyLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLl9wYWdlU2l6ZSxcclxuICAgICAgICAgIHRoaXMuX2hhc01vY2tSb290XHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9ub2RlcyQubmV4dCh0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuIG9mIGVhY2ggbm9kZSB0aHVzIGNhbGN1bGF0aW5nIHRoZWlyIGhhc0NoaWxkcmVuIHByb3BlcnR5XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuT2JzZXJ2YWJsZXMgPSB0aGlzLl9ub2RlcyQudmFsdWUubWFwKChub2RlKSA9PlxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0UGFnZUZyb21DYWNoZU9yU2VydmVyKHsgLi4uZmlsdGVyLCBwYXJlbnRJZDogbm9kZS5pZCB9LCAxKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBmb3JrSm9pbihjaGlsZHJlbk9ic2VydmFibGVzKS5zdWJzY3JpYmUoKGNoaWxkcmVuUGFnZXMpID0+IHtcclxuICAgICAgICAgICAgICBjaGlsZHJlblBhZ2VzLmZvckVhY2goKHBhZ2UsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vZGVzJC52YWx1ZVtpXS5oYXNDaGlsZHJlbiA9IHBhZ2UudG90YWwgPiAwO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBub2RlIGZpbHRlciBmb3IgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqIEBwYXJhbSBpZCBUaGUgbm9kZSBJRC5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gc2V0LlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIGZpbHRlciB3YXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHNldE5vZGVGaWx0ZXIoaWQ6IG51bWJlciwgZmlsdGVyPzogRiB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUhLmZpbHRlciA9IGZpbHRlciB8fCB1bmRlZmluZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZVBhZ2UoaWQsIDEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELiBJZiB0aGUgbm9kZSBpcyBub3QgZXhwYW5kYWJsZSxcclxuICAgKiBvciBpdCBpcyBhbHJlYWR5IGV4cGFuZGVkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIElEIG9mIHRoZSBub2RlIHRvIGV4cGFuZC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgZXhwYW5kZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgZXhwYW5kKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8IG5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihub2RlKSwgcGFyZW50SWQ6IGlkIH0sXHJcbiAgICAgICAgMVxyXG4gICAgICApLnN1YnNjcmliZSgocGFnZSkgPT4ge1xyXG4gICAgICAgIC8vIG5vIGNoaWxkcmVuLCBzZXQgaGFzQ2hpbGRyZW4gdG8gZmFsc2VcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIG5vZGUhLmhhc0NoaWxkcmVuID0gZmFsc2U7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gaW5zZXJ0IHBhZ2Ugbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSEpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZWplY3QoYE5vZGUgSUQgJHtpZH0gbm90IGZvdW5kIGluIHN0b3JlYCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGluZGV4ICsgMSwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgICBub2RlIS5oYXNDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIG5vZGUhLmV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgYWxsIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBub2RlIHRvIGV4cGFuZC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBleHBhbmRBbGwoaWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFpZCkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vIGdldCB0aGUgcGFyZW50IG5vZGUgdG8gc3RhcnQgZnJvbVxyXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICBjb25zdCBub2RlSW5kZXggPSBub2Rlcy5maW5kSW5kZXgoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgIGlmIChub2RlSW5kZXggPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbGxlY3QgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzIElEc1xyXG4gICAgbGV0IGkgPSBub2RlSW5kZXggKyAxO1xyXG4gICAgd2hpbGUgKGkgPCBub2Rlcy5sZW5ndGggJiYgbm9kZXNbaV0ueSA+IG5vZGVzW25vZGVJbmRleF0ueSkge1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBjb25zdCBub2Rlc1RvRXhwYW5kID0gbm9kZXMuc2xpY2Uobm9kZUluZGV4LCBpKS5tYXAoKG4pID0+IG4uaWQpO1xyXG5cclxuICAgIC8vIGV4cGFuZCBhbGwgdGhlIGRlc2NlbmRhbnQgbm9kZXNcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIG5vZGVzVG9FeHBhbmQuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICB0aGlzLmV4cGFuZChpZCk7XHJcbiAgICAgICAgdGhpcy5leHBhbmRBbGwoaWQpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoaWxkcmVuKGlkOiBudW1iZXIpOiBFW10ge1xyXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5oYXNDaGlsZHJlbiA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICBjb25zdCBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSk7XHJcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNoaWxkcmVuOiBFW10gPSBbXTtcclxuICAgIGxldCBpID0gaW5kZXggKyAxO1xyXG4gICAgd2hpbGUgKGkgPCBub2Rlcy5sZW5ndGggJiYgbm9kZXNbaV0ueSA+IG5vZGUueSkge1xyXG4gICAgICBjaGlsZHJlbi5wdXNoKG5vZGVzW2ldKTtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVEZXNjZW5kYW50cyhcclxuICAgIG5vZGVzOiBQYWdlZFRyZWVOb2RlPEY+W10sXHJcbiAgICBub2RlSW5kZXg6IG51bWJlclxyXG4gICk6IHZvaWQge1xyXG4gICAgbGV0IGkgPSBub2RlSW5kZXggKyAxO1xyXG4gICAgd2hpbGUgKGkgPCBub2Rlcy5sZW5ndGggJiYgbm9kZXNbaV0ueSA+IG5vZGVzW25vZGVJbmRleF0ueSkge1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBub2Rlcy5zcGxpY2Uobm9kZUluZGV4ICsgMSwgaSAtIG5vZGVJbmRleCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGFwc2UgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELiBJZiB0aGUgbm9kZSBpcyBub3QgZXhwYW5kYWJsZSxcclxuICAgKiBvciBpdCBpcyBhbHJlYWR5IGNvbGxhcHNlZCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGNvbGxhcHNlLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIHRoZSBub2RlIHdhcyBjb2xsYXBzZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgY29sbGFwc2UoaWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFpZCkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgICBpZiAoIW5vZGUgfHwgbm9kZS5oYXNDaGlsZHJlbiA9PT0gZmFsc2UgfHwgIW5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyBhZnRlciB0aGUgY3VycmVudCBub2RlXHJcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgICBjb25zdCBub2RlSW5kZXggPSBub2Rlcy5pbmRleE9mKG5vZGUhKTtcclxuICAgICAgaWYgKG5vZGVJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICByZWplY3QoYE5vZGUgSUQgJHtpZH0gbm90IGZvdW5kIGluIHN0b3JlYCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRGVzY2VuZGFudHMobm9kZXMsIG5vZGVJbmRleCk7XHJcbiAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgIG5vZGUhLmV4cGFuZGVkID0gZmFsc2U7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGFuZ2UgdGhlIHBhZ2UgaW5jbHVkaW5nIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC5cclxuICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbm9kZSB3aG9zZSBjaGlsZHJlbiBhcmUgaW5zaWRlIHRoZSBwYWdlXHJcbiAgICogeW91IHdhbnQgdG8gY2hhbmdlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBuZXcgcGFnZSBudW1iZXIuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIHBhZ2Ugd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFnZShwYXJlbnRJZDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vIGdldCB0aGUgcGFyZW50IG5vZGVcclxuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBwYXJlbnRJZCk7XHJcbiAgICAgIGlmICghcGFyZW50Tm9kZSkge1xyXG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBnZXQgdGhlIHBhZ2VcclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihwYXJlbnROb2RlKSwgcGFyZW50SWQgfSxcclxuICAgICAgICBwYWdlTnVtYmVyXHJcbiAgICAgICkuc3Vic2NyaWJlKChwYWdlKSA9PiB7XHJcbiAgICAgICAgLy8gaWYgcGFnZSBpcyBlbXB0eSBkbyBub3RoaW5nXHJcbiAgICAgICAgaWYgKCFwYWdlLnRvdGFsKSB7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHNhbWUgcGFnZSBvZiBub2RlXHJcbiAgICAgICAgICAvLyB3aXRoIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2Rlcy5pbmRleE9mKHBhcmVudE5vZGUhKSArIDE7XHJcbiAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuXHJcbiAgICAgICAgICAvLyBmaW5kIHRoZSBmaXJzdCBub2RlIG9mIHRoZSBub2RlJ3MgcGFnZVxyXG4gICAgICAgICAgbGV0IHN0YXJ0ID0gbm9kZUluZGV4O1xyXG4gICAgICAgICAgY29uc3Qgb2xkUGFnZU5yID0gbm9kZXNbc3RhcnRdLnBhZ2luZy5wYWdlTnVtYmVyO1xyXG4gICAgICAgICAgd2hpbGUgKFxyXG4gICAgICAgICAgICBzdGFydCA+IDAgJiZcclxuICAgICAgICAgICAgbm9kZXNbc3RhcnQgLSAxXS5wYXJlbnRJZCA9PT0gcGFyZW50SWQgJiZcclxuICAgICAgICAgICAgbm9kZXNbc3RhcnQgLSAxXS5wYWdpbmcucGFnZU51bWJlciA9PT0gb2xkUGFnZU5yXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgc3RhcnQtLTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBmaW5kIHRoZSBsYXN0IG5vZGUgb2YgdGhlIG5vZGUncyBwYWdlLFxyXG4gICAgICAgICAgLy8gaW5jbHVkaW5nIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0O1xyXG4gICAgICAgICAgY29uc3QgeSA9IG5vZGVzW3N0YXJ0XS55O1xyXG4gICAgICAgICAgd2hpbGUgKGVuZCA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tlbmRdLnkgPj0geSkge1xyXG4gICAgICAgICAgICBlbmQrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIHRoZXNlIG5vZGVzIHdpdGggdGhlIG5ldyBvbmVzXHJcbiAgICAgICAgICBub2Rlcy5zcGxpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTtcclxuICAgICAgICAgIG5vZGVzLnNwbGljZShzdGFydCwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuXHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBhcmVudCBub2RlIHBhZ2luZyBpbmZvXHJcbiAgICAgICAgICBwYXJlbnROb2RlIS5wYWdpbmcucGFnZU51bWJlciA9IHBhZ2UucGFnZU51bWJlcjtcclxuICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGFwc2UgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlQWxsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIGNvbGxhcHNlIHRoZSBmaXJzdCBub2RlXHJcbiAgICBjb25zdCByb290ID0gdGhpcy5fbm9kZXMkLnZhbHVlWzBdO1xyXG4gICAgdGhpcy5jb2xsYXBzZShyb290LmlkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBzdG9yZS4gVGhlIGNhY2hlIGlzIGNsZWFyZWQgYW5kIHRoZSBub2RlcyBhcmUgcmVtb3ZlZC5cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xyXG4gICAgdGhpcy5fbm9kZXMkLm5leHQoW10pO1xyXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlciBhbmQgZmlsdGVyIGlzIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGFnZSBpcyBpbiBjYWNoZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNDYWNoZWRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5oYXMoa2V5KTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public-api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXlybWlkb24tcGFnZWQtZGF0YS1icm93c2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL215cm1pZG9uLXBhZ2VkLWRhdGEtYnJvd3NlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
package/esm2022/public-api.mjs
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of paged-data-browsers
|
|
3
|
-
*/
|
|
4
|
-
export * from './lib/components/compact-pager/compact-pager.component';
|
|
5
|
-
export * from './lib/components/range-view/range-view.component';
|
|
6
|
-
export * from './lib/components/browser-tree-node/browser-tree-node.component';
|
|
7
|
-
export * from './lib/services/paged-list.store';
|
|
8
|
-
export * from './lib/services/paged-tree.store';
|
|
9
|
-
export * from './lib/services/lru-cache';
|
|
10
|
-
export * from './lib/paged-data-browsers.module';
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsa0RBQWtELENBQUM7QUFDakUsY0FBYyxnRUFBZ0UsQ0FBQztBQUUvRSxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywwQkFBMEIsQ0FBQztBQUV6QyxjQUFjLGtDQUFrQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBwYWdlZC1kYXRhLWJyb3dzZXJzXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9jb21wYWN0LXBhZ2VyL2NvbXBhY3QtcGFnZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcmFuZ2Utdmlldy9yYW5nZS12aWV3LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2Jyb3dzZXItdHJlZS1ub2RlL2Jyb3dzZXItdHJlZS1ub2RlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3BhZ2VkLWxpc3Quc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvcGFnZWQtdHJlZS5zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9scnUtY2FjaGUnO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9wYWdlZC1kYXRhLWJyb3dzZXJzLm1vZHVsZSc7XG4iXX0=
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import * as i0 from "@angular/core";
|
|
2
|
-
import * as i1 from "./components/compact-pager/compact-pager.component";
|
|
3
|
-
import * as i2 from "./components/range-view/range-view.component";
|
|
4
|
-
import * as i3 from "./components/browser-tree-node/browser-tree-node.component";
|
|
5
|
-
import * as i4 from "@angular/common";
|
|
6
|
-
import * as i5 from "@angular/forms";
|
|
7
|
-
import * as i6 from "@angular/material/badge";
|
|
8
|
-
import * as i7 from "@angular/material/button";
|
|
9
|
-
import * as i8 from "@angular/material/chips";
|
|
10
|
-
import * as i9 from "@angular/material/dialog";
|
|
11
|
-
import * as i10 from "@angular/material/form-field";
|
|
12
|
-
import * as i11 from "@angular/material/icon";
|
|
13
|
-
import * as i12 from "@angular/material/input";
|
|
14
|
-
import * as i13 from "@angular/material/paginator";
|
|
15
|
-
import * as i14 from "@angular/material/progress-bar";
|
|
16
|
-
import * as i15 from "@angular/material/select";
|
|
17
|
-
import * as i16 from "@angular/material/tooltip";
|
|
18
|
-
import * as i17 from "@myrmidon/ng-tools";
|
|
19
|
-
export declare class PagedDataBrowsersModule {
|
|
20
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<PagedDataBrowsersModule, never>;
|
|
21
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<PagedDataBrowsersModule, [typeof i1.CompactPagerComponent, typeof i2.RangeViewComponent, typeof i3.BrowserTreeNodeComponent], [typeof i4.CommonModule, typeof i5.ReactiveFormsModule, typeof i6.MatBadgeModule, typeof i7.MatButtonModule, typeof i8.MatChipsModule, typeof i9.MatDialogModule, typeof i10.MatFormFieldModule, typeof i11.MatIconModule, typeof i12.MatInputModule, typeof i13.MatPaginatorModule, typeof i14.MatProgressBarModule, typeof i15.MatSelectModule, typeof i16.MatTooltipModule, typeof i17.NgToolsModule], [typeof i1.CompactPagerComponent, typeof i2.RangeViewComponent, typeof i3.BrowserTreeNodeComponent]>;
|
|
22
|
-
static ɵinj: i0.ɵɵInjectorDeclaration<PagedDataBrowsersModule>;
|
|
23
|
-
}
|