@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.
- package/cache/cache.actions.d.ts +4 -4
- package/fesm2022/ngrx-traits-core-testing.mjs.map +1 -1
- package/fesm2022/ngrx-traits-core.mjs +10 -10
- package/fesm2022/ngrx-traits-core.mjs.map +1 -1
- package/package.json +5 -9
- package/esm2022/cache/cache.actions.mjs +0 -6
- package/esm2022/cache/cache.models.mjs +0 -30
- package/esm2022/cache/cache.module.mjs +0 -18
- package/esm2022/cache/cache.reducer.mjs +0 -138
- package/esm2022/cache/cache.selectors.mjs +0 -5
- package/esm2022/cache/cache.service.mjs +0 -72
- package/esm2022/cache/index.mjs +0 -7
- package/esm2022/create-entity-feature.mjs +0 -428
- package/esm2022/index.mjs +0 -7
- package/esm2022/local-store/disable-local-trait-effects.token.mjs +0 -7
- package/esm2022/local-store/index.mjs +0 -3
- package/esm2022/local-store/traits-local-store.mjs +0 -147
- package/esm2022/model.mjs +0 -2
- package/esm2022/ngrx-traits-core.mjs +0 -5
- package/esm2022/testing/index.mjs +0 -2
- package/esm2022/testing/ngrx-traits-core-testing.mjs +0 -5
- package/esm2022/testing/provide-mock-local-traits.mjs +0 -36
- package/esm2022/trait-effect.mjs +0 -30
- package/esm2022/util.mjs +0 -70
|
@@ -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=
|