1 | import { NgModule, Inject, InjectionToken, Injector, Optional, SkipSelf, } from '@angular/core';
|
2 | import { combineReducers, createReducerFactory } from './utils';
|
3 | import { INITIAL_STATE, INITIAL_REDUCERS, _INITIAL_REDUCERS, REDUCER_FACTORY, _REDUCER_FACTORY, STORE_FEATURES, _INITIAL_STATE, META_REDUCERS, _STORE_REDUCERS, FEATURE_REDUCERS, _FEATURE_REDUCERS, _FEATURE_REDUCERS_TOKEN, _STORE_FEATURES, _FEATURE_CONFIGS, USER_PROVIDED_META_REDUCERS, _RESOLVED_META_REDUCERS, _ROOT_STORE_GUARD, _ACTION_TYPE_UNIQUENESS_CHECK, } from './tokens';
|
4 | import { ACTIONS_SUBJECT_PROVIDERS, ActionsSubject } from './actions_subject';
|
5 | import { REDUCER_MANAGER_PROVIDERS, ReducerManager, ReducerObservable, } from './reducer_manager';
|
6 | import { SCANNED_ACTIONS_SUBJECT_PROVIDERS, ScannedActionsSubject, } from './scanned_actions_subject';
|
7 | import { STATE_PROVIDERS } from './state';
|
8 | import { STORE_PROVIDERS, Store } from './store';
|
9 | import { provideRuntimeChecks, checkForActionTypeUniqueness, } from './runtime_checks';
|
10 | export class StoreRootModule {
|
11 | constructor(actions$, reducer$, scannedActions$, store, guard, actionCheck) { }
|
12 | }
|
13 | StoreRootModule.decorators = [
|
14 | { type: NgModule, args: [{},] }
|
15 | ];
|
16 | /** @nocollapse */
|
17 | StoreRootModule.ctorParameters = () => [
|
18 | { type: ActionsSubject },
|
19 | { type: ReducerObservable },
|
20 | { type: ScannedActionsSubject },
|
21 | { type: Store },
|
22 | { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [_ROOT_STORE_GUARD,] }] },
|
23 | { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [_ACTION_TYPE_UNIQUENESS_CHECK,] }] }
|
24 | ];
|
25 | export class StoreFeatureModule {
|
26 | constructor(features, featureReducers, reducerManager, root, actionCheck) {
|
27 | this.features = features;
|
28 | this.featureReducers = featureReducers;
|
29 | this.reducerManager = reducerManager;
|
30 | const feats = features.map((feature, index) => {
|
31 | const featureReducerCollection = featureReducers.shift();
|
32 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
33 | const reducers = featureReducerCollection /*TODO(#823)*/[index];
|
34 | return Object.assign(Object.assign({}, feature), { reducers, initialState: _initialStateFactory(feature.initialState) });
|
35 | });
|
36 | reducerManager.addFeatures(feats);
|
37 | }
|
38 | // eslint-disable-next-line @angular-eslint/contextual-lifecycle
|
39 | ngOnDestroy() {
|
40 | this.reducerManager.removeFeatures(this.features);
|
41 | }
|
42 | }
|
43 | StoreFeatureModule.decorators = [
|
44 | { type: NgModule, args: [{},] }
|
45 | ];
|
46 | /** @nocollapse */
|
47 | StoreFeatureModule.ctorParameters = () => [
|
48 | { type: Array, decorators: [{ type: Inject, args: [_STORE_FEATURES,] }] },
|
49 | { type: Array, decorators: [{ type: Inject, args: [FEATURE_REDUCERS,] }] },
|
50 | { type: ReducerManager },
|
51 | { type: StoreRootModule },
|
52 | { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [_ACTION_TYPE_UNIQUENESS_CHECK,] }] }
|
53 | ];
|
54 | export class StoreModule {
|
55 | static forRoot(reducers, config = {}) {
|
56 | return {
|
57 | ngModule: StoreRootModule,
|
58 | providers: [
|
59 | {
|
60 | provide: _ROOT_STORE_GUARD,
|
61 | useFactory: _provideForRootGuard,
|
62 | deps: [[Store, new Optional(), new SkipSelf()]],
|
63 | },
|
64 | { provide: _INITIAL_STATE, useValue: config.initialState },
|
65 | {
|
66 | provide: INITIAL_STATE,
|
67 | useFactory: _initialStateFactory,
|
68 | deps: [_INITIAL_STATE],
|
69 | },
|
70 | { provide: _INITIAL_REDUCERS, useValue: reducers },
|
71 | {
|
72 | provide: _STORE_REDUCERS,
|
73 | useExisting: reducers instanceof InjectionToken ? reducers : _INITIAL_REDUCERS,
|
74 | },
|
75 | {
|
76 | provide: INITIAL_REDUCERS,
|
77 | deps: [Injector, _INITIAL_REDUCERS, [new Inject(_STORE_REDUCERS)]],
|
78 | useFactory: _createStoreReducers,
|
79 | },
|
80 | {
|
81 | provide: USER_PROVIDED_META_REDUCERS,
|
82 | useValue: config.metaReducers ? config.metaReducers : [],
|
83 | },
|
84 | {
|
85 | provide: _RESOLVED_META_REDUCERS,
|
86 | deps: [META_REDUCERS, USER_PROVIDED_META_REDUCERS],
|
87 | useFactory: _concatMetaReducers,
|
88 | },
|
89 | {
|
90 | provide: _REDUCER_FACTORY,
|
91 | useValue: config.reducerFactory
|
92 | ? config.reducerFactory
|
93 | : combineReducers,
|
94 | },
|
95 | {
|
96 | provide: REDUCER_FACTORY,
|
97 | deps: [_REDUCER_FACTORY, _RESOLVED_META_REDUCERS],
|
98 | useFactory: createReducerFactory,
|
99 | },
|
100 | ACTIONS_SUBJECT_PROVIDERS,
|
101 | REDUCER_MANAGER_PROVIDERS,
|
102 | SCANNED_ACTIONS_SUBJECT_PROVIDERS,
|
103 | STATE_PROVIDERS,
|
104 | STORE_PROVIDERS,
|
105 | provideRuntimeChecks(config.runtimeChecks),
|
106 | checkForActionTypeUniqueness(),
|
107 | ],
|
108 | };
|
109 | }
|
110 | static forFeature(featureNameOrSlice, reducersOrConfig, config = {}) {
|
111 | return {
|
112 | ngModule: StoreFeatureModule,
|
113 | providers: [
|
114 | {
|
115 | provide: _FEATURE_CONFIGS,
|
116 | multi: true,
|
117 | useValue: featureNameOrSlice instanceof Object ? {} : config,
|
118 | },
|
119 | {
|
120 | provide: STORE_FEATURES,
|
121 | multi: true,
|
122 | useValue: {
|
123 | key: featureNameOrSlice instanceof Object
|
124 | ? featureNameOrSlice.name
|
125 | : featureNameOrSlice,
|
126 | reducerFactory: !(config instanceof InjectionToken) && config.reducerFactory
|
127 | ? config.reducerFactory
|
128 | : combineReducers,
|
129 | metaReducers: !(config instanceof InjectionToken) && config.metaReducers
|
130 | ? config.metaReducers
|
131 | : [],
|
132 | initialState: !(config instanceof InjectionToken) && config.initialState
|
133 | ? config.initialState
|
134 | : undefined,
|
135 | },
|
136 | },
|
137 | {
|
138 | provide: _STORE_FEATURES,
|
139 | deps: [Injector, _FEATURE_CONFIGS, STORE_FEATURES],
|
140 | useFactory: _createFeatureStore,
|
141 | },
|
142 | {
|
143 | provide: _FEATURE_REDUCERS,
|
144 | multi: true,
|
145 | useValue: featureNameOrSlice instanceof Object
|
146 | ? featureNameOrSlice.reducer
|
147 | : reducersOrConfig,
|
148 | },
|
149 | {
|
150 | provide: _FEATURE_REDUCERS_TOKEN,
|
151 | multi: true,
|
152 | useExisting: reducersOrConfig instanceof InjectionToken
|
153 | ? reducersOrConfig
|
154 | : _FEATURE_REDUCERS,
|
155 | },
|
156 | {
|
157 | provide: FEATURE_REDUCERS,
|
158 | multi: true,
|
159 | deps: [
|
160 | Injector,
|
161 | _FEATURE_REDUCERS,
|
162 | [new Inject(_FEATURE_REDUCERS_TOKEN)],
|
163 | ],
|
164 | useFactory: _createFeatureReducers,
|
165 | },
|
166 | checkForActionTypeUniqueness(),
|
167 | ],
|
168 | };
|
169 | }
|
170 | }
|
171 | StoreModule.decorators = [
|
172 | { type: NgModule, args: [{},] }
|
173 | ];
|
174 | export function _createStoreReducers(injector, reducers) {
|
175 | return reducers instanceof InjectionToken ? injector.get(reducers) : reducers;
|
176 | }
|
177 | export function _createFeatureStore(injector, configs, featureStores) {
|
178 | return featureStores.map((feat, index) => {
|
179 | if (configs[index] instanceof InjectionToken) {
|
180 | const conf = injector.get(configs[index]);
|
181 | return {
|
182 | key: feat.key,
|
183 | reducerFactory: conf.reducerFactory
|
184 | ? conf.reducerFactory
|
185 | : combineReducers,
|
186 | metaReducers: conf.metaReducers ? conf.metaReducers : [],
|
187 | initialState: conf.initialState,
|
188 | };
|
189 | }
|
190 | return feat;
|
191 | });
|
192 | }
|
193 | export function _createFeatureReducers(injector, reducerCollection) {
|
194 | const reducers = reducerCollection.map((reducer) => {
|
195 | return reducer instanceof InjectionToken ? injector.get(reducer) : reducer;
|
196 | });
|
197 | return reducers;
|
198 | }
|
199 | export function _initialStateFactory(initialState) {
|
200 | if (typeof initialState === 'function') {
|
201 | return initialState();
|
202 | }
|
203 | return initialState;
|
204 | }
|
205 | export function _concatMetaReducers(metaReducers, userProvidedMetaReducers) {
|
206 | return metaReducers.concat(userProvidedMetaReducers);
|
207 | }
|
208 | export function _provideForRootGuard(store) {
|
209 | if (store) {
|
210 | throw new TypeError(`StoreModule.forRoot() called twice. Feature modules should use StoreModule.forFeature() instead.`);
|
211 | }
|
212 | return 'guarded';
|
213 | }
|
214 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVfbW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zdG9yZS9zcmMvc3RvcmVfbW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUdOLGNBQWMsRUFDZCxRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQVd2QixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hFLE9BQU8sRUFDTCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsYUFBYSxFQUNiLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBRWpCLDZCQUE2QixHQUM5QixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixjQUFjLEVBQ2QsaUJBQWlCLEdBQ2xCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLGlDQUFpQyxFQUNqQyxxQkFBcUIsR0FDdEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsNEJBQTRCLEdBQzdCLE1BQU0sa0JBQWtCLENBQUM7QUFHMUIsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFDRSxRQUF3QixF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Y0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDN0UsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFlBQWlCO0lBQ3BELElBQUksT0FBTyxZQUFZLEtBQUssVUFBVSxFQUFFO1FBQ3RDLE9BQU8sWUFBWSxFQUFFLENBQUM7S0FDdkI7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxZQUEyQixFQUMzQix3QkFBdUM7SUFFdkMsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxLQUFpQjtJQUNwRCxJQUFJLEtBQUssRUFBRTtRQUNULE1BQU0sSUFBSSxTQUFTLENBQ2pCLGtHQUFrRyxDQUNuRyxDQUFDO0tBQ0g7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgTmdNb2R1bGUsXG4gIEluamVjdCxcbiAgTW9kdWxlV2l0aFByb3ZpZGVycyxcbiAgT25EZXN0cm95LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIE9wdGlvbmFsLFxuICBTa2lwU2VsZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBY3Rpb24sXG4gIEFjdGlvblJlZHVjZXIsXG4gIEFjdGlvblJlZHVjZXJNYXAsXG4gIEFjdGlvblJlZHVjZXJGYWN0b3J5LFxuICBTdG9yZUZlYXR1cmUsXG4gIEluaXRpYWxTdGF0ZSxcbiAgTWV0YVJlZHVjZXIsXG4gIFJ1bnRpbWVDaGVja3MsXG59IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IGNvbWJpbmVSZWR1Y2VycywgY3JlYXRlUmVkdWNlckZhY3RvcnkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7XG4gIElOSVRJQUxfU1RBVEUsXG4gIElOSVRJQUxfUkVEVUNFUlMsXG4gIF9JTklUSUFMX1JFRFVDRVJTLFxuICBSRURVQ0VSX0ZBQ1RPUlksXG4gIF9SRURVQ0VSX0ZBQ1RPUlksXG4gIFNUT1JFX0ZFQVRVUkVTLFxuICBfSU5JVElBTF9TVEFURSxcbiAgTUVUQV9SRURVQ0VSUyxcbiAgX1NUT1JFX1JFRFVDRVJTLFxuICBGRUFUVVJFX1JFRFVDRVJTLFxuICBfRkVBVFVSRV9SRURVQ0VSUyxcbiAgX0ZFQVRVUkVfUkVEVUNFUlNfVE9LRU4sXG4gIF9TVE9SRV9GRUFUVVJFUyxcbiAgX0ZFQVRVUkVfQ09ORklHUyxcbiAgVVNFUl9QUk9WSURFRF9NRVRBX1JFRFVDRVJTLFxuICBfUkVTT0xWRURfTUVUQV9SRURVQ0VSUyxcbiAgX1JPT1RfU1RPUkVfR1VBUkQsXG4gIEFDVElWRV9SVU5USU1FX0NIRUNLUyxcbiAgX0FDVElPTl9UWVBFX1VOSVFVRU5FU1NfQ0hFQ0ssXG59IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IEFDVElPTlNfU1VCSkVDVF9QUk9WSURFUlMsIEFjdGlvbnNTdWJqZWN0IH0gZnJvbSAnLi9hY3Rpb25zX3N1YmplY3QnO1xuaW1wb3J0IHtcbiAgUkVEVUNFUl9NQU5BR0VSX1BST1ZJREVSUyxcbiAgUmVkdWNlck1hbmFnZXIsXG4gIFJlZHVjZXJPYnNlcnZhYmxlLFxufSBmcm9tICcuL3JlZHVjZXJfbWFuYWdlcic7XG5pbXBvcnQge1xuICBTQ0FOTkVEX0FDVElPTlNfU1VCSkVDVF9QUk9WSURFUlMsXG4gIFNjYW5uZWRBY3Rpb25zU3ViamVjdCxcbn0gZnJvbSAnLi9zY2FubmVkX2FjdGlvbnNfc3ViamVjdCc7XG5pbXBvcnQgeyBTVEFURV9QUk9WSURFUlMgfSBmcm9tICcuL3N0YXRlJztcbmltcG9ydCB7IFNUT1JFX1BST1ZJREVSUywgU3RvcmUgfSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCB7XG4gIHByb3ZpZGVSdW50aW1lQ2hlY2tzLFxuICBjaGVja0ZvckFjdGlvblR5cGVVbmlxdWVuZXNzLFxufSBmcm9tICcuL3J1bnRpbWVfY2hlY2tzJztcblxuQE5nTW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIFN0b3JlUm9vdE1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGFjdGlvbnMkOiBBY3Rpb25zU3ViamVjdCxcbiAgICByZWR1Y2VyJDogUmVkdWNlck9ic2VydmFibGUsXG4gICAgc2Nhbm5lZEFjdGlvbnMkOiBTY2FubmVkQWN0aW9uc1N1YmplY3QsXG4gICAgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KF9ST09UX1NUT1JFX0dVQVJEKVxuICAgIGd1YXJkOiBhbnksXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KF9BQ1RJT05fVFlQRV9VTklRVUVORVNTX0NIRUNLKVxuICAgIGFjdGlvbkNoZWNrOiBhbnlcbiAgKSB7fVxufVxuXG5ATmdNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgU3RvcmVGZWF0dXJlTW9kdWxlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChfU1RPUkVfRkVBVFVSRVMpIHByaXZhdGUgZmVhdHVyZXM6IFN0b3JlRmVhdHVyZTxhbnksIGFueT5bXSxcbiAgICBASW5qZWN0KEZFQVRVUkVfUkVEVUNFUlMpIHByaXZhdGUgZmVhdHVyZVJlZHVjZXJzOiBBY3Rpb25SZWR1Y2VyTWFwPGFueT5bXSxcbiAgICBwcml2YXRlIHJlZHVjZXJNYW5hZ2VyOiBSZWR1Y2VyTWFuYWdlcixcbiAgICByb290OiBTdG9yZVJvb3RNb2R1bGUsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KF9BQ1RJT05fVFlQRV9VTklRVUVORVNTX0NIRUNLKVxuICAgIGFjdGlvbkNoZWNrOiBhbnlcbiAgKSB7XG4gICAgY29uc3QgZmVhdHMgPSBmZWF0dXJlcy5tYXAoKGZlYXR1cmUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBmZWF0dXJlUmVkdWNlckNvbGxlY3Rpb24gPSBmZWF0dXJlUmVkdWNlcnMuc2hpZnQoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICBjb25zdCByZWR1Y2VycyA9IGZlYXR1cmVSZWR1Y2VyQ29sbGVjdGlvbiEgLypUT0RPKCM4MjMpKi9baW5kZXhdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5mZWF0dXJlLFxuICAgICAgICByZWR1Y2VycyxcbiAgICAgICAgaW5pdGlhbFN0YXRlOiBfaW5pdGlhbFN0YXRlRmFjdG9yeShmZWF0dXJlLmluaXRpYWxTdGF0ZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmVkdWNlck1hbmFnZXIuYWRkRmVhdHVyZXMoZmVhdHMpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb250ZXh0dWFsLWxpZmVjeWNsZVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlZHVjZXJNYW5hZ2VyLnJlbW92ZUZlYXR1cmVzKHRoaXMuZmVhdHVyZXMpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVDb25maWc8VCwgViBleHRlbmRzIEFjdGlvbiA9IEFjdGlvbj4ge1xuICBpbml0aWFsU3RhdGU/OiBJbml0aWFsU3RhdGU8VD47XG4gIHJlZHVjZXJGYWN0b3J5PzogQWN0aW9uUmVkdWNlckZhY3Rvcnk8VCwgVj47XG4gIG1ldGFSZWR1Y2Vycz86IE1ldGFSZWR1Y2VyPFQsIFY+W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFN0b3JlQ29uZmlnPFQsIFYgZXh0ZW5kcyBBY3Rpb24gPSBBY3Rpb24+XG4gIGV4dGVuZHMgU3RvcmVDb25maWc8VCwgVj4ge1xuICBydW50aW1lQ2hlY2tzPzogUGFydGlhbDxSdW50aW1lQ2hlY2tzPjtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgbmFtZSBhbmQgdGhlIHJlZHVjZXIgZm9yIHRoZSBmZWF0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVTbGljZTxULCBWIGV4dGVuZHMgQWN0aW9uID0gQWN0aW9uPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVkdWNlcjogQWN0aW9uUmVkdWNlcjxULCBWPjtcbn1cblxuQE5nTW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIFN0b3JlTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3Q8VCwgViBleHRlbmRzIEFjdGlvbiA9IEFjdGlvbj4oXG4gICAgcmVkdWNlcnM6IEFjdGlvblJlZHVjZXJNYXA8VCwgVj4gfCBJbmplY3Rpb25Ub2tlbjxBY3Rpb25SZWR1Y2VyTWFwPFQsIFY+PixcbiAgICBjb25maWc/OiBSb290U3RvcmVDb25maWc8VCwgVj5cbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxTdG9yZVJvb3RNb2R1bGU+O1xuICBzdGF0aWMgZm9yUm9vdChcbiAgICByZWR1Y2VyczpcbiAgICAgIHwgQWN0aW9uUmVkdWNlck1hcDxhbnksIGFueT5cbiAgICAgIHwgSW5qZWN0aW9uVG9rZW48QWN0aW9uUmVkdWNlck1hcDxhbnksIGFueT4+LFxuICAgIGNvbmZpZzogUm9vdFN0b3JlQ29uZmlnPGFueSwgYW55PiA9IHt9XG4gICk6IE1vZHVsZVdpdGhQcm92aWRlcnM8U3RvcmVSb290TW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBTdG9yZVJvb3RNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IF9ST09UX1NUT1JFX0dVQVJELFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IF9wcm92aWRlRm9yUm9vdEd1YXJkLFxuICAgICAgICAgIGRlcHM6IFtbU3RvcmUsIG5ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKV1dLFxuICAgICAgICB9LFxuICAgICAgICB7IHByb3ZpZGU6IF9JTklUSUFMX1NUQVRFLCB1c2VWYWx1ZTogY29uZmlnLmluaXRpYWxTdGF0ZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogSU5JVElBTF9TVEFURSxcbiAgICAgICAgICB1c2VGYWN0b3J5OiBfaW5pdGlhbFN0YXRlRmFjdG9yeSxcbiAgICAgICAgICBkZXBzOiBbX0lOSVRJQUxfU1RBVEVdLFxuICAgICAgICB9LFxuICAgICAgICB7IHByb3ZpZGU6IF9JTklUSUFMX1JFRFVDRVJTLCB1c2VWYWx1ZTogcmVkdWNlcnMgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IF9TVE9SRV9SRURVQ0VSUyxcbiAgICAgICAgICB1c2VFeGlzdGluZzpcbiAgICAgICAgICAgIHJlZHVjZXJzIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4gPyByZWR1Y2VycyA6IF9JTklUSUFMX1JFRFVDRVJTLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogSU5JVElBTF9SRURVQ0VSUyxcbiAgICAgICAgICBkZXBzOiBbSW5qZWN0b3IsIF9JTklUSUFMX1JFRFVDRVJTLCBbbmV3IEluamVjdChfU1RPUkVfUkVEVUNFUlMpXV0sXG4gICAgICAgICAgdXNlRmFjdG9yeTogX2NyZWF0ZVN0b3JlUmVkdWNlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBVU0VSX1BST1ZJREVEX01FVEFfUkVEVUNFUlMsXG4gICAgICAgICAgdXNlVmFsdWU6IGNvbmZpZy5tZXRhUmVkdWNlcnMgPyBjb25maWcubWV0YVJlZHVjZXJzIDogW10sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBfUkVTT0xWRURfTUVUQV9SRURVQ0VSUyxcbiAgICAgICAgICBkZXBzOiBbTUVUQV9SRURVQ0VSUywgVVNFUl9QUk9WSURFRF9NRVRBX1JFRFVDRVJTXSxcbiAgICAgICAgICB1c2VGYWN0b3J5OiBfY29uY2F0TWV0YVJlZHVjZXJzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogX1JFRFVDRVJfRkFDVE9SWSxcbiAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLnJlZHVjZXJGYWN0b3J5XG4gICAgICAgICAgICA/IGNvbmZpZy5yZWR1Y2VyRmFjdG9yeVxuICAgICAgICAgICAgOiBjb21iaW5lUmVkdWNlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBSRURVQ0VSX0ZBQ1RPUlksXG4gICAgICAgICAgZGVwczogW19SRURVQ0VSX0ZBQ1RPUlksIF9SRVNPTFZFRF9NRVRBX1JFRFVDRVJTXSxcbiAgICAgICAgICB1c2VGYWN0b3J5OiBjcmVhdGVSZWR1Y2VyRmFjdG9yeSxcbiAgICAgICAgfSxcbiAgICAgICAgQUNUSU9OU19TVUJKRUNUX1BST1ZJREVSUyxcbiAgICAgICAgUkVEVUNFUl9NQU5BR0VSX1BST1ZJREVSUyxcbiAgICAgICAgU0NBTk5FRF9BQ1RJT05TX1NVQkpFQ1RfUFJPVklERVJTLFxuICAgICAgICBTVEFURV9QUk9WSURFUlMsXG4gICAgICAgIFNUT1JFX1BST1ZJREVSUyxcbiAgICAgICAgcHJvdmlkZVJ1bnRpbWVDaGVja3MoY29uZmlnLnJ1bnRpbWVDaGVja3MpLFxuICAgICAgICBjaGVja0ZvckFjdGlvblR5cGVVbmlxdWVuZXNzKCksXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZm9yRmVhdHVyZTxULCBWIGV4dGVuZHMgQWN0aW9uID0gQWN0aW9uPihcbiAgICBmZWF0dXJlTmFtZTogc3RyaW5nLFxuICAgIHJlZHVjZXJzOiBBY3Rpb25SZWR1Y2VyTWFwPFQsIFY+IHwgSW5qZWN0aW9uVG9rZW48QWN0aW9uUmVkdWNlck1hcDxULCBWPj4sXG4gICAgY29uZmlnPzogU3RvcmVDb25maWc8VCwgVj4gfCBJbmplY3Rpb25Ub2tlbjxTdG9yZUNvbmZpZzxULCBWPj5cbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxTdG9yZUZlYXR1cmVNb2R1bGU+O1xuICBzdGF0aWMgZm9yRmVhdHVyZTxULCBWIGV4dGVuZHMgQWN0aW9uID0gQWN0aW9uPihcbiAgICBmZWF0dXJlTmFtZTogc3RyaW5nLFxuICAgIHJlZHVjZXI6IEFjdGlvblJlZHVjZXI8VCwgVj4gfCBJbmplY3Rpb25Ub2tlbjxBY3Rpb25SZWR1Y2VyPFQsIFY+PixcbiAgICBjb25maWc/OiBTdG9yZUNvbmZpZzxULCBWPiB8IEluamVjdGlvblRva2VuPFN0b3JlQ29uZmlnPFQsIFY+PlxuICApOiBNb2R1bGVXaXRoUHJvdmlkZXJzPFN0b3JlRmVhdHVyZU1vZHVsZT47XG4gIHN0YXRpYyBmb3JGZWF0dXJlPFQsIFYgZXh0ZW5kcyBBY3Rpb24gPSBBY3Rpb24+KFxuICAgIHNsaWNlOiBGZWF0dXJlU2xpY2U8VCwgVj4sXG4gICAgY29uZmlnPzogU3RvcmVDb25maWc8VCwgVj4gfCBJbmplY3Rpb25Ub2tlbjxTdG9yZUNvbmZpZzxULCBWPj5cbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxTdG9yZUZlYXR1cmVNb2R1bGU+O1xuICBzdGF0aWMgZm9yRmVhdHVyZShcbiAgICBmZWF0dXJlTmFtZU9yU2xpY2U6IHN0cmluZyB8IEZlYXR1cmVTbGljZTxhbnksIGFueT4sXG4gICAgcmVkdWNlcnNPckNvbmZpZz86XG4gICAgICB8IEFjdGlvblJlZHVjZXJNYXA8YW55LCBhbnk+XG4gICAgICB8IEluamVjdGlvblRva2VuPEFjdGlvblJlZHVjZXJNYXA8YW55LCBhbnk+PlxuICAgICAgfCBBY3Rpb25SZWR1Y2VyPGFueSwgYW55PlxuICAgICAgfCBJbmplY3Rpb25Ub2tlbjxBY3Rpb25SZWR1Y2VyPGFueSwgYW55Pj5cbiAgICAgIHwgU3RvcmVDb25maWc8YW55LCBhbnk+XG4gICAgICB8IEluamVjdGlvblRva2VuPFN0b3JlQ29uZmlnPGFueSwgYW55Pj4sXG4gICAgY29uZmlnOiBTdG9yZUNvbmZpZzxhbnksIGFueT4gfCBJbmplY3Rpb25Ub2tlbjxTdG9yZUNvbmZpZzxhbnksIGFueT4+ID0ge31cbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxTdG9yZUZlYXR1cmVNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IFN0b3JlRmVhdHVyZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogX0ZFQVRVUkVfQ09ORklHUyxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgICB1c2VWYWx1ZTogZmVhdHVyZU5hbWVPclNsaWNlIGluc3RhbmNlb2YgT2JqZWN0ID8ge30gOiBjb25maWcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBTVE9SRV9GRUFUVVJFUyxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAga2V5OlxuICAgICAgICAgICAgICBmZWF0dXJlTmFtZU9yU2xpY2UgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICAgICA/IGZlYXR1cmVOYW1lT3JTbGljZS5uYW1lXG4gICAgICAgICAgICAgICAgOiBmZWF0dXJlTmFtZU9yU2xpY2UsXG4gICAgICAgICAgICByZWR1Y2VyRmFjdG9yeTpcbiAgICAgICAgICAgICAgIShjb25maWcgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgJiYgY29uZmlnLnJlZHVjZXJGYWN0b3J5XG4gICAgICAgICAgICAgICAgPyBjb25maWcucmVkdWNlckZhY3RvcnlcbiAgICAgICAgICAgICAgICA6IGNvbWJpbmVSZWR1Y2VycyxcbiAgICAgICAgICAgIG1ldGFSZWR1Y2VyczpcbiAgICAgICAgICAgICAgIShjb25maWcgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgJiYgY29uZmlnLm1ldGFSZWR1Y2Vyc1xuICAgICAgICAgICAgICAgID8gY29uZmlnLm1ldGFSZWR1Y2Vyc1xuICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICBpbml0aWFsU3RhdGU6XG4gICAgICAgICAgICAgICEoY29uZmlnIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4pICYmIGNvbmZpZy5pbml0aWFsU3RhdGVcbiAgICAgICAgICAgICAgICA/IGNvbmZpZy5pbml0aWFsU3RhdGVcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogX1NUT1JFX0ZFQVRVUkVTLFxuICAgICAgICAgIGRlcHM6IFtJbmplY3RvciwgX0ZFQVRVUkVfQ09ORklHUywgU1RPUkVfRkVBVFVSRVNdLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IF9jcmVhdGVGZWF0dXJlU3RvcmUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBfRkVBVFVSRV9SRURVQ0VSUyxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgICB1c2VWYWx1ZTpcbiAgICAgICAgICAgIGZlYXR1cmVOYW1lT3JTbGljZSBpbnN0YW5jZW9mIE9iamVjdFxuICAgICAgICAgICAgICA/IGZlYXR1cmVOYW1lT3JTbGljZS5yZWR1Y2VyXG4gICAgICAgICAgICAgIDogcmVkdWNlcnNPckNvbmZpZyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IF9GRUFUVVJFX1JFRFVDRVJTX1RPS0VOLFxuICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICAgIHVzZUV4aXN0aW5nOlxuICAgICAgICAgICAgcmVkdWNlcnNPckNvbmZpZyBpbnN0YW5jZW9mIEluamVjdGlvblRva2VuXG4gICAgICAgICAgICAgID8gcmVkdWNlcnNPckNvbmZpZ1xuICAgICAgICAgICAgICA6IF9GRUFUVVJFX1JFRFVDRVJTLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogRkVBVFVSRV9SRURVQ0VSUyxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgICBkZXBzOiBbXG4gICAgICAgICAgICBJbmplY3RvcixcbiAgICAgICAgICAgIF9GRUFUVVJFX1JFRFVDRVJTLFxuICAgICAgICAgICAgW25ldyBJbmplY3QoX0ZFQVRVUkVfUkVEVUNFUlNfVE9LRU4pXSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IF9jcmVhdGVGZWF0dXJlUmVkdWNlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrRm9yQWN0aW9uVHlwZVVuaXF1ZW5lc3MoKSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX2NyZWF0ZVN0b3JlUmVkdWNlcnMoXG4gIGluamVjdG9yOiBJbmplY3RvcixcbiAgcmVkdWNlcnM6IEFjdGlvblJlZHVjZXJNYXA8YW55LCBhbnk+XG4pIHtcbiAgcmV0dXJuIHJlZHVjZXJzIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4gPyBpbmplY3Rvci5nZXQocmVkdWNlcnMpIDogcmVkdWNlcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlRmVhdHVyZVN0b3JlKFxuICBpbmplY3RvcjogSW5qZWN0b3IsXG4gIGNvbmZpZ3M6IFN0b3JlQ29uZmlnPGFueSwgYW55PltdIHwgSW5qZWN0aW9uVG9rZW48U3RvcmVDb25maWc8YW55LCBhbnk+PltdLFxuICBmZWF0dXJlU3RvcmVzOiBTdG9yZUZlYXR1cmU8YW55LCBhbnk+W11cbikge1xuICByZXR1cm4gZmVhdHVyZVN0b3Jlcy5tYXAoKGZlYXQsIGluZGV4KSA9PiB7XG4gICAgaWYgKGNvbmZpZ3NbaW5kZXhdIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4pIHtcbiAgICAgIGNvbnN0IGNvbmYgPSBpbmplY3Rvci5nZXQoY29uZmlnc1tpbmRleF0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBmZWF0LmtleSxcbiAgICAgICAgcmVkdWNlckZhY3Rvcnk6IGNvbmYucmVkdWNlckZhY3RvcnlcbiAgICAgICAgICA/IGNvbmYucmVkdWNlckZhY3RvcnlcbiAgICAgICAgICA6IGNvbWJpbmVSZWR1Y2VycyxcbiAgICAgICAgbWV0YVJlZHVjZXJzOiBjb25mLm1ldGFSZWR1Y2VycyA/IGNvbmYubWV0YVJlZHVjZXJzIDogW10sXG4gICAgICAgIGluaXRpYWxTdGF0ZTogY29uZi5pbml0aWFsU3RhdGUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZmVhdDtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlRmVhdHVyZVJlZHVjZXJzKFxuICBpbmplY3RvcjogSW5qZWN0b3IsXG4gIHJlZHVjZXJDb2xsZWN0aW9uOiBBY3Rpb25SZWR1Y2VyTWFwPGFueSwgYW55PltdXG4pIHtcbiAgY29uc3QgcmVkdWNlcnMgPSByZWR1Y2VyQ29sbGVjdGlvbi5tYXAoKHJlZHVjZXIpID0+IHtcbiAgICByZXR1cm4gcmVkdWNlciBpbnN0YW5jZW9mIEluamVjdGlvblRva2VuID8gaW5qZWN0b3IuZ2V0KHJlZHVjZXIpIDogcmVkdWNlcjtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlZHVjZXJzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2luaXRpYWxTdGF0ZUZhY3RvcnkoaW5pdGlhbFN0YXRlOiBhbnkpOiBhbnkge1xuICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBpbml0aWFsU3RhdGUoKTtcbiAgfVxuXG4gIHJldHVybiBpbml0aWFsU3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfY29uY2F0TWV0YVJlZHVjZXJzKFxuICBtZXRhUmVkdWNlcnM6IE1ldGFSZWR1Y2VyW10sXG4gIHVzZXJQcm92aWRlZE1ldGFSZWR1Y2VyczogTWV0YVJlZHVjZXJbXVxuKTogTWV0YVJlZHVjZXJbXSB7XG4gIHJldHVybiBtZXRhUmVkdWNlcnMuY29uY2F0KHVzZXJQcm92aWRlZE1ldGFSZWR1Y2Vycyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfcHJvdmlkZUZvclJvb3RHdWFyZChzdG9yZTogU3RvcmU8YW55Pik6IGFueSB7XG4gIGlmIChzdG9yZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgU3RvcmVNb2R1bGUuZm9yUm9vdCgpIGNhbGxlZCB0d2ljZS4gRmVhdHVyZSBtb2R1bGVzIHNob3VsZCB1c2UgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZSgpIGluc3RlYWQuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuICdndWFyZGVkJztcbn1cbiJdfQ== |
\ | No newline at end of file |