@fireflysemantics/slice 15.0.18 → 15.0.24
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 +1 -0
- package/esm2020/lib/AbstractStore.mjs +296 -0
- package/{esm2015/lib/EStore.js → esm2020/lib/EStore.mjs} +10 -10
- package/esm2020/lib/Slice.mjs +222 -0
- package/esm2020/lib/utilities.mjs +226 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
- package/fesm2015/{fireflysemantics-slice.js → fireflysemantics-slice.mjs} +35 -22
- package/fesm2015/fireflysemantics-slice.mjs.map +1 -0
- package/fesm2020/fireflysemantics-slice.mjs +1494 -0
- package/fesm2020/fireflysemantics-slice.mjs.map +1 -0
- package/lib/models/Predicate.d.ts +1 -1
- package/lib/models/scrollPosition.d.ts +1 -1
- package/lib/utilities.d.ts +12 -1
- package/package.json +22 -9
- package/bundles/fireflysemantics-slice.umd.js +0 -1891
- package/bundles/fireflysemantics-slice.umd.js.map +0 -1
- package/esm2015/lib/AbstractStore.js +0 -296
- package/esm2015/lib/Slice.js +0 -222
- package/esm2015/lib/utilities.js +0 -213
- package/fesm2015/fireflysemantics-slice.js.map +0 -1
- /package/{esm2015/fireflysemantics-slice.js → esm2020/fireflysemantics-slice.mjs} +0 -0
- /package/{esm2015/lib/OStore.js → esm2020/lib/OStore.mjs} +0 -0
- /package/{esm2015/lib/models/ActionTypes.js → esm2020/lib/models/ActionTypes.mjs} +0 -0
- /package/{esm2015/lib/models/Delta.js → esm2020/lib/models/Delta.mjs} +0 -0
- /package/{esm2015/lib/models/Entity.js → esm2020/lib/models/Entity.mjs} +0 -0
- /package/{esm2015/lib/models/Predicate.js → esm2020/lib/models/Predicate.mjs} +0 -0
- /package/{esm2015/lib/models/StoreConfig.js → esm2020/lib/models/StoreConfig.mjs} +0 -0
- /package/{esm2015/lib/models/constants.js → esm2020/lib/models/constants.mjs} +0 -0
- /package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
- /package/{esm2015/lib/models/scrollPosition.js → esm2020/lib/models/scrollPosition.mjs} +0 -0
- /package/{fireflysemantics-slice.d.ts → index.d.ts} +0 -0
package/README.md
CHANGED
@@ -50,6 +50,7 @@ npm i @fireflysemantics/slice tslib rxjs nanoid
|
|
50
50
|
- [Adding Slices to an Firefly Semantics Slice Entity Store](https://developer.fireflysemantics.com/tasks/tasks--slice--adding-slices-to-the-firefly-semantics-entity-store)
|
51
51
|
- [Adding Search To the Firefly Semantics Slice Angular Todo Application](https://developer.fireflysemantics.com/tasks/tasks--slice--adding-search-to-the-firefly-semantics-slice-angular-todo-application)
|
52
52
|
- [Comparing Firefly Semantics Slice Entities](https://developer.fireflysemantics.com/tasks/tasks--slice--comparing-firefly-semantics-slice-entities)
|
53
|
+
- [Filtering Firefly Semantics Slice Object Store Observables by Property Value](https://developer.fireflysemantics.com/tasks/tasks--slice--filtering-firefly-semantics-slice-object-store-observables-by-property-value)
|
53
54
|
|
54
55
|
|
55
56
|
## Youtube
|
@@ -0,0 +1,296 @@
|
|
1
|
+
import { ReplaySubject } from "rxjs";
|
2
|
+
import { map } from "rxjs/operators";
|
3
|
+
const { freeze } = Object;
|
4
|
+
const ESTORE_DEFAULT_ID_KEY = "id";
|
5
|
+
const ESTORE_DEFAULT_GID_KEY = "gid";
|
6
|
+
export const ESTORE_CONFIG_DEFAULT = freeze({
|
7
|
+
idKey: ESTORE_DEFAULT_ID_KEY,
|
8
|
+
guidKey: ESTORE_DEFAULT_GID_KEY
|
9
|
+
});
|
10
|
+
export class AbstractStore {
|
11
|
+
constructor(config) {
|
12
|
+
/**
|
13
|
+
* Notifies observers of the store query.
|
14
|
+
*/
|
15
|
+
this.notifyQuery = new ReplaySubject(1);
|
16
|
+
/**
|
17
|
+
* The current query state.
|
18
|
+
*/
|
19
|
+
this._query = '';
|
20
|
+
/**
|
21
|
+
* Primary index for the stores elements.
|
22
|
+
*/
|
23
|
+
this.entries = new Map();
|
24
|
+
/**
|
25
|
+
* The element entries that are keyed by
|
26
|
+
* an id generated on the server.
|
27
|
+
*/
|
28
|
+
this.idEntries = new Map();
|
29
|
+
/**
|
30
|
+
* Create notifications that broacast
|
31
|
+
* the entire set of entries.
|
32
|
+
*/
|
33
|
+
this.notify = new ReplaySubject(1);
|
34
|
+
/**
|
35
|
+
* Create notifications that broacast
|
36
|
+
* store or slice delta state changes.
|
37
|
+
*/
|
38
|
+
this.notifyDelta = new ReplaySubject(1);
|
39
|
+
/**
|
40
|
+
* An Observable<E[]> reference
|
41
|
+
* to the entities in the store or
|
42
|
+
* Slice instance.
|
43
|
+
*
|
44
|
+
*/
|
45
|
+
this.obs = this.observe();
|
46
|
+
this.config = config
|
47
|
+
? freeze({ ...ESTORE_CONFIG_DEFAULT, ...config })
|
48
|
+
: ESTORE_CONFIG_DEFAULT;
|
49
|
+
}
|
50
|
+
/**
|
51
|
+
* Sets the current query state and notifies observers.
|
52
|
+
*/
|
53
|
+
set query(query) {
|
54
|
+
this._query = query;
|
55
|
+
this.notifyQuery.next(this._query);
|
56
|
+
}
|
57
|
+
/**
|
58
|
+
* @return A snapshot of the query state.
|
59
|
+
*/
|
60
|
+
get query() {
|
61
|
+
return this._query;
|
62
|
+
}
|
63
|
+
/**
|
64
|
+
* Observe the query.
|
65
|
+
* @example
|
66
|
+
<pre>
|
67
|
+
let query$ = source.observeQuery();
|
68
|
+
</pre>
|
69
|
+
*/
|
70
|
+
observeQuery() {
|
71
|
+
return this.notifyQuery.asObservable();
|
72
|
+
}
|
73
|
+
/**
|
74
|
+
* The current id key for the EStore instance.
|
75
|
+
* @return this.config.idKey;
|
76
|
+
*/
|
77
|
+
get ID_KEY() {
|
78
|
+
return this.config.idKey;
|
79
|
+
}
|
80
|
+
/**
|
81
|
+
* The current guid key for the EStore instance.
|
82
|
+
* @return this.config.guidKey;
|
83
|
+
*/
|
84
|
+
get GUID_KEY() {
|
85
|
+
return this.config.guidKey;
|
86
|
+
}
|
87
|
+
/**
|
88
|
+
* Call all the notifiers at once.
|
89
|
+
*
|
90
|
+
* @param v
|
91
|
+
* @param delta
|
92
|
+
*/
|
93
|
+
notifyAll(v, delta) {
|
94
|
+
this.notify.next(v);
|
95
|
+
this.notifyDelta.next(delta);
|
96
|
+
}
|
97
|
+
/**
|
98
|
+
* Observe store state changes.
|
99
|
+
* @param sort Optional sorting function yielding a sorted observable.
|
100
|
+
* @example
|
101
|
+
```
|
102
|
+
let todos$ = source.observe();
|
103
|
+
//or with a sort by title function
|
104
|
+
let todos$ = source.observe((a, b)=>(a.title > b.title ? -1 : 1));
|
105
|
+
```
|
106
|
+
*/
|
107
|
+
observe(sort) {
|
108
|
+
if (sort) {
|
109
|
+
return this.notify.pipe(map((e) => e.sort(sort)));
|
110
|
+
}
|
111
|
+
return this.notify.asObservable();
|
112
|
+
}
|
113
|
+
/**
|
114
|
+
* Observe delta updates.
|
115
|
+
* @example
|
116
|
+
<pre>
|
117
|
+
let todos$ = source.observeDelta();
|
118
|
+
</pre>
|
119
|
+
*/
|
120
|
+
observeDelta() {
|
121
|
+
return this.notifyDelta.asObservable();
|
122
|
+
}
|
123
|
+
/**
|
124
|
+
* Check whether the store is empty.
|
125
|
+
*
|
126
|
+
* @return A hot {@link Observable} that indicates whether the store is empty.
|
127
|
+
*
|
128
|
+
* @example
|
129
|
+
<pre>
|
130
|
+
source.isEmpty();
|
131
|
+
</pre>
|
132
|
+
*/
|
133
|
+
isEmpty() {
|
134
|
+
return this.notify.pipe(map((entries) => entries.length == 0));
|
135
|
+
}
|
136
|
+
/**
|
137
|
+
* Check whether the store is empty.
|
138
|
+
*
|
139
|
+
* @return A snapshot that indicates whether the store is empty.
|
140
|
+
*
|
141
|
+
* @example
|
142
|
+
<pre>
|
143
|
+
source.isEmpty();
|
144
|
+
</pre>
|
145
|
+
*/
|
146
|
+
isEmptySnapshot() {
|
147
|
+
return Array.from(this.entries.values()).length == 0;
|
148
|
+
}
|
149
|
+
/**
|
150
|
+
* Returns the number of entries contained.
|
151
|
+
* @param p The predicate to apply in order to filter the count
|
152
|
+
*/
|
153
|
+
count(p) {
|
154
|
+
if (p) {
|
155
|
+
return this.notify.pipe(map((e) => e.reduce((total, e) => total + (p(e) ? 1 : 0), 0)));
|
156
|
+
}
|
157
|
+
return this.notify.pipe(map((entries) => entries.length));
|
158
|
+
}
|
159
|
+
/**
|
160
|
+
* Returns a snapshot of the number of entries contained in the store.
|
161
|
+
* @param p The predicate to apply in order to filter the count
|
162
|
+
*/
|
163
|
+
countSnapshot(p) {
|
164
|
+
if (p) {
|
165
|
+
return Array.from(this.entries.values()).filter(p).length;
|
166
|
+
}
|
167
|
+
return Array.from(this.entries.values()).length;
|
168
|
+
}
|
169
|
+
/**
|
170
|
+
* Snapshot of all entries.
|
171
|
+
*
|
172
|
+
* @return Snapshot array of all the elements the entities the store contains.
|
173
|
+
*
|
174
|
+
* @example Observe a snapshot of all the entities in the store.
|
175
|
+
```
|
176
|
+
let selectedTodos:Todo[] = source.allSnapshot();
|
177
|
+
```
|
178
|
+
*/
|
179
|
+
allSnapshot() {
|
180
|
+
return Array.from(this.entries.values());
|
181
|
+
}
|
182
|
+
/**
|
183
|
+
* Returns true if the entries contain the identified instance.
|
184
|
+
*
|
185
|
+
* @param target Either an instance of type `E` or a `guid` identifying the instance.
|
186
|
+
* @param byId Whether the lookup should be performed with the `id` key rather than the `guid`.
|
187
|
+
* @returns true if the instance identified by the guid exists, false otherwise.
|
188
|
+
*
|
189
|
+
* @example
|
190
|
+
<pre>
|
191
|
+
let contains:boolean = source.contains(guid);
|
192
|
+
</pre>
|
193
|
+
*/
|
194
|
+
contains(target) {
|
195
|
+
if (typeof target === "string") {
|
196
|
+
return this.entries.get(target) ? true : false;
|
197
|
+
}
|
198
|
+
const guid = target[this.config.guidKey];
|
199
|
+
return this.entries.get(guid) ? true : false;
|
200
|
+
}
|
201
|
+
/**
|
202
|
+
* Returns true if the entries contain the identified instance.
|
203
|
+
*
|
204
|
+
* @param target Either an instance of type `E` or a `id` identifying the instance.
|
205
|
+
* @returns true if the instance identified by the `id` exists, false otherwise.
|
206
|
+
*
|
207
|
+
* @example
|
208
|
+
<pre>
|
209
|
+
let contains:boolean = source.contains(guid);
|
210
|
+
</pre>
|
211
|
+
*/
|
212
|
+
containsById(target) {
|
213
|
+
if (typeof target === "string") {
|
214
|
+
return this.idEntries.get(target) ? true : false;
|
215
|
+
}
|
216
|
+
const id = target[this.config.idKey];
|
217
|
+
return this.idEntries.get(id) ? true : false;
|
218
|
+
}
|
219
|
+
/**
|
220
|
+
* Find and return the entity identified by the GUID parameter
|
221
|
+
* if it exists and return it.
|
222
|
+
*
|
223
|
+
* @param guid
|
224
|
+
* @return The entity instance if it exists, null otherwise
|
225
|
+
*/
|
226
|
+
findOne(guid) {
|
227
|
+
return this.entries.get(guid);
|
228
|
+
}
|
229
|
+
/**
|
230
|
+
* Find and return the entity identified by the ID parameter
|
231
|
+
* if it exists and return it.
|
232
|
+
*
|
233
|
+
* @param id
|
234
|
+
* @return The entity instance if it exists, null otherwise
|
235
|
+
*/
|
236
|
+
findOneByID(id) {
|
237
|
+
return this.idEntries.get(id);
|
238
|
+
}
|
239
|
+
/**
|
240
|
+
* Snapshot of the entries that match the predicate.
|
241
|
+
*
|
242
|
+
* @param p The predicate used to query for the selection.
|
243
|
+
* @return A snapshot array containing the entities that match the predicate.
|
244
|
+
*
|
245
|
+
* @example Select all the `Todo` instance where the `title` length is greater than 100.
|
246
|
+
```
|
247
|
+
let todos:Todo[]=store.select(todo=>todo.title.length>100);
|
248
|
+
```
|
249
|
+
*/
|
250
|
+
select(p) {
|
251
|
+
const selected = [];
|
252
|
+
Array.from(this.entries.values()).forEach(e => {
|
253
|
+
if (p(e)) {
|
254
|
+
selected.push(e);
|
255
|
+
}
|
256
|
+
});
|
257
|
+
return selected;
|
258
|
+
}
|
259
|
+
/**
|
260
|
+
* Compare entities by GUID
|
261
|
+
* @param e1 The first entity
|
262
|
+
* @param e2 The second entity
|
263
|
+
* @return true if the two entities have equal GUID ids
|
264
|
+
* @example Compare `todo1` with `todo2` by `gid`.
|
265
|
+
```
|
266
|
+
if (equalsByGUID(todo1, todo2)){...};
|
267
|
+
```
|
268
|
+
*/
|
269
|
+
equalsByGUID(e1, e2) {
|
270
|
+
return e1[this.GUID_KEY] == e2[this.GUID_KEY];
|
271
|
+
}
|
272
|
+
/**
|
273
|
+
* Compare entities by ID
|
274
|
+
* @param e1 The first entity
|
275
|
+
* @param e2 The second entity
|
276
|
+
* @return true if the two entities have equal ID ids
|
277
|
+
* @example Compare `todo1` with `todo2` by `id`.
|
278
|
+
```
|
279
|
+
if (equalsByID(todo1, todo2)){...};
|
280
|
+
```
|
281
|
+
*/
|
282
|
+
equalsByID(e1, e2) {
|
283
|
+
return e1[this.ID_KEY] == e2[this.ID_KEY];
|
284
|
+
}
|
285
|
+
/**
|
286
|
+
* Calls complete on all {@link BehaviorSubject} instances.
|
287
|
+
*
|
288
|
+
* Call destroy when disposing of the store.
|
289
|
+
*/
|
290
|
+
destroy() {
|
291
|
+
this.notify.complete();
|
292
|
+
this.notifyDelta.complete();
|
293
|
+
this.notifyQuery.complete();
|
294
|
+
}
|
295
|
+
}
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NsaWNlL3NyYy9saWIvQWJzdHJhY3RTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUlwQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFBO0FBRXpCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFBO0FBQ2xDLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFBO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFnQixNQUFNLENBQUM7SUFDdkQsS0FBSyxFQUFFLHFCQUFxQjtJQUM1QixPQUFPLEVBQUUsc0JBQXNCO0NBQ2hDLENBQUMsQ0FBQztBQUVILE1BQU0sT0FBZ0IsYUFBYTtJQU9oQyxZQUFZLE1BQW9CO1FBTWpDOztXQUVHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRDs7V0FFRztRQUNPLFdBQU0sR0FBVyxFQUFFLENBQUM7UUE0QzlCOztXQUVHO1FBQ0ksWUFBTyxHQUFtQixJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTFDOzs7V0FHRztRQUNJLGNBQVMsR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUU1Qzs7O1dBR0c7UUFDTyxXQUFNLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUE7UUFFNUM7OztXQUdHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBVyxDQUFDLENBQUMsQ0FBQTtRQThCdEQ7Ozs7O1dBS0c7UUFDSyxRQUFHLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQWxIMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNO1lBQ2xCLENBQUMsQ0FBQyxNQUFNLENB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SUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDM0Q7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsV0FBVztRQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsUUFBUSxDQUFDLE1BQWtCO1FBQ3pCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxJQUFJLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxDQUFDLE1BQWtCO1FBQzdCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTSxFQUFFLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsSUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxXQUFXLENBQUMsRUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxDQUFDLENBQWU7UUFDcEIsTUFBTSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDUixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxDQUFDLEVBQU0sRUFBRSxFQUFNO1FBQ3pCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxVQUFVLENBQUMsRUFBTSxFQUFFLEVBQU07UUFDdkIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCJcbmltcG9ydCB7IG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiXG5pbXBvcnQgeyBEZWx0YSwgUHJlZGljYXRlIH0gZnJvbSBcIi4vbW9kZWxzXCJcbmltcG9ydCB7IFN0b3JlQ29uZmlnIH0gZnJvbSBcIi4vbW9kZWxzL1N0b3JlQ29uZmlnXCJcblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdFxuXG5jb25zdCBFU1RPUkVfREVGQVVMVF9JRF9LRVkgPSBcImlkXCJcbmNvbnN0IEVTVE9SRV9ERUZBVUxUX0dJRF9LRVkgPSBcImdpZFwiXG5cbmV4cG9ydCBjb25zdCBFU1RPUkVfQ09ORklHX0RFRkFVTFQ6IFN0b3JlQ29uZmlnID0gZnJlZXplKHtcbiAgaWRLZXk6IEVTVE9SRV9ERUZBVUxUX0lEX0tFWSxcbiAgZ3VpZEtleTogRVNUT1JFX0RFRkFVTFRfR0lEX0tFWVxufSk7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0b3JlPEU+IHtcblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzdG9yZS5cbiAgICovXG4gICBwdWJsaWMgY29uZmlnOiBTdG9yZUNvbmZpZztcblxuICAgY29uc3RydWN0b3IoY29uZmlnPzogU3RvcmVDb25maWcpIHtcbiAgICAgdGhpcy5jb25maWcgPSBjb25maWdcbiAgICAgICA/IGZyZWV6ZSh7IC4uLkVTVE9SRV9DT05GSUdfREVGQVVMVCwgLi4uY29uZmlnIH0pXG4gICAgICAgOiBFU1RPUkVfQ09ORklHX0RFRkFVTFQ7XG4gICB9XG4gXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgb2YgdGhlIHN0b3JlIHF1ZXJ5LlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeVF1ZXJ5ID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcXVlcnkgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3F1ZXJ5OiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBxdWVyeSBzdGF0ZSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzLlxuICAgKi9cbiAgc2V0IHF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMubm90aWZ5UXVlcnkubmV4dCh0aGlzLl9xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBxdWVyeSBzdGF0ZS5cbiAgICovXG4gIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgcXVlcnkuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHF1ZXJ5JCA9IHNvdXJjZS5vYnNlcnZlUXVlcnkoKTtcbiAgICA8L3ByZT5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlRdWVyeS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGlkIGtleSBmb3IgdGhlIEVTdG9yZSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB0aGlzLmNvbmZpZy5pZEtleTtcbiAgICovXG4gIGdldCBJRF9LRVkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaWRLZXlcbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZ3VpZCBrZXkgZm9yIHRoZSBFU3RvcmUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4gdGhpcy5jb25maWcuZ3VpZEtleTtcbiAgICovXG4gIGdldCBHVUlEX0tFWSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5ndWlkS2V5XG4gIH1cblxuICAvKipcbiAgICogUHJpbWFyeSBpbmRleCBmb3IgdGhlIHN0b3JlcyBlbGVtZW50cy5cbiAgICovXG4gIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKVxuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBlbnRyaWVzIHRoYXQgYXJlIGtleWVkIGJ5XG4gICAqIGFuIGlkIGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGlkRW50cmllczogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKClcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiB0aGUgZW50aXJlIHNldCBvZiBlbnRyaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeSA9IG5ldyBSZXBsYXlTdWJqZWN0PEVbXT4oMSlcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiBzdG9yZSBvciBzbGljZSBkZWx0YSBzdGF0ZSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeURlbHRhID0gbmV3IFJlcGxheVN1YmplY3Q8RGVsdGE8RT4+KDEpXG5cbiAgLyoqXG4gICAqIENhbGwgYWxsIHRoZSBub3RpZmllcnMgYXQgb25jZS5cbiAgICpcbiAgICogQHBhcmFtIHZcbiAgICogQHBhcmFtIGRlbHRhXG4gICAqL1xuICBwcm90ZWN0ZWQgbm90aWZ5QWxsKHY6IEVbXSwgZGVsdGE6IERlbHRhPEU+KSB7XG4gICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgc3RvcmUgc3RhdGUgY2hhbmdlcy5cbiAgICogQHBhcmFtIHNvcnQgT3B0aW9uYWwgc29ydGluZyBmdW5jdGlvbiB5aWVsZGluZyBhIHNvcnRlZCBvYnNlcnZhYmxlLlxuICAgKiBAZXhhbXBsZVxuYGBgXG5sZXQgdG9kb3MkID0gc291cmNlLm9ic2VydmUoKTtcbi8vb3Igd2l0aCBhIHNvcnQgYnkgdGl0bGUgZnVuY3Rpb25cbmxldCB0b2RvcyQgPSBzb3VyY2Uub2JzZXJ2ZSgoYSwgYik9PihhLnRpdGxlID4gYi50aXRsZSA/IC0xIDogMSkpO1xuYGBgXG4gICovXG4gIHB1YmxpYyBvYnNlcnZlKHNvcnQ/OiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcik6IE9ic2VydmFibGU8RVtdPiB7XG4gICAgaWYgKHNvcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKG1hcCgoZTogRVtdKSA9PiBlLnNvcnQoc29ydCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIE9ic2VydmFibGU8RVtdPiByZWZlcmVuY2VcbiAgICogdG8gdGhlIGVudGl0aWVzIGluIHRoZSBzdG9yZSBvclxuICAgKiBTbGljZSBpbnN0YW5jZS5cbiAgICogXG4gICAqL1xuICAgcHVibGljIG9iczogT2JzZXJ2YWJsZTxFW10+ID0gdGhpcy5vYnNlcnZlKClcblxuXG5cbiAgLyoqXG4gICAqIE9ic2VydmUgZGVsdGEgdXBkYXRlcy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IHRvZG9zJCA9IHNvdXJjZS5vYnNlcnZlRGVsdGEoKTtcbiAgICAgPC9wcmU+XG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZURlbHRhKCk6IE9ic2VydmFibGU8RGVsdGE8RT4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlEZWx0YS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoZSBzdG9yZSBpcyBlbXB0eS5cbiAgICogXG4gICAqIEByZXR1cm4gQSBob3Qge0BsaW5rIE9ic2VydmFibGV9IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICA8cHJlPlxuICAgIHNvdXJjZS5pc0VtcHR5KCk7XG4gICAgPC9wcmU+XG4gICovXG4gIGlzRW1wdHkoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LnBpcGUoXG4gICAgICBtYXAoKGVudHJpZXM6IEVbXSkgPT4gZW50cmllcy5sZW5ndGggPT0gMClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQHJldHVybiBBIHNuYXBzaG90IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBzb3VyY2UuaXNFbXB0eSgpO1xuICAgIDwvcHJlPlxuICAqL1xuICBpc0VtcHR5U25hcHNob3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5sZW5ndGggPT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBjb250YWluZWQuXG4gICAqIEBwYXJhbSBwIFRoZSBwcmVkaWNhdGUgdG8gYXBwbHkgaW4gb3JkZXIgdG8gZmlsdGVyIHRoZSBjb3VudFxuICAgKi9cbiAgY291bnQocD86IFByZWRpY2F0ZTxFPik6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgaWYgKHApIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKFxuICAgICAgICBtYXAoKGU6IEVbXSkgPT4gZS5yZWR1Y2UoKHRvdGFsLCBlKSA9PiB0b3RhbCArIChwKGUpID8gMSA6IDApLCAwKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKG1hcCgoZW50cmllczogRVtdKSA9PiBlbnRyaWVzLmxlbmd0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY29udGFpbmVkIGluIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHAgVGhlIHByZWRpY2F0ZSB0byBhcHBseSBpbiBvcmRlciB0byBmaWx0ZXIgdGhlIGNvdW50XG4gICAqL1xuICBjb3VudFNuYXBzaG90KHA/OiBQcmVkaWNhdGU8RT4pOiBudW1iZXIge1xuICAgIGlmIChwKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZpbHRlcihwKS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IG9mIGFsbCBlbnRyaWVzLlxuICAgKiBcbiAgICogQHJldHVybiBTbmFwc2hvdCBhcnJheSBvZiBhbGwgdGhlIGVsZW1lbnRzIHRoZSBlbnRpdGllcyB0aGUgc3RvcmUgY29udGFpbnMuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBPYnNlcnZlIGEgc25hcHNob3Qgb2YgYWxsIHRoZSBlbnRpdGllcyBpbiB0aGUgc3RvcmUuXG5gYGBcbmxldCBzZWxlY3RlZFRvZG9zOlRvZG9bXSA9IHNvdXJjZS5hbGxTbmFwc2hvdCgpO1xuYGBgXG4gICAqL1xuICBhbGxTbmFwc2hvdCgpOiBFW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyaWVzIGNvbnRhaW4gdGhlIGlkZW50aWZpZWQgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAcGFyYW0gdGFyZ2V0IEVpdGhlciBhbiBpbnN0YW5jZSBvZiB0eXBlIGBFYCBvciBhIGBndWlkYCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UuIFxuICAgKiBAcGFyYW0gYnlJZCBXaGV0aGVyIHRoZSBsb29rdXAgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aXRoIHRoZSBgaWRgIGtleSByYXRoZXIgdGhhbiB0aGUgYGd1aWRgLlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpZGVudGlmaWVkIGJ5IHRoZSBndWlkIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IGNvbnRhaW5zOmJvb2xlYW4gPSBzb3VyY2UuY29udGFpbnMoZ3VpZCk7XG4gICAgIDwvcHJlPlxuICAgKi9cbiAgY29udGFpbnModGFyZ2V0OiBFIHwgc3RyaW5nKTpib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZ3VpZDogc3RyaW5nID0gKDxhbnk+dGFyZ2V0KVt0aGlzLmNvbmZpZy5ndWlkS2V5XTtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChndWlkKSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudHJpZXMgY29udGFpbiB0aGUgaWRlbnRpZmllZCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBwYXJhbSB0YXJnZXQgRWl0aGVyIGFuIGluc3RhbmNlIG9mIHR5cGUgYEVgIG9yIGEgYGlkYCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UuIFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpZGVudGlmaWVkIGJ5IHRoZSBgaWRgIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IGNvbnRhaW5zOmJvb2xlYW4gPSBzb3VyY2UuY29udGFpbnMoZ3VpZCk7XG4gICAgIDwvcHJlPlxuICAgKi9cbiAgY29udGFpbnNCeUlkKHRhcmdldDogRSB8IHN0cmluZyk6Ym9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaWQ6IHN0cmluZyA9ICg8YW55PnRhcmdldClbdGhpcy5jb25maWcuaWRLZXldO1xuICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQoaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIEdVSUQgcGFyYW1ldGVyXG4gICAqIGlmIGl0IGV4aXN0cyBhbmQgcmV0dXJuIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpZFxuICAgKiBAcmV0dXJuIFRoZSBlbnRpdHkgaW5zdGFuY2UgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgZmluZE9uZShndWlkOiBzdHJpbmcpOiBFIHwgdW5kZWZpbmVke1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGd1aWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIElEIHBhcmFtZXRlclxuICAgKiBpZiBpdCBleGlzdHMgYW5kIHJldHVybiBpdC5cbiAgICpcbiAgICogQHBhcmFtIGlkXG4gICAqIEByZXR1cm4gVGhlIGVudGl0eSBpbnN0YW5jZSBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlXG4gICAqL1xuICBmaW5kT25lQnlJRChpZDogc3RyaW5nKTogRSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuaWRFbnRyaWVzLmdldChpZCk7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3Qgb2YgdGhlIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlIHVzZWQgdG8gcXVlcnkgZm9yIHRoZSBzZWxlY3Rpb24uXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBhcnJheSBjb250YWluaW5nIHRoZSBlbnRpdGllcyB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBTZWxlY3QgYWxsIHRoZSBgVG9kb2AgaW5zdGFuY2Ugd2hlcmUgdGhlIGB0aXRsZWAgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiAxMDAuIFxuYGBgXG5sZXQgdG9kb3M6VG9kb1tdPXN0b3JlLnNlbGVjdCh0b2RvPT50b2RvLnRpdGxlLmxlbmd0aD4xMDApO1xuYGBgXG4gICAqL1xuICBzZWxlY3QocDogUHJlZGljYXRlPEU+KTogRVtdIHtcbiAgICBjb25zdCBzZWxlY3RlZDogRVtdID0gW107XG4gICAgQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZvckVhY2goZSA9PiB7XG4gICAgICBpZiAocChlKSkge1xuICAgICAgICBzZWxlY3RlZC5wdXNoKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxuXG4gIC8qKiBcbiAgICogQ29tcGFyZSBlbnRpdGllcyBieSBHVUlEIFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBHVUlEIGlkc1xuICAgKiBAZXhhbXBsZSBDb21wYXJlIGB0b2RvMWAgd2l0aCBgdG9kbzJgIGJ5IGBnaWRgLlxuYGBgXG5pZiAoZXF1YWxzQnlHVUlEKHRvZG8xLCB0b2RvMikpey4uLn07XG5gYGBcbiAgICovXG4gIGVxdWFsc0J5R1VJRChlMTphbnksIGUyOmFueSkge1xuICAgIHJldHVybiBlMVt0aGlzLkdVSURfS0VZXSA9PSBlMlt0aGlzLkdVSURfS0VZXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIGVudGl0aWVzIGJ5IElEIFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBJRCBpZHNcbiAgICogQGV4YW1wbGUgQ29tcGFyZSBgdG9kbzFgIHdpdGggYHRvZG8yYCBieSBgaWRgLlxuYGBgXG5pZiAoZXF1YWxzQnlJRCh0b2RvMSwgdG9kbzIpKXsuLi59O1xuYGBgXG4gICAqL1xuICBlcXVhbHNCeUlEKGUxOmFueSwgZTI6YW55KSB7XG4gICAgcmV0dXJuIGUxW3RoaXMuSURfS0VZXSA9PSBlMlt0aGlzLklEX0tFWV07XG4gIH1cbiAgLyoqXG4gICAqIENhbGxzIGNvbXBsZXRlIG9uIGFsbCB7QGxpbmsgQmVoYXZpb3JTdWJqZWN0fSBpbnN0YW5jZXMuXG4gICAqIFxuICAgKiBDYWxsIGRlc3Ryb3kgd2hlbiBkaXNwb3Npbmcgb2YgdGhlIHN0b3JlLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vdGlmeS5jb21wbGV0ZSgpO1xuICAgIHRoaXMubm90aWZ5RGVsdGEuY29tcGxldGUoKTtcbiAgICB0aGlzLm5vdGlmeVF1ZXJ5LmNvbXBsZXRlKCk7XG4gIH1cbn0iXX0=
|
@@ -86,7 +86,7 @@ export class EStore extends AbstractStore {
|
|
86
86
|
* Store slices
|
87
87
|
*/
|
88
88
|
this.slices = new Map();
|
89
|
-
const delta = { type: "Initialize" /* INTIALIZE */, entries: entities };
|
89
|
+
const delta = { type: "Initialize" /* ActionTypes.INTIALIZE */, entries: entities };
|
90
90
|
this.post(entities);
|
91
91
|
this.notifyDelta.next(delta);
|
92
92
|
}
|
@@ -350,7 +350,7 @@ export class EStore extends AbstractStore {
|
|
350
350
|
});
|
351
351
|
//Create a new array reference to trigger Angular change detection.
|
352
352
|
let v = [...Array.from(this.entries.values())];
|
353
|
-
const delta = { type: "Post" /* POST */, entries: [e] };
|
353
|
+
const delta = { type: "Post" /* ActionTypes.POST */, entries: [e] };
|
354
354
|
this.notifyAll(v, delta);
|
355
355
|
}
|
356
356
|
else {
|
@@ -379,7 +379,7 @@ export class EStore extends AbstractStore {
|
|
379
379
|
});
|
380
380
|
//Create a new array reference to trigger Angular change detection.
|
381
381
|
let v = [...Array.from(this.entries.values())];
|
382
|
-
const delta = { type: "Post" /* POST */, entries: e };
|
382
|
+
const delta = { type: "Post" /* ActionTypes.POST */, entries: e };
|
383
383
|
this.notifyAll(v, delta);
|
384
384
|
}
|
385
385
|
/**
|
@@ -408,7 +408,7 @@ export class EStore extends AbstractStore {
|
|
408
408
|
this.updateIDEntry(e);
|
409
409
|
let v = [...Array.from(this.entries.values())];
|
410
410
|
this.notify.next(v);
|
411
|
-
const delta = { type: "Put" /* PUT */, entries: [e] };
|
411
|
+
const delta = { type: "Put" /* ActionTypes.PUT */, entries: [e] };
|
412
412
|
this.notifyDelta.next(delta);
|
413
413
|
Array.from(this.slices.values()).forEach(s => {
|
414
414
|
s.put(e);
|
@@ -447,7 +447,7 @@ export class EStore extends AbstractStore {
|
|
447
447
|
//Create a new array reference to trigger Angular change detection.
|
448
448
|
let v = [...Array.from(this.entries.values())];
|
449
449
|
this.notify.next(v);
|
450
|
-
const delta = { type: "Put" /* PUT */, entries: e };
|
450
|
+
const delta = { type: "Put" /* ActionTypes.PUT */, entries: e };
|
451
451
|
this.notifyDelta.next(delta);
|
452
452
|
Array.from(this.slices.values()).forEach(s => {
|
453
453
|
s.putA(e);
|
@@ -472,7 +472,7 @@ export class EStore extends AbstractStore {
|
|
472
472
|
});
|
473
473
|
//Create a new array reference to trigger Angular change detection.
|
474
474
|
let v = [...Array.from(this.entries.values())];
|
475
|
-
const delta = { type: "Delete" /* DELETE */, entries: [e] };
|
475
|
+
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: [e] };
|
476
476
|
this.notifyAll(v, delta);
|
477
477
|
Array.from(this.slices.values()).forEach(s => {
|
478
478
|
s.delete(e);
|
@@ -513,7 +513,7 @@ export class EStore extends AbstractStore {
|
|
513
513
|
});
|
514
514
|
//Create a new array reference to trigger Angular change detection.
|
515
515
|
let v = [...Array.from(this.entries.values())];
|
516
|
-
const delta = { type: "Delete" /* DELETE */, entries: e };
|
516
|
+
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: e };
|
517
517
|
this.notifyAll(v, delta);
|
518
518
|
Array.from(this.slices.values()).forEach(s => {
|
519
519
|
s.deleteA(e);
|
@@ -540,7 +540,7 @@ export class EStore extends AbstractStore {
|
|
540
540
|
});
|
541
541
|
//Create a new array reference to trigger Angular change detection.
|
542
542
|
let v = [...Array.from(this.entries.values())];
|
543
|
-
const delta = { type: "Delete" /* DELETE */, entries: d };
|
543
|
+
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: d };
|
544
544
|
this.notifyAll(v, delta);
|
545
545
|
Array.from(this.slices.values()).forEach(s => {
|
546
546
|
s.deleteA(d);
|
@@ -581,7 +581,7 @@ export class EStore extends AbstractStore {
|
|
581
581
|
*/
|
582
582
|
reset() {
|
583
583
|
const delta = {
|
584
|
-
type: "Reset" /* RESET */,
|
584
|
+
type: "Reset" /* ActionTypes.RESET */,
|
585
585
|
entries: Array.from(this.entries.values())
|
586
586
|
};
|
587
587
|
this.notifyAll([], delta);
|
@@ -601,4 +601,4 @@ export class EStore extends AbstractStore {
|
|
601
601
|
this.notifyLoading.next(this.loading);
|
602
602
|
}
|
603
603
|
}
|
604
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9FU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLE9BQU8sTUFBVSxTQUFRLGFBQWdCO0lBQzdDOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsWUFBWSxXQUFnQixFQUFFLEVBQUUsTUFBb0I7UUFDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBNENoQjs7V0FFRztRQUNLLGlCQUFZLEdBQUcsSUFBSSxhQUFhLENBQWlCLENBQUMsQ0FBQyxDQUFDO1FBRzVEOzs7O1dBSUc7UUFDSSxXQUFNLEdBQW1CLElBQUksR0FBRyxFQUFFLENBQUM7UUF3RzFDOzs7OztXQUtHO1FBQ0ssa0JBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUV0RDs7Ozs7Ozs7OztXQVVHO1FBQ0ssYUFBUSxHQUFZLElBQUksQ0FBQztRQStEakM7Ozs7O1dBS0c7UUFDSyxvQkFBZSxHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXhEOzs7OztXQUtHO1FBQ0ssZUFBVSxHQUFZLEtBQUssQ0FBQztRQStDcEM7O1dBRUc7UUFDSyxXQUFNLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7UUFoVGhELE1BQU0sS0FBSyxH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QUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdFN0b3JlIH0gZnJvbSAnLi9BYnN0cmFjdFN0b3JlJztcbmltcG9ydCB7IFN0b3JlQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvU3RvcmVDb25maWcnO1xuaW1wb3J0IHsgR1VJRCB9IGZyb20gJy4vdXRpbGl0aWVzJztcblxuaW1wb3J0IHsgQWN0aW9uVHlwZXMsIFByZWRpY2F0ZSwgRGVsdGEgfSBmcm9tICcuL21vZGVscy8nO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgb2YsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VXaGlsZSwgZmlsdGVyLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuXG4vKipcbiAqIFRoaXMgYHRvZG9GYWN0b3J5YCBjb2RlIHdpbGwgYmUgdXNlZCB0byBpbGx1c3RyYXRlIHRoZSBBUEkgZXhhbXBsZXMuICBUaGUgZm9sbG93aW5nXG4gKiB1dGlsaXRpZXMgYXJlIHVzZWQgaW4gdGhlIHRlc3RzIGFuZCB0aGUgQVBJIFR5cGVkb2MgZXhhbXBsZXMgY29udGFpbmVkIGhlcmUuXG4gKiBAZXhhbXBsZSBVdGlsaXRpZXMgZm9yIEFQSSBFeGFtcGxlc1xuYGBgXG5leHBvcnQgY29uc3QgZW51bSBUb2RvU2xpY2VFbnVtIHtcbiAgQ09NUExFVEUgPSBcIkNvbXBsZXRlXCIsXG4gIElOQ09NUExFVEUgPSBcIkluY29tcGxldGVcIlxufVxuXG5leHBvcnQgY2xhc3MgVG9kbyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wbGV0ZTogYm9vbGVhbiwgcHVibGljIHRpdGxlOiBzdHJpbmcscHVibGljIGdpZD86c3RyaW5nLCBwdWJsaWMgaWQ/OnN0cmluZykge31cbn1cblxuZXhwb3J0IGxldCB0b2RvcyA9IFtuZXcgVG9kbyhmYWxzZSwgXCJZb3UgY29tcGxldGUgbWUhXCIpLCBuZXcgVG9kbyh0cnVlLCBcIllvdSBjb21wbGV0ZWQgbWUhXCIpXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvZG9zRmFjdG9yeSgpOlRvZG9bXSB7XG4gIHJldHVybiBbbmV3IFRvZG8oZmFsc2UsIFwiWW91IGNvbXBsZXRlIG1lIVwiKSwgbmV3IFRvZG8odHJ1ZSwgXCJZb3UgY29tcGxldGVkIG1lIVwiKV07XG59XG4gYGBgIFxuICovXG5cbmV4cG9ydCBjbGFzcyBFU3RvcmU8RT4gZXh0ZW5kcyBBYnN0cmFjdFN0b3JlPEU+IHtcbiAgLyoqXG4gICAqIFN0b3JlIGNvbnN0cnVjdG9yIChJbml0aWFsaXphdGlvbiB3aXRoIGVsZW1lbnQgaXMgb3B0aW9uYWwpXG4gICAqXG4gICAqIHBlcmZvcm0gaW5pdGlhbCBub3RpZmljYXRpb24gdG8gYWxsIG9ic2VydmVycyxcbiAgICogc3VjaCB0aGF0IGZ1bmN0aW9uIGxpa2Uge0BsaW5rIGNvbWJpbmVMYXRlc3R9e31cbiAgICogd2lsbCBleGVjdXRlIGF0IGxlYXN0IG9uY2UuXG4gICAqIEBwYXJhbSBlbnRpdGllc1xuICAgKiBAZXhhbXBsZSBEeW5hbWljIGBFU3RvcmU8VG9kbz5gIENyZWF0aW9uIFxuYGBgXG4vLyBJbml0aWFsaXplIHRoZSBTdG9yZVxubGV0IHN0b3JlOiBFU3RvcmU8VG9kbz4gPSBuZXcgRVN0b3JlPFRvZG8+KHRvZG9zRmFjdG9yeSgpKTtcbmBgYCovXG4gIGNvbnN0cnVjdG9yKGVudGl0aWVzOiBFW10gPSBbXSwgY29uZmlnPzogU3RvcmVDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuSU5USUFMSVpFLCBlbnRyaWVzOiBlbnRpdGllcyB9O1xuICAgIHRoaXMucG9zdChlbnRpdGllcylcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGNvbXBsZXRlIG9uIGFsbCB7QGxpbmsgQmVoYXZpb3JTdWJqZWN0fSBpbnN0YW5jZXMuXG4gICAqIFxuICAgKiBDYWxsIGRlc3Ryb3kgd2hlbiBkaXNwb3Npbmcgb2YgdGhlIHN0b3JlLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KClcbiAgICB0aGlzLm5vdGlmeUxvYWRpbmcuY29tcGxldGUoKVxuICAgIHRoaXMubm90aWZ5QWN0aXZlLmNvbXBsZXRlKClcbiAgICB0aGlzLnNsaWNlcy5mb3JFYWNoKHNsaWNlID0+IHNsaWNlLmRlc3Ryb3koKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBlbnRpdHk6XG4gICAqIFxuICAgKiBJZiB0aGUgc3RvcmUgY29udGFpbnMgdGhlIGVudGl0eVxuICAgKiBpdCB3aWxsIGJlIGRlbGV0ZWQuICBJZiB0aGUgc3RvcmUgXG4gICAqIGRvZXMgbm90IGNvbnRhaW5zIHRoZSBlbnRpdHksXG4gICAqIGl0IGlzIGFkZGVkLlxuICAgKiBAcGFyYW0gZSBcbiAgICogQGV4YW1wbGUgVG9nZ2xlIHRoZSBgVG9kb2AgaW5zdGFuY2VcbmBgYFxuZXN0b3JlLnBvc3QodG9kbyk7XG4vLyBSZW1vdmUgdG9kb1xuZXN0b3JlLnRvZ2dsZSh0b2RvKTtcbi8vIEFkZCBpdCBiYWNrXG5lc3RvcmUudG9nZ2xlKHRvZG8pO1xuXG5gYGBcbiAgICovXG4gIHB1YmxpYyB0b2dnbGUoZTogRSkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5zKGUpKSB7XG4gICAgICB0aGlzLmRlbGV0ZShlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wb3N0KGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgd2hlbiB0aGUgc3RvcmUgaXMgZW1wdHkuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeUFjdGl2ZSA9IG5ldyBSZXBsYXlTdWJqZWN0PE1hcDxzdHJpbmcsIEU+PigxKTtcblxuXG4gIC8qKlxuICAgKiBgTWFwYCBvZiBhY3RpdmUgZW50dGllcy4gVGhlIGluc3RhbmNlIGlzIHB1YmxpYyBhbmQgY2FuIGJlIHVzZWRcbiAgICogZGlyZWN0bHkgdG8gYWRkIGFuZCByZW1vdmUgYWN0aXZlIGVudGl0aWVzLCBob3dldmVyIHdlIHJlY29tbWVuZFxuICAgKiB1c2luZyB0aGUge0BsaW5rIGFkZEFjdGl2ZX0gYW5kIHtAbGluayBkZWxldGVBY3RpdmV9IG1ldGhvZHMuXG4gICAqL1xuICBwdWJsaWMgYWN0aXZlOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQWRkIG11bHRpcGxlIGVudGl0eSBlbnRpdGllcyB0byBhY3RpdmUuXG4gICAqIFxuICAgKiBJZiB0aGUgZW50aXR5IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIHN0b3JlIGl0IGlzIGFkZGVkXG4gICAqIHRvIHRoZSBzdG9yZSBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gYGFjdGl2ZWAuXG4gICAqIFxuICAgKiBBbHNvIHdlIGNsb25lIHRoZSBtYXAgcHJpb3IgdG8gYnJvYWRjYXN0aW5nIGl0IHdpdGhcbiAgICogYG5vdGlmeUFjdGl2ZWAgdG8gbWFrZSBzdXJlIHdlIHdpbGwgdHJpZ2dlciBBbmd1bGFyIFxuICAgKiBjaGFuZ2UgZGV0ZWN0aW9uIGluIHRoZSBldmVudCB0aGF0IGl0IG1haW50YWlucyBcbiAgICogYSByZWZlcmVuY2UgdG8gdGhlIGBhY3RpdmVgIHN0YXRlIGBNYXBgIGluc3RhbmNlLlxuICAgKiBcbiAgICogQGV4YW1wbGUgQWRkIGEgYHRvZG8xYCBhbmQgYHRvZG8yYCBhcyBhY3RpdmVcbmBgYFxuYWRkQWN0aXZlKHRvZG8xKTtcbmFkZEFjdGl2ZSh0b2RvMik7XG5gYGBcbiAgICovXG4gIHB1YmxpYyBhZGRBY3RpdmUoZTogRSkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5zKGUpKSB7XG4gICAgICB0aGlzLmFjdGl2ZS5zZXQoKDxhbnk+ZSkuZ2lkLCBlKTtcbiAgICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICAgIHRoaXMuYWN0aXZlLnNldCgoPGFueT5lKS5naWQsIGUpO1xuICAgICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBlbnRpdHkgYXMgYWN0aXZlLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIE1hcmsgYSBgdG9kb2AgaW5zdGFuY2UgYXMgYWN0aXZlXG4gIGBgYFxuZGVsZXRlQWN0aXZlKHRvZG8xKTtcbmRlbGV0ZUFjdGl2ZSh0b2RvMik7XG4gIGBgYFxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFjdGl2ZShlOiBFKSB7XG4gICAgdGhpcy5hY3RpdmUuZGVsZXRlKCg8YW55PmUpLmdpZCk7XG4gICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgLyByZXNldCB0aGUgYWN0aXZlIGVudGl0eSBtYXAuXG4gICAqIFxuICAgKiBBbHNvIHdlIGNsb25lIHRoZSBtYXAgcHJpb3IgdG8gYnJvYWRjYXN0aW5nIGl0IHdpdGhcbiAgICogYG5vdGlmeUFjdGl2ZWAgdG8gbWFrZSBzdXJlIHdlIHdpbGwgdHJpZ2dlciBBbmd1bGFyIFxuICAgKiBjaGFuZ2UgZGV0ZWN0aW9uIGluIHRoZSBldmVudCB0aGF0IGl0IG1haW50YWlucyBcbiAgICogYSByZWZlcmVuY2UgdG8gdGhlIGBhY3RpdmVgIHN0YXRlIGBNYXBgIGluc3RhbmNlLlxuICAgKiBcbiAgICogQGV4YW1wbGUgTWFyayBhIGB0b2RvYCBpbnN0YW5jZSBhcyBhY3RpdmVcbiAgYGBgXG5kZWxldGVBY3RpdmUodG9kbzEpO1xuZGVsZXRlQWN0aXZlKHRvZG8yKTtcbiAgYGBgXG4gICAqL1xuICBjbGVhckFjdGl2ZSgpIHtcbiAgICB0aGlzLmFjdGl2ZS5jbGVhcigpO1xuICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgdGhlIGFjdGl2ZSBlbnRpdHkuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IGFjdGl2ZSQgPSBzb3VyY2Uub2JzZXJ2ZUFjdGl2ZSgpO1xuICAgIDwvcHJlPlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZUFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlBY3RpdmUuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHRoZSBhY3RpdmUgZW50aXR5LlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBhY3RpdmUkID0gc291cmNlLmFjdGl2ZVNuYXBzaG90KCk7XG4gICAgPC9wcmU+XG4gICovXG4gICAgcHVibGljIGFjdGl2ZVNuYXBzaG90KCkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5hY3RpdmUudmFsdWVzKCkpXG4gIH1cblxuXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExPQURJTkdcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBvZiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGEgbG9hZCByZXF1ZXN0LlxuICAgKiBcbiAgICogVGhlIGVycm9yIE9ic2VydmFibGUgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhlIFxuICAgKiBjbGllbnQuXG4gICAqL1xuICBwdWJsaWMgbG9hZGluZ0Vycm9yITogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgd2hlbiB0aGUgc3RvcmUgaXMgbG9hZGluZy5cbiAgICogXG4gICAqIFRoaXMgaXMgYSBjb21tb24gcGF0dGVybiBmb3VuZCB3aGVuIGltcGxlbWVudGluZ1xuICAgKiBgT2JzZXJ2YWJsZWAgZGF0YSBzb3VyY2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlMb2FkaW5nID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGxvYWRpbmcgc3RhdGUuICBVc2UgbG9hZGluZyB3aGVuIGZldGNoaW5nIG5ld1xuICAgKiBkYXRhIGZvciB0aGUgc3RvcmUuICBUaGUgZGVmYXVsdCBsb2FkaW5nIHN0YXRlIGlzIGB0cnVlYC5cbiAgICogXG4gICAqIFRoaXMgaXMgc3VjaCB0aGF0IGlmIGRhdGEgaXMgZmV0Y2hlZCBhc3luY2hyb25vdXNseSBcbiAgICogaW4gYSBzZXJ2aWNlLCBjb21wb25lbnRzIGNhbiB3YWl0IG9uIGxvYWRpbmcgbm90aWZpY2F0aW9uXG4gICAqIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgc2VydmljZS5cbiAgICpcbiAgICogTG9hZGluZyBjb3VsZCBiZSBiYXNlZCBvbiBhIGNvbXBvc2l0ZSByZXNwb25zZS4gIEZvciBleGFtcGxlXG4gICAqIHdoZW4gdGhlIHN0b2NrIGFuZCBtdXR1YWwgZnVuZHMgaGF2ZSBsb2FkZWQsIHNldCBsb2FkaW5nIHRvIGBmYWxzZWAuXG4gICAqL1xuICBwcml2YXRlIF9sb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBsb2FkaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgbG9hZGluZyhsb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbG9hZGluZyA9IGxvYWRpbmc7XG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLm5leHQodGhpcy5fbG9hZGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBsb2FkaW5nIHN0YXRlLlxuICAgKi9cbiAgZ2V0IGxvYWRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmc7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBsb2FkaW5nLlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBsb2FkaW5nJCA9IHNvdXJjZS5vYnNlcnZlTG9hZGluZygpO1xuICAgIDwvcHJlPlxuXG4gICAgTm90ZSB0aGF0IHRoaXMgb2J2ZXJhYmxlIHBpcGVkIHRocm91Z2hcbiAgICBgdGFrZVdoaWxlKHYtPnYsIHRydWUpLCBzdWNoIHRoYXQgaXQgd2lsbCBcbiAgICBjb21wbGV0ZSBhZnRlciBlYWNoIGVtaXNzaW9uLlxuXG4gICAgU2VlOlxuICAgIGh0dHBzOi8vbWVkaXVtLmNvbS9Ab2xlLmVyc295L3dhaXRpbmctb24tZXN0b3JlLXRvLWxvYWQtOGRjYmUxNjE2MTNjXG5cbiAgICBGb3IgbW9yZSBkZXRhaWxzLlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZUxvYWRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5TG9hZGluZy5hc09ic2VydmFibGUoKS5cbiAgICAgIHBpcGUodGFrZVdoaWxlKHYgPT4gdiwgdHJ1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGZpaWVzIHdoZW4gbG9hZGluZyBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG9ic2VydmVMb2FkaW5nQ29tcGxldGUoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZUxvYWRpbmcoKS5waXBlKFxuICAgICAgZmlsdGVyKGxvYWRpbmcgPT4gbG9hZGluZyA9PSBmYWxzZSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2YodHJ1ZSkpKVxuICB9XG5cblxuXG5cblxuXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNFQVJDSElOR1xuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBvZiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGEgc2VhcmNoIHJlcXVlc3QuXG4gICAqIFxuICAgKiBUaGUgZXJyb3IgT2JzZXJ2YWJsZSBzaG91bGQgYmUgY3JlYXRlZCBieSB0aGUgXG4gICAqIGNsaWVudC5cbiAgICovXG4gIHB1YmxpYyBzZWFyY2hFcnJvciE6IE9ic2VydmFibGU8YW55PjtcblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHRoYXQgYSBzZWFyY2ggaXMgaW4gcHJvZ3Jlc3MuXG4gICAqIFxuICAgKiBUaGlzIGlzIGEgY29tbW9uIHBhdHRlcm4gZm91bmQgd2hlbiBpbXBsZW1lbnRpbmdcbiAgICogYE9ic2VydmFibGVgIGRhdGEgc291cmNlcy5cbiAgICovXG4gIHByaXZhdGUgbm90aWZ5U2VhcmNoaW5nID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGBzZWFyY2hpbmdgIHN0YXRlLiAgVXNlIGBzZWFyY2hpbmdgXG4gICAqIGZvciBleGFtcGxlIHRvIGRpc3BsYXkgYSBzcGlubm5lciBcbiAgICogd2hlbiBwZXJmb3JtaW5nIGEgc2VhcmNoLiAgXG4gICAqIFRoZSBkZWZhdWx0IGBzZWFyY2hpbmdgIHN0YXRlIGlzIGBmYWxzZWAuXG4gICAqL1xuICBwcml2YXRlIF9zZWFyY2hpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBzZWFyY2hpbmcgc3RhdGUgYW5kIG5vdGlmaWVzIG9ic2VydmVycy5cbiAgICovXG4gIHNldCBzZWFyY2hpbmcoc2VhcmNoaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VhcmNoaW5nID0gc2VhcmNoaW5nO1xuICAgIHRoaXMubm90aWZ5U2VhcmNoaW5nLm5leHQodGhpcy5fc2VhcmNoaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIEEgc25hcHNob3Qgb2YgdGhlIHNlYXJjaGluZyBzdGF0ZS5cbiAgICovXG4gIGdldCBzZWFyY2hpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHNlYXJjaGluZy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgc2VhcmNoaW5nJCA9IHNvdXJjZS5vYnNlcnZlU2VhcmNoaW5nKCk7XG4gICAgPC9wcmU+XG4gIFxuICAgIE5vdGUgdGhhdCB0aGlzIG9idmVyYWJsZSBwaXBlZCB0aHJvdWdoXG4gICAgYHRha2VXaGlsZSh2LT52LCB0cnVlKSwgc3VjaCB0aGF0IGl0IHdpbGwgXG4gICAgY29tcGxldGUgYWZ0ZXIgZWFjaCBlbWlzc2lvbi5cbiAgXG4gICAgU2VlOlxuICAgIGh0dHBzOi8vbWVkaXVtLmNvbS9Ab2xlLmVyc295L3dhaXRpbmctb24tZXN0b3JlLXRvLWxvYWQtOGRjYmUxNjE2MTNjXG4gIFxuICAgIEZvciBtb3JlIGRldGFpbHMuXG4gICovXG4gIHB1YmxpYyBvYnNlcnZlU2VhcmNoaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLm5vdGlmeVNlYXJjaGluZy5hc09ic2VydmFibGUoKS5cbiAgICAgIHBpcGUodGFrZVdoaWxlKHYgPT4gdiwgdHJ1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGZpaWVzIHdoZW4gc2VhcmNoaW5nIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZVNlYXJjaGluZ0NvbXBsZXRlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVTZWFyY2hpbmcoKS5waXBlKFxuICAgICAgZmlsdGVyKHNlYXJjaGluZyA9PiBzZWFyY2hpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBzbGljZXNcbiAgICovXG4gIHByaXZhdGUgc2xpY2VzOiBNYXA8c3RyaW5nLCBTbGljZTxFPj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzbGljZSB0byB0aGUgc3RvcmUgYW5kIGtleXMgaXQgYnkgdGhlIHNsaWNlcyBsYWJlbC5cbiAgICpcbiAgICogQHBhcmFtIHBcbiAgICogQHBhcmFtIGxhYmVsXG4gICAqIFxuICAgKiBAZXhhbXBsZSBTZXR1cCBhIFRvZG8gU2xpY2UgZm9yIENPTVBMRVRFIFRvZG9zXG5gYGBcbnNvdXJjZS5hZGRTbGljZSh0b2RvID0+IHRvZG8uY29tcGxldGUsIFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICBhZGRTbGljZShwOiBQcmVkaWNhdGU8RT4sIGxhYmVsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzbGljZTogU2xpY2U8RT4gPSBuZXcgU2xpY2UoXG4gICAgICBsYWJlbCxcbiAgICAgIHAsXG4gICAgICB0aGlzKVxuICAgIHRoaXMuc2xpY2VzLnNldChzbGljZS5sYWJlbCwgc2xpY2UpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc2xpY2VcbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBpZGVudGlmeWluZyB0aGUgc2xpY2VcbiAgICogXG4gICAqIEBleGFtcGxlIFJlbW92ZSB0aGUgVG9kb1NsaWNlcy5DT01QTEVURSBTbGljZVxuYGBgXG5zb3VyY2UucmVtb3ZlU2xpY2UoVG9kb1NsaWNlcy5DT01QTEVURSk7XG5gYGBcbiAgICovXG4gIHJlbW92ZVNsaWNlKGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNsaWNlcy5kZWxldGUobGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNsaWNlXG4gICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgaWRlbnRpZnlpbmcgdGhlIHNsaWNlXG4gICAqIEByZXR1cm4gVGhlIFNsaWNlIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBcbiAgICogXG4gICAqIEBleGFtcGxlIEdldCB0aGUgVG9kb1NsaWNlcy5DT01QTEVURSBzbGljZVxuYGBgXG5zb3VyY2UuZ2V0U2xpY2UoVG9kb1NsaWNlcy5DT01QTEVURSk7XG5gYGBcbiAgICovXG4gIGdldFNsaWNlKGxhYmVsOiBzdHJpbmcpOiBTbGljZTxFPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VzLmdldChsYWJlbCk7XG4gIH1cblxuICAvKipcbiAgICogUG9zdCAoQWRkIGEgbmV3KSBlbGVtZW50KHMpIHRvIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIGUgQW4gaW5kaWlkdWFsIGVudGl0eSBvciBhbiBhcnJheSBvZiBlbnRpdGllc1xuICAgKiBAZXhhbXBsZSBQb3N0IGEgYHRvZG9gLlxuYGBgXG5zdG9yZS5wb3N0KHRvZG8pO1xuYGBgXG4gICAqL1xuICBwb3N0KGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgID8gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgOiBHVUlEKCk7XG4gICAgICAoPGFueT5lKVt0aGlzLkdVSURfS0VZXSA9IGd1aWQ7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGd1aWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5wb3N0KGUpO1xuICAgICAgfSk7XG4gICAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBPU1QsIGVudHJpZXM6IFtlXSB9O1xuICAgICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucG9zdEEoZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9zdCBlbGVtZW50cyB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSAuLi5lXG4gICAqIEBleGFtcGxlIFBvc3QgdHdvIGBUb2RvYCBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLnBvc3QodG9kbzEsIHRvZG8yKTtcbmBgYFxuICAgKi9cbiAgcG9zdE4oLi4uZTogRVtdKSB7XG4gICAgZS5mb3JFYWNoKGUgPT4ge1xuICAgICAgY29uc3QgZ3VpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgPyAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgICA6IEdVSUQoKTtcbiAgICAgICg8YW55PmUpW3RoaXMuR1VJRF9LRVldID0gZ3VpZDtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoZ3VpZCwgZSk7XG4gICAgICB0aGlzLnVwZGF0ZUlERW50cnkoZSk7XG4gICAgfSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMucG9zdEEoZSk7XG4gICAgfSk7XG4gICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBPU1QsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogUG9zdCAoQWRkKSBhbiBhcnJheSBvZiBlbGVtZW50cyB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFBvc3QgYSBgVG9kb2AgYXJyYXkuXG5gYGBcbnN0b3JlLnBvc3QoW3RvZG8xLCB0b2RvMl0pO1xuYGBgXG4gICAqL1xuICBwb3N0QShlOiBFW10pIHtcbiAgICB0aGlzLnBvc3ROKC4uLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCAoVXBkYXRlKSBhbiBlbGVtZW50LlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBQdXQgYSBUb2RvIGluc3RhbmNlLlxuYGBgXG5zdG9yZS5wdXQodG9kbzEpO1xuYGBgXG4gICAqL1xuICBwdXQoZTogRSB8IEVbXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgbGV0IGlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoaWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuUFVULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gICAgICBBcnJheS5mcm9tKHRoaXMuc2xpY2VzLnZhbHVlcygpKS5mb3JFYWNoKHMgPT4ge1xuICAgICAgICBzLnB1dChlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucHV0QShlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgKFVwZGF0ZSkgYW4gZWxlbWVudCBvciBhZGQgYW4gZWxlbWVudCB0aGF0IHdhcyByZWFkIGZyb20gYSBwZXJzaXN0ZW5jZSBzb3VyY2VcbiAgICogYW5kIHRodXMgYWxyZWFkeSBoYXMgYW4gYXNzaWduZWQgZ2xvYmFsIGlkYC5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgUHV0IFRvZG8gaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5wdXQodG9kbzEsIHRvZG8yKTtcbmBgYFxuICAgKi9cbiAgcHV0TiguLi5lOiBFW10pIHtcbiAgICB0aGlzLnB1dEEoZSk7XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgUHV0IFRvZG8gaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5wdXQoW3RvZG8xLCB0b2RvMl0pO1xuYGBgXG4gICAqL1xuICBwdXRBKGU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIGxldCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgdGhpcy5lbnRyaWVzLnNldChndWlkLCBlKVxuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBVVCwgZW50cmllczogZSB9O1xuICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMucHV0QShlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgKFVwZGF0ZSkgdGhlIGFycmF5IG9mIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBEZWxldGUgdG9kbzEuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMV0pO1xuYGBgXG4gICAqL1xuICBkZWxldGUoZTogRSB8IEVbXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICBjb25zdCBndWlkID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGd1aWQpO1xuICAgICAgdGhpcy5kZWxldGVJREVudHJ5KGUpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIH0pO1xuICAgICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IFtlXSB9O1xuICAgICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5kZWxldGUoZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRlbGV0ZUEoZSlcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgTiBlbGVtZW50cy5cbiAgICogQHBhcmFtIC4uLmVcbiAgICogQGV4YW1wbGUgUHV0IFRvZG8gaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5kZWxldGUodG9kbzEsIHRvZG8yKTtcbmBgYFxuICAgKi9cbiAgZGVsZXRlTiguLi5lOiBFW10pIHtcbiAgICB0aGlzLmRlbGV0ZUEoZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIE4gZWxlbWVudHMuXG4gICAqIEBwYXJhbSAuLi5lXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIGRlbGV0ZUEoZTogRVtdKSB7XG4gICAgZS5mb3JFYWNoKGUgPT4ge1xuICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICBjb25zdCBndWlkID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGd1aWQpO1xuICAgICAgdGhpcy5kZWxldGVJREVudHJ5KGUpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMuZGVsZXRlQShlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZWxlbWVudHMgYnkge0BsaW5rIFByZWRpY2F0ZX0uXG4gICAqIEBwYXJhbSBwIFRoZSBwcmVkaWNhdGUuXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIGRlbGV0ZVAocDogUHJlZGljYXRlPEU+KSB7XG4gICAgY29uc3QgZDogRVtdID0gW107XG4gICAgQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZvckVhY2goZSA9PiB7XG4gICAgICBpZiAocChlKSkge1xuICAgICAgICBkLnB1c2goZSk7XG4gICAgICAgIGNvbnN0IGlkID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpO1xuICAgICAgICB0aGlzLmRlbGV0ZUFjdGl2ZShlKTtcbiAgICAgICAgdGhpcy5kZWxldGVJREVudHJ5KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IGQgfTtcbiAgICB0aGlzLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMuZGVsZXRlQShkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZW50aXR5IGhhcyB0aGUgYGlkYCBrZXkgaW5pdGlhbGl6ZWQgd2l0aCBhIHZhbHVlLFxuICAgKiB0aGVuIGFsc28gYWRkIHRoZSBlbnRpdHkgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKlxuICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYGlkRW50cmllc2AuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUlERW50cnkoZTogRSkge1xuICAgIGlmICgoPGFueT5lKVt0aGlzLklEX0tFWV0pIHtcbiAgICAgIHRoaXMuaWRFbnRyaWVzLnNldCgoPGFueT5lKVt0aGlzLklEX0tFWV0sIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZW50aXR5IGhhcyB0aGUgYGlkYCBrZXkgaW5pdGlhbGl6ZWQgd2l0aCBhIHZhbHVlLFxuICAgKiB0aGVuIGFsc28gZGVsZXRlIHRoZSBlbnRpdHkgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKlxuICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYGlkRW50cmllc2AuXG4gICAqL1xuICBwcml2YXRlIGRlbGV0ZUlERW50cnkoZTogRSkge1xuICAgIGlmICgoPGFueT5lKVt0aGlzLklEX0tFWV0pIHtcbiAgICAgIHRoaXMuaWRFbnRyaWVzLmRlbGV0ZSgoPGFueT5lKVt0aGlzLklEX0tFWV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHN0b3JlIGFuZCBhbGwgY29udGFpbmVkIHNsaWNlIGluc3RhbmNlcyB0byBlbXB0eS5cbiAgICogQWxzbyBwZXJmb3JtIGRlbHRhIG5vdGlmaWNhdGlvbiB0aGF0IHNlbmRzIGFsbCBjdXJyZW50IHN0b3JlIGVudHJpZXMuXG4gICAqIFRoZSBBY3Rpb25UeXBlLlJFU0VUIGNvZGUgaXMgc2VudCB3aXRoIHRoZSBkZWx0YSBub3RpZmljYXRpb24uICBTbGljZXNcbiAgICogc2VuZCB0aGVpciBvd24gZGVsdGEgbm90aWZpY2F0aW9uLlxuICAgKiBcbiAgICogQGV4YW1wbGUgUmVzZXQgdGhlIHN0b3JlLlxuYGBgXG5zdG9yZS5yZXNldCgpO1xuYGBgXG4gICAqL1xuICByZXNldCgpIHtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRVNFVCxcbiAgICAgIGVudHJpZXM6IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH07XG4gICAgdGhpcy5ub3RpZnlBbGwoW10sIGRlbHRhKTtcbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKCk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMucmVzZXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIGFsbCB0aGUgbm90aWZpZXJzIGF0IG9uY2UuXG4gICAqXG4gICAqIEBwYXJhbSB2XG4gICAqIEBwYXJhbSBkZWx0YVxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeUFsbCh2OiBFW10sIGRlbHRhOiBEZWx0YTxFPikge1xuICAgIHN1cGVyLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLm5leHQodGhpcy5sb2FkaW5nKTtcbiAgfVxufSJdfQ==
|
604
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9FU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLE9BQU8sTUFBVSxTQUFRLGFBQWdCO0lBQzdDOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsWUFBWSxXQUFnQixFQUFFLEVBQUUsTUFBb0I7UUFDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBNENoQjs7V0FFRztRQUNLLGlCQUFZLEdBQUcsSUFBSSxhQUFhLENBQWlCLENBQUMsQ0FBQyxDQUFDO1FBRzVEOzs7O1dBSUc7UUFDSSxXQUFNLEdBQW1CLElBQUksR0FBRyxFQUFFLENBQUM7UUF3RzFDOzs7OztXQUtHO1FBQ0ssa0JBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUV0RDs7Ozs7Ozs7OztXQVVHO1FBQ0ssYUFBUSxHQUFZLElBQUksQ0FBQztRQStEakM7Ozs7O1dBS0c7UUFDSyxvQkFBZSxHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXhEOzs7OztXQUtHO1FBQ0ssZUFBVSxHQUFZLEtBQUssQ0FBQztRQStDcEM7O1dBRUc7UUFDSyxXQUFNLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7UUFoVGhELE1BQU0sS0FBSyxH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QUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RTdG9yZSB9IGZyb20gJy4vQWJzdHJhY3RTdG9yZSc7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL1N0b3JlQ29uZmlnJztcbmltcG9ydCB7IEdVSUQgfSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbmltcG9ydCB7IEFjdGlvblR5cGVzLCBQcmVkaWNhdGUsIERlbHRhIH0gZnJvbSAnLi9tb2RlbHMvJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG9mLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlV2hpbGUsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2xpY2UgfSBmcm9tICcuL1NsaWNlJztcblxuLyoqXG4gKiBUaGlzIGB0b2RvRmFjdG9yeWAgY29kZSB3aWxsIGJlIHVzZWQgdG8gaWxsdXN0cmF0ZSB0aGUgQVBJIGV4YW1wbGVzLiAgVGhlIGZvbGxvd2luZ1xuICogdXRpbGl0aWVzIGFyZSB1c2VkIGluIHRoZSB0ZXN0cyBhbmQgdGhlIEFQSSBUeXBlZG9jIGV4YW1wbGVzIGNvbnRhaW5lZCBoZXJlLlxuICogQGV4YW1wbGUgVXRpbGl0aWVzIGZvciBBUEkgRXhhbXBsZXNcbmBgYFxuZXhwb3J0IGNvbnN0IGVudW0gVG9kb1NsaWNlRW51bSB7XG4gIENPTVBMRVRFID0gXCJDb21wbGV0ZVwiLFxuICBJTkNPTVBMRVRFID0gXCJJbmNvbXBsZXRlXCJcbn1cblxuZXhwb3J0IGNsYXNzIFRvZG8ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcGxldGU6IGJvb2xlYW4sIHB1YmxpYyB0aXRsZTogc3RyaW5nLHB1YmxpYyBnaWQ/OnN0cmluZywgcHVibGljIGlkPzpzdHJpbmcpIHt9XG59XG5cbmV4cG9ydCBsZXQgdG9kb3MgPSBbbmV3IFRvZG8oZmFsc2UsIFwiWW91IGNvbXBsZXRlIG1lIVwiKSwgbmV3IFRvZG8odHJ1ZSwgXCJZb3UgY29tcGxldGVkIG1lIVwiKV07XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2Rvc0ZhY3RvcnkoKTpUb2RvW10ge1xuICByZXR1cm4gW25ldyBUb2RvKGZhbHNlLCBcIllvdSBjb21wbGV0ZSBtZSFcIiksIG5ldyBUb2RvKHRydWUsIFwiWW91IGNvbXBsZXRlZCBtZSFcIildO1xufVxuIGBgYCBcbiAqL1xuXG5leHBvcnQgY2xhc3MgRVN0b3JlPEU+IGV4dGVuZHMgQWJzdHJhY3RTdG9yZTxFPiB7XG4gIC8qKlxuICAgKiBTdG9yZSBjb25zdHJ1Y3RvciAoSW5pdGlhbGl6YXRpb24gd2l0aCBlbGVtZW50IGlzIG9wdGlvbmFsKVxuICAgKlxuICAgKiBwZXJmb3JtIGluaXRpYWwgbm90aWZpY2F0aW9uIHRvIGFsbCBvYnNlcnZlcnMsXG4gICAqIHN1Y2ggdGhhdCBmdW5jdGlvbiBsaWtlIHtAbGluayBjb21iaW5lTGF0ZXN0fXt9XG4gICAqIHdpbGwgZXhlY3V0ZSBhdCBsZWFzdCBvbmNlLlxuICAgKiBAcGFyYW0gZW50aXRpZXNcbiAgICogQGV4YW1wbGUgRHluYW1pYyBgRVN0b3JlPFRvZG8+YCBDcmVhdGlvbiBcbmBgYFxuLy8gSW5pdGlhbGl6ZSB0aGUgU3RvcmVcbmxldCBzdG9yZTogRVN0b3JlPFRvZG8+ID0gbmV3IEVTdG9yZTxUb2RvPih0b2Rvc0ZhY3RvcnkoKSk7XG5gYGAqL1xuICBjb25zdHJ1Y3RvcihlbnRpdGllczogRVtdID0gW10sIGNvbmZpZz86IFN0b3JlQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLklOVElBTElaRSwgZW50cmllczogZW50aXRpZXMgfTtcbiAgICB0aGlzLnBvc3QoZW50aXRpZXMpXG4gICAgdGhpcy5ub3RpZnlEZWx0YS5uZXh0KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBjb21wbGV0ZSBvbiBhbGwge0BsaW5rIEJlaGF2aW9yU3ViamVjdH0gaW5zdGFuY2VzLlxuICAgKiBcbiAgICogQ2FsbCBkZXN0cm95IHdoZW4gZGlzcG9zaW5nIG9mIHRoZSBzdG9yZS5cbiAgICovXG4gIG92ZXJyaWRlIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpXG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLmNvbXBsZXRlKClcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5jb21wbGV0ZSgpXG4gICAgdGhpcy5zbGljZXMuZm9yRWFjaChzbGljZSA9PiBzbGljZS5kZXN0cm95KCkpXG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZW50aXR5OlxuICAgKiBcbiAgICogSWYgdGhlIHN0b3JlIGNvbnRhaW5zIHRoZSBlbnRpdHlcbiAgICogaXQgd2lsbCBiZSBkZWxldGVkLiAgSWYgdGhlIHN0b3JlIFxuICAgKiBkb2VzIG5vdCBjb250YWlucyB0aGUgZW50aXR5LFxuICAgKiBpdCBpcyBhZGRlZC5cbiAgICogQHBhcmFtIGUgXG4gICAqIEBleGFtcGxlIFRvZ2dsZSB0aGUgYFRvZG9gIGluc3RhbmNlXG5gYGBcbmVzdG9yZS5wb3N0KHRvZG8pO1xuLy8gUmVtb3ZlIHRvZG9cbmVzdG9yZS50b2dnbGUodG9kbyk7XG4vLyBBZGQgaXQgYmFja1xuZXN0b3JlLnRvZ2dsZSh0b2RvKTtcblxuYGBgXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5kZWxldGUoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlBY3RpdmUgPSBuZXcgUmVwbGF5U3ViamVjdDxNYXA8c3RyaW5nLCBFPj4oMSk7XG5cblxuICAvKipcbiAgICogYE1hcGAgb2YgYWN0aXZlIGVudHRpZXMuIFRoZSBpbnN0YW5jZSBpcyBwdWJsaWMgYW5kIGNhbiBiZSB1c2VkXG4gICAqIGRpcmVjdGx5IHRvIGFkZCBhbmQgcmVtb3ZlIGFjdGl2ZSBlbnRpdGllcywgaG93ZXZlciB3ZSByZWNvbW1lbmRcbiAgICogdXNpbmcgdGhlIHtAbGluayBhZGRBY3RpdmV9IGFuZCB7QGxpbmsgZGVsZXRlQWN0aXZlfSBtZXRob2RzLlxuICAgKi9cbiAgcHVibGljIGFjdGl2ZTogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEFkZCBtdWx0aXBsZSBlbnRpdHkgZW50aXRpZXMgdG8gYWN0aXZlLlxuICAgKiBcbiAgICogSWYgdGhlIGVudGl0eSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBzdG9yZSBpdCBpcyBhZGRlZFxuICAgKiB0byB0aGUgc3RvcmUgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIGBhY3RpdmVgLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIEFkZCBhIGB0b2RvMWAgYW5kIGB0b2RvMmAgYXMgYWN0aXZlXG5gYGBcbmFkZEFjdGl2ZSh0b2RvMSk7XG5hZGRBY3RpdmUodG9kbzIpO1xuYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQWN0aXZlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5hY3RpdmUuc2V0KCg8YW55PmUpLmdpZCwgZSk7XG4gICAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnBvc3QoZSk7XG4gICAgICB0aGlzLmFjdGl2ZS5zZXQoKDxhbnk+ZSkuZ2lkLCBlKTtcbiAgICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZW50aXR5IGFzIGFjdGl2ZS5cbiAgICogXG4gICAqIEFsc28gd2UgY2xvbmUgdGhlIG1hcCBwcmlvciB0byBicm9hZGNhc3RpbmcgaXQgd2l0aFxuICAgKiBgbm90aWZ5QWN0aXZlYCB0byBtYWtlIHN1cmUgd2Ugd2lsbCB0cmlnZ2VyIEFuZ3VsYXIgXG4gICAqIGNoYW5nZSBkZXRlY3Rpb24gaW4gdGhlIGV2ZW50IHRoYXQgaXQgbWFpbnRhaW5zIFxuICAgKiBhIHJlZmVyZW5jZSB0byB0aGUgYGFjdGl2ZWAgc3RhdGUgYE1hcGAgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBNYXJrIGEgYHRvZG9gIGluc3RhbmNlIGFzIGFjdGl2ZVxuICBgYGBcbmRlbGV0ZUFjdGl2ZSh0b2RvMSk7XG5kZWxldGVBY3RpdmUodG9kbzIpO1xuICBgYGBcbiAgICovXG4gIHB1YmxpYyBkZWxldGVBY3RpdmUoZTogRSkge1xuICAgIHRoaXMuYWN0aXZlLmRlbGV0ZSgoPGFueT5lKS5naWQpO1xuICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIC8gcmVzZXQgdGhlIGFjdGl2ZSBlbnRpdHkgbWFwLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIE1hcmsgYSBgdG9kb2AgaW5zdGFuY2UgYXMgYWN0aXZlXG4gIGBgYFxuZGVsZXRlQWN0aXZlKHRvZG8xKTtcbmRlbGV0ZUFjdGl2ZSh0b2RvMik7XG4gIGBgYFxuICAgKi9cbiAgY2xlYXJBY3RpdmUoKSB7XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHRoZSBhY3RpdmUgZW50aXR5LlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBhY3RpdmUkID0gc291cmNlLm9ic2VydmVBY3RpdmUoKTtcbiAgICA8L3ByZT5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5QWN0aXZlLmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgYWN0aXZlIGVudGl0eS5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgYWN0aXZlJCA9IHNvdXJjZS5hY3RpdmVTbmFwc2hvdCgpO1xuICAgIDwvcHJlPlxuICAqL1xuICAgIHB1YmxpYyBhY3RpdmVTbmFwc2hvdCgpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlLnZhbHVlcygpKVxuICB9XG5cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMT0FESU5HXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIGxvYWQgcmVxdWVzdC5cbiAgICogXG4gICAqIFRoZSBlcnJvciBPYnNlcnZhYmxlIHNob3VsZCBiZSBjcmVhdGVkIGJ5IHRoZSBcbiAgICogY2xpZW50LlxuICAgKi9cbiAgcHVibGljIGxvYWRpbmdFcnJvciE6IE9ic2VydmFibGU8YW55PjtcblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGxvYWRpbmcuXG4gICAqIFxuICAgKiBUaGlzIGlzIGEgY29tbW9uIHBhdHRlcm4gZm91bmQgd2hlbiBpbXBsZW1lbnRpbmdcbiAgICogYE9ic2VydmFibGVgIGRhdGEgc291cmNlcy5cbiAgICovXG4gIHByaXZhdGUgbm90aWZ5TG9hZGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBsb2FkaW5nIHN0YXRlLiAgVXNlIGxvYWRpbmcgd2hlbiBmZXRjaGluZyBuZXdcbiAgICogZGF0YSBmb3IgdGhlIHN0b3JlLiAgVGhlIGRlZmF1bHQgbG9hZGluZyBzdGF0ZSBpcyBgdHJ1ZWAuXG4gICAqIFxuICAgKiBUaGlzIGlzIHN1Y2ggdGhhdCBpZiBkYXRhIGlzIGZldGNoZWQgYXN5bmNocm9ub3VzbHkgXG4gICAqIGluIGEgc2VydmljZSwgY29tcG9uZW50cyBjYW4gd2FpdCBvbiBsb2FkaW5nIG5vdGlmaWNhdGlvblxuICAgKiBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBkYXRhIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqXG4gICAqIExvYWRpbmcgY291bGQgYmUgYmFzZWQgb24gYSBjb21wb3NpdGUgcmVzcG9uc2UuICBGb3IgZXhhbXBsZVxuICAgKiB3aGVuIHRoZSBzdG9jayBhbmQgbXV0dWFsIGZ1bmRzIGhhdmUgbG9hZGVkLCBzZXQgbG9hZGluZyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgbG9hZGluZyBzdGF0ZSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzLlxuICAgKi9cbiAgc2V0IGxvYWRpbmcobG9hZGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX2xvYWRpbmcgPSBsb2FkaW5nO1xuICAgIHRoaXMubm90aWZ5TG9hZGluZy5uZXh0KHRoaXMuX2xvYWRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBvZiB0aGUgbG9hZGluZyBzdGF0ZS5cbiAgICovXG4gIGdldCBsb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgbG9hZGluZy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgbG9hZGluZyQgPSBzb3VyY2Uub2JzZXJ2ZUxvYWRpbmcoKTtcbiAgICA8L3ByZT5cblxuICAgIE5vdGUgdGhhdCB0aGlzIG9idmVyYWJsZSBwaXBlZCB0aHJvdWdoXG4gICAgYHRha2VXaGlsZSh2LT52LCB0cnVlKSwgc3VjaCB0aGF0IGl0IHdpbGwgXG4gICAgY29tcGxldGUgYWZ0ZXIgZWFjaCBlbWlzc2lvbi5cblxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuXG4gICAgRm9yIG1vcmUgZGV0YWlscy5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVMb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm5vdGlmeUxvYWRpbmcuYXNPYnNlcnZhYmxlKCkuXG4gICAgICBwaXBlKHRha2VXaGlsZSh2ID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIGxvYWRpbmcgaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvYnNlcnZlTG9hZGluZ0NvbXBsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVMb2FkaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcihsb2FkaW5nID0+IGxvYWRpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKSlcbiAgfVxuXG5cblxuXG5cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTRUFSQ0hJTkdcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIHNlYXJjaCByZXF1ZXN0LlxuICAgKiBcbiAgICogVGhlIGVycm9yIE9ic2VydmFibGUgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhlIFxuICAgKiBjbGllbnQuXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoRXJyb3IhOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0IGEgc2VhcmNoIGlzIGluIHByb2dyZXNzLlxuICAgKiBcbiAgICogVGhpcyBpcyBhIGNvbW1vbiBwYXR0ZXJuIGZvdW5kIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIGBPYnNlcnZhYmxlYCBkYXRhIHNvdXJjZXMuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeVNlYXJjaGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBgc2VhcmNoaW5nYCBzdGF0ZS4gIFVzZSBgc2VhcmNoaW5nYFxuICAgKiBmb3IgZXhhbXBsZSB0byBkaXNwbGF5IGEgc3Bpbm5uZXIgXG4gICAqIHdoZW4gcGVyZm9ybWluZyBhIHNlYXJjaC4gIFxuICAgKiBUaGUgZGVmYXVsdCBgc2VhcmNoaW5nYCBzdGF0ZSBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhcmNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc2VhcmNoaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgc2VhcmNoaW5nKHNlYXJjaGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlYXJjaGluZyA9IHNlYXJjaGluZztcbiAgICB0aGlzLm5vdGlmeVNlYXJjaGluZy5uZXh0KHRoaXMuX3NlYXJjaGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBzZWFyY2hpbmcgc3RhdGUuXG4gICAqL1xuICBnZXQgc2VhcmNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBzZWFyY2hpbmcuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHNlYXJjaGluZyQgPSBzb3VyY2Uub2JzZXJ2ZVNlYXJjaGluZygpO1xuICAgIDwvcHJlPlxuICBcbiAgICBOb3RlIHRoYXQgdGhpcyBvYnZlcmFibGUgcGlwZWQgdGhyb3VnaFxuICAgIGB0YWtlV2hpbGUodi0+diwgdHJ1ZSksIHN1Y2ggdGhhdCBpdCB3aWxsIFxuICAgIGNvbXBsZXRlIGFmdGVyIGVhY2ggZW1pc3Npb24uXG4gIFxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuICBcbiAgICBGb3IgbW9yZSBkZXRhaWxzLlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZVNlYXJjaGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlTZWFyY2hpbmcuYXNPYnNlcnZhYmxlKCkuXG4gICAgICBwaXBlKHRha2VXaGlsZSh2ID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIHNlYXJjaGluZyBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG9ic2VydmVTZWFyY2hpbmdDb21wbGV0ZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlU2VhcmNoaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcihzZWFyY2hpbmcgPT4gc2VhcmNoaW5nID09IGZhbHNlKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBvZih0cnVlKSkpXG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgc2xpY2VzXG4gICAqL1xuICBwcml2YXRlIHNsaWNlczogTWFwPHN0cmluZywgU2xpY2U8RT4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc2xpY2UgdG8gdGhlIHN0b3JlIGFuZCBrZXlzIGl0IGJ5IHRoZSBzbGljZXMgbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSBwXG4gICAqIEBwYXJhbSBsYWJlbFxuICAgKiBcbiAgICogQGV4YW1wbGUgU2V0dXAgYSBUb2RvIFNsaWNlIGZvciBDT01QTEVURSBUb2Rvc1xuYGBgXG5zb3VyY2UuYWRkU2xpY2UodG9kbyA9PiB0b2RvLmNvbXBsZXRlLCBUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgYWRkU2xpY2UocDogUHJlZGljYXRlPEU+LCBsYWJlbDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2xpY2U6IFNsaWNlPEU+ID0gbmV3IFNsaWNlKFxuICAgICAgbGFiZWwsXG4gICAgICBwLFxuICAgICAgdGhpcylcbiAgICB0aGlzLnNsaWNlcy5zZXQoc2xpY2UubGFiZWwsIHNsaWNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHNsaWNlXG4gICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgaWRlbnRpZnlpbmcgdGhlIHNsaWNlXG4gICAqIFxuICAgKiBAZXhhbXBsZSBSZW1vdmUgdGhlIFRvZG9TbGljZXMuQ09NUExFVEUgU2xpY2VcbmBgYFxuc291cmNlLnJlbW92ZVNsaWNlKFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICByZW1vdmVTbGljZShsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zbGljZXMuZGVsZXRlKGxhYmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzbGljZVxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIGlkZW50aWZ5aW5nIHRoZSBzbGljZVxuICAgKiBAcmV0dXJuIFRoZSBTbGljZSBpbnN0YW5jZSBvciB1bmRlZmluZWQgXG4gICAqIFxuICAgKiBAZXhhbXBsZSBHZXQgdGhlIFRvZG9TbGljZXMuQ09NUExFVEUgc2xpY2VcbmBgYFxuc291cmNlLmdldFNsaWNlKFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICBnZXRTbGljZShsYWJlbDogc3RyaW5nKTogU2xpY2U8RT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNsaWNlcy5nZXQobGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgKEFkZCBhIG5ldykgZWxlbWVudChzKSB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBlIEFuIGluZGlpZHVhbCBlbnRpdHkgb3IgYW4gYXJyYXkgb2YgZW50aXRpZXNcbiAgICogQGV4YW1wbGUgUG9zdCBhIGB0b2RvYC5cbmBgYFxuc3RvcmUucG9zdCh0b2RvKTtcbmBgYFxuICAgKi9cbiAgcG9zdChlOiBFIHwgRVtdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBjb25zdCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgICA/ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgIDogR1VJRCgpO1xuICAgICAgKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV0gPSBndWlkO1xuICAgICAgdGhpcy5lbnRyaWVzLnNldChndWlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMucG9zdChlKTtcbiAgICAgIH0pO1xuICAgICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnBvc3RBKGUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgZWxlbWVudHMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQb3N0IHR3byBgVG9kb2AgaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5wb3N0KHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIHBvc3ROKC4uLmU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgID8gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgOiBHVUlEKCk7XG4gICAgICAoPGFueT5lKVt0aGlzLkdVSURfS0VZXSA9IGd1aWQ7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGd1aWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgIH0pO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnBvc3RBKGUpO1xuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgKEFkZCkgYW4gYXJyYXkgb2YgZWxlbWVudHMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBQb3N0IGEgYFRvZG9gIGFycmF5LlxuYGBgXG5zdG9yZS5wb3N0KFt0b2RvMSwgdG9kbzJdKTtcbmBgYFxuICAgKi9cbiAgcG9zdEEoZTogRVtdKSB7XG4gICAgdGhpcy5wb3N0TiguLi5lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgKFVwZGF0ZSkgYW4gZWxlbWVudC5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgUHV0IGEgVG9kbyBpbnN0YW5jZS5cbmBgYFxuc3RvcmUucHV0KHRvZG8xKTtcbmBgYFxuICAgKi9cbiAgcHV0KGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIGxldCBpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICAgIHRoaXMubm90aWZ5Lm5leHQodik7XG4gICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBVVCwgZW50cmllczogW2VdIH07XG4gICAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5wdXQoZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnB1dEEoZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIGFuIGVsZW1lbnQgb3IgYWRkIGFuIGVsZW1lbnQgdGhhdCB3YXMgcmVhZCBmcm9tIGEgcGVyc2lzdGVuY2Ugc291cmNlXG4gICAqIGFuZCB0aHVzIGFscmVhZHkgaGFzIGFuIGFzc2lnbmVkIGdsb2JhbCBpZGAuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUucHV0KHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIHB1dE4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5wdXRBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCAoVXBkYXRlKSB0aGUgYXJyYXkgb2YgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUucHV0KFt0b2RvMSwgdG9kbzJdKTtcbmBgYFxuICAgKi9cbiAgcHV0QShlOiBFW10pIHtcbiAgICBlLmZvckVhY2goZSA9PiB7XG4gICAgICBsZXQgZ3VpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgIHRoaXMuZW50cmllcy5zZXQoZ3VpZCwgZSlcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIHRoaXMubm90aWZ5Lm5leHQodik7XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QVVQsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnB1dEEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgRGVsZXRlIHRvZG8xLlxuYGBgXG5zdG9yZS5kZWxldGUodG9kbzFdKTtcbmBgYFxuICAgKi9cbiAgZGVsZXRlKGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZW50cmllcy5kZWxldGUoZ3VpZCk7XG4gICAgICB9KTtcbiAgICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZGVsZXRlKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5kZWxldGVBKGUpXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIE4gZWxlbWVudHMuXG4gICAqIEBwYXJhbSAuLi5lXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIGRlbGV0ZU4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5kZWxldGVBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBOIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQdXQgVG9kbyBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMSwgdG9kbzIpO1xuYGBgXG4gICAqL1xuICBkZWxldGVBKGU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZW50cmllcy5kZWxldGUoZ3VpZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGVsZW1lbnRzIGJ5IHtAbGluayBQcmVkaWNhdGV9LlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlLlxuICAgKiBAZXhhbXBsZSBQdXQgVG9kbyBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMSwgdG9kbzIpO1xuYGBgXG4gICAqL1xuICBkZWxldGVQKHA6IFByZWRpY2F0ZTxFPikge1xuICAgIGNvbnN0IGQ6IEVbXSA9IFtdO1xuICAgIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5mb3JFYWNoKGUgPT4ge1xuICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgZC5wdXNoKGUpO1xuICAgICAgICBjb25zdCBpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGVudGl0eSBoYXMgdGhlIGBpZGAga2V5IGluaXRpYWxpemVkIHdpdGggYSB2YWx1ZSxcbiAgICogdGhlbiBhbHNvIGFkZCB0aGUgZW50aXR5IHRvIHRoZSBgaWRFbnRyaWVzYC5cbiAgICpcbiAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVJREVudHJ5KGU6IEUpIHtcbiAgICBpZiAoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKSB7XG4gICAgICB0aGlzLmlkRW50cmllcy5zZXQoKDxhbnk+ZSlbdGhpcy5JRF9LRVldLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGVudGl0eSBoYXMgdGhlIGBpZGAga2V5IGluaXRpYWxpemVkIHdpdGggYSB2YWx1ZSxcbiAgICogdGhlbiBhbHNvIGRlbGV0ZSB0aGUgZW50aXR5IHRvIHRoZSBgaWRFbnRyaWVzYC5cbiAgICpcbiAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVJREVudHJ5KGU6IEUpIHtcbiAgICBpZiAoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKSB7XG4gICAgICB0aGlzLmlkRW50cmllcy5kZWxldGUoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZSBhbmQgYWxsIGNvbnRhaW5lZCBzbGljZSBpbnN0YW5jZXMgdG8gZW1wdHkuXG4gICAqIEFsc28gcGVyZm9ybSBkZWx0YSBub3RpZmljYXRpb24gdGhhdCBzZW5kcyBhbGwgY3VycmVudCBzdG9yZSBlbnRyaWVzLlxuICAgKiBUaGUgQWN0aW9uVHlwZS5SRVNFVCBjb2RlIGlzIHNlbnQgd2l0aCB0aGUgZGVsdGEgbm90aWZpY2F0aW9uLiAgU2xpY2VzXG4gICAqIHNlbmQgdGhlaXIgb3duIGRlbHRhIG5vdGlmaWNhdGlvbi5cbiAgICogXG4gICAqIEBleGFtcGxlIFJlc2V0IHRoZSBzdG9yZS5cbmBgYFxuc3RvcmUucmVzZXQoKTtcbmBgYFxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0ge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUkVTRVQsXG4gICAgICBlbnRyaWVzOiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9O1xuICAgIHRoaXMubm90aWZ5QWxsKFtdLCBkZWx0YSk7XG4gICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnJlc2V0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhbGwgdGhlIG5vdGlmaWVycyBhdCBvbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gdlxuICAgKiBAcGFyYW0gZGVsdGFcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBub3RpZnlBbGwodjogRVtdLCBkZWx0YTogRGVsdGE8RT4pIHtcbiAgICBzdXBlci5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIHRoaXMubm90aWZ5TG9hZGluZy5uZXh0KHRoaXMubG9hZGluZyk7XG4gIH1cbn0iXX0=
|