@ngrx-traits/core 12.1.2 → 13.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.
Files changed (81) hide show
  1. package/cache/cache.service.d.ts +2 -1
  2. package/esm2020/cache/cache.actions.mjs +6 -0
  3. package/esm2020/cache/cache.models.mjs +30 -0
  4. package/esm2020/cache/cache.module.mjs +18 -0
  5. package/esm2020/cache/cache.reducer.mjs +138 -0
  6. package/esm2020/cache/cache.selectors.mjs +5 -0
  7. package/esm2020/cache/cache.service.mjs +72 -0
  8. package/esm2020/cache/index.mjs +7 -0
  9. package/esm2020/create-entity-feature.mjs +404 -0
  10. package/esm2020/index.mjs +7 -0
  11. package/esm2020/local-store/disable-local-trait-effects.token.mjs +7 -0
  12. package/esm2020/local-store/index.mjs +3 -0
  13. package/esm2020/local-store/traits-local-store.mjs +147 -0
  14. package/esm2020/model.mjs +2 -0
  15. package/esm2020/ngrx-traits-core.mjs +5 -0
  16. package/esm2020/public_api.mjs +2 -0
  17. package/esm2020/testing/index.mjs +2 -0
  18. package/esm2020/testing/ngrx-traits-core-testing.mjs +5 -0
  19. package/esm2020/testing/provide-mock-local-traits.mjs +36 -0
  20. package/esm2020/testing/public_api.mjs +2 -0
  21. package/esm2020/trait-effect.mjs +32 -0
  22. package/esm2020/util.mjs +70 -0
  23. package/fesm2015/{ngrx-traits-core-testing.js → ngrx-traits-core-testing.mjs} +1 -1
  24. package/fesm2015/ngrx-traits-core-testing.mjs.map +1 -0
  25. package/fesm2015/{ngrx-traits-core.js → ngrx-traits-core.mjs} +13 -13
  26. package/fesm2015/ngrx-traits-core.mjs.map +1 -0
  27. package/{esm2015/testing/provide-mock-local-traits.js → fesm2020/ngrx-traits-core-testing.mjs} +12 -8
  28. package/fesm2020/ngrx-traits-core-testing.mjs.map +1 -0
  29. package/fesm2020/ngrx-traits-core.mjs +915 -0
  30. package/fesm2020/ngrx-traits-core.mjs.map +1 -0
  31. package/package.json +36 -14
  32. package/src/lib/cache/README.md +100 -0
  33. package/src/lib/local-store/README.md +172 -0
  34. package/testing/package.json +5 -5
  35. package/bundles/ngrx-traits-core-testing.umd.js +0 -52
  36. package/bundles/ngrx-traits-core-testing.umd.js.map +0 -1
  37. package/bundles/ngrx-traits-core.umd.js +0 -1442
  38. package/bundles/ngrx-traits-core.umd.js.map +0 -1
  39. package/esm2015/cache/cache.actions.js +0 -6
  40. package/esm2015/cache/cache.actions.js.map +0 -1
  41. package/esm2015/cache/cache.models.js +0 -31
  42. package/esm2015/cache/cache.models.js.map +0 -1
  43. package/esm2015/cache/cache.module.js +0 -18
  44. package/esm2015/cache/cache.module.js.map +0 -1
  45. package/esm2015/cache/cache.reducer.js +0 -141
  46. package/esm2015/cache/cache.reducer.js.map +0 -1
  47. package/esm2015/cache/cache.selectors.js +0 -5
  48. package/esm2015/cache/cache.selectors.js.map +0 -1
  49. package/esm2015/cache/cache.service.js +0 -72
  50. package/esm2015/cache/cache.service.js.map +0 -1
  51. package/esm2015/cache/index.js +0 -7
  52. package/esm2015/cache/index.js.map +0 -1
  53. package/esm2015/create-entity-feature.js +0 -409
  54. package/esm2015/create-entity-feature.js.map +0 -1
  55. package/esm2015/index.js +0 -7
  56. package/esm2015/index.js.map +0 -1
  57. package/esm2015/local-store/disable-local-trait-effects.token.js +0 -7
  58. package/esm2015/local-store/disable-local-trait-effects.token.js.map +0 -1
  59. package/esm2015/local-store/index.js +0 -3
  60. package/esm2015/local-store/index.js.map +0 -1
  61. package/esm2015/local-store/traits-local-store.js +0 -148
  62. package/esm2015/local-store/traits-local-store.js.map +0 -1
  63. package/esm2015/model.js +0 -2
  64. package/esm2015/model.js.map +0 -1
  65. package/esm2015/ngrx-traits-core.js +0 -5
  66. package/esm2015/ngrx-traits-core.js.map +0 -1
  67. package/esm2015/public_api.js +0 -2
  68. package/esm2015/public_api.js.map +0 -1
  69. package/esm2015/testing/index.js +0 -2
  70. package/esm2015/testing/index.js.map +0 -1
  71. package/esm2015/testing/ngrx-traits-core-testing.js +0 -5
  72. package/esm2015/testing/ngrx-traits-core-testing.js.map +0 -1
  73. package/esm2015/testing/provide-mock-local-traits.js.map +0 -1
  74. package/esm2015/testing/public_api.js +0 -2
  75. package/esm2015/testing/public_api.js.map +0 -1
  76. package/esm2015/trait-effect.js +0 -32
  77. package/esm2015/trait-effect.js.map +0 -1
  78. package/esm2015/util.js +0 -67
  79. package/esm2015/util.js.map +0 -1
  80. package/fesm2015/ngrx-traits-core-testing.js.map +0 -1
  81. package/fesm2015/ngrx-traits-core.js.map +0 -1
@@ -0,0 +1,404 @@
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
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWVudGl0eS1mZWF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRyYWl0cy9jb3JlL3NyYy9saWIvY3JlYXRlLWVudGl0eS1mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9CQSxPQUFPLEVBR0wsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBR3JCLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFpRjFEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FLeEMsY0FFZ0IsRUFDaEIsR0FBRyxNQUFTO0lBUVosT0FBTyxDQUFDLENBQUMsTUFBd0IsRUFBRSxFQUFFO1FBQ25DLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQ2hDLFlBQVksSUFBSSxjQUFjO1lBQzVCLENBQUMsQ0FBRSxjQUdDO1lBQ0osQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFFekQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLFlBQVk7WUFDekIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7WUFDMUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFakMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUM3QixZQUFZLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQzNFLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFD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QUFlLEVBQUUsUUFBUTthQUMxQixDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNyQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztZQUN6QyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsRDtRQUNELE9BQU87WUFDTCxPQUFPO1lBQ1AsU0FBUztZQUNULE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1lBQ3BFLE9BQU87U0FDUixDQUFDO0lBQ0osQ0FBQyxDQUFNLENBQUM7QUFDVixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQVFoQyxDQVVEO0lBQ0MsT0FBTyxDQUE2QyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWcsXG4gIEV4dHJhY3RBY3Rpb25zVHlwZSxcbiAgRXh0cmFjdFNlbGVjdG9yc1R5cGUsXG4gIEV4dHJhY3RTdGF0ZVR5cGUsXG4gIEVudGl0eUZlYXR1cmVGYWN0b3J5LFxuICBGZWF0dXJlU2VsZWN0b3JzLFxuICBLZXllZENvbmZpZyxcbiAgVHJhaXRBY3Rpb25zLFxuICBUcmFpdEZhY3RvcnksXG4gIFRyYWl0U2VsZWN0b3JzLFxuICBUcmFpdFN0YXRlTXV0YXRvcnMsXG4gIFVuaW9uVG9JbnRlcnNlY3Rpb24sXG4gIFRyYWl0QWN0aW9uc0ZhY3RvcnksXG4gIFRyYWl0U2VsZWN0b3JzRmFjdG9yeSxcbiAgVHJhaXRJbml0aWFsU3RhdGVGYWN0b3J5LFxuICBUcmFpdFN0YXRlTXV0YXRvcnNGYWN0b3J5LFxuICBUcmFpdFJlZHVjZXJGYWN0b3J5LFxuICBUcmFpdEVmZmVjdHNGYWN0b3J5LFxufSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gIEFjdGlvbixcbiAgQWN0aW9uVHlwZSxcbiAgY29tYmluZVJlZHVjZXJzLFxuICBjcmVhdGVGZWF0dXJlU2VsZWN0b3IsXG4gIGNyZWF0ZVJlZHVjZXIsXG4gIGNyZWF0ZVNlbGVjdG9yLFxuICBNZW1vaXplZFNlbGVjdG9yLFxufSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBUcmFpdEVmZmVjdCB9IGZyb20gJy4vdHJhaXQtZWZmZWN0JztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL2xvY2FsLXN0b3JlJztcbmltcG9ydCB7IGNhcGl0YWxpemUsIHNldFByb3BlcnRpZXNSZWR1Y2VyIH0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aGVuIGV4ZWN1dGUgd2lsbCBjb21iaW5lIGFsbCB0aGUgdHJhaXRzLCBhbmQgcmV0dXJuIGEgRW50aXR5RmVhdHVyZUZhY3RvcnlcbiAqIHdoaWNoIGNvbWJpbmVzIGFsbCB0aGUgdHJhaXRzIGFjdGlvbnMsIHNlbGVjdG9ycyAsIHJlZHVjZXJzIGFuZCBlZmZlY3RzLFxuICogdGhlIG5hbWVzIHBhcmFtIHdpbGwgcmVwbGFjZSBhbnkgYWN0aW9uIGFuZCBzZWxlY3RvciB3aXRoIHRoZSB3b3JkIEVudGl0eSBvciBFbnRpdGllcyxcbiAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZW50aXR5TmFtZSBhbmQgIGVudGl0aWVzTmFtZSBwYXJhbSAoZW50aXR5TmFtZSsncycgaWYgZW50aXRpZXNOYW1lIGlzIG9taXR0ZWQpLlxuICogQHBhcmFtIG5hbWVzQ29uZmlnIC0gT3B0aW9uYWwgTmFtZXMgZm9yIGVudGl0aWVzXG4gKiBAcGFyYW0gbmFtZXNDb25maWcuZW50aXR5TmFtZSAtIHNpbmd1bGFyIG5hbWUgZm9yIGVudGl0eVxuICogQHBhcmFtIFtuYW1lc0NvbmZpZy5lbnRpdGllc05hbWVdIC0gcGx1cmFsIG5hbWUgZm9yIGVudGl0aWVzLCBkZWZhdWx0cyB0byBlbnRpdHlOYW1lICsgJ3MnXG4gKiBAcGFyYW0gdHJhaXRzIHNldCBvZiB0cmFpdHMgdG8gYmUgY29tYmluZWRcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3QnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZFNlbGVjdEVudGl0eVRyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZEFzeW5jQWN0aW9uVHJhaXQoe1xuICogICAgIG5hbWU6ICdjaGVja291dCcsXG4gKiAgICAgYWN0aW9uU3VjY2Vzc1Byb3BzOiBwcm9wczx7IG9yZGVySWQ6IHN0cmluZyB9PigpLFxuICogICB9KVxuICogKTtcbiAqXG4gKiBleHBvcnQgY29uc3QgcHJvZHVjdHNGZWF0dXJlID0gZmVhdHVyZUZhY3Rvcnkoe1xuICogICBhY3Rpb25zR3JvdXBLZXk6ICdbUHJvZHVjdHNdJyxcbiAqICAgZmVhdHVyZVNlbGVjdG9yOiAncHJvZHVjdHMnLFxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeTxcbiAgRiBleHRlbmRzIHJlYWRvbmx5IFRyYWl0RmFjdG9yeVtdLFxuICBFbnRpdHlOYW1lIGV4dGVuZHMgc3RyaW5nLFxuICBFbnRpdGllc05hbWUgZXh0ZW5kcyBzdHJpbmcgPSBgJHtFbnRpdHlOYW1lfXNgXG4+KFxuICB7XG4gICAgZW50aXR5TmFtZSxcbiAgICBlbnRpdGllc05hbWUsXG4gIH06IHsgZW50aXR5TmFtZTogRW50aXR5TmFtZTsgZW50aXRpZXNOYW1lPzogRW50aXRpZXNOYW1lIH0sXG4gIC4uLnRyYWl0czogRlxuKTogRW50aXR5RmVhdHVyZUZhY3Rvcnk8XG4gIEVudGl0eU5hbWUsXG4gIEVudGl0aWVzTmFtZSxcbiAgRXh0cmFjdFN0YXRlVHlwZTxGPixcbiAgRXh0cmFjdEFjdGlvbnNUeXBlPEY+LFxuICBFeHRyYWN0U2VsZWN0b3JzVHlwZTxGPlxuPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aGVuIGV4ZWN1dGUgd2lsbCBjb21iaW5lIGFsbCB0aGUgdHJhaXRzLCBhbmQgcmV0dXJuIGEgRW50aXR5RmVhdHVyZUZhY3RvcnlcbiAqIHdoaWNoIGNvbWJpbmVzIGFsbCB0aGUgdHJhaXRzIGFjdGlvbnMsIHNlbGVjdG9ycyAsIHJlZHVjZXJzIGFuZCBlZmZlY3RzLlxuICogQHBhcmFtIHRyYWl0cyBzZXQgb2YgdHJhaXRzIHRvIGJlIGNvbWJpbmVkXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdwcm9kdWN0JyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRTZWxlY3RFbnRpdHlUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRBc3luY0FjdGlvblRyYWl0KHtcbiAqICAgICBuYW1lOiAnY2hlY2tvdXQnLFxuICogICAgIGFjdGlvblN1Y2Nlc3NQcm9wczogcHJvcHM8eyBvcmRlcklkOiBzdHJpbmcgfT4oKSxcbiAqICAgfSlcbiAqICk7XG4gKlxuICogZXhwb3J0IGNvbnN0IHByb2R1Y3RzRmVhdHVyZSA9IGZlYXR1cmVGYWN0b3J5KHtcbiAqICAgYWN0aW9uc0dyb3VwS2V5OiAnW1Byb2R1Y3RzXScsXG4gKiAgIGZlYXR1cmVTZWxlY3RvcjogJ3Byb2R1Y3RzJyxcbiAqIH0pO1xuICpcbiAqIHByb2R1Y3RzRmVhdHVyZS5hY3Rpb25zLmxvYWRQcm9kdWN0cygpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3Rvcnk8RiBleHRlbmRzIHJlYWRvbmx5IFRyYWl0RmFjdG9yeVtdPihcbiAgLi4udHJhaXRzOiBGXG4pOiBFbnRpdHlGZWF0dXJlRmFjdG9yeTxcbiAgJ0VudGl0eScsXG4gICdFbnRpdGllcycsXG4gIEV4dHJhY3RTdGF0ZVR5cGU8Rj4sXG4gIEV4dHJhY3RBY3Rpb25zVHlwZTxGPixcbiAgRXh0cmFjdFNlbGVjdG9yc1R5cGU8Rj5cbj47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd2hlbiBleGVjdXRlIHdpbGwgY29tYmluZSBhbGwgdGhlIHRyYWl0cywgYW5kIHJldHVybiBhIEVudGl0eUZlYXR1cmVGYWN0b3J5XG4gKiB3aGljaCBjb21iaW5lcyBhbGwgdGhlIHRyYWl0cyBhY3Rpb25zLCBzZWxlY3RvcnMgLCByZWR1Y2VycyBhbmQgZWZmZWN0cyxcbiAqIHRoZSBuYW1lcyBwYXJhbSB3aWxsIHJlcGxhY2UgYW55IGFjdGlvbiBhbmQgc2VsZWN0b3Igd2l0aCB0aGUgd29yZCBFbnRpdHkgb3IgRW50aXRpZXMsXG4gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGVudGl0eU5hbWUgYW5kICBlbnRpdGllc05hbWUgcGFyYW0gKGVudGl0eU5hbWUrJ3MnIGlmIGVudGl0aWVzTmFtZSBpcyBvbWl0dGVkKS5cbiAqIEBwYXJhbSBuYW1lc0NvbmZpZyAtIE9wdGlvbmFsIE5hbWVzIGZvciBlbnRpdGllc1xuICogQHBhcmFtIG5hbWVzQ29uZmlnLmVudGl0eU5hbWUgLSBzaW5ndWxhciBuYW1lIGZvciBlbnRpdHlcbiAqIEBwYXJhbSBbbmFtZXNDb25maWcuZW50aXRpZXNOYW1lXSAtIHBsdXJhbCBuYW1lIGZvciBlbnRpdGllcywgZGVmYXVsdHMgdG8gZW50aXR5TmFtZSArICdzJ1xuICogQHBhcmFtIHRyYWl0cyBzZXQgb2YgdHJhaXRzIHRvIGJlIGNvbWJpbmVkXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdwcm9kdWN0JyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRTZWxlY3RFbnRpdHlUcmFpdDxQcm9kdWN0PigpLFxuICogICBhZGRBc3luY0FjdGlvblRyYWl0KHtcbiAqICAgICBuYW1lOiAnY2hlY2tvdXQnLFxuICogICAgIGFjdGlvblN1Y2Nlc3NQcm9wczogcHJvcHM8eyBvcmRlcklkOiBzdHJpbmcgfT4oKSxcbiAqICAgfSlcbiAqICk7XG4gKlxuICogZXhwb3J0IGNvbnN0IHByb2R1Y3RzRmVhdHVyZSA9IGZlYXR1cmVGYWN0b3J5KHtcbiAqICAgYWN0aW9uc0dyb3VwS2V5OiAnW1Byb2R1Y3RzXScsXG4gKiAgIGZlYXR1cmVTZWxlY3RvcjogJ3Byb2R1Y3RzJyxcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3Rvcnk8XG4gIEYgZXh0ZW5kcyByZWFkb25seSBUcmFpdEZhY3RvcnlbXSxcbiAgRW50aXR5TmFtZSBleHRlbmRzIHN0cmluZyxcbiAgRW50aXRpZXNOYW1lIGV4dGVuZHMgc3RyaW5nID0gYCR7RW50aXR5TmFtZX1zYFxuPihcbiAgbmFtZXNPckZhY3Rvcnk6XG4gICAgfCB7IGVudGl0eU5hbWU6IEVudGl0eU5hbWU7IGVudGl0aWVzTmFtZT86IEVudGl0aWVzTmFtZSB9XG4gICAgfCBUcmFpdEZhY3RvcnksXG4gIC4uLnRyYWl0czogRlxuKTogRW50aXR5RmVhdHVyZUZhY3Rvcnk8XG4gIEVudGl0eU5hbWUsXG4gIEVudGl0aWVzTmFtZSxcbiAgRXh0cmFjdFN0YXRlVHlwZTxGPixcbiAgRXh0cmFjdEFjdGlvbnNUeXBlPEY+LFxuICBFeHRyYWN0U2VsZWN0b3JzVHlwZTxGPlxuPiB7XG4gIHJldHVybiAoKGNvbmZpZzogQ29uZmlnPGFueSwgYW55PikgPT4ge1xuICAgIGNvbnN0IHsgZW50aXR5TmFtZSwgZW50aXRpZXNOYW1lIH0gPVxuICAgICAgJ2VudGl0eU5hbWUnIGluIG5hbWVzT3JGYWN0b3J5XG4gICAgICAgID8gKG5hbWVzT3JGYWN0b3J5IGFzIHtcbiAgICAgICAgICAgIGVudGl0eU5hbWU6IEVudGl0eU5hbWU7XG4gICAgICAgICAgICBlbnRpdGllc05hbWU/OiBFbnRpdGllc05hbWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgOiB7IGVudGl0eU5hbWU6ICdFbnRpdHknLCBlbnRpdGllc05hbWU6ICdFbnRpdGllcycgfTtcblxuICAgIGNvbnN0IHNpbmd1bGFyID0gY2FwaXRhbGl6ZShlbnRpdHlOYW1lKTtcbiAgICBjb25zdCBwbHVyYWwgPSBlbnRpdGllc05hbWVcbiAgICAgID8gY2FwaXRhbGl6ZShlbnRpdGllc05hbWUpXG4gICAgICA6IGNhcGl0YWxpemUoZW50aXR5TmFtZSArICdzJyk7XG5cbiAgICBjb25zdCBzb3J0ZWRUcmFpdHMgPSBzb3J0VHJhaXRzKFxuICAgICAgJ2VudGl0eU5hbWUnIGluIG5hbWVzT3JGYWN0b3J5ID8gWy4uLnRyYWl0c10gOiBbbmFtZXNPckZhY3RvcnksIC4uLnRyYWl0c11cbiAgICApO1xuXG4gICAgY29uc3QgYWxsQ29uZmlncyA9IGJ1aWxkQWxsQ29uZmlncyhzb3J0ZWRUcmFpdHMpO1xuXG4gICAgY29uc3QgYWxsQWN0aW9ucyA9IGJ1aWxkQWxsQWN0aW9ucyhcbiAgICAgIHNvcnRlZFRyYWl0cyxcbiAgICAgIGNvbmZpZy5hY3Rpb25zR3JvdXBLZXksXG4gICAgICBzaW5ndWxhcixcbiAgICAgIHBsdXJhbCxcbiAgICAgIGFsbENvbmZpZ3NcbiAgICApO1xuXG4gICAgY29uc3QgYWxsU2VsZWN0b3JzID0gYnVpbGRBbGxTZWxlY3RvcnMoc29ydGVkVHJhaXRzLCBhbGxDb25maWdzKTtcblxuICAgIGNvbnN0IGFsbE11dGF0b3JzID0gYnVpbGRBbGxNdXRhdG9ycyhcbiAgICAgIHNvcnRlZFRyYWl0cyxcbiAgICAgIGFsbFNlbGVjdG9ycyxcbiAgICAgIGFsbENvbmZpZ3NcbiAgICApO1xuXG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0gYnVpbGRJbml0aWFsU3RhdGUoc29ydGVkVHJhaXRzLCBhbGxDb25maWdzKTtcblxuICAgIGNvbnN0IHJlZHVjZXIgPSBidWlsZFJlZHVjZXIoXG4gICAgICBzb3J0ZWRUcmFpdHMsXG4gICAgICBpbml0aWFsU3RhdGUsXG4gICAgICBhbGxBY3Rpb25zLFxuICAgICAgYWxsU2VsZWN0b3JzLFxuICAgICAgYWxsTXV0YXRvcnMsXG4gICAgICBhbGxDb25maWdzXG4gICAgKTtcblxuICAgIGNvbnN0IGZlYXR1cmVTZWxlY3RvciA9XG4gICAgICB0eXBlb2YgY29uZmlnLmZlYXR1cmVTZWxlY3RvciA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBjcmVhdGVGZWF0dXJlU2VsZWN0b3I8RXh0cmFjdFN0YXRlVHlwZTxGPj4oY29uZmlnLmZlYXR1cmVTZWxlY3RvcilcbiAgICAgICAgOiBjb25maWcuZmVhdHVyZVNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWxsRmVhdHVyZVNlbGVjdG9ycyA9XG4gICAgICBhbGxTZWxlY3RvcnMgJiYgZ2V0U2VsZWN0b3JzRm9yRmVhdHVyZShmZWF0dXJlU2VsZWN0b3IsIGFsbFNlbGVjdG9ycyk7XG5cbiAgICBjb25zdCBhbGxFZmZlY3RzID0gYnVpbGRBbGxFZmZlY3RzKFxuICAgICAgc29ydGVkVHJhaXRzLFxuICAgICAgYWxsQWN0aW9ucyxcbiAgICAgIGFsbEZlYXR1cmVTZWxlY3RvcnMsXG4gICAgICBhbGxDb25maWdzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25zOiBlbnRpdHlOYW1lXG4gICAgICAgID8gcmVuYW1lUHJvcHMoYWxsQWN0aW9ucywgc2luZ3VsYXIsIHBsdXJhbClcbiAgICAgICAgOiBhbGxBY3Rpb25zLFxuICAgICAgc2VsZWN0b3JzOiBlbnRpdHlOYW1lXG4gICAgICAgID8gcmVuYW1lUHJvcHMoYWxsRmVhdHVyZVNlbGVjdG9ycywgc2luZ3VsYXIsIHBsdXJhbClcbiAgICAgICAgOiBhbGxTZWxlY3RvcnMsXG4gICAgICBpbml0aWFsU3RhdGUsXG4gICAgICByZWR1Y2VyOiByZWR1Y2VyID8/IGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlKSxcbiAgICAgIGVmZmVjdHM6IGFsbEVmZmVjdHMsXG4gICAgfTtcbiAgfSkgYXMgRW50aXR5RmVhdHVyZUZhY3Rvcnk8XG4gICAgRW50aXR5TmFtZSxcbiAgICBFbnRpdGllc05hbWUsXG4gICAgRXh0cmFjdFN0YXRlVHlwZTxGPixcbiAgICBFeHRyYWN0QWN0aW9uc1R5cGU8Rj4sXG4gICAgRXh0cmFjdFNlbGVjdG9yc1R5cGU8Rj5cbiAgPjtcbn1cblxuZnVuY3Rpb24gcmVuYW1lUHJvcHModGFyZ2V0OiBhbnksIGVudGl0eU5hbWU6IHN0cmluZywgZW50aXRpZXNOYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgYW55O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YXJnZXQpKSB7XG4gICAgY29uc3QgbmV3S2V5ID0ga2V5XG4gICAgICAucmVwbGFjZSgnRW50aXRpZXMnLCBlbnRpdGllc05hbWUpXG4gICAgICAucmVwbGFjZSgnRW50aXR5JywgZW50aXR5TmFtZSk7XG4gICAgcmVzdWx0W25ld0tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzb3J0VHJhaXRzKFxuICB0cmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W11cbik6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10ge1xuICBjb25zdCBzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFpdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0cmFpdCA9IHRyYWl0c1tpXTtcbiAgICBpZiAoIXRyYWl0LmRlcGVuZHM/Lmxlbmd0aCkge1xuICAgICAgc29ydGVkVHJhaXRzLnB1c2godHJhaXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0cmFpdC5kZXBlbmRzLmxlbmd0aCA+IDEpXG4gICAgICBmb3IgKGNvbnN0IGQgb2YgdHJhaXQuZGVwZW5kcykge1xuICAgICAgICBjb25zdCBpc1RyYWl0UHJlc2VudCA9IHRyYWl0cy5zb21lKCh0cikgPT4gdHIua2V5ID09PSBkKTtcbiAgICAgICAgaWYgKGlzVHJhaXRQcmVzZW50KSB7XG4gICAgICAgICAgdHJhaXQuZGVwZW5kcyA9IFtkXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGlmICh0cmFpdC5kZXBlbmRzLmxlbmd0aCA+IDEpXG4gICAgICB0aHJvdyBFcnJvcignY291bGQgbm90IGZpbmQgZGVwZW5kZW5jaWVzICcgKyB0cmFpdC5kZXBlbmRzLmpvaW4oJyAnKSk7XG4gICAgY29uc3QgaXNEZXBlbmRlbmN5QWxyZWFkeUFkZGVkID0gc29ydGVkVHJhaXRzLnNvbWUoXG4gICAgICAodHIpID0+IHRyLmtleSA9PT0gdHJhaXQ/LmRlcGVuZHM/LlswXVxuICAgICk7XG5cbiAgICBpZiAoaXNEZXBlbmRlbmN5QWxyZWFkeUFkZGVkKSBzb3J0ZWRUcmFpdHMucHVzaCh0cmFpdCk7XG4gICAgZWxzZSB7XG4gICAgICAvLyBtb3ZlIHRyYWl0IHRvIHRoZSBlbmRcbiAgICAgIGRlbGV0ZSB0cmFpdHNbaV07XG4gICAgICB0cmFpdHMucHVzaCh0cmFpdCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzb3J0ZWRUcmFpdHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsQ29uZmlncyhzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10pIHtcbiAgcmV0dXJuIHNvcnRlZFRyYWl0cy5yZWR1Y2UoKGFjYzogS2V5ZWRDb25maWc8c3RyaW5nLCBhbnk+LCBmYWN0b3J5KSA9PiB7XG4gICAgYWNjW2ZhY3Rvcnkua2V5XSA9IGZhY3RvcnkuY29uZmlnO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxBY3Rpb25zKFxuICBzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10sXG4gIGFjdGlvbnNHcm91cEtleTogc3RyaW5nLFxuICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gIGVudGl0aWVzTmFtZTogc3RyaW5nLFxuICBhbGxDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ICYgeyBbcDogc3RyaW5nXTogYW55IH1cbikge1xuICByZXR1cm4gc29ydGVkVHJhaXRzLnJlZHVjZSgocHJldmlvdXNSZXN1bHQ6IFRyYWl0QWN0aW9ucywgZmFjdG9yeSkgPT4ge1xuICAgIGxldCByZXN1bHQgPVxuICAgICAgZmFjdG9yeT8uYWN0aW9ucz8uKHtcbiAgICAgICAgYWN0aW9uc0dyb3VwS2V5OiBhY3Rpb25zR3JvdXBLZXksXG4gICAgICAgIGVudGl0eU5hbWUsXG4gICAgICAgIGVudGl0aWVzTmFtZSxcbiAgICAgICAgYWxsQ29uZmlncyxcbiAgICAgIH0pID8/IHt9O1xuICAgIHJlc3VsdCA9IHByZXZpb3VzUmVzdWx0ID8geyAuLi5wcmV2aW91c1Jlc3VsdCwgLi4ucmVzdWx0IH0gOiByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFsbFNlbGVjdG9ycyhcbiAgc29ydGVkVHJhaXRzOiBUcmFpdEZhY3Rvcnk8YW55LCBhbnksIGFueSwgYW55PltdLFxuICBhbGxDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ICYgeyBbcDogc3RyaW5nXTogYW55IH1cbikge1xuICByZXR1cm4gc29ydGVkVHJhaXRzLnJlZHVjZSgocHJldmlvdXNSZXN1bHQ6IFRyYWl0U2VsZWN0b3JzPGFueT4sIGZhY3RvcnkpID0+IHtcbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIGZhY3Rvcnk/LnNlbGVjdG9ycz8uKHtcbiAgICAgICAgcHJldmlvdXNTZWxlY3RvcnM6IHByZXZpb3VzUmVzdWx0LFxuICAgICAgICBhbGxDb25maWdzLFxuICAgICAgfSkgPz8ge307XG4gICAgcmVzdWx0ID0gcHJldmlvdXNSZXN1bHQgPyB7IC4uLnByZXZpb3VzUmVzdWx0LCAuLi5yZXN1bHQgfSA6IHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsTXV0YXRvcnMoXG4gIHNvcnRlZFRyYWl0czogVHJhaXRGYWN0b3J5PGFueSwgYW55LCBhbnksIGFueT5bXSxcbiAgYWxsU2VsZWN0b3JzOiBUcmFpdFNlbGVjdG9yczxhbnk+LFxuICBhbGxDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ICYgeyBbcDogc3RyaW5nXTogYW55IH1cbikge1xuICByZXR1cm4gKFxuICAgIHNvcnRlZFRyYWl0cy5yZWR1Y2UoXG4gICAgICAocHJldmlvdXNSZXN1bHQ6IFRyYWl0U3RhdGVNdXRhdG9yczxhbnk+IHwgdW5kZWZpbmVkLCBmYWN0b3J5KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPVxuICAgICAgICAgIGZhY3Rvcnk/Lm11dGF0b3JzPy4oe1xuICAgICAgICAgICAgYWxsU2VsZWN0b3JzOiBhbGxTZWxlY3RvcnMsXG4gICAgICAgICAgICBwcmV2aW91c011dGF0b3JzOiBwcmV2aW91c1Jlc3VsdCxcbiAgICAgICAgICAgIGFsbENvbmZpZ3MsXG4gICAgICAgICAgfSkgPz8ge307XG4gICAgICAgIHJlc3VsdCA9IHByZXZpb3VzUmVzdWx0ID8geyAuLi5wcmV2aW91c1Jlc3VsdCwgLi4ucmVzdWx0IH0gOiByZXN1bHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge31cbiAgICApIHx8IHt9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW5pdGlhbFN0YXRlKFxuICBzb3J0ZWRUcmFpdHM6IFRyYWl0RmFjdG9yeTxhbnksIGFueSwgYW55LCBhbnk+W10sXG4gIGFsbENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gJiB7IFtwOiBzdHJpbmddOiBhbnkgfVxuKSB7XG4gIHJldHVybiBzb3J0ZWRUcmFpdHMucmVkdWNlKChwcmV2aW91c1Jlc3VsdDogYW55LCBmYWN0b3J5KSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgIGZhY3Rvcnk/LmluaXRpYWxTdGF0ZT8uKHtcbiAgICAgICAgcHJldmlvdXNJbml0aWFsU3RhdGU6IHByZXZpb3VzUmVzdWx0LFxuICAgICAgICBhbGxDb25maWdzLFxuICAgICAgfSkgPz9cbiAgICAgIHByZXZpb3VzUmVzdWx0ID8/XG4gICAgICB7fTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVkdWNlcihcbiAgc29ydGVkVHJhaXRzOiBUcmFpdEZhY3Rvcnk8YW55LCBhbnksIGFueSwgYW55PltdLFxuICBpbml0aWFsU3RhdGU6IGFueSxcbiAgYWxsQWN0aW9uczogVHJhaXRBY3Rpb25zLFxuICBhbGxTZWxlY3RvcnM6IFRyYWl0U2VsZWN0b3JzPGFueT4sXG4gIGFsbE11dGF0b3JzOiBUcmFpdFN0YXRlTXV0YXRvcnM8YW55PixcbiAgYWxsQ29uZmlnczogUmVjb3JkPHN0cmluZywgYW55PiAmIHsgW3A6IHN0cmluZ106IGFueSB9XG4pIHtcbiAgcmV0dXJuIHNvcnRlZFRyYWl0cy5yZWR1Y2UoXG4gICAgKFxuICAgICAgcHJldmlvdXNSZXN1bHQ6ICgoc3RhdGU6IGFueSwgYWN0aW9uOiBBY3Rpb24pID0+IGFueSkgfCB1bmRlZmluZWQsXG4gICAgICBmYWN0b3J5XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBmYWN0b3J5Py5yZWR1Y2VyPy4oe1xuICAgICAgICBpbml0aWFsU3RhdGUsXG4gICAgICAgIGFsbEFjdGlvbnMsXG4gICAgICAgIGFsbFNlbGVjdG9ycyxcbiAgICAgICAgYWxsTXV0YXRvcnMsXG4gICAgICAgIGFsbENvbmZpZ3MsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQgJiYgcHJldmlvdXNSZXN1bHRcbiAgICAgICAgPyAoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYVN0YXRlID0gcHJldmlvdXNSZXN1bHQoc3RhdGUsIGFjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0KGFTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogcmVzdWx0ID8/IHByZXZpb3VzUmVzdWx0O1xuICAgIH0sXG4gICAgdW5kZWZpbmVkXG4gICk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsRWZmZWN0cyhcbiAgc29ydGVkVHJhaXRzOiBUcmFpdEZhY3Rvcnk8YW55LCBhbnksIGFueSwgYW55PltdLFxuICBhbGxBY3Rpb25zOiBUcmFpdEFjdGlvbnMsXG4gIGFsbEZlYXR1cmVTZWxlY3RvcnM6IFRyYWl0U2VsZWN0b3JzPGFueT4sXG4gIGFsbENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gJiB7IFtwOiBzdHJpbmddOiBhbnkgfVxuKSB7XG4gIHJldHVybiBzb3J0ZWRUcmFpdHMucmVkdWNlKFxuICAgIChwcmV2aW91c1Jlc3VsdDogVHlwZTxUcmFpdEVmZmVjdD5bXSB8IHVuZGVmaW5lZCwgZmFjdG9yeSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdCA9XG4gICAgICAgIGZhY3Rvcnk/LmVmZmVjdHM/Lih7XG4gICAgICAgICAgYWxsQWN0aW9ucyxcbiAgICAgICAgICBhbGxTZWxlY3RvcnM6IGFsbEZlYXR1cmVTZWxlY3RvcnMsXG4gICAgICAgICAgYWxsQ29uZmlncyxcbiAgICAgICAgfSkgPz8gW107XG4gICAgICByZXN1bHQgPSBwcmV2aW91c1Jlc3VsdCA/IFsuLi5wcmV2aW91c1Jlc3VsdCwgLi4ucmVzdWx0XSA6IHJlc3VsdDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBbXVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3RvcnNGb3JGZWF0dXJlPFxuICBTdGF0ZSxcbiAgUyBleHRlbmRzIFRyYWl0U2VsZWN0b3JzPFN0YXRlPixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgRiBleHRlbmRzIE1lbW9pemVkU2VsZWN0b3I8b2JqZWN0LCBhbnk+XG4+KGZlYXR1cmVTZWxlY3Q6IEYsIHNlbGVjdG9yczogUyk6IEZlYXR1cmVTZWxlY3RvcnM8U3RhdGUsIFM+IHtcbiAgY29uc3Qgc3M6IHsgW2tleSBpbiBrZXlvZiBTXT86IGFueSB9ID0ge307XG4gIGZvciAoY29uc3QgcHJvcCBpbiBzZWxlY3RvcnMpIHtcbiAgICBzc1twcm9wXSA9IGNyZWF0ZVNlbGVjdG9yKGZlYXR1cmVTZWxlY3QgYXMgYW55LCBzZWxlY3RvcnNbcHJvcF0gYXMgYW55KTtcbiAgfVxuICByZXR1cm4gc3MgYXMgRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgUz47XG59XG5cbi8qKlxuICogQ29tYmluZSBhIG1hcCBlbnRpdHlGZWF0dXJlRmFjdG9yaWVzIGludG8gb25lLFxuICogZ3JvdXBpbmcgdGhlIGFjdGlvbnMgYW5kIHNlbGVjdG9ycyBieSB0aGUga2V5IG9mIHRoZSByZXNwZWN0aXZlIGVudGl0eUZlYXR1cmVGYWN0b3J5XG4gKiBAcGFyYW0gdHJhaXRGYWN0b3JpZXNNYXBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGNsaWVudHNGZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdjbGllbnQnLCBlbnRpdGllc05hbWU6ICdjbGllbnRzJyB9LFxuICogICBhZGRMb2FkRW50aXRpZXNUcmFpdDxDbGllbnQ+KCksXG4gKiAgIGFkZENydWRFbnRpdGllc1RyYWl0PENsaWVudD4oKVxuICogKTtcbiAqXG4gKiBjb25zdCBwcm9kdWN0T3JkZXJGZWF0dXJlRmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZlYXR1cmVGYWN0b3J5KFxuICogICB7IGVudGl0eU5hbWU6ICdwcm9kdWN0T3JkZXInIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PFByb2R1Y3RPcmRlcj4oKSxcbiAqICAgYWRkU2VsZWN0RW50aXRpZXNUcmFpdDxQcm9kdWN0T3JkZXI+KClcbiAqICk7XG4gKlxuICogY29uc3QgcHJvZHVjdEZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3QnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PFByb2R1Y3Q+KCksXG4gKiAgIGFkZFNlbGVjdEVudGl0aWVzVHJhaXQ8UHJvZHVjdD4oKVxuICogKTtcbiAqXG4gKiBjb25zdCBwcm9kdWN0Q29tYmluZWRGYWN0b3J5ID0gY29tYmluZUVudGl0eUZlYXR1cmVzKHtcbiAqICAgcHJvZHVjdHM6IHByb2R1Y3RGZWF0dXJlRmFjdG9yeSxcbiAqICAgcHJvZHVjdE9yZGVyczogcHJvZHVjdE9yZGVyRmVhdHVyZUZhY3RvcnksXG4gKiAgIGNsaWVudHM6IGNsaWVudHNGZWF0dXJlRmFjdG9yeSxcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbWJpbmVkRmVhdHVyZSA9IHByb2R1Y3RDb21iaW5lZEZhY3Rvcnkoe1xuICogICAgIGFjdGlvbnNHcm91cEtleTogJ1tDb21iaW5lZF0nLFxuICogICAgIGZlYXR1cmVTZWxlY3RvcjogJ2NvbWJpbmVkJyxcbiAqICAgfSk7XG4gKlxuICogICBjb21iaW5lZEZlYXR1cmUuYWN0aW9ucy5jbGllbnQubG9hZENsaWVudHMoKTtcbiAqICAgY29tYmluZWRGZWF0dXJlLmFjdGlvbnMucHJvZHVjdC5sb2FkUHJvZHVjdHMoKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVFbnRpdHlGZWF0dXJlczxcbiAgVCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogRW50aXR5RmVhdHVyZUZhY3Rvcnk8YW55LCBhbnk+IH0sXG4gIEsgZXh0ZW5kcyBrZXlvZiBULFxuICBTdGF0ZSBleHRlbmRzIHsgW1AgaW4gS106IEV4dHJhY3RTdGF0ZVR5cGU8UmV0dXJuVHlwZTxUW1BdPj4gfSxcbiAgQSBleHRlbmRzIHsgW1AgaW4gS106IEV4dHJhY3RBY3Rpb25zVHlwZTxSZXR1cm5UeXBlPFRbUF0+PiB9LFxuICBTIGV4dGVuZHMge1xuICAgIFtQIGluIEtdOiBGZWF0dXJlU2VsZWN0b3JzPFN0YXRlLCBFeHRyYWN0U2VsZWN0b3JzVHlwZTxSZXR1cm5UeXBlPFRbUF0+Pj47XG4gIH0sXG4gIFIgZXh0ZW5kcyAoY29uZmlnOiBDb25maWc8U3RhdGU+KSA9PiB7XG4gICAgYWN0aW9uczogQTtcbiAgICBzZWxlY3RvcnM6IFM7XG4gICAgcmVkdWNlcjogKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25UeXBlPGFueT4pID0+IFN0YXRlO1xuICAgIGVmZmVjdHM6IFR5cGU8YW55PltdO1xuICAgIGluaXRpYWxTdGF0ZTogU3RhdGU7XG4gIH1cbj4odHJhaXRGYWN0b3JpZXNNYXA6IFQpOiBSIHtcbiAgcmV0dXJuICgoY29uZmlnOiBDb25maWc8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc3QgZmVhdHVyZVNlbGVjdG9yID1cbiAgICAgIHR5cGVvZiBjb25maWcuZmVhdHVyZVNlbGVjdG9yID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGNyZWF0ZUZlYXR1cmVTZWxlY3Rvcjxhbnk+KGNvbmZpZy5mZWF0dXJlU2VsZWN0b3IpXG4gICAgICAgIDogY29uZmlnLmZlYXR1cmVTZWxlY3RvcjtcbiAgICBjb25zdCBhY3Rpb25zOiBhbnkgPSB7fTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IGFueSA9IHt9O1xuICAgIGNvbnN0IHJlZHVjZXJzOiBhbnkgPSB7fTtcbiAgICBsZXQgZWZmZWN0czogVHlwZTxhbnk+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudGl0eUZlYXR1cmVGYWN0b3J5XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIHRyYWl0RmFjdG9yaWVzTWFwXG4gICAgKSkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICAgICAgZmVhdHVyZVNlbGVjdG9yLFxuICAgICAgICAoc3RhdGU6IGFueSkgPT4gc3RhdGVba2V5XVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZlYXR1cmVUcmFpdHMgPSBlbnRpdHlGZWF0dXJlRmFjdG9yeSh7XG4gICAgICAgIGFjdGlvbnNHcm91cEtleTogY29uZmlnLmFjdGlvbnNHcm91cEtleSxcbiAgICAgICAgZmVhdHVyZVNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgIH0pO1xuICAgICAgYWN0aW9uc1trZXldID0gZmVhdHVyZVRyYWl0cy5hY3Rpb25zO1xuICAgICAgc2VsZWN0b3JzW2tleV0gPSBmZWF0dXJlVHJhaXRzLnNlbGVjdG9ycztcbiAgICAgIHJlZHVjZXJzW2tleV0gPSBmZWF0dXJlVHJhaXRzLnJlZHVjZXI7XG4gICAgICBlZmZlY3RzID0gWy4uLmVmZmVjdHMsIC4uLmZlYXR1cmVUcmFpdHMuZWZmZWN0c107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25zLFxuICAgICAgc2VsZWN0b3JzLFxuICAgICAgcmVkdWNlcjogY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSxcbiAgICAgIGVmZmVjdHMsXG4gICAgfTtcbiAgfSkgYXMgUjtcbn1cblxuLyoqXG4gKiBNaXggYSBtYXAgZW50aXR5RmVhdHVyZUZhY3RvcmllcyBpbnRvIG9uZSwgZGlmZmVyZW50IGZyb20gY29tYmluZSB0aGUgYWN0aW9ucyBhbmQgc2VsZWN0b3JzIGEgbWl4LCBub3QgZ3JvdXAgYnkga2V5IGxpa2UgaW4gY29tYmluZSwgdGhlIGtleXMgYXJlIHN0aWxsIHVzZVxuICogaW50ZXJuYWwgaW4gdGhlIHJlZHVjZXJzIGFuZCBzZWxlY3RvciB0byBzZXBhcmF0ZSB0aGUgc3RhdGVcbiAqIEBwYXJhbSB0cmFpdEZhY3Rvcmllc01hcFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgY2xpZW50c0ZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ2NsaWVudCcsIGVudGl0aWVzTmFtZTogJ2NsaWVudHMnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PENsaWVudD4oKSxcbiAqICAgYWRkQ3J1ZEVudGl0aWVzVHJhaXQ8Q2xpZW50PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RPcmRlckZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3RPcmRlcicgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdE9yZGVyPigpLFxuICogICBhZGRTZWxlY3RFbnRpdGllc1RyYWl0PFByb2R1Y3RPcmRlcj4oKVxuICogKTtcbiAqXG4gKiBjb25zdCBwcm9kdWN0RmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAncHJvZHVjdCcgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdD4oKSxcbiAqICAgYWRkU2VsZWN0RW50aXRpZXNUcmFpdDxQcm9kdWN0PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RNaXhlZEZhY3RvcnkgPSBtaXhFbnRpdHlGZWF0dXJlcyh7XG4gKiAgIHByb2R1Y3RzOiBwcm9kdWN0RmVhdHVyZUZhY3RvcnksXG4gKiAgIHByb2R1Y3RPcmRlcnM6IHByb2R1Y3RPcmRlckZlYXR1cmVGYWN0b3J5LFxuICogICBjbGllbnRzOiBjbGllbnRzRmVhdHVyZUZhY3RvcnksXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBtaXhlZEZlYXR1cmUgPSBwcm9kdWN0TWl4ZWRGYWN0b3J5KHtcbiAqICAgICBhY3Rpb25zR3JvdXBLZXk6ICdbTWl4ZWRdJyxcbiAqICAgICBmZWF0dXJlU2VsZWN0b3I6ICdtaXhlZCcsXG4gKiAgIH0pO1xuICogbWl4ZWRGZWF0dXJlLmFjdGlvbnMubG9hZENsaWVudHMoKTtcbiAqIG1peGVkRmVhdHVyZS5hY3Rpb25zLmxvYWRQcm9kdWN0cygpO1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peEVudGl0eUZlYXR1cmVzPFxuICBUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBFbnRpdHlGZWF0dXJlRmFjdG9yeTxhbnksIGFueT4gfSxcbiAgSyBleHRlbmRzIGtleW9mIFQsXG4gIFN0YXRlIGV4dGVuZHMgeyBbUCBpbiBLXTogRXh0cmFjdFN0YXRlVHlwZTxSZXR1cm5UeXBlPFRbUF0+PiB9LFxuICBBIGV4dGVuZHMgVHJhaXRBY3Rpb25zICZcbiAgICBVbmlvblRvSW50ZXJzZWN0aW9uPEV4dHJhY3RBY3Rpb25zVHlwZTxSZXR1cm5UeXBlPFRbS10+Pj4sXG4gIFMgZXh0ZW5kcyBUcmFpdFNlbGVjdG9yczxhbnk+ICZcbiAgICBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICAgICAgRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgRXh0cmFjdFNlbGVjdG9yc1R5cGU8UmV0dXJuVHlwZTxUW0tdPj4+XG4gICAgPixcbiAgUiBleHRlbmRzIEVudGl0eUZlYXR1cmVGYWN0b3J5PGFueSwgYW55LCBTdGF0ZSwgQSwgUz5cbj4odHJhaXRGYWN0b3JpZXNNYXA6IFQpOiBSIHtcbiAgcmV0dXJuICgoY29uZmlnOiBDb25maWc8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc3QgZmVhdHVyZVNlbGVjdG9yID1cbiAgICAgIHR5cGVvZiBjb25maWcuZmVhdHVyZVNlbGVjdG9yID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGNyZWF0ZUZlYXR1cmVTZWxlY3Rvcjxhbnk+KGNvbmZpZy5mZWF0dXJlU2VsZWN0b3IpXG4gICAgICAgIDogY29uZmlnLmZlYXR1cmVTZWxlY3RvcjtcbiAgICBsZXQgYWN0aW9uczogYW55ID0ge307XG4gICAgbGV0IHNlbGVjdG9yczogYW55ID0ge307XG4gICAgY29uc3QgcmVkdWNlcnM6IGFueSA9IHt9O1xuICAgIGxldCBlZmZlY3RzOiBUeXBlPGFueT5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50aXR5RmVhdHVyZUZhY3RvcnldIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgdHJhaXRGYWN0b3JpZXNNYXBcbiAgICApKSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgICBmZWF0dXJlU2VsZWN0b3IsXG4gICAgICAgIChzdGF0ZTogYW55KSA9PiBzdGF0ZVtrZXldXG4gICAgICApO1xuICAgICAgY29uc3QgZmVhdHVyZVRyYWl0cyA9IGVudGl0eUZlYXR1cmVGYWN0b3J5KHtcbiAgICAgICAgYWN0aW9uc0dyb3VwS2V5OiBjb25maWcuYWN0aW9uc0dyb3VwS2V5LFxuICAgICAgICBmZWF0dXJlU2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgfSk7XG4gICAgICBhY3Rpb25zID0geyAuLi5hY3Rpb25zLCAuLi5mZWF0dXJlVHJhaXRzLmFjdGlvbnMgfTtcbiAgICAgIHNlbGVjdG9ycyA9IHsgLi4uc2VsZWN0b3JzLCAuLi5mZWF0dXJlVHJhaXRzLnNlbGVjdG9ycyB9O1xuICAgICAgcmVkdWNlcnNba2V5XSA9IGZlYXR1cmVUcmFpdHMucmVkdWNlcjtcbiAgICAgIGVmZmVjdHMgPSBbLi4uZWZmZWN0cywgLi4uZmVhdHVyZVRyYWl0cy5lZmZlY3RzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbnMsXG4gICAgICBzZWxlY3RvcnMsXG4gICAgICByZWR1Y2VyOiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpLFxuICAgICAgZWZmZWN0cyxcbiAgICB9O1xuICB9KSBhcyBSO1xufVxuXG4vKipcbiAqIENvbWJpbmVzIHRhcmdldFRyYWl0RmFjdG9yeSB3aXRoIHRoZSB0cmFpdEZhY3Rvcmllc01hcCB1c2luZyB0aGUga2V5cyBhcyBwcm9wcyBmb3IgdGhlIHRhcmdldFRyYWl0RmFjdG9yeSBzdGF0ZSxcbiAqIGFuZCBncm91cGluZyB0aGUgY29tYmluZWQgYWN0aW9ucyBieSBrZXlcbiAqIEBwYXJhbSB0YXJnZXRUcmFpdEZhY3RvcnlcbiAqIEBwYXJhbSB0cmFpdEZhY3Rvcmllc01hcFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgY2xpZW50c0ZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ2NsaWVudCcsIGVudGl0aWVzTmFtZTogJ2NsaWVudHMnIH0sXG4gKiAgIGFkZExvYWRFbnRpdGllc1RyYWl0PENsaWVudD4oKSxcbiAqICAgYWRkQ3J1ZEVudGl0aWVzVHJhaXQ8Q2xpZW50PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RPcmRlckZlYXR1cmVGYWN0b3J5ID0gY3JlYXRlRW50aXR5RmVhdHVyZUZhY3RvcnkoXG4gKiAgIHsgZW50aXR5TmFtZTogJ3Byb2R1Y3RPcmRlcicgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdE9yZGVyPigpLFxuICogICBhZGRTZWxlY3RFbnRpdGllc1RyYWl0PFByb2R1Y3RPcmRlcj4oKVxuICogKTtcbiAqXG4gKiBjb25zdCBwcm9kdWN0RmVhdHVyZUZhY3RvcnkgPSBjcmVhdGVFbnRpdHlGZWF0dXJlRmFjdG9yeShcbiAqICAgeyBlbnRpdHlOYW1lOiAncHJvZHVjdCcgfSxcbiAqICAgYWRkTG9hZEVudGl0aWVzVHJhaXQ8UHJvZHVjdD4oKSxcbiAqICAgYWRkU2VsZWN0RW50aXRpZXNUcmFpdDxQcm9kdWN0PigpXG4gKiApO1xuICpcbiAqIGNvbnN0IHByb2R1Y3RBZGRFbnRpdHlQcm9wZXJ0aWVzRmFjdG9yeSA9IGFkZEVudGl0eUZlYXR1cmVzUHJvcGVydGllcyhcbiAqICAgcHJvZHVjdEZlYXR1cmVGYWN0b3J5LFxuICogICB7XG4gKiAgICAgcHJvZHVjdE9yZGVyczogcHJvZHVjdE9yZGVyRmVhdHVyZUZhY3RvcnksXG4gKiAgICAgY2xpZW50czogY2xpZW50c0ZlYXR1cmVGYWN0b3J5LFxuICogICB9XG4gKiApO1xuICpcbiAqIGNvbnN0IGNvbWJpbmVkRmVhdHVyZSA9IHByb2R1Y3RBZGRFbnRpdHlQcm9wZXJ0aWVzRmFjdG9yeSh7XG4gKiAgICAgYWN0aW9uc0dyb3VwS2V5OiAnW2FkZEVudGl0eUZlYXR1cmVzXScsXG4gKiAgICAgZmVhdHVyZVNlbGVjdG9yOiAnYWRkRW50aXR5RmVhdHVyZXMnLFxuICogICB9KTtcbiAqXG4gKiAgIGNvbWJpbmVkRmVhdHVyZS5hY3Rpb25zLmxvYWRQcm9kdWN0cygpO1xuICogICBjb21iaW5lZEZlYXR1cmUuYWN0aW9ucy5jbGllbnRzLmxvYWRDbGllbnRzKCk7XG4gKiAgIGNvbWJpbmVkRmVhdHVyZS5hY3Rpb25zLnByb2R1Y3RPcmRlcnMubG9hZFByb2R1Y3RPcmRlcnMoKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEVudGl0eUZlYXR1cmVzUHJvcGVydGllczxcbiAgRiBleHRlbmRzIEVudGl0eUZlYXR1cmVGYWN0b3J5PGFueSwgYW55PixcbiAgVCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogRW50aXR5RmVhdHVyZUZhY3Rvcnk8YW55LCBhbnksIGFueSwgYW55LCBhbnk+IH0sXG4gIEsgZXh0ZW5kcyBrZXlvZiBULFxuICBTdGF0ZSBleHRlbmRzIEV4dHJhY3RTdGF0ZVR5cGU8UmV0dXJuVHlwZTxGPj4gJlxuICAgIHtcbiAgICAgIFtQIGluIEtdOiBFeHRyYWN0U3RhdGVUeXBlPFJldHVyblR5cGU8VFtQXT4+O1xuICAgIH0sXG4gIEEgZXh0ZW5kcyBFeHRyYWN0QWN0aW9uc1R5cGU8UmV0dXJuVHlwZTxGPj4gJlxuICAgIHsgW1AgaW4gS106IEV4dHJhY3RBY3Rpb25zVHlwZTxSZXR1cm5UeXBlPFRbUF0+PiB9LFxuICBTIGV4dGVuZHMgRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgRXh0cmFjdFNlbGVjdG9yc1R5cGU8UmV0dXJuVHlwZTxGPj4+ICZcbiAgICB7XG4gICAgICBbUCBpbiBLXTogRmVhdHVyZVNlbGVjdG9yczxTdGF0ZSwgRXh0cmFjdFNlbGVjdG9yc1R5cGU8UmV0dXJuVHlwZTxUW1BdPj4+O1xuICAgIH0sXG4gIFIgZXh0ZW5kcyAoY29uZmlnOiBDb25maWc8U3RhdGU+KSA9PiB7XG4gICAgYWN0aW9uczogQTtcbiAgICBzZWxlY3RvcnM6IFM7XG4gICAgcmVkdWNlcjogKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25UeXBlPGFueT4pID0+IFN0YXRlO1xuICAgIGVmZmVjdHM6IFR5cGU8YW55PltdO1xuICAgIGluaXRpYWxTdGF0ZTogU3RhdGU7XG4gIH1cbj4odGFyZ2V0VHJhaXRGYWN0b3J5OiBGLCB0cmFpdEZhY3Rvcmllc01hcDogVCk6IFIge1xuICByZXR1cm4gKChjb25maWc6IENvbmZpZzxhbnksIGFueT4pID0+IHtcbiAgICBjb25zdCBmZWF0dXJlU2VsZWN0b3IgPVxuICAgICAgdHlwZW9mIGNvbmZpZy5mZWF0dXJlU2VsZWN0b3IgPT09ICdzdHJpbmcnXG4gICAgICAgID8gY3JlYXRlRmVhdHVyZVNlbGVjdG9yPGFueT4oY29uZmlnLmZlYXR1cmVTZWxlY3RvcilcbiAgICAgICAgOiBjb25maWcuZmVhdHVyZVNlbGVjdG9yO1xuICAgIGNvbnN0IHRhcmdldEZlYXR1cmVUcmFpdHMgPSB0YXJnZXRUcmFpdEZhY3Rvcnkoe1xuICAgICAgYWN0aW9uc0dyb3VwS2V5OiBjb25maWcuYWN0aW9uc0dyb3VwS2V5LFxuICAgICAgZmVhdHVyZVNlbGVjdG9yOiBmZWF0dXJlU2VsZWN0b3IsXG4gICAgfSk7XG4gICAgY29uc3QgYWN0aW9uczogYW55ID0geyAuLi50YXJnZXRGZWF0dXJlVHJhaXRzLmFjdGlvbnMgfTtcbiAgICBjb25zdCBzZWxlY3RvcnM6IGFueSA9IHsgLi4udGFyZ2V0RmVhdHVyZVRyYWl0cy5zZWxlY3RvcnMgfTtcbiAgICBjb25zdCByZWR1Y2VyczogYW55ID0ge307XG4gICAgbGV0IGVmZmVjdHM6IFR5cGU8YW55PltdID0gWy4uLnRhcmdldEZlYXR1cmVUcmFpdHMuZWZmZWN0c107XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRpdHlGZWF0dXJlRmFjdG9yeV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICB0cmFpdEZhY3Rvcmllc01hcFxuICAgICkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgIGZlYXR1cmVTZWxlY3RvcixcbiAgICAgICAgKHN0YXRlOiBhbnkpID0+IHN0YXRlW2tleV1cbiAgICAgICk7XG4gICAgICBjb25zdCBmZWF0dXJlVHJhaXRzID0gZW50aXR5RmVhdHVyZUZhY3Rvcnkoe1xuICAgICAgICBhY3Rpb25zR3JvdXBLZXk6IGNvbmZpZy5hY3Rpb25zR3JvdXBLZXksXG4gICAgICAgIGZlYXR1cmVTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICB9KTtcbiAgICAgIGFjdGlvbnNba2V5XSA9IGZlYXR1cmVUcmFpdHMuYWN0aW9ucztcbiAgICAgIHNlbGVjdG9yc1trZXldID0gZmVhdHVyZVRyYWl0cy5zZWxlY3RvcnM7XG4gICAgICByZWR1Y2Vyc1trZXldID0gZmVhdHVyZVRyYWl0cy5yZWR1Y2VyO1xuICAgICAgZWZmZWN0cyA9IFsuLi5lZmZlY3RzLCAuLi5mZWF0dXJlVHJhaXRzLmVmZmVjdHNdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9ucyxcbiAgICAgIHNlbGVjdG9ycyxcbiAgICAgIHJlZHVjZXI6IHNldFByb3BlcnRpZXNSZWR1Y2VyKHRhcmdldEZlYXR1cmVUcmFpdHMucmVkdWNlciwgcmVkdWNlcnMpLFxuICAgICAgZWZmZWN0cyxcbiAgICB9O1xuICB9KSBhcyBSO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYW4gaW1wbGVtZW50YXRpb24gIGEgVHJhaXRGYWN0b3J5XG4gKiBAcGFyYW0gZiBUcmFpdEZhY3RvcnkgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyYWl0RmFjdG9yeTxcbiAgU3RhdGUgPSB7fSxcbiAgQSBleHRlbmRzIFRyYWl0QWN0aW9ucyA9IHt9LFxuICBTIGV4dGVuZHMgVHJhaXRTZWxlY3RvcnM8U3RhdGU+ID0ge30sXG4gIE0gZXh0ZW5kcyBUcmFpdFN0YXRlTXV0YXRvcnM8U3RhdGU+ID0ge30sXG4gIEtFWSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgQyA9IHVua25vd24sXG4gIEtDID0gS2V5ZWRDb25maWc8S0VZLCBDPlxuPihmOiB7XG4gIGtleTogS0VZO1xuICBjb25maWc/OiBDO1xuICBkZXBlbmRzPzogc3RyaW5nW107XG4gIGFjdGlvbnM/OiBUcmFpdEFjdGlvbnNGYWN0b3J5PEEsIEtDPjtcbiAgc2VsZWN0b3JzPzogVHJhaXRTZWxlY3RvcnNGYWN0b3J5PFN0YXRlLCBTLCBLQz47XG4gIGluaXRpYWxTdGF0ZT86IFRyYWl0SW5pdGlhbFN0YXRlRmFjdG9yeTxTdGF0ZSwgS0M+O1xuICBtdXRhdG9ycz86IFRyYWl0U3RhdGVNdXRhdG9yc0ZhY3Rvcnk8U3RhdGUsIE0sIEtDPjtcbiAgcmVkdWNlcj86IFRyYWl0UmVkdWNlckZhY3Rvcnk8U3RhdGUsIEEsIFMsIE0sIEtDPjtcbiAgZWZmZWN0cz86IFRyYWl0RWZmZWN0c0ZhY3Rvcnk8U3RhdGUsIEEsIFMsIEtDPjtcbn0pOiBUcmFpdEZhY3Rvcnk8U3RhdGUsIEEsIFMsIE0sIEtFWSwgQywgS0M+IHtcbiAgcmV0dXJuIGYgYXMgVHJhaXRGYWN0b3J5PFN0YXRlLCBBLCBTLCBNLCBLRVksIEMsIEtDPjtcbn1cbiJdfQ==
@@ -0,0 +1,7 @@
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
@@ -0,0 +1,7 @@
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=
@@ -0,0 +1,3 @@
1
+ export * from './traits-local-store';
2
+ export * from './disable-local-trait-effects.token';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdHJhaXRzL2NvcmUvc3JjL2xpYi9sb2NhbC1zdG9yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMscUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3RyYWl0cy1sb2NhbC1zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL2Rpc2FibGUtbG9jYWwtdHJhaXQtZWZmZWN0cy50b2tlbic7XG4iXX0=