@ngrx-traits/core 18.4.2 → 19.0.0-beta.2

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.
@@ -1,428 +0,0 @@
1
- import { combineReducers, createFeatureSelector, createReducer, createSelector, } from '@ngrx/store';
2
- import { capitalize, setPropertiesReducer } from './util';
3
- /**
4
- * Creates a function that when execute will combine all the traits, and return a EntityFeatureFactory
5
- * which combines all the traits actions, selectors , reducers and effects,
6
- * the names param will replace any action and selector with the word Entity or Entities,
7
- * with the corresponding entityName and entitiesName param (entityName+'s' if entitiesName is omitted).
8
- * @param namesConfig - Optional Names for entities
9
- * @param namesConfig.entityName - singular name for entity
10
- * @param [namesConfig.entitiesName] - plural name for entities, defaults to entityName + 's'
11
- * @param traits set of traits to be combined
12
- *
13
- * @example
14
- *
15
- * const featureFactory = createEntityFeatureFactory(
16
- * { entityName: 'product' },
17
- * addLoadEntitiesTrait<Product>(),
18
- * addSelectEntityTrait<Product>(),
19
- * addAsyncActionTrait({
20
- * name: 'checkout',
21
- * actionSuccessProps: props<{ orderId: string }>(),
22
- * })
23
- * );
24
- *
25
- * export const productsFeature = featureFactory({
26
- * actionsGroupKey: '[Products]',
27
- * featureSelector: 'products',
28
- * });
29
- */
30
- export function createEntityFeatureFactory(namesOrFactory, ...traits) {
31
- return ((config) => {
32
- const { entityName, entitiesName } = 'entityName' in namesOrFactory
33
- ? namesOrFactory
34
- : { entityName: 'Entity', entitiesName: 'Entities' };
35
- const singular = capitalize(entityName);
36
- const plural = entitiesName
37
- ? capitalize(entitiesName)
38
- : capitalize(entityName + 's');
39
- const sortedTraits = sortTraits('entityName' in namesOrFactory ? [...traits] : [namesOrFactory, ...traits]);
40
- const allConfigs = buildAllConfigs(sortedTraits);
41
- const allActions = buildAllActions(sortedTraits, config.actionsGroupKey, singular, plural, allConfigs);
42
- const allSelectors = buildAllSelectors(sortedTraits, allConfigs);
43
- const allMutators = buildAllMutators(sortedTraits, allSelectors, allConfigs);
44
- const initialState = buildInitialState(sortedTraits, allConfigs);
45
- const reducer = buildReducer(sortedTraits, initialState, allActions, allSelectors, allMutators, allConfigs);
46
- const featureSelector = typeof config.featureSelector === 'string'
47
- ? createFeatureSelector(config.featureSelector)
48
- : config.featureSelector;
49
- const allFeatureSelectors = allSelectors && getSelectorsForFeature(featureSelector, allSelectors);
50
- const allEffects = buildAllEffects(sortedTraits, allActions, allFeatureSelectors, allConfigs);
51
- return {
52
- actions: entityName
53
- ? renameProps(allActions, singular, plural)
54
- : allActions,
55
- selectors: entityName
56
- ? renameProps(allFeatureSelectors, singular, plural)
57
- : allSelectors,
58
- initialState,
59
- reducer: reducer ?? createReducer(initialState),
60
- effects: allEffects,
61
- };
62
- });
63
- }
64
- function renameProps(target, entityName, entitiesName) {
65
- const result = {};
66
- for (const [key, value] of Object.entries(target)) {
67
- const newKey = key
68
- .replace('Entities', entitiesName)
69
- .replace('Entity', entityName);
70
- result[newKey] = value;
71
- }
72
- return result;
73
- }
74
- function sortTraits(traits) {
75
- const sortedTraits = [];
76
- for (let i = 0; i < traits.length; i++) {
77
- const trait = traits[i];
78
- if (!trait.depends?.length) {
79
- sortedTraits.push(trait);
80
- continue;
81
- }
82
- if (trait.depends.length > 1)
83
- for (const d of trait.depends) {
84
- const isTraitPresent = traits.some((tr) => tr.key === d);
85
- if (isTraitPresent) {
86
- trait.depends = [d];
87
- break;
88
- }
89
- }
90
- if (trait.depends.length > 1)
91
- throw Error('could not find dependencies ' + trait.depends.join(' '));
92
- const isDependencyAlreadyAdded = sortedTraits.some((tr) => tr.key === trait?.depends?.[0]);
93
- if (isDependencyAlreadyAdded)
94
- sortedTraits.push(trait);
95
- else {
96
- // move trait to the end
97
- delete traits[i];
98
- traits.push(trait);
99
- }
100
- }
101
- return sortedTraits;
102
- }
103
- function buildAllConfigs(sortedTraits) {
104
- return sortedTraits.reduce((acc, factory) => {
105
- acc[factory.key] = factory.config;
106
- return acc;
107
- }, {});
108
- }
109
- function buildAllActions(sortedTraits, actionsGroupKey, entityName, entitiesName, allConfigs) {
110
- return sortedTraits.reduce((previousResult, factory) => {
111
- let result = factory?.actions?.({
112
- actionsGroupKey: actionsGroupKey,
113
- entityName,
114
- entitiesName,
115
- allConfigs,
116
- }) ?? {};
117
- result = previousResult ? { ...previousResult, ...result } : result;
118
- return result;
119
- }, {});
120
- }
121
- function buildAllSelectors(sortedTraits, allConfigs) {
122
- return sortedTraits.reduce((previousResult, factory) => {
123
- let result = factory?.selectors?.({
124
- previousSelectors: previousResult,
125
- allConfigs,
126
- }) ?? {};
127
- result = previousResult ? { ...previousResult, ...result } : result;
128
- return result;
129
- }, {});
130
- }
131
- function buildAllMutators(sortedTraits, allSelectors, allConfigs) {
132
- return (sortedTraits.reduce((previousResult, factory) => {
133
- let result = factory?.mutators?.({
134
- allSelectors: allSelectors,
135
- previousMutators: previousResult,
136
- allConfigs,
137
- }) ?? {};
138
- result = previousResult ? { ...previousResult, ...result } : result;
139
- return result;
140
- }, {}) || {});
141
- }
142
- function buildInitialState(sortedTraits, allConfigs) {
143
- return sortedTraits.reduce((previousResult, factory) => {
144
- const result = factory?.initialState?.({
145
- previousInitialState: previousResult,
146
- allConfigs,
147
- }) ??
148
- previousResult ??
149
- {};
150
- return result;
151
- }, {});
152
- }
153
- function buildReducer(sortedTraits, initialState, allActions, allSelectors, allMutators, allConfigs) {
154
- return sortedTraits.reduce((previousResult, factory) => {
155
- const result = factory?.reducer?.({
156
- initialState,
157
- allActions,
158
- allSelectors,
159
- allMutators,
160
- allConfigs,
161
- });
162
- return result && previousResult
163
- ? (state = initialState, action) => {
164
- const aState = previousResult(state, action);
165
- return result(aState, action);
166
- }
167
- : result ?? previousResult;
168
- }, undefined);
169
- }
170
- function buildAllEffects(sortedTraits, allActions, allFeatureSelectors, allConfigs) {
171
- return sortedTraits.reduce((previousResult, factory) => {
172
- let result = factory?.effects?.({
173
- allActions,
174
- allSelectors: allFeatureSelectors,
175
- allConfigs,
176
- }) ?? [];
177
- result = previousResult ? [...previousResult, ...result] : result;
178
- return result;
179
- }, []);
180
- }
181
- function getSelectorsForFeature(featureSelect, selectors) {
182
- const ss = {};
183
- for (const prop in selectors) {
184
- ss[prop] = createSelector(featureSelect, selectors[prop]);
185
- }
186
- return ss;
187
- }
188
- /**
189
- * Combine a map entityFeatureFactories into one,
190
- * grouping the actions and selectors by the key of the respective entityFeatureFactory
191
- * @param traitFactoriesMap
192
- *
193
- * @example
194
- *
195
- * const clientsFeatureFactory = createEntityFeatureFactory(
196
- * { entityName: 'client', entitiesName: 'clients' },
197
- * addLoadEntitiesTrait<Client>(),
198
- * addCrudEntitiesTrait<Client>()
199
- * );
200
- *
201
- * const productOrderFeatureFactory = createEntityFeatureFactory(
202
- * { entityName: 'productOrder' },
203
- * addLoadEntitiesTrait<ProductOrder>(),
204
- * addSelectEntitiesTrait<ProductOrder>()
205
- * );
206
- *
207
- * const productFeatureFactory = createEntityFeatureFactory(
208
- * { entityName: 'product' },
209
- * addLoadEntitiesTrait<Product>(),
210
- * addSelectEntitiesTrait<Product>()
211
- * );
212
- *
213
- * const productCombinedFactory = combineEntityFeatures({
214
- * products: productFeatureFactory,
215
- * productOrders: productOrderFeatureFactory,
216
- * clients: clientsFeatureFactory,
217
- * });
218
- *
219
- * const combinedFeature = productCombinedFactory({
220
- * actionsGroupKey: '[Combined]',
221
- * featureSelector: 'combined',
222
- * });
223
- *
224
- * combinedFeature.actions.client.loadClients();
225
- * combinedFeature.actions.product.loadProducts();
226
- */
227
- export function combineEntityFeatures(traitFactoriesMap) {
228
- return ((config) => {
229
- const featureSelector = typeof config.featureSelector === 'string'
230
- ? createFeatureSelector(config.featureSelector)
231
- : config.featureSelector;
232
- const actions = {};
233
- const selectors = {};
234
- const reducers = {};
235
- let effects = [];
236
- for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
237
- const selector = createSelector(featureSelector, (state) => state[key]);
238
- const featureTraits = entityFeatureFactory({
239
- actionsGroupKey: config.actionsGroupKey,
240
- featureSelector: selector,
241
- });
242
- actions[key] = featureTraits.actions;
243
- selectors[key] = featureTraits.selectors;
244
- reducers[key] = featureTraits.reducer;
245
- effects = [...effects, ...featureTraits.effects];
246
- }
247
- return {
248
- actions,
249
- selectors,
250
- reducer: combineReducers(reducers),
251
- effects,
252
- };
253
- });
254
- }
255
- /**
256
- * Mix a map entityFeatureFactories into one, different from combine the actions and selectors a mix, not group by key like in combine, the keys are still use
257
- * internal in the reducers and selector to separate the state
258
- * @param traitFactoriesMap
259
- *
260
- * @example
261
- *
262
- * const clientsFeatureFactory = createEntityFeatureFactory(
263
- * { entityName: 'client', entitiesName: 'clients' },
264
- * addLoadEntitiesTrait<Client>(),
265
- * addCrudEntitiesTrait<Client>()
266
- * );
267
- *
268
- * const productOrderFeatureFactory = createEntityFeatureFactory(
269
- * { entityName: 'productOrder' },
270
- * addLoadEntitiesTrait<ProductOrder>(),
271
- * addSelectEntitiesTrait<ProductOrder>()
272
- * );
273
- *
274
- * const productFeatureFactory = createEntityFeatureFactory(
275
- * { entityName: 'product' },
276
- * addLoadEntitiesTrait<Product>(),
277
- * addSelectEntitiesTrait<Product>()
278
- * );
279
- *
280
- * const productMixedFactory = mixEntityFeatures({
281
- * products: productFeatureFactory,
282
- * productOrders: productOrderFeatureFactory,
283
- * clients: clientsFeatureFactory,
284
- * });
285
- *
286
- * const mixedFeature = productMixedFactory({
287
- * actionsGroupKey: '[Mixed]',
288
- * featureSelector: 'mixed',
289
- * });
290
- * mixedFeature.actions.loadClients();
291
- * mixedFeature.actions.loadProducts();
292
- *
293
- */
294
- export function mixEntityFeatures(traitFactoriesMap) {
295
- return ((config) => {
296
- const featureSelector = typeof config.featureSelector === 'string'
297
- ? createFeatureSelector(config.featureSelector)
298
- : config.featureSelector;
299
- let actions = {};
300
- let selectors = {};
301
- const reducers = {};
302
- let effects = [];
303
- for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
304
- const selector = createSelector(featureSelector, (state) => state[key]);
305
- const featureTraits = entityFeatureFactory({
306
- actionsGroupKey: config.actionsGroupKey,
307
- featureSelector: selector,
308
- });
309
- actions = { ...actions, ...featureTraits.actions };
310
- selectors = { ...selectors, ...featureTraits.selectors };
311
- reducers[key] = featureTraits.reducer;
312
- effects = [...effects, ...featureTraits.effects];
313
- }
314
- return {
315
- actions,
316
- selectors,
317
- reducer: combineReducers(reducers),
318
- effects,
319
- };
320
- });
321
- }
322
- /**
323
- * Combines targetTraitFactory with the traitFactoriesMap using the keys as props for the targetTraitFactory state,
324
- * and grouping the combined actions by key
325
- * @param targetTraitFactory
326
- * @param traitFactoriesMap
327
- *
328
- * @example
329
- *
330
- * const clientsFeatureFactory = createEntityFeatureFactory(
331
- * { entityName: 'client', entitiesName: 'clients' },
332
- * addLoadEntitiesTrait<Client>(),
333
- * addCrudEntitiesTrait<Client>()
334
- * );
335
- *
336
- * const productOrderFeatureFactory = createEntityFeatureFactory(
337
- * { entityName: 'productOrder' },
338
- * addLoadEntitiesTrait<ProductOrder>(),
339
- * addSelectEntitiesTrait<ProductOrder>()
340
- * );
341
- *
342
- * const productFeatureFactory = createEntityFeatureFactory(
343
- * { entityName: 'product' },
344
- * addLoadEntitiesTrait<Product>(),
345
- * addSelectEntitiesTrait<Product>()
346
- * );
347
- *
348
- * const productAddEntityPropertiesFactory = addEntityFeaturesProperties(
349
- * productFeatureFactory,
350
- * {
351
- * productOrders: productOrderFeatureFactory,
352
- * clients: clientsFeatureFactory,
353
- * }
354
- * );
355
- *
356
- * const combinedFeature = productAddEntityPropertiesFactory({
357
- * actionsGroupKey: '[addEntityFeatures]',
358
- * featureSelector: 'addEntityFeatures',
359
- * });
360
- *
361
- * combinedFeature.actions.loadProducts();
362
- * combinedFeature.actions.clients.loadClients();
363
- * combinedFeature.actions.productOrders.loadProductOrders();
364
- */
365
- export function addEntityFeaturesProperties(targetTraitFactory, traitFactoriesMap) {
366
- return ((config) => {
367
- const featureSelector = typeof config.featureSelector === 'string'
368
- ? createFeatureSelector(config.featureSelector)
369
- : config.featureSelector;
370
- const targetFeatureTraits = targetTraitFactory({
371
- actionsGroupKey: config.actionsGroupKey,
372
- featureSelector: featureSelector,
373
- });
374
- const actions = { ...targetFeatureTraits.actions };
375
- const selectors = { ...targetFeatureTraits.selectors };
376
- const reducers = {};
377
- let effects = [...targetFeatureTraits.effects];
378
- for (const [key, entityFeatureFactory] of Object.entries(traitFactoriesMap)) {
379
- const selector = createSelector(featureSelector, (state) => state[key]);
380
- const featureTraits = entityFeatureFactory({
381
- actionsGroupKey: config.actionsGroupKey,
382
- featureSelector: selector,
383
- });
384
- actions[key] = featureTraits.actions;
385
- selectors[key] = featureTraits.selectors;
386
- reducers[key] = featureTraits.reducer;
387
- effects = [...effects, ...featureTraits.effects];
388
- }
389
- return {
390
- actions,
391
- selectors,
392
- reducer: setPropertiesReducer(targetFeatureTraits.reducer, reducers),
393
- effects,
394
- };
395
- });
396
- }
397
- /**
398
- * Helper function to create an implementation a TraitFactory
399
- * @param f TraitFactory implementation
400
- */
401
- export function createTraitFactory(f) {
402
- return f;
403
- }
404
- /**
405
- * Helper function to combine selectors in components as map
406
- *
407
- * @example
408
- *
409
- * view = combineSelectors({
410
- * products: ProductSelectors.selectProductsCurrentPage,
411
- * isLoading: ProductSelectors.isLoadingProductsCurrentPage,
412
- * selectedProduct: ProductSelectors.selectProductSelected,
413
- * isLoadingCheckout: ProductSelectors.isLoadingCheckout,
414
- * selectedSort: ProductSelectors.selectProductsSort,
415
- * filters: ProductSelectors.selectProductsFilter,
416
- * });
417
- * @param t
418
- */
419
- export function combineSelectors(t) {
420
- const selectors = Object.values(t);
421
- const keys = Object.keys(t);
422
- const projector = (...args) => keys.reduce((acc, key, index) => {
423
- acc[key] = args[index];
424
- return acc;
425
- }, {});
426
- return createSelector.apply(null, [...selectors, projector]);
427
- }
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWVudGl0eS1mZWF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRyYWl0cy9jb3JlL3NyYy9saWIvY3JlYXRlLWVudGl0eS1mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSxPQUFPLEVBR0wsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBR3JCLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFpRjFEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FLeEMsY0FFZ0IsRUFDaEIsR0FBRyxNQUFTO0lBUVosT0FBTyxDQUFDLENBQUMsTUFBd0IsRUFBRSxFQUFFO1FBQ25DLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQ2hDLFlBQVksSUFBSSxjQUFjO1lBQzVCLENBQUMsQ0FBRSxjQUdDO1lBQ0osQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFFekQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLFlBQVk7WUFDekIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7WUFDMUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFakMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUM3QixZQUFZLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQzNFLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFD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LENBQUM7UUFDdkIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBUyxDQUFDLENBQUM7SUFDaEIsT0FBUSxjQUFzQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWcsXG4gIEV4dHJhY3RBY3Rpb25zVHlwZSxcbiAgRXh0cmFjdFNlbGVjdG9yc1R5cGUsXG4gIEV4dHJhY3RTdGF0ZVR5cGUsXG4gIEVudGl0eUZlYXR1cmVGYWN0b3J5LFxuICBGZWF0dXJlU2VsZWN0b3JzLFxuICBLZXllZENvbmZpZyxcbiAgVHJhaXRBY3Rpb25zLFxuICBUcmFpdEZhY3RvcnksXG4gIFRyYWl0U2VsZWN0b3JzLFxuICBUcmFpdFN0YXRlTXV0YXRvcnMsXG4gIFVuaW9uVG9JbnRlcnNlY3Rpb24sXG4gIFRyYWl0QWN0aW9uc0ZhY3RvcnksXG4gIFRyYWl0U2VsZWN0b3JzRmFjdG9yeSxcbiAgVHJhaXRJbml0aWFsU3RhdGVGYWN0b3J5LFxuICBUcmFpdFN0YXRlTXV0YXRvcnNGYWN0b3J5LFxuICBUcmFpdFJlZHVjZXJGYWN0b3J5LFxuICBUcmFpdEVmZmVjdHNGYWN0b3J5LFxuICBBbGxUcmFpdENvbmZpZ3MsXG59IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgQWN0aW9uLFxuICBBY3Rpb25UeXBlLFxuICBjb21iaW5lUmVkdWNlcnMsXG4gIGNyZWF0ZUZlYXR1cmVTZWxlY3RvcixcbiAgY3JlYXRlUmVkdWNlcixcbiAgY3JlYXRlU2VsZWN0b3IsXG4gIE1lbW9pemVkU2VsZWN0b3IsXG59IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IFRyYWl0RWZmZWN0IH0gZnJvbSAnLi90cmFpdC1lZmZlY3QnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJy4vbG9jYWwtc3RvcmUnO1xuaW1wb3J0IHsgY2FwaXRhbGl6ZSwgc2V0UHJvcGVydGllc1JlZHVjZXIgfSBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdoZW4gZXhlY3V0ZSB3aWxsIGNvbWJpbmUgYWxsIHRoZSB0cmFpdHMsIGFuZCByZXR1cm4gYSBFbnRpdHlGZWF0dXJlRmFjdG9yeVxuICogd2hpY2ggY29tYmluZXMgYWxsIHRoZSB0cmFpdHMgYWN0aW9ucywgc2VsZWN0b3JzICwgcmVkdWNlcnMgYW5kIGVmZmVjdHMsXG4gKiB0aGUgbmFtZXMgcGFyYW0gd2lsbCByZXBsYWNlIGFueSBhY3Rpb24gYW5kIHNlbGVjdG9yIHdpdGggdGhlIHdvcmQgRW50aXR5IG9yIEVudGl0aWVzLFxuICogd2l0aCB0aGUgY29ycmVzcG9uZGluZyBlbnRpdHlOYW1lIGFuZCAgZW50aXRpZXNOYW1lIHBhcmFtIChlbnRpdHlOYW1lKydzJyBpZiBlbnRpdGllc05hbWUgaXMgb21pdHRlZCkuXG4gKiBAcGFyYW0gbmFtZXNDb25maWcgLSBPcHRpb25hbCBOYW1lcyBmb3IgZW50aXRpZXNcbiAqIEBwYXJhbSBuYW1lc0NvbmZpZy5lbnRpdHlOYW1lIC0gc2luZ3VsYXIgbmFtZSBmb3IgZW50aXR5XG4gKiBAcGFyYW0gW25hbWVzQ29uZmlnLmVudGl0aWVzTmFtZV0gLSBwbHVyYWwgbmFtZSBmb3IgZW50aXRpZXMsIGRlZmF1bHRzIHRvIGVudGl0eU5hbWUgKyAncydcbiAqIEBwYXJhbSB0cmFpdHMgc2V0IG9mIHRyYWl0cyB0byBiZSBjb21iaW5lZFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAncHJvZHVjdCcgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdD4oKSxcbiAqICAgYWRkU2VsZWN0RW50aXR5VHJhaXQ8UHJvZHVjdD4oKSxcbiAqICAgYWRkQXN5bmNBY3Rpb25UcmFpdCh7XG4gKiAgICAgbmFtZTogJ2NoZWNrb3V0JyxcbiAqICAgICBhY3Rpb25TdWNjZXNzUHJvcHM6IHByb3BzPHsgb3JkZXJJZDogc3RyaW5nIH0+KCksXG4gKiAgIH0pXG4gKiApO1xuICpcbiAqIGV4cG9ydCBjb25zdCBwcm9kdWN0c0ZlYXR1cmUgPSBmZWF0dXJlRmFjdG9yeSh7XG4gKiAgIGFjdGlvbnNHcm91cEtleTogJ1tQcm9kdWN0c10nLFxuICogICBmZWF0dXJlU2VsZWN0b3I6ICdwcm9kdWN0cycsXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5PFxuICBGIGV4dGVuZHMgcmVhZG9ubHkgVHJhaXRGYWN0b3J5W10sXG4gIEVudGl0eU5hbWUgZXh0ZW5kcyBzdHJpbmcsXG4gIEVudGl0aWVzTmFtZSBleHRlbmRzIHN0cmluZyA9IGAke0VudGl0eU5hbWV9c2Bcbj4oXG4gIHtcbiAgICBlbnRpdHlOYW1lLFxuICAgIGVudGl0aWVzTmFtZSxcbiAgfTogeyBlbnRpdHlOYW1lOiBFbnRpdHlOYW1lOyBlbnRpdGllc05hbWU/OiBFbnRpdGllc05hbWUgfSxcbiAgLi4udHJhaXRzOiBGXG4pOiBFbnRpdHlGZWF0dXJlRmFjdG9yeTxcbiAgRW50aXR5TmFtZSxcbiAgRW50aXRpZXNOYW1lLFxuICBFeHRyYWN0U3RhdGVUeXBlPEY+LFxuICBFeHRyYWN0QWN0aW9uc1R5cGU8Rj4sXG4gIEV4dHJhY3RTZWxlY3RvcnNUeXBlPEY+XG4+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdoZW4gZXhlY3V0ZSB3aWxsIGNvbWJpbmUgYWxsIHRoZSB0cmFpdHMsIGFuZCByZXR1cm4gYSBFbnRpdHlGZWF0dXJlRmFjdG9yeVxuICogd2hpY2ggY29tYmluZXMgYWxsIHRoZSB0cmFpdHMgYWN0aW9ucywgc2VsZWN0b3JzICwgcmVkdWNlcnMgYW5kIGVmZmVjdHMuXG4gKiBAcGFyYW0gdHJhaXRzIHNldCBvZiB0cmFpdHMgdG8gYmUgY29tYmluZWRcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3QnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZFNlbGVjdEVudGl0eVRyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZEFzeW5jQWN0aW9uVHJhaXQoe1xuICogICAgIG5hbWU6ICdjaGVja291dCcsXG4gKiAgICAgYWN0aW9uU3VjY2Vzc1Byb3BzOiBwcm9wczx7IG9yZGVySWQ6IHN0cmluZyB9PigpLFxuICogICB9KVxuICogKTtcbiAqXG4gKiBleHBvcnQgY29uc3QgcHJvZHVjdHNGZWF0dXJlID0gZmVhdHVyZUZhY3Rvcnkoe1xuICogICBhY3Rpb25zR3JvdXBLZXk6ICdbUHJvZHVjdHNdJyxcbiAqICAgZmVhdHVyZVNlbGVjdG9yOiAncHJvZHVjdHMnLFxuICogfSk7XG4gKlxuICogcHJvZHVjdHNGZWF0dXJlLmFjdGlvbnMubG9hZFByb2R1Y3RzKCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeTxGIGV4dGVuZHMgcmVhZG9ubHkgVHJhaXRGYWN0b3J5W10+KFxuICAuLi50cmFpdHM6IEZcbik6IEVudGl0eUZlYXR1cmVGYWN0b3J5PFxuICAnRW50aXR5JyxcbiAgJ0VudGl0aWVzJyxcbiAgRXh0cmFjdFN0YXRlVHlwZTxGPixcbiAgRXh0cmFjdEFjdGlvbnNUeXBlPEY+LFxuICBFeHRyYWN0U2VsZWN0b3JzVHlwZTxGPlxuPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aGVuIGV4ZWN1dGUgd2lsbCBjb21iaW5lIGFsbCB0aGUgdHJhaXRzLCBhbmQgcmV0dXJuIGEgRW50aXR5RmVhdHVyZUZhY3RvcnlcbiAqIHdoaWNoIGNvbWJpbmVzIGFsbCB0aGUgdHJhaXRzIGFjdGlvbnMsIHNlbGVjdG9ycyAsIHJlZHVjZXJzIGFuZCBlZmZlY3RzLFxuICogdGhlIG5hbWVzIHBhcmFtIHdpbGwgcmVwbGFjZSBhbnkgYWN0aW9uIGFuZCBzZWxlY3RvciB3aXRoIHRoZSB3b3JkIEVudGl0eSBvciBFbnRpdGllcyxcbiAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZW50aXR5TmFtZSBhbmQgIGVudGl0aWVzTmFtZSBwYXJhbSAoZW50aXR5TmFtZSsncycgaWYgZW50aXRpZXNOYW1lIGlzIG9taXR0ZWQpLlxuICogQHBhcmFtIG5hbWVzQ29uZmlnIC0gT3B0aW9uYWwgTmFtZXMgZm9yIGVudGl0aWVzXG4gKiBAcGFyYW0gbmFtZXNDb25maWcuZW50aXR5TmFtZSAtIHNpbmd1bGFyIG5hbWUgZm9yIGVudGl0eVxuICogQHBhcmFtIFtuYW1lc0NvbmZpZy5lbnRpdGllc05hbWVdIC0gcGx1cmFsIG5hbWUgZm9yIGVudGl0aWVzLCBkZWZhdWx0cyB0byBlbnRpdHlOYW1lICsgJ3MnXG4gKiBAcGFyYW0gdHJhaXRzIHNldCBvZiB0cmFpdHMgdG8gYmUgY29tYmluZWRcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3QnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZFNlbGVjdEVudGl0eVRyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZEFzeW5jQWN0aW9uVHJhaXQoe1xuICogICAgIG5hbWU6ICdjaGVja291dCcsXG4gKiAgICAgYWN0aW9uU3VjY2Vzc1Byb3BzOiBwcm9wczx7IG9yZGVySWQ6IHN0cmluZyB9PigpLFxuICogICB9KVxuICogKTtcbiAqXG4gKiBleHBvcnQgY29uc3QgcHJvZHVjdHNGZWF0dXJlID0gZmVhdHVyZUZhY3Rvcnkoe1xuICogICBhY3Rpb25zR3JvdXBLZXk6ICdbUHJvZHVjdHNdJyxcbiAqICAgZmVhdHVyZVNlbGVjdG9yOiAncHJvZHVjdHMnLFxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeTxcbiAgRiBleHRlbmRzIHJlYWRvbmx5IFRyYWl0RmFjdG9yeVtdLFxuICBFbnRpdHlOYW1lIGV4dGVuZHMgc3RyaW5nLFxuICBFbnRpdGllc05hbWUgZXh0ZW5kcyBzdHJpbmcgPSBgJHtFbnRpdHlOYW1lfXNgXG4+KFxuICBuYW1lc09yRmFjdG9yeTpcbiAgICB8IHsgZW50aXR5TmFtZTogRW50aXR5TmFtZTsgZW50aXRpZXNOYW1lPzogRW50aXRpZXNOYW1lIH1cbiAgICB8IFRyYWl0RmFjdG9yeSxcbiAgLi4udHJhaXRzOiBGXG4pOiBFbnRpdHlGZWF0dXJlRmFjdG9yeTxcbiAgRW50aXR5TmFtZSxcbiAgRW50aXRpZXNOYW1lLFxuICBFeHRyYWN0U3RhdGVUeXBlPEY+LFxuICBFeHRyYWN0QWN0aW9uc1R5cGU8Rj4sXG4gIEV4dHJhY3RTZWxlY3RvcnNUeXBlPEY+XG4+IHtcbiAgcmV0dXJuICgoY29uZmlnOiBDb25maWc8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc3QgeyBlbnRpdHlOYW1lLCBlbnRpdGllc05hbWUgfSA9XG4gICAgICAnZW50aXR5TmFtZScgaW4gbmFtZXNPckZhY3RvcnlcbiAgICAgICAgPyAobmFtZXNPckZhY3RvcnkgYXMge1xuICAgICAgICAgICAgZW50aXR5TmFtZTogRW50aXR5TmFtZTtcbiAgICAgICAgICAgIGVudGl0aWVzTmFtZT86IEVudGl0aWVzTmFtZTtcbiAgICAgICAgICB9KVxuICAgICAgICA6IHsgZW50aXR5TmFtZTogJ0VudGl0eScsIGVudGl0aWVzTmFtZTogJ0VudGl0aWVzJyB9O1xuXG4gICAgY29uc3Qgc2luZ3VsYXIgPSBjYXBpdGFsaXplKGVudGl0eU5hbWUpO1xuICAgIGNvbnN0IHBsdXJhbCA9IGVudGl0aWVzTmFtZVxuICAgICAgPyBjYXBpdGFsaXplKGVudGl0aWVzTmFtZSlcbiAgICAgIDogY2FwaXRhbGl6ZShlbnRpdHlOYW1lICsgJ3MnKTtcblxuICAgIGNvbnN0IHNvcnRlZFRyYWl0cyA9IHNvcnRUcmFpdHMoXG4gICAgICAnZW50aXR5TmFtZScgaW4gbmFtZXNPckZhY3RvcnkgPyBbLi4udHJhaXRzXSA6IFtuYW1lc09yRmFjdG9yeSwgLi4udHJhaXRzXVxuICAgICk7XG5cbiAgICBjb25zdCBhbGxDb25maWdzID0gYnVpbGRBbGxDb25maWdzKHNvcnRlZFRyYWl0cyk7XG5cbiAgICBjb25zdCBhbGxBY3Rpb25zID0gYnVpbGRBbGxBY3Rpb25zKFxuICAgICAgc29ydGVkVHJhaXRzLFxuICAgICAgY29uZmlnLmFjdGlvbnNHcm91cEtleSxcbiAgICAgIHNpbmd1bGFyLFxuICAgICAgcGx1cmFsLFxuICAgICAgYWxsQ29uZmlnc1xuICAgICk7XG5cbiAgICBjb25zdCBhbGxTZWxlY3RvcnMgPSBidWlsZEFsbFNlbGVjdG9ycyhzb3J0ZWRUcmFpdHMsIGFsbENvbmZpZ3MpO1xuXG4gICAgY29uc3QgYWxsTXV0YXRvcnMgPSBidWlsZEFsbE11dGF0b3JzKFxuICAgICAgc29ydGVkVHJhaXRzLFxuICAgICAgYWxsU2VsZWN0b3JzLFxuICAgICAgYWxsQ29uZmlnc1xuICAgICk7XG5cbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSBidWlsZEluaXRpYWxTdGF0ZShzb3J0ZWRUcmFpdHMsIGFsbENvbmZpZ3MpO1xuXG4gICAgY29uc3QgcmVkdWNlciA9IGJ1aWxkUmVkdWNlcihcbiAgICAgIHNvcnRlZFRyYWl0cyxcbiAgICAgIGluaXRpYWxTdGF0ZSxcbiAgICAgIGFsbEFjdGlvbnMsXG4gICAgICBhbGxTZWxlY3RvcnMsXG4gICAgICBhbGxNdXRhdG9ycyxcbiAgICAgIGFsbENvbmZpZ3NcbiAgICApO1xuXG4gICAgY29uc3QgZmVhdHVyZVNlbGVjdG9yID1cbiAgICAgIHR5cGVvZiBjb25maWcuZmVhdHVyZVNlbGVjdG9yID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGNyZWF0ZUZlYXR1cmVTZWxlY3RvcjxFeHRyYWN0U3RhdGVUeXBlPEY+Pihjb25maWcuZmVhdHVyZVNlbGVjdG9yKVxuICAgICAgICA6IGNvbmZpZy5mZWF0dXJlU2VsZWN0b3I7XG5cbiAgICBjb25zdCBhbGxGZWF0dXJlU2VsZWN0b3JzID1cbiAgICAgIGFsbFNlbGVjdG9ycyAmJiBnZXRTZWxlY3RvcnNGb3JGZWF0dXJlKGZlYXR1cmVTZWxlY3RvciwgYWxsU2VsZWN0b3JzKTtcblxuICAgIGNvbnN0IGFsbEVmZmVjdHMgPSBidWlsZEFsbEVmZmVjdHMoXG4gICAgICBzb3J0ZWRUcmFpdHMsXG4gICAgICBhbGxBY3Rpb25zLFxuICAgICAgYWxsRmVhdHVyZVNlbGVjdG9ycyxcbiAgICAgIGFsbENvbmZpZ3NcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbnM6IGVudGl0eU5hbWVcbiAgICAgICAgPyByZW5hbWVQcm9wcyhhbGxBY3Rpb25zLCBzaW5ndWxhciwgcGx1cmFsKVxuICAgICAgICA6IGFsbEFjdGlvbnMsXG4gICAgICBzZWxlY3RvcnM6IGVudGl0eU5hbWVcbiAgICAgICAgPyByZW5hbWVQcm9wcyhhbGxGZWF0dXJlU2VsZWN0b3JzLCBzaW5ndWxhciwgcGx1cmFsKVxuICAgICAgICA6IGFsbFNlbGVjdG9ycyxcbiAgICAgIGluaXRpYWxTdGF0ZSxcbiAgICAgIHJlZHVjZXI6IHJlZHVjZXIgPz8gY3JlYXRlUmVkdWNlcihpbml0aWFsU3RhdGUpLFxuICAgICAgZWZmZWN0czogYWxsRWZmZWN0cyxcbiAgICB9O1xuICB9KSBhcyBFbnRpdHlGZWF0dXJlRmFjdG9yeTxcbiAgICBFbnRpdHlOYW1lLFxuICAgIEVudGl0aWVzTmFtZSxcbiAgICBFeHRyYWN0U3RhdGVUeXBlPEY+LFxuICAgIEV4dHJhY3RBY3Rpb25zVHlwZTxGPixcbiAgICBFeHRyYWN0U2VsZWN0b3JzVHlwZTxGPlxuICA+O1xufVxuXG5mdW5jdGlvbiByZW5hbWVQcm9wcyh0YXJnZXQ6IGFueSwgZW50aXR5TmFtZTogc3RyaW5nLCBlbnRpdGllc05hbWU6IHN0cmluZykge1xuICBjb25zdCByZXN1bHQgPSB7fSBhcyBhbnk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhcmdldCkpIHtcbiAgICBjb25zdCBuZXdLZXkgPSBrZXlcbiAgICAgIC5yZXBsYWNlKCdFbnRpdGllcycsIGVudGl0aWVzTmFtZSlcbiAgICAgIC5yZXBsYWNlKCdFbnRpdHknLCBlbnRpdHlOYW1lKTtcbiAgICByZXN1bHRbbmV3S2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNvcnRUcmFpdHMoXG4gIHRyYWl0czogVHJhaXRGYWN0b3J5PGFueSwgYW55LCBhbnksIGFueT5bXVxuKTogVHJhaXRGYWN0b3J5PGFueSwgYW55LCBhbnksIGFueT5bXSB7XG4gIGNvbnN0IHNvcnRlZFRyYWl0czogVHJhaXRGYWN0b3J5PGFueSwgYW55LCBhbnksIGFueT5bXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWl0cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRyYWl0ID0gdHJhaXRzW2ldO1xuICAgIGlmICghdHJhaXQuZGVwZW5kcz8ubGVuZ3RoKSB7XG4gICAgICBzb3J0ZWRUcmFpdHMucHVzaCh0cmFpdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHRyYWl0LmRlcGVuZHMubGVuZ3RoID4gMSlcbiAgICAgIGZvciAoY29uc3QgZCBvZiB0cmFpdC5kZXBlbmRzKSB7XG4gICAgICAgIGNvbnN0IGlzVHJhaXRQcmVzZW50ID0gdHJhaXRzLnNvbWUoKHRyKSA9PiB0ci5rZXkgPT09IGQpO1xuICAgICAgICBpZiAoaXNUcmFpdFByZXNlbnQpIHtcbiAgICAgICAgICB0cmFpdC5kZXBlbmRzID0gW2RdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgaWYgKHRyYWl0LmRlcGVuZHMubGVuZ3RoID4gMSlcbiAgICAgIHRocm93IEVycm9yKCdjb3VsZCBub3QgZmluZCBkZXBlbmRlbmNpZXMgJyArIHRyYWl0LmRlcGVuZHMuam9pbignICcpKTtcbiAgICBjb25zdCBpc0RlcGVuZGVuY3lBbHJlYWR5QWRkZWQgPSBzb3J0ZWRUcmFpdHMuc29tZShcbiAgICAgICh0cikgPT4gdHIua2V5ID09PSB0cmFpdD8uZGVwZW5kcz8uWzBdXG4gICAgKTtcblxuICAgIGlmIChpc0RlcGVuZGVuY3lBbHJlYWR5QWRkZWQpIHNvcnRlZFRyYWl0cy5wdXNoKHRyYWl0KTtcbiAgICBlbHNlIHtcbiAgICAgIC8vIG1vdmUgdHJhaXQgdG8gdGhlIGVuZFxuICAgICAgZGVsZXRlIHRyYWl0c1tpXTtcbiAgICAgIHRyYWl0cy5wdXNoKHRyYWl0KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNvcnRlZFRyYWl0cztcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxDb25maWdzKHNvcnRlZFRyYWl0czogVHJhaXRGYWN0b3J5PGFueSwgYW55LCBhbnksIGFueT5bXSkge1xuICByZXR1cm4gc29ydGVkVHJhaXRzLnJlZHVjZSgoYWNjOiBLZXllZENvbmZpZzxzdHJpbmcsIGFueT4sIGZhY3RvcnkpID0+IHtcbiAgICBhY2NbZmFjdG9yeS5rZXldID0gZmFjdG9yeS5jb25maWc7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFsbEFjdGlvbnMoXG4gIHNvcnRlZFRyYWl0czogVHJhaXRGYWN0b3J5PGFueSwgYW55LCBhbnksIGFueT5bXSxcbiAgYWN0aW9uc0dyb3VwS2V5OiBzdHJpbmcsXG4gIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgZW50aXRpZXNOYW1lOiBzdHJpbmcsXG4gIGFsbENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gJiB7IFtwOiBzdHJpbmddOiBhbnkgfVxuKSB7XG4gIHJldHVybiBzb3J0ZWRUcmFpdHMucmVkdWNlKChwcmV2aW91c1Jlc3VsdDogVHJhaXRBY3Rpb25zLCBmYWN0b3J5KSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBmYWN0b3J5Py5hY3Rpb25zPy4oe1xuICAgICAgICBhY3Rpb25zR3JvdXBLZXk6IGFjdGlvbnNHcm91cEtleSxcbiAgICAgICAgZW50aXR5TmFtZSxcbiAgICAgICAgZW50aXRpZXNOYW1lLFxuICAgICAgICBhbGxDb25maWdzLFxuICAgICAgfSkgPz8ge307XG4gICAgcmVzdWx0ID0gcHJldmlvdXNSZXN1bHQgPyB7IC4uLnByZXZpb3VzUmVzdWx0LCAuLi5yZXN1bHQgfSA6IHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsU2VsZWN0b3JzKFxuICBzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10sXG4gIGFsbENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gJiB7IFtwOiBzdHJpbmddOiBhbnkgfVxuKSB7XG4gIHJldHVybiBzb3J0ZWRUcmFpdHMucmVkdWNlKChwcmV2aW91c1Jlc3VsdDogVHJhaXRTZWxlY3RvcnM8YW55PiwgZmFjdG9yeSkgPT4ge1xuICAgIGxldCByZXN1bHQgPVxuICAgICAgZmFjdG9yeT8uc2VsZWN0b3JzPy4oe1xuICAgICAgICBwcmV2aW91c1NlbGVjdG9yczogcHJldmlvdXNSZXN1bHQsXG4gICAgICAgIGFsbENvbmZpZ3MsXG4gICAgICB9KSA/PyB7fTtcbiAgICByZXN1bHQgPSBwcmV2aW91c1Jlc3VsdCA/IHsgLi4ucHJldmlvdXNSZXN1bHQsIC4uLnJlc3VsdCB9IDogcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxNdXRhdG9ycyhcbiAgc29ydGVkVHJhaXRzOiBUcmFpdEZhY3Rvcnk8YW55LCBhbnksIGFueSwgYW55PltdLFxuICBhbGxTZWxlY3RvcnM6IFRyYWl0U2VsZWN0b3JzPGFueT4sXG4gIGFsbENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gJiB7IFtwOiBzdHJpbmddOiBhbnkgfVxuKSB7XG4gIHJldHVybiAoXG4gICAgc29ydGVkVHJhaXRzLnJlZHVjZShcbiAgICAgIChwcmV2aW91c1Jlc3VsdDogVHJhaXRTdGF0ZU11dGF0b3JzPGFueT4gfCB1bmRlZmluZWQsIGZhY3RvcnkpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9XG4gICAgICAgICAgZmFjdG9yeT8ubXV0YXRvcnM/Lih7XG4gICAgICAgICAgICBhbGxTZWxlY3RvcnM6IGFsbFNlbGVjdG9ycyxcbiAgICAgICAgICAgIHByZXZpb3VzTXV0YXRvcnM6IHByZXZpb3VzUmVzdWx0LFxuICAgICAgICAgICAgYWxsQ29uZmlncyxcbiAgICAgICAgICB9KSA/PyB7fTtcbiAgICAgICAgcmVzdWx0ID0gcHJldmlvdXNSZXN1bHQgPyB7IC4uLnByZXZpb3VzUmVzdWx0LCAuLi5yZXN1bHQgfSA6IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICkgfHwge31cbiAgKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRJbml0aWFsU3RhdGUoXG4gIHNvcnRlZFRyYWl0czogVHJhaXRGYWN0b3J5PGFueSwgYW55LCBhbnksIGFueT5bXSxcbiAgYWxsQ29uZmlnczogUmVjb3JkPHN0cmluZywgYW55PiAmIHsgW3A6IHN0cmluZ106IGFueSB9XG4pIHtcbiAgcmV0dXJuIHNvcnRlZFRyYWl0cy5yZWR1Y2UoKHByZXZpb3VzUmVzdWx0OiBhbnksIGZhY3RvcnkpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPVxuICAgICAgZmFjdG9yeT8uaW5pdGlhbFN0YXRlPy4oe1xuICAgICAgICBwcmV2aW91c0luaXRpYWxTdGF0ZTogcHJldmlvdXNSZXN1bHQsXG4gICAgICAgIGFsbENvbmZpZ3MsXG4gICAgICB9KSA/P1xuICAgICAgcHJldmlvdXNSZXN1bHQgPz9cbiAgICAgIHt9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZWR1Y2VyKFxuICBzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10sXG4gIGluaXRpYWxTdGF0ZTogYW55LFxuICBhbGxBY3Rpb25zOiBUcmFpdEFjdGlvbnMsXG4gIGFsbFNlbGVjdG9yczogVHJhaXRTZWxlY3RvcnM8YW55PixcbiAgYWxsTXV0YXRvcnM6IFRyYWl0U3RhdGVNdXRhdG9yczxhbnk+LFxuICBhbGxDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ICYgeyBbcDogc3RyaW5nXTogYW55IH1cbikge1xuICByZXR1cm4gc29ydGVkVHJhaXRzLnJlZHVjZShcbiAgICAoXG4gICAgICBwcmV2aW91c1Jlc3VsdDogKChzdGF0ZTogYW55LCBhY3Rpb246IEFjdGlvbikgPT4gYW55KSB8IHVuZGVmaW5lZCxcbiAgICAgIGZhY3RvcnlcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGZhY3Rvcnk/LnJlZHVjZXI/Lih7XG4gICAgICAgIGluaXRpYWxTdGF0ZSxcbiAgICAgICAgYWxsQWN0aW9ucyxcbiAgICAgICAgYWxsU2VsZWN0b3JzLFxuICAgICAgICBhbGxNdXRhdG9ycyxcbiAgICAgICAgYWxsQ29uZmlncyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdCAmJiBwcmV2aW91c1Jlc3VsdFxuICAgICAgICA/IChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhU3RhdGUgPSBwcmV2aW91c1Jlc3VsdChzdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQoYVN0YXRlLCBhY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgOiByZXN1bHQgPz8gcHJldmlvdXNSZXN1bHQ7XG4gICAgfSxcbiAgICB1bmRlZmluZWRcbiAgKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxFZmZlY3RzKFxuICBzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10sXG4gIGFsbEFjdGlvbnM6IFRyYWl0QWN0aW9ucyxcbiAgYWxsRmVhdHVyZVNlbGVjdG9yczogVHJhaXRTZWxlY3RvcnM8YW55PixcbiAgYWxsQ29uZmlnczogUmVjb3JkPHN0cmluZywgYW55PiAmIHsgW3A6IHN0cmluZ106IGFueSB9XG4pIHtcbiAgcmV0dXJuIHNvcnRlZFRyYWl0cy5yZWR1Y2UoXG4gICAgKHByZXZpb3VzUmVzdWx0OiBUeXBlPFRyYWl0RWZmZWN0PltdIHwgdW5kZWZpbmVkLCBmYWN0b3J5KSA9PiB7XG4gICAgICBsZXQgcmVzdWx0ID1cbiAgICAgICAgZmFjdG9yeT8uZWZmZWN0cz8uKHtcbiAgICAgICAgICBhbGxBY3Rpb25zLFxuICAgICAgICAgIGFsbFNlbGVjdG9yczogYWxsRmVhdHVyZVNlbGVjdG9ycyxcbiAgICAgICAgICBhbGxDb25maWdzLFxuICAgICAgICB9KSA/PyBbXTtcbiAgICAgIHJlc3VsdCA9IHByZXZpb3VzUmVzdWx0ID8gWy4uLnByZXZpb3VzUmVzdWx0LCAuLi5yZXN1bHRdIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIFtdXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFNlbGVjdG9yc0ZvckZlYXR1cmU8XG4gIFN0YXRlLFxuICBTIGV4dGVuZHMgVHJhaXRTZWxlY3RvcnM8U3RhdGU+LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICBGIGV4dGVuZHMgTWVtb2l6ZWRTZWxlY3RvcjxvYmplY3QsIGFueT5cbj4oZmVhdHVyZVNlbGVjdDogRiwgc2VsZWN0b3JzOiBTKTogRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgUz4ge1xuICBjb25zdCBzczogeyBba2V5IGluIGtleW9mIFNdPzogYW55IH0gPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wIGluIHNlbGVjdG9ycykge1xuICAgIHNzW3Byb3BdID0gY3JlYXRlU2VsZWN0b3IoZmVhdHVyZVNlbGVjdCBhcyBhbnksIHNlbGVjdG9yc1twcm9wXSBhcyBhbnkpO1xuICB9XG4gIHJldHVybiBzcyBhcyBGZWF0dXJlU2VsZWN0b3JzPFN0YXRlLCBTPjtcbn1cblxuLyoqXG4gKiBDb21iaW5lIGEgbWFwIGVudGl0eUZlYXR1cmVGYWN0b3JpZXMgaW50byBvbmUsXG4gKiBncm91cGluZyB0aGUgYWN0aW9ucyBhbmQgc2VsZWN0b3JzIGJ5IHRoZSBrZXkgb2YgdGhlIHJlc3BlY3RpdmUgZW50aXR5RmVhdHVyZUZhY3RvcnlcbiAqIEBwYXJhbSB0cmFpdEZhY3Rvcmllc01hcFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgY2xpZW50c0ZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ2NsaWVudCcsIGVudGl0aWVzTmFtZTogJ2NsaWVudHMnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PENsaWVudD4oKSxcbiAqICAgYWRkQ3J1ZEVudGl0aWVzVHJhaXQ8Q2xpZW50PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RPcmRlckZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3RPcmRlcicgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdE9yZGVyPigpLFxuICogICBhZGRTZWxlY3RFbnRpdGllc1RyYWl0PFByb2R1Y3RPcmRlcj4oKVxuICogKTtcbiAqXG4gKiBjb25zdCBwcm9kdWN0RmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAncHJvZHVjdCcgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdD4oKSxcbiAqICAgYWRkU2VsZWN0RW50aXRpZXNUcmFpdDxQcm9kdWN0PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RDb21iaW5lZEZhY3RvcnkgPSBjb21iaW5lRW50aXR5RmVhdHVyZXMoe1xuICogICBwcm9kdWN0czogcHJvZHVjdEZlYXR1cmVGYWN0b3J5LFxuICogICBwcm9kdWN0T3JkZXJzOiBwcm9kdWN0T3JkZXJGZWF0dXJlRmFjdG9yeSxcbiAqICAgY2xpZW50czogY2xpZW50c0ZlYXR1cmVGYWN0b3J5LFxuICogfSk7XG4gKlxuICogY29uc3QgY29tYmluZWRGZWF0dXJlID0gcHJvZHVjdENvbWJpbmVkRmFjdG9yeSh7XG4gKiAgICAgYWN0aW9uc0dyb3VwS2V5OiAnW0NvbWJpbmVkXScsXG4gKiAgICAgZmVhdHVyZVNlbGVjdG9yOiAnY29tYmluZWQnLFxuICogICB9KTtcbiAqXG4gKiAgIGNvbWJpbmVkRmVhdHVyZS5hY3Rpb25zLmNsaWVudC5sb2FkQ2xpZW50cygpO1xuICogICBjb21iaW5lZEZlYXR1cmUuYWN0aW9ucy5wcm9kdWN0LmxvYWRQcm9kdWN0cygpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUVudGl0eUZlYXR1cmVzPFxuICBUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBFbnRpdHlGZWF0dXJlRmFjdG9yeTxhbnksIGFueT4gfSxcbiAgSyBleHRlbmRzIGtleW9mIFQsXG4gIFN0YXRlIGV4dGVuZHMgeyBbUCBpbiBLXTogRXh0cmFjdFN0YXRlVHlwZTxSZXR1cm5UeXBlPFRbUF0+PiB9LFxuICBBIGV4dGVuZHMgeyBbUCBpbiBLXTogRXh0cmFjdEFjdGlvbnNUeXBlPFJldHVyblR5cGU8VFtQXT4+IH0sXG4gIFMgZXh0ZW5kcyB7XG4gICAgW1AgaW4gS106IEZlYXR1cmVTZWxlY3RvcnM8U3RhdGUsIEV4dHJhY3RTZWxlY3RvcnNUeXBlPFJldHVyblR5cGU8VFtQXT4+PjtcbiAgfSxcbiAgUiBleHRlbmRzIChjb25maWc6IENvbmZpZzxTdGF0ZT4pID0+IHtcbiAgICBhY3Rpb25zOiBBO1xuICAgIHNlbGVjdG9yczogUztcbiAgICByZWR1Y2VyOiAoc3RhdGU6IFN0YXRlLCBhY3Rpb246IEFjdGlvblR5cGU8YW55PikgPT4gU3RhdGU7XG4gICAgZWZmZWN0czogVHlwZTxhbnk+W107XG4gICAgaW5pdGlhbFN0YXRlOiBTdGF0ZTtcbiAgfVxuPih0cmFpdEZhY3Rvcmllc01hcDogVCk6IFIge1xuICByZXR1cm4gKChjb25maWc6IENvbmZpZzxhbnksIGFueT4pID0+IHtcbiAgICBjb25zdCBmZWF0dXJlU2VsZWN0b3IgPVxuICAgICAgdHlwZW9mIGNvbmZpZy5mZWF0dXJlU2VsZWN0b3IgPT09ICdzdHJpbmcnXG4gICAgICAgID8gY3JlYXRlRmVhdHVyZVNlbGVjdG9yPGFueT4oY29uZmlnLmZlYXR1cmVTZWxlY3RvcilcbiAgICAgICAgOiBjb25maWcuZmVhdHVyZVNlbGVjdG9yO1xuICAgIGNvbnN0IGFjdGlvbnM6IGFueSA9IHt9O1xuICAgIGNvbnN0IHNlbGVjdG9yczogYW55ID0ge307XG4gICAgY29uc3QgcmVkdWNlcnM6IGFueSA9IHt9O1xuICAgIGxldCBlZmZlY3RzOiBUeXBlPGFueT5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50aXR5RmVhdHVyZUZhY3RvcnldIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgdHJhaXRGYWN0b3JpZXNNYXBcbiAgICApKSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICBmZWF0dXJlU2VsZWN0b3IsXG4gICAgICAgIChzdGF0ZTogYW55KSA9PiBzdGF0ZVtrZXldXG4gICAgICApO1xuICAgICAgY29uc3QgZmVhdHVyZVRyYWl0cyA9IGVudGl0eUZlYXR1cmVGYWN0b3J5KHtcbiAgICAgICAgYWN0aW9uc0dyb3VwS2V5OiBjb25maWcuYWN0aW9uc0dyb3VwS2V5LFxuICAgICAgICBmZWF0dXJlU2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgfSk7XG4gICAgICBhY3Rpb25zW2tleV0gPSBmZWF0dXJlVHJhaXRzLmFjdGlvbnM7XG4gICAgICBzZWxlY3RvcnNba2V5XSA9IGZlYXR1cmVUcmFpdHMuc2VsZWN0b3JzO1xuICAgICAgcmVkdWNlcnNba2V5XSA9IGZlYXR1cmVUcmFpdHMucmVkdWNlcjtcbiAgICAgIGVmZmVjdHMgPSBbLi4uZWZmZWN0cywgLi4uZmVhdHVyZVRyYWl0cy5lZmZlY3RzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbnMsXG4gICAgICBzZWxlY3RvcnMsXG4gICAgICByZWR1Y2VyOiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpLFxuICAgICAgZWZmZWN0cyxcbiAgICB9O1xuICB9KSBhcyBSO1xufVxuXG4vKipcbiAqIE1peCBhIG1hcCBlbnRpdHlGZWF0dXJlRmFjdG9yaWVzIGludG8gb25lLCBkaWZmZXJlbnQgZnJvbSBjb21iaW5lIHRoZSBhY3Rpb25zIGFuZCBzZWxlY3RvcnMgYSBtaXgsIG5vdCBncm91cCBieSBrZXkgbGlrZSBpbiBjb21iaW5lLCB0aGUga2V5cyBhcmUgc3RpbGwgdXNlXG4gKiBpbnRlcm5hbCBpbiB0aGUgcmVkdWNlcnMgYW5kIHNlbGVjdG9yIHRvIHNlcGFyYXRlIHRoZSBzdGF0ZVxuICogQHBhcmFtIHRyYWl0RmFjdG9yaWVzTWFwXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBjbGllbnRzRmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAnY2xpZW50JywgZW50aXRpZXNOYW1lOiAnY2xpZW50cycgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8Q2xpZW50PigpLFxuICogICBhZGRDcnVkRW50aXRpZXNUcmFpdDxDbGllbnQ+KClcbiAqICk7XG4gKlxuICogY29uc3QgcHJvZHVjdE9yZGVyRmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAncHJvZHVjdE9yZGVyJyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxQcm9kdWN0T3JkZXI+KCksXG4gKiAgIGFkZFNlbGVjdEVudGl0aWVzVHJhaXQ8UHJvZHVjdE9yZGVyPigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RGZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdwcm9kdWN0JyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRTZWxlY3RFbnRpdGllc1RyYWl0PFByb2R1Y3Q+KClcbiAqICk7XG4gKlxuICogY29uc3QgcHJvZHVjdE1peGVkRmFjdG9yeSA9IG1peEVudGl0eUZlYXR1cmVzKHtcbiAqICAgcHJvZHVjdHM6IHByb2R1Y3RGZWF0dXJlRmFjdG9yeSxcbiAqICAgcHJvZHVjdE9yZGVyczogcHJvZHVjdE9yZGVyRmVhdHVyZUZhY3RvcnksXG4gKiAgIGNsaWVudHM6IGNsaWVudHNGZWF0dXJlRmFjdG9yeSxcbiAqIH0pO1xuICpcbiAqIGNvbnN0IG1peGVkRmVhdHVyZSA9IHByb2R1Y3RNaXhlZEZhY3Rvcnkoe1xuICogICAgIGFjdGlvbnNHcm91cEtleTogJ1tNaXhlZF0nLFxuICogICAgIGZlYXR1cmVTZWxlY3RvcjogJ21peGVkJyxcbiAqICAgfSk7XG4gKiBtaXhlZEZlYXR1cmUuYWN0aW9ucy5sb2FkQ2xpZW50cygpO1xuICogbWl4ZWRGZWF0dXJlLmFjdGlvbnMubG9hZFByb2R1Y3RzKCk7XG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWl4RW50aXR5RmVhdHVyZXM8XG4gIFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IEVudGl0eUZlYXR1cmVGYWN0b3J5PGFueSwgYW55PiB9LFxuICBLIGV4dGVuZHMga2V5b2YgVCxcbiAgU3RhdGUgZXh0ZW5kcyB7IFtQIGluIEtdOiBFeHRyYWN0U3RhdGVUeXBlPFJldHVyblR5cGU8VFtQXT4+IH0sXG4gIEEgZXh0ZW5kcyBUcmFpdEFjdGlvbnMgJlxuICAgIFVuaW9uVG9JbnRlcnNlY3Rpb248RXh0cmFjdEFjdGlvbnNUeXBlPFJldHVyblR5cGU8VFtLXT4+PixcbiAgUyBleHRlbmRzIFRyYWl0U2VsZWN0b3JzPGFueT4gJlxuICAgIFVuaW9uVG9JbnRlcnNlY3Rpb248XG4gICAgICBGZWF0dXJlU2VsZWN0b3JzPFN0YXRlLCBFeHRyYWN0U2VsZWN0b3JzVHlwZTxSZXR1cm5UeXBlPFRbS10+Pj5cbiAgICA+LFxuICBSIGV4dGVuZHMgRW50aXR5RmVhdHVyZUZhY3Rvcnk8YW55LCBhbnksIFN0YXRlLCBBLCBTPlxuPih0cmFpdEZhY3Rvcmllc01hcDogVCk6IFIge1xuICByZXR1cm4gKChjb25maWc6IENvbmZpZzxhbnksIGFueT4pID0+IHtcbiAgICBjb25zdCBmZWF0dXJlU2VsZWN0b3IgPVxuICAgICAgdHlwZW9mIGNvbmZpZy5mZWF0dXJlU2VsZWN0b3IgPT09ICdzdHJpbmcnXG4gICAgICAgID8gY3JlYXRlRmVhdHVyZVNlbGVjdG9yPGFueT4oY29uZmlnLmZlYXR1cmVTZWxlY3RvcilcbiAgICAgICAgOiBjb25maWcuZmVhdHVyZVNlbGVjdG9yO1xuICAgIGxldCBhY3Rpb25zOiBhbnkgPSB7fTtcbiAgICBsZXQgc2VsZWN0b3JzOiBhbnkgPSB7fTtcbiAgICBjb25zdCByZWR1Y2VyczogYW55ID0ge307XG4gICAgbGV0IGVmZmVjdHM6IFR5cGU8YW55PltdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRpdHlGZWF0dXJlRmFjdG9yeV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICB0cmFpdEZhY3Rvcmllc01hcFxuICAgICkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgIGZlYXR1cmVTZWxlY3RvcixcbiAgICAgICAgKHN0YXRlOiBhbnkpID0+IHN0YXRlW2tleV1cbiAgICAgICk7XG4gICAgICBjb25zdCBmZWF0dXJlVHJhaXRzID0gZW50aXR5RmVhdHVyZUZhY3Rvcnkoe1xuICAgICAgICBhY3Rpb25zR3JvdXBLZXk6IGNvbmZpZy5hY3Rpb25zR3JvdXBLZXksXG4gICAgICAgIGZlYXR1cmVTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICB9KTtcbiAgICAgIGFjdGlvbnMgPSB7IC4uLmFjdGlvbnMsIC4uLmZlYXR1cmVUcmFpdHMuYWN0aW9ucyB9O1xuICAgICAgc2VsZWN0b3JzID0geyAuLi5zZWxlY3RvcnMsIC4uLmZlYXR1cmVUcmFpdHMuc2VsZWN0b3JzIH07XG4gICAgICByZWR1Y2Vyc1trZXldID0gZmVhdHVyZVRyYWl0cy5yZWR1Y2VyO1xuICAgICAgZWZmZWN0cyA9IFsuLi5lZmZlY3RzLCAuLi5mZWF0dXJlVHJhaXRzLmVmZmVjdHNdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9ucyxcbiAgICAgIHNlbGVjdG9ycyxcbiAgICAgIHJlZHVjZXI6IGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VycyksXG4gICAgICBlZmZlY3RzLFxuICAgIH07XG4gIH0pIGFzIFI7XG59XG5cbi8qKlxuICogQ29tYmluZXMgdGFyZ2V0VHJhaXRGYWN0b3J5IHdpdGggdGhlIHRyYWl0RmFjdG9yaWVzTWFwIHVzaW5nIHRoZSBrZXlzIGFzIHByb3BzIGZvciB0aGUgdGFyZ2V0VHJhaXRGYWN0b3J5IHN0YXRlLFxuICogYW5kIGdyb3VwaW5nIHRoZSBjb21iaW5lZCBhY3Rpb25zIGJ5IGtleVxuICogQHBhcmFtIHRhcmdldFRyYWl0RmFjdG9yeVxuICogQHBhcmFtIHRyYWl0RmFjdG9yaWVzTWFwXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBjbGllbnRzRmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAnY2xpZW50JywgZW50aXRpZXNOYW1lOiAnY2xpZW50cycgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8Q2xpZW50PigpLFxuICogICBhZGRDcnVkRW50aXRpZXNUcmFpdDxDbGllbnQ+KClcbiAqICk7XG4gKlxuICogY29uc3QgcHJvZHVjdE9yZGVyRmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAncHJvZHVjdE9yZGVyJyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxQcm9kdWN0T3JkZXI+KCksXG4gKiAgIGFkZFNlbGVjdEVudGl0aWVzVHJhaXQ8UHJvZHVjdE9yZGVyPigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RGZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdwcm9kdWN0JyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRTZWxlY3RFbnRpdGllc1RyYWl0PFByb2R1Y3Q+KClcbiAqICk7XG4gKlxuICogY29uc3QgcHJvZHVjdEFkZEVudGl0eVByb3BlcnRpZXNGYWN0b3J5ID0gYWRkRW50aXR5RmVhdHVyZXNQcm9wZXJ0aWVzKFxuICogICBwcm9kdWN0RmVhdHVyZUZhY3RvcnksXG4gKiAgIHtcbiAqICAgICBwcm9kdWN0T3JkZXJzOiBwcm9kdWN0T3JkZXJGZWF0dXJlRmFjdG9yeSxcbiAqICAgICBjbGllbnRzOiBjbGllbnRzRmVhdHVyZUZhY3RvcnksXG4gKiAgIH1cbiAqICk7XG4gKlxuICogY29uc3QgY29tYmluZWRGZWF0dXJlID0gcHJvZHVjdEFkZEVudGl0eVByb3BlcnRpZXNGYWN0b3J5KHtcbiAqICAgICBhY3Rpb25zR3JvdXBLZXk6ICdbYWRkRW50aXR5RmVhdHVyZXNdJyxcbiAqICAgICBmZWF0dXJlU2VsZWN0b3I6ICdhZGRFbnRpdHlGZWF0dXJlcycsXG4gKiAgIH0pO1xuICpcbiAqICAgY29tYmluZWRGZWF0dXJlLmFjdGlvbnMubG9hZFByb2R1Y3RzKCk7XG4gKiAgIGNvbWJpbmVkRmVhdHVyZS5hY3Rpb25zLmNsaWVudHMubG9hZENsaWVudHMoKTtcbiAqICAgY29tYmluZWRGZWF0dXJlLmFjdGlvbnMucHJvZHVjdE9yZGVycy5sb2FkUHJvZHVjdE9yZGVycygpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRW50aXR5RmVhdHVyZXNQcm9wZXJ0aWVzPFxuICBGIGV4dGVuZHMgRW50aXR5RmVhdHVyZUZhY3Rvcnk8YW55LCBhbnk+LFxuICBUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBFbnRpdHlGZWF0dXJlRmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnksIGFueT4gfSxcbiAgSyBleHRlbmRzIGtleW9mIFQsXG4gIFN0YXRlIGV4dGVuZHMgRXh0cmFjdFN0YXRlVHlwZTxSZXR1cm5UeXBlPEY+PiAmIHtcbiAgICBbUCBpbiBLXTogRXh0cmFjdFN0YXRlVHlwZTxSZXR1cm5UeXBlPFRbUF0+PjtcbiAgfSxcbiAgQSBleHRlbmRzIEV4dHJhY3RBY3Rpb25zVHlwZTxSZXR1cm5UeXBlPEY+PiAmIHtcbiAgICBbUCBpbiBLXTogRXh0cmFjdEFjdGlvbnNUeXBlPFJldHVyblR5cGU8VFtQXT4+O1xuICB9LFxuICBTIGV4dGVuZHMgRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgRXh0cmFjdFNlbGVjdG9yc1R5cGU8UmV0dXJuVHlwZTxGPj4+ICYge1xuICAgIFtQIGluIEtdOiBGZWF0dXJlU2VsZWN0b3JzPFN0YXRlLCBFeHRyYWN0U2VsZWN0b3JzVHlwZTxSZXR1cm5UeXBlPFRbUF0+Pj47XG4gIH0sXG4gIFIgZXh0ZW5kcyAoY29uZmlnOiBDb25maWc8U3RhdGU+KSA9PiB7XG4gICAgYWN0aW9uczogQTtcbiAgICBzZWxlY3RvcnM6IFM7XG4gICAgcmVkdWNlcjogKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25UeXBlPGFueT4pID0+IFN0YXRlO1xuICAgIGVmZmVjdHM6IFR5cGU8YW55PltdO1xuICAgIGluaXRpYWxTdGF0ZTogU3RhdGU7XG4gIH1cbj4odGFyZ2V0VHJhaXRGYWN0b3J5OiBGLCB0cmFpdEZhY3Rvcmllc01hcDogVCk6IFIge1xuICByZXR1cm4gKChjb25maWc6IENvbmZpZzxhbnksIGFueT4pID0+IHtcbiAgICBjb25zdCBmZWF0dXJlU2VsZWN0b3IgPVxuICAgICAgdHlwZW9mIGNvbmZpZy5mZWF0dXJlU2VsZWN0b3IgPT09ICdzdHJpbmcnXG4gICAgICAgID8gY3JlYXRlRmVhdHVyZVNlbGVjdG9yPGFueT4oY29uZmlnLmZlYXR1cmVTZWxlY3RvcilcbiAgICAgICAgOiBjb25maWcuZmVhdHVyZVNlbGVjdG9yO1xuICAgIGNvbnN0IHRhcmdldEZlYXR1cmVUcmFpdHMgPSB0YXJnZXRUcmFpdEZhY3Rvcnkoe1xuICAgICAgYWN0aW9uc0dyb3VwS2V5OiBjb25maWcuYWN0aW9uc0dyb3VwS2V5LFxuICAgICAgZmVhdHVyZVNlbGVjdG9yOiBmZWF0dXJlU2VsZWN0b3IsXG4gICAgfSk7XG4gICAgY29uc3QgYWN0aW9uczogYW55ID0geyAuLi50YXJnZXRGZWF0dXJlVHJhaXRzLmFjdGlvbnMgfTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IGFueSA9IHsgLi4udGFyZ2V0RmVhdHVyZVRyYWl0cy5zZWxlY3RvcnMgfTtcbiAgICBjb25zdCByZWR1Y2VyczogYW55ID0ge307XG4gICAgbGV0IGVmZmVjdHM6IFR5cGU8YW55PltdID0gWy4uLnRhcmdldEZlYXR1cmVUcmFpdHMuZWZmZWN0c107XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRpdHlGZWF0dXJlRmFjdG9yeV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICB0cmFpdEZhY3Rvcmllc01hcFxuICAgICkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgIGZlYXR1cmVTZWxlY3RvcixcbiAgICAgICAgKHN0YXRlOiBhbnkpID0+IHN0YXRlW2tleV1cbiAgICAgICk7XG4gICAgICBjb25zdCBmZWF0dXJlVHJhaXRzID0gZW50aXR5RmVhdHVyZUZhY3Rvcnkoe1xuICAgICAgICBhY3Rpb25zR3JvdXBLZXk6IGNvbmZpZy5hY3Rpb25zR3JvdXBLZXksXG4gICAgICAgIGZlYXR1cmVTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICB9KTtcbiAgICAgIGFjdGlvbnNba2V5XSA9IGZlYXR1cmVUcmFpdHMuYWN0aW9ucztcbiAgICAgIHNlbGVjdG9yc1trZXldID0gZmVhdHVyZVRyYWl0cy5zZWxlY3RvcnM7XG4gICAgICByZWR1Y2Vyc1trZXldID0gZmVhdHVyZVRyYWl0cy5yZWR1Y2VyO1xuICAgICAgZWZmZWN0cyA9IFsuLi5lZmZlY3RzLCAuLi5mZWF0dXJlVHJhaXRzLmVmZmVjdHNdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9ucyxcbiAgICAgIHNlbGVjdG9ycyxcbiAgICAgIHJlZHVjZXI6IHNldFByb3BlcnRpZXNSZWR1Y2VyKHRhcmdldEZlYXR1cmVUcmFpdHMucmVkdWNlciwgcmVkdWNlcnMpLFxuICAgICAgZWZmZWN0cyxcbiAgICB9O1xuICB9KSBhcyBSO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYW4gaW1wbGVtZW50YXRpb24gIGEgVHJhaXRGYWN0b3J5XG4gKiBAcGFyYW0gZiBUcmFpdEZhY3RvcnkgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyYWl0RmFjdG9yeTxcbiAgU3RhdGUgPSB7fSxcbiAgQSBleHRlbmRzIFRyYWl0QWN0aW9ucyA9IHt9LFxuICBTIGV4dGVuZHMgVHJhaXRTZWxlY3RvcnM8U3RhdGU+ID0ge30sXG4gIE0gZXh0ZW5kcyBUcmFpdFN0YXRlTXV0YXRvcnM8U3RhdGU+ID0ge30sXG4gIEtFWSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgQyA9IHVua25vd24sXG4gIEtDIGV4dGVuZHMgQWxsVHJhaXRDb25maWdzID0gS2V5ZWRDb25maWc8S0VZLCBDPlxuPihmOiB7XG4gIGtleTogS0VZO1xuICBjb25maWc/OiBDO1xuICBkZXBlbmRzPzogc3RyaW5nW107XG4gIGFjdGlvbnM/OiBUcmFpdEFjdGlvbnNGYWN0b3J5PEEsIEtDPjtcbiAgc2VsZWN0b3JzPzogVHJhaXRTZWxlY3RvcnNGYWN0b3J5PFN0YXRlLCBTLCBLQz47XG4gIGluaXRpYWxTdGF0ZT86IFRyYWl0SW5pdGlhbFN0YXRlRmFjdG9yeTxTdGF0ZSwgS0M+O1xuICBtdXRhdG9ycz86IFRyYWl0U3RhdGVNdXRhdG9yc0ZhY3Rvcnk8U3RhdGUsIE0sIEtDPjtcbiAgcmVkdWNlcj86IFRyYWl0UmVkdWNlckZhY3Rvcnk8U3RhdGUsIEEsIFMsIE0sIEtDPjtcbiAgZWZmZWN0cz86IFRyYWl0RWZmZWN0c0ZhY3Rvcnk8U3RhdGUsIEEsIFMsIEtDPjtcbn0pOiBUcmFpdEZhY3Rvcnk8U3RhdGUsIEEsIFMsIE0sIEtFWSwgQywgS0M+IHtcbiAgcmV0dXJuIGYgYXMgVHJhaXRGYWN0b3J5PFN0YXRlLCBBLCBTLCBNLCBLRVksIEMsIEtDPjtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY29tYmluZSBzZWxlY3RvcnMgaW4gY29tcG9uZW50cyBhcyBtYXBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZpZXcgPSBjb21iaW5lU2VsZWN0b3JzKHtcbiAqICAgICBwcm9kdWN0czogUHJvZHVjdFNlbGVjdG9ycy5zZWxlY3RQcm9kdWN0c0N1cnJlbnRQYWdlLFxuICogICAgIGlzTG9hZGluZzogUHJvZHVjdFNlbGVjdG9ycy5pc0xvYWRpbmdQcm9kdWN0c0N1cnJlbnRQYWdlLFxuICogICAgIHNlbGVjdGVkUHJvZHVjdDogUHJvZHVjdFNlbGVjdG9ycy5zZWxlY3RQcm9kdWN0U2VsZWN0ZWQsXG4gKiAgICAgaXNMb2FkaW5nQ2hlY2tvdXQ6IFByb2R1Y3RTZWxlY3RvcnMuaXNMb2FkaW5nQ2hlY2tvdXQsXG4gKiAgICAgc2VsZWN0ZWRTb3J0OiBQcm9kdWN0U2VsZWN0b3JzLnNlbGVjdFByb2R1Y3RzU29ydCxcbiAqICAgICBmaWx0ZXJzOiBQcm9kdWN0U2VsZWN0b3JzLnNlbGVjdFByb2R1Y3RzRmlsdGVyLFxuICogICB9KTtcbiAqIEBwYXJhbSB0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lU2VsZWN0b3JzPFxuICBUIGV4dGVuZHMgeyBbazogc3RyaW5nXTogTWVtb2l6ZWRTZWxlY3RvcjxhbnksIGFueT4gfVxuPih0OiBUKTogTWVtb2l6ZWRTZWxlY3RvcjxhbnksIHsgW2ogaW4ga2V5b2YgVF06IFJldHVyblR5cGU8VFtqXT4gfT4ge1xuICBjb25zdCBzZWxlY3RvcnMgPSBPYmplY3QudmFsdWVzKHQpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModCk7XG4gIGNvbnN0IHByb2plY3RvciA9ICguLi5hcmdzOiBhbnlbXSkgPT5cbiAgICBrZXlzLnJlZHVjZSgoYWNjLCBrZXksIGluZGV4KSA9PiB7XG4gICAgICBhY2Nba2V5XSA9IGFyZ3NbaW5kZXhdO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBhbnkpO1xuICByZXR1cm4gKGNyZWF0ZVNlbGVjdG9yIGFzIGFueSkuYXBwbHkobnVsbCwgWy4uLnNlbGVjdG9ycywgcHJvamVjdG9yXSk7XG59XG4iXX0=
package/esm2022/index.mjs DELETED
@@ -1,7 +0,0 @@
1
- export * from './create-entity-feature';
2
- export * from './model';
3
- export * from './local-store';
4
- export * from './trait-effect';
5
- export * from './util';
6
- export * from './cache';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdHJhaXRzL2NvcmUvc3JjL2xpYi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxRQUFRLENBQUM7QUFDdkIsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1lbnRpdHktZmVhdHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vbG9jYWwtc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi90cmFpdC1lZmZlY3QnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUnO1xuIl19
@@ -1,7 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- /**
3
- * @ignore
4
- * @internal
5
- */
6
- export const DISABLE_LOCAL_TRAIT_EFFECTS = new InjectionToken('disableLocalTraitEffects');
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzYWJsZS1sb2NhbC10cmFpdC1lZmZlY3RzLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRyYWl0cy9jb3JlL3NyYy9saWIvbG9jYWwtc3RvcmUvZGlzYWJsZS1sb2NhbC10cmFpdC1lZmZlY3RzLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0M7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxjQUFjLENBQzNELDBCQUEwQixDQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAaWdub3JlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERJU0FCTEVfTE9DQUxfVFJBSVRfRUZGRUNUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPihcbiAgJ2Rpc2FibGVMb2NhbFRyYWl0RWZmZWN0cydcbik7XG4iXX0=
@@ -1,3 +0,0 @@
1
- export * from './traits-local-store';
2
- export * from './disable-local-trait-effects.token';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdHJhaXRzL2NvcmUvc3JjL2xpYi9sb2NhbC1zdG9yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMscUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3RyYWl0cy1sb2NhbC1zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL2Rpc2FibGUtbG9jYWwtdHJhaXQtZWZmZWN0cy50b2tlbic7XG4iXX0=