@o3r/analytics 12.0.0-next.2 → 12.0.0-next.21
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/directives/track-events/base-track-events.d.ts +1 -1
- package/directives/track-events/track-click/track-click.directive.d.ts +1 -1
- package/directives/track-events/track-events.directive.d.ts +1 -1
- package/directives/track-events/track-events.module.d.ts +4 -1
- package/directives/track-events/track-events.module.d.ts.map +1 -1
- package/directives/track-events/track-focus/track-focus.directive.d.ts +1 -1
- package/fesm2022/o3r-analytics.mjs +27 -24
- package/fesm2022/o3r-analytics.mjs.map +1 -1
- package/fixtures/jasmine/package.json +3 -0
- package/fixtures/jest/package.json +3 -0
- package/package.json +13 -18
- package/schematics/package.json +3 -0
- package/esm2022/contracts/events-contracts.mjs +0 -2
- package/esm2022/contracts/index.mjs +0 -2
- package/esm2022/directives/index.mjs +0 -2
- package/esm2022/directives/track-events/base-track-events.mjs +0 -72
- package/esm2022/directives/track-events/index.mjs +0 -5
- package/esm2022/directives/track-events/track-click/track-click.directive.mjs +0 -42
- package/esm2022/directives/track-events/track-events.directive.mjs +0 -49
- package/esm2022/directives/track-events/track-events.module.mjs +0 -18
- package/esm2022/directives/track-events/track-focus/track-focus.directive.mjs +0 -39
- package/esm2022/fixtures/jasmine/event-track.service.fixture.jasmine.mjs +0 -40
- package/esm2022/fixtures/jasmine/index.mjs +0 -2
- package/esm2022/fixtures/jasmine/o3r-analytics-fixtures-jasmine.mjs +0 -5
- package/esm2022/fixtures/jest/event-track.service.fixture.jest.mjs +0 -40
- package/esm2022/fixtures/jest/index.mjs +0 -2
- package/esm2022/fixtures/jest/o3r-analytics-fixtures-jest.mjs +0 -5
- package/esm2022/o3r-analytics.mjs +0 -5
- package/esm2022/public_api.mjs +0 -5
- package/esm2022/services/event-track/event-track.configuration.mjs +0 -14
- package/esm2022/services/event-track/event-track.service.mjs +0 -303
- package/esm2022/services/event-track/index.mjs +0 -3
- package/esm2022/services/index.mjs +0 -2
- package/esm2022/stores/event-track/event-track.actions.mjs +0 -28
- package/esm2022/stores/event-track/event-track.module.mjs +0 -39
- package/esm2022/stores/event-track/event-track.reducer.mjs +0 -101
- package/esm2022/stores/event-track/event-track.selectors.mjs +0 -7
- package/esm2022/stores/event-track/event-track.state.mjs +0 -5
- package/esm2022/stores/event-track/event-track.sync.mjs +0 -7
- package/esm2022/stores/event-track/index.mjs +0 -7
- package/esm2022/stores/index.mjs +0 -2
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, NgZone, Optional, } from '@angular/core';
|
|
2
|
-
import { NavigationEnd, Router, } from '@angular/router';
|
|
3
|
-
import { BehaviorSubject, combineLatest, fromEvent, ReplaySubject, } from 'rxjs';
|
|
4
|
-
import { delay, filter, skip, skipWhile, take, takeWhile, withLatestFrom, } from 'rxjs/operators';
|
|
5
|
-
import { defaultEventTrackConfiguration, EVENT_TRACK_SERVICE_CONFIGURATION, } from './event-track.configuration';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/router";
|
|
8
|
-
/** The initial value of the performance measurements */
|
|
9
|
-
export const performanceMarksInitialState = {
|
|
10
|
-
page: '',
|
|
11
|
-
perceived: {},
|
|
12
|
-
serverCalls: [],
|
|
13
|
-
customMarks: []
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Service to expose the tracked events as streams. Also provide a way to activate/deactivate the tracking
|
|
17
|
-
*/
|
|
18
|
-
export class EventTrackService {
|
|
19
|
-
/** Performance payload object */
|
|
20
|
-
get performancePayload() {
|
|
21
|
-
return this._performancePayload;
|
|
22
|
-
}
|
|
23
|
-
/** Performance payload object */
|
|
24
|
-
set performancePayload(value) {
|
|
25
|
-
if (this.isPerfTrackingActive) {
|
|
26
|
-
this._performancePayload = { ...value, page: this.router.url }; // Saves the current page url
|
|
27
|
-
this.perfEventTrack.next(this._performancePayload);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
constructor(router, zone, config) {
|
|
31
|
-
this.router = router;
|
|
32
|
-
this.zone = zone;
|
|
33
|
-
/** Boolean to indicate the first load of the application */
|
|
34
|
-
this.isFirstLoad = true;
|
|
35
|
-
this._performancePayload = performanceMarksInitialState;
|
|
36
|
-
const eventConfiguration = { ...defaultEventTrackConfiguration, ...config };
|
|
37
|
-
this.uiTrackingActivated = new BehaviorSubject(eventConfiguration.activate.uiTracking);
|
|
38
|
-
this.uiTrackingActive$ = this.uiTrackingActivated.asObservable();
|
|
39
|
-
this.uiEventTrack = new ReplaySubject(eventConfiguration.uiEventsBufferSize);
|
|
40
|
-
this.uiEventTrack$ = this.uiEventTrack.asObservable();
|
|
41
|
-
// Custom events
|
|
42
|
-
this.customEventTrack = new ReplaySubject();
|
|
43
|
-
this.customEventTrack$ = this.customEventTrack.asObservable();
|
|
44
|
-
this.perfTrackingActivated = new BehaviorSubject(eventConfiguration.activate.perfTracking);
|
|
45
|
-
this.perfTrackingActive$ = this.perfTrackingActivated.asObservable();
|
|
46
|
-
this.perfEventTrack = new ReplaySubject(eventConfiguration.perfBufferSize);
|
|
47
|
-
this.perfEventTrack$ = this.perfEventTrack.asObservable();
|
|
48
|
-
this.perfTrackingActive$.subscribe((activated) => this.isPerfTrackingActive = activated);
|
|
49
|
-
const routerNavigationEnd$ = this.router.events.pipe(filter((event) => event instanceof NavigationEnd));
|
|
50
|
-
const trackingNavigationEnd$ = routerNavigationEnd$.pipe(withLatestFrom(this.perfTrackingActive$));
|
|
51
|
-
// Handles first load navigation
|
|
52
|
-
combineLatest(trackingNavigationEnd$.pipe(take(1), filter(() => typeof window.performance.timing !== 'undefined'), takeWhile(([_event, active]) => active)), fromEvent(window, 'load').pipe(delay(0))).subscribe(async () => {
|
|
53
|
-
if (eventConfiguration.useBrowserApiForFirstFP) {
|
|
54
|
-
const browserEntries = window.performance.getEntriesByType && window.performance.getEntriesByType('paint');
|
|
55
|
-
const browserFP = browserEntries && browserEntries.find((entry) => entry.name === 'first-paint');
|
|
56
|
-
if (browserFP) {
|
|
57
|
-
const endTime = Math.round(browserFP.startTime);
|
|
58
|
-
this.addFPToPerfPayload({ startTime: 0, endTime });
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
else if (this.firstPaint) { // If there is a registered firstPaint value emit it
|
|
62
|
-
this.addFPToPerfPayload(await this.firstPaint);
|
|
63
|
-
this.firstPaint = undefined;
|
|
64
|
-
}
|
|
65
|
-
this.markFirstLoad();
|
|
66
|
-
});
|
|
67
|
-
// Handles later navigation
|
|
68
|
-
trackingNavigationEnd$.pipe(skip(1), skipWhile(([_event, active]) => !active)).subscribe(async () => {
|
|
69
|
-
this.isFirstLoad = false;
|
|
70
|
-
this.resetPerfMarks();
|
|
71
|
-
if (this.firstPaint) { // If there is a registered firstPaint value emit it
|
|
72
|
-
this.addFPToPerfPayload(await this.firstPaint);
|
|
73
|
-
this.firstPaint = undefined;
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Create metrics object for the first load of the application
|
|
79
|
-
*/
|
|
80
|
-
createFirstLoadData() {
|
|
81
|
-
const navigation = window.performance.timing;
|
|
82
|
-
return {
|
|
83
|
-
connection: Math.round(navigation.connectEnd - navigation.navigationStart),
|
|
84
|
-
request: Math.round(navigation.responseStart - navigation.connectEnd),
|
|
85
|
-
response: Math.round(navigation.responseEnd - navigation.responseStart),
|
|
86
|
-
DOM: Math.round(navigation.loadEventEnd - navigation.responseEnd),
|
|
87
|
-
total: Math.round(navigation.loadEventEnd - navigation.navigationStart)
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Populate performance payload with FP object
|
|
92
|
-
* @param FP
|
|
93
|
-
*/
|
|
94
|
-
addFPToPerfPayload(FP) {
|
|
95
|
-
const perfFirstPaint = {
|
|
96
|
-
...this.performancePayload,
|
|
97
|
-
perceived: {
|
|
98
|
-
...this.performancePayload.perceived,
|
|
99
|
-
FP
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
this.performancePayload = perfFirstPaint;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Reset all metrics to initial state; Add the pageName on top of it
|
|
106
|
-
*/
|
|
107
|
-
resetPerfMarks() {
|
|
108
|
-
this.performancePayload = { ...performanceMarksInitialState };
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Mark the first load metrics using the navigation API.
|
|
112
|
-
* This has to be called only once in a single page application, being meaningful only for the first load
|
|
113
|
-
* This mark is populated by default in this service when the NavigationEnd event of the router emits for the first time
|
|
114
|
-
*/
|
|
115
|
-
markFirstLoad() {
|
|
116
|
-
const firstLoad = this.createFirstLoadData();
|
|
117
|
-
this.performancePayload = { ...this.performancePayload, firstLoad };
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Mark the first paint value
|
|
121
|
-
* Store the first paint timing value to be emitted at Navigation End
|
|
122
|
-
* @param emit If true, sets the FP to the current page. Otherwise, wait for next NavigationEnd event to happen
|
|
123
|
-
*/
|
|
124
|
-
async markFP(emit = false) {
|
|
125
|
-
this.firstPaint = this.getTiming();
|
|
126
|
-
if (emit) {
|
|
127
|
-
this.addFPToPerfPayload(await this.firstPaint);
|
|
128
|
-
this.firstPaint = undefined;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Mark the first meaningful paint value.
|
|
133
|
-
* @param markOnlyFirstLoad If false, marks the FMP for subsequent loads else only for the first load of the application
|
|
134
|
-
*/
|
|
135
|
-
async markFMP(markOnlyFirstLoad = true) {
|
|
136
|
-
if (!markOnlyFirstLoad || (markOnlyFirstLoad && this.isFirstLoad)) {
|
|
137
|
-
const timing = await this.getTiming();
|
|
138
|
-
const perfFirstMeaningfulPaint = {
|
|
139
|
-
...this.performancePayload,
|
|
140
|
-
perceived: {
|
|
141
|
-
...this.performancePayload.perceived,
|
|
142
|
-
FMP: timing
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
this.performancePayload = perfFirstMeaningfulPaint;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Add data ready perceived event
|
|
150
|
-
* This probe marks the time when the page considers it has all the data to become interactive
|
|
151
|
-
*/
|
|
152
|
-
async markDataReady() {
|
|
153
|
-
const timing = await this.getTiming();
|
|
154
|
-
const perfDataReady = {
|
|
155
|
-
...this.performancePayload,
|
|
156
|
-
perceived: {
|
|
157
|
-
...this.performancePayload.perceived,
|
|
158
|
-
dataReady: timing
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
this.performancePayload = perfDataReady;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Add a custom event and its measurements
|
|
165
|
-
* @param label The event name
|
|
166
|
-
*/
|
|
167
|
-
async addCustomMark(label) {
|
|
168
|
-
const timing = await this.getTiming();
|
|
169
|
-
const customMark = { label, timing };
|
|
170
|
-
const perf = { ...this.performancePayload, customMarks: this.performancePayload.customMarks.concat(customMark) };
|
|
171
|
-
this.performancePayload = perf;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Add a server call object in the list of server calls metrics
|
|
175
|
-
* @param serverCall The object to add in the server calls metrics
|
|
176
|
-
*/
|
|
177
|
-
addServerCallMark(serverCall) {
|
|
178
|
-
const perf = { ...this.performancePayload, serverCalls: this.performancePayload.serverCalls.concat(serverCall) };
|
|
179
|
-
this.performancePayload = perf;
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Add a DxAPI SDK server call object, created by the SDK Probe plugin, in the list of server calls metrics.
|
|
183
|
-
* In order to have requestId for the DxAPI calls, your server has to expose 'ama-request-id' via Access-Control-Expose-Headers
|
|
184
|
-
* @param serverMark The mark object
|
|
185
|
-
*/
|
|
186
|
-
async addSDKServerCallMark(serverMark) {
|
|
187
|
-
let serverCallMetric = {
|
|
188
|
-
url: serverMark.url,
|
|
189
|
-
httpMethod: serverMark.requestOptions.method,
|
|
190
|
-
httpStatus: serverMark.response && serverMark.response.status,
|
|
191
|
-
timing: { startTime: serverMark.startTime, endTime: serverMark.endTime },
|
|
192
|
-
error: serverMark.error
|
|
193
|
-
};
|
|
194
|
-
if (serverMark.response) {
|
|
195
|
-
const clonedResponse = serverMark.response.clone();
|
|
196
|
-
const amaRequestId = clonedResponse.headers.get('ama-request-id');
|
|
197
|
-
const blob = await clonedResponse.blob();
|
|
198
|
-
serverCallMetric = {
|
|
199
|
-
...serverCallMetric,
|
|
200
|
-
responseSize: blob.size,
|
|
201
|
-
requestId: amaRequestId || undefined
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
this.addServerCallMark(serverCallMetric);
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Add a custom event and mark the start time, and returns the element index
|
|
208
|
-
* @param label Event name
|
|
209
|
-
* @returns the element index if tracking is active. Otherwise, -1
|
|
210
|
-
*/
|
|
211
|
-
startCustomMark(label) {
|
|
212
|
-
if (!this.isPerfTrackingActive) {
|
|
213
|
-
return -1;
|
|
214
|
-
}
|
|
215
|
-
const startTime = Math.round(window.performance.now());
|
|
216
|
-
const customMark = { label, timing: { startTime } };
|
|
217
|
-
const perf = { ...this.performancePayload, customMarks: this.performancePayload.customMarks.concat(customMark) };
|
|
218
|
-
this.performancePayload = perf;
|
|
219
|
-
return this.performancePayload.customMarks.length - 1;
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* End the event mark given in parameter;
|
|
223
|
-
* Returns false if the custom event is not found in the list of custom marks; true otherwise
|
|
224
|
-
* @param eventIndex Index of the custom event to be marked as ended
|
|
225
|
-
*/
|
|
226
|
-
endCustomMark(eventIndex) {
|
|
227
|
-
if (!this.isPerfTrackingActive) {
|
|
228
|
-
return false;
|
|
229
|
-
}
|
|
230
|
-
let updated = false;
|
|
231
|
-
const perf = {
|
|
232
|
-
...this.performancePayload,
|
|
233
|
-
customMarks: this.performancePayload.customMarks.map((eventObj, index) => {
|
|
234
|
-
if (index !== eventIndex) {
|
|
235
|
-
return eventObj;
|
|
236
|
-
}
|
|
237
|
-
updated = true;
|
|
238
|
-
const endTime = Math.round(window.performance.now());
|
|
239
|
-
return { label: eventObj.label, timing: { ...eventObj.timing, endTime } };
|
|
240
|
-
})
|
|
241
|
-
};
|
|
242
|
-
this.performancePayload = perf;
|
|
243
|
-
return updated;
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* The goal of this method is to compute a time range duration between the moment you call the function (lower bound timestamp)
|
|
247
|
-
* and the end of the composite rendering (upper bound measurement - a time mark that occurs after the real composite)
|
|
248
|
-
* For the first load of the application, the start time is considered as the start of navigation to ensure a cumulative measure.
|
|
249
|
-
* It is using the 'NgZone' service to runOutsideAngular to prevent any change detection to occur, nor angular error handling, speeding up the measurement.
|
|
250
|
-
* Example {@link markFMP} is called in {@link ngAfterViewInit}, the end time will be computed once the render pipeline stage completed the changes triggered by the javascript
|
|
251
|
-
*/
|
|
252
|
-
getTiming() {
|
|
253
|
-
const startTime = this.isFirstLoad ? 0 : Math.round(window.performance.now());
|
|
254
|
-
return new Promise((resolve) => {
|
|
255
|
-
this.zone.runOutsideAngular(() => {
|
|
256
|
-
setTimeout(() => {
|
|
257
|
-
const endTime = Math.round(window.performance.now());
|
|
258
|
-
resolve({ startTime, endTime });
|
|
259
|
-
}, 0);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Add an event to the stream of captured UI events
|
|
265
|
-
* @param uiEvent emitted event object
|
|
266
|
-
*/
|
|
267
|
-
addUiEvent(uiEvent) {
|
|
268
|
-
this.uiEventTrack.next(uiEvent);
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Add an event to the stream of captured custom events
|
|
272
|
-
* @param customEvent emitted event object
|
|
273
|
-
*/
|
|
274
|
-
addCustomEvent(customEvent) {
|
|
275
|
-
this.customEventTrack.next(customEvent);
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Activate/deactivate the tracking mode for UI events
|
|
279
|
-
* @param activate activation/deactivation boolean
|
|
280
|
-
*/
|
|
281
|
-
toggleUiTracking(activate) {
|
|
282
|
-
this.uiTrackingActivated.next(activate);
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Activate/deactivate the tracking mode for performance measurements
|
|
286
|
-
* @param activate activation/deactivation boolean
|
|
287
|
-
*/
|
|
288
|
-
togglePerfTracking(activate) {
|
|
289
|
-
this.perfTrackingActivated.next(activate);
|
|
290
|
-
}
|
|
291
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventTrackService, deps: [{ token: i1.Router }, { token: i0.NgZone }, { token: EVENT_TRACK_SERVICE_CONFIGURATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
292
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventTrackService, providedIn: 'root' }); }
|
|
293
|
-
}
|
|
294
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventTrackService, decorators: [{
|
|
295
|
-
type: Injectable,
|
|
296
|
-
args: [{ providedIn: 'root' }]
|
|
297
|
-
}], ctorParameters: () => [{ type: i1.Router }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
298
|
-
type: Optional
|
|
299
|
-
}, {
|
|
300
|
-
type: Inject,
|
|
301
|
-
args: [EVENT_TRACK_SERVICE_CONFIGURATION]
|
|
302
|
-
}] }] });
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtdHJhY2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9ldmVudC10cmFjay9ldmVudC10cmFjay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGFBQWEsRUFDYixNQUFNLEdBQ1AsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixTQUFTLEVBRVQsYUFBYSxHQUNkLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04sSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULGNBQWMsR0FDZixNQUFNLGdCQUFnQixDQUFDO0FBVXhCLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsaUNBQWlDLEdBRWxDLE1BQU0sNkJBQTZCLENBQUM7OztBQUVyQyx3REFBd0Q7QUFDeEQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQStCO0lBQ3RFLElBQUksRUFBRSxFQUFFO0lBQ1IsU0FBUyxFQUFFLEVBQUU7SUFDYixXQUFXLEVBQUUsRUFBRTtJQUNmLFdBQVcsRUFBRSxFQUFFO0NBQ1AsQ0FBQztBQUVYOztHQUVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQW1DNUIsaUNBQWlDO0lBQ2pDLElBQVksa0JBQWtCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsSUFBWSxrQkFBa0IsQ0FBQyxLQUF1QjtRQUNwRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxJ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QUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDL0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDckQsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ2xDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLE9BQXVCO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjLENBQUMsV0FBK0I7UUFDbkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZ0JBQWdCLENBQUMsUUFBaUI7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksa0JBQWtCLENBQUMsUUFBaUI7UUFDekMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QyxDQUFDO2tJQS9VVSxpQkFBaUIsOERBZ0RvRSxpQ0FBaUM7c0lBaER0SCxpQkFBaUIsY0FGZCxNQUFNOzs0RkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQ1QsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFrRHVELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUNBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uIC0tIG5hbWluZyBjb252ZW50aW9uIGZvciBET00sIEZQLCBhbmQgRk1QIGltcG9zZWQgYnkgTGlnaHRob3VzZSAqL1xuaW1wb3J0IHR5cGUge1xuICBNYXJrLFxufSBmcm9tICdAYW1hLXNkay9jb3JlJztcbmltcG9ydCB7XG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgTmdab25lLFxuICBPcHRpb25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBOYXZpZ2F0aW9uRW5kLFxuICBSb3V0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZyb21FdmVudCxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkZWxheSxcbiAgZmlsdGVyLFxuICBza2lwLFxuICBza2lwV2hpbGUsXG4gIHRha2UsXG4gIHRha2VXaGlsZSxcbiAgd2l0aExhdGVzdEZyb20sXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEN1c3RvbUV2ZW50TWFya3MsXG4gIEN1c3RvbUV2ZW50UGF5bG9hZCxcbiAgRXZlbnRUaW1pbmcsXG4gIEZpcnN0TG9hZERhdGFQYXlsb2FkLFxuICBQZXJmRXZlbnRQYXlsb2FkLFxuICBTZXJ2ZXJDYWxsTWV0cmljLFxuICBVaUV2ZW50UGF5bG9hZCxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzJztcbmltcG9ydCB7XG4gIGRlZmF1bHRFdmVudFRyYWNrQ29uZmlndXJhdGlvbixcbiAgRVZFTlRfVFJBQ0tfU0VSVklDRV9DT05GSUdVUkFUSU9OLFxuICBFdmVudFRyYWNrQ29uZmlndXJhdGlvbixcbn0gZnJvbSAnLi9ldmVudC10cmFjay5jb25maWd1cmF0aW9uJztcblxuLyoqIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMgKi9cbmV4cG9ydCBjb25zdCBwZXJmb3JtYW5jZU1hcmtzSW5pdGlhbFN0YXRlOiBSZWFkb25seTxQZXJmRXZlbnRQYXlsb2FkPiA9IHtcbiAgcGFnZTogJycsXG4gIHBlcmNlaXZlZDoge30sXG4gIHNlcnZlckNhbGxzOiBbXSxcbiAgY3VzdG9tTWFya3M6IFtdXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFNlcnZpY2UgdG8gZXhwb3NlIHRoZSB0cmFja2VkIGV2ZW50cyBhcyBzdHJlYW1zLiBBbHNvIHByb3ZpZGUgYSB3YXkgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZSB0aGUgdHJhY2tpbmdcbiAqL1xuQEluamVjdGFibGUoXG4gIHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH1cbilcbmV4cG9ydCBjbGFzcyBFdmVudFRyYWNrU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdWlFdmVudFRyYWNrOiBSZXBsYXlTdWJqZWN0PFVpRXZlbnRQYXlsb2FkPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbUV2ZW50VHJhY2s6IFJlcGxheVN1YmplY3Q8Q3VzdG9tRXZlbnRQYXlsb2FkPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBlcmZFdmVudFRyYWNrOiBSZXBsYXlTdWJqZWN0PFBlcmZFdmVudFBheWxvYWQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdWlUcmFja2luZ0FjdGl2YXRlZDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyZlRyYWNraW5nQWN0aXZhdGVkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG5cbiAgcHJpdmF0ZSBmaXJzdFBhaW50PzogUHJvbWlzZTxFdmVudFRpbWluZz47XG5cbiAgLyoqIFVJIGNhcHR1cmVkIGV2ZW50cyBhcyBzdHJlYW0gKi9cbiAgcHVibGljIHVpRXZlbnRUcmFjayQ6IE9ic2VydmFibGU8VWlFdmVudFBheWxvYWQ+O1xuXG4gIC8qKiBDdXN0b20gY2FwdHVyZWQgZXZlbnRzIGFzIHN0cmVhbSAqL1xuICBwdWJsaWMgY3VzdG9tRXZlbnRUcmFjayQ6IE9ic2VydmFibGU8Q3VzdG9tRXZlbnRQYXlsb2FkPjtcblxuICAvKiogUGVyZm9ybWFuY2UgY2FwdHVyZWQgZXZlbnRzIGFzIHN0cmVhbSAqL1xuICBwdWJsaWMgcGVyZkV2ZW50VHJhY2skOiBPYnNlcnZhYmxlPFBlcmZFdmVudFBheWxvYWQ+O1xuXG4gIC8qKiBTdHJlYW0gb2YgYm9vbGVhbnMgZm9yIHRoZSB1aSB0cmFja2luZyBtb2RlIGFjdGl2ZS9pbmFjdGl2ZSAqL1xuICBwdWJsaWMgdWlUcmFja2luZ0FjdGl2ZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgLyoqIFN0cmVhbSBvZiBib29sZWFucyBmb3IgdGhlIHBlcmZvcm1hbmNlIHRyYWNraW5nIG1vZGUgYWN0aXZlL2luYWN0aXZlICovXG4gIHB1YmxpYyBwZXJmVHJhY2tpbmdBY3RpdmUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIC8qKiBUcnVlIGlmIHRoZSBwZXJmIHRyYWNraW5nIGlzIGFjdGl2YXRlZDsgZmFsc2Ugb3RoZXJ3aXNlICovXG4gIHByaXZhdGUgaXNQZXJmVHJhY2tpbmdBY3RpdmUhOiBib29sZWFuO1xuXG4gIC8qKiBCb29sZWFuIHRvIGluZGljYXRlIHRoZSBmaXJzdCBsb2FkIG9mIHRoZSBhcHBsaWNhdGlvbiAqL1xuICBwcml2YXRlIGlzRmlyc3RMb2FkID0gdHJ1ZTtcblxuICBwcml2YXRlIF9wZXJmb3JtYW5jZVBheWxvYWQ6IFBlcmZFdmVudFBheWxvYWQgPSBwZXJmb3JtYW5jZU1hcmtzSW5pdGlhbFN0YXRlO1xuICAvKiogUGVyZm9ybWFuY2UgcGF5bG9hZCBvYmplY3QgKi9cbiAgcHJpdmF0ZSBnZXQgcGVyZm9ybWFuY2VQYXlsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLl9wZXJmb3JtYW5jZVBheWxvYWQ7XG4gIH1cblxuICAvKiogUGVyZm9ybWFuY2UgcGF5bG9hZCBvYmplY3QgKi9cbiAgcHJpdmF0ZSBzZXQgcGVyZm9ybWFuY2VQYXlsb2FkKHZhbHVlOiBQZXJmRXZlbnRQYXlsb2FkKSB7XG4gICAgaWYgKHRoaXMuaXNQZXJmVHJhY2tpbmdBY3RpdmUpIHtcbiAgICAgIHRoaXMuX3BlcmZvcm1hbmNlUGF5bG9hZCA9IHsgLi4udmFsdWUsIHBhZ2U6IHRoaXMucm91dGVyLnVybCB9OyAvLyBTYXZlcyB0aGUgY3VycmVudCBwYWdlIHVybFxuICAgICAgdGhpcy5wZXJmRXZlbnRUcmFjay5uZXh0KHRoaXMuX3BlcmZvcm1hbmNlUGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSByZWFkb25seSB6b25lOiBOZ1pvbmUsIEBPcHRpb25hbCgpIEBJbmplY3QoRVZFTlRfVFJBQ0tfU0VSVklDRV9DT05GSUdVUkFUSU9OKSBjb25maWc/OiBFdmVudFRyYWNrQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGV2ZW50Q29uZmlndXJhdGlvbiA9IHsgLi4uZGVmYXVsdEV2ZW50VHJhY2tDb25maWd1cmF0aW9uLCAuLi5jb25maWcgfTtcbiAgICB0aGlzLnVpVHJhY2tpbmdBY3RpdmF0ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGV2ZW50Q29uZmlndXJhdGlvbi5hY3RpdmF0ZS51aVRyYWNraW5nKTtcbiAgICB0aGlzLnVpVHJhY2tpbmdBY3RpdmUkID0gdGhpcy51aVRyYWNraW5nQWN0aXZhdGVkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMudWlFdmVudFRyYWNrID0gbmV3IFJlcGxheVN1YmplY3Q8VWlFdmVudFBheWxvYWQ+KGV2ZW50Q29uZmlndXJhdGlvbi51aUV2ZW50c0J1ZmZlclNpemUpO1xuICAgIHRoaXMudWlFdmVudFRyYWNrJCA9IHRoaXMudWlFdmVudFRyYWNrLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgLy8gQ3VzdG9tIGV2ZW50c1xuICAgIHRoaXMuY3VzdG9tRXZlbnRUcmFjayA9IG5ldyBSZXBsYXlTdWJqZWN0PEN1c3RvbUV2ZW50UGF5bG9hZD4oKTtcbiAgICB0aGlzLmN1c3RvbUV2ZW50VHJhY2skID0gdGhpcy5jdXN0b21FdmVudFRyYWNrLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgdGhpcy5wZXJmVHJhY2tpbmdBY3RpdmF0ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGV2ZW50Q29uZmlndXJhdGlvbi5hY3RpdmF0ZS5wZXJmVHJhY2tpbmcpO1xuICAgIHRoaXMucGVyZlRyYWNraW5nQWN0aXZlJCA9IHRoaXMucGVyZlRyYWNraW5nQWN0aXZhdGVkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMucGVyZkV2ZW50VHJhY2sgPSBuZXcgUmVwbGF5U3ViamVjdDxQZXJmRXZlbnRQYXlsb2FkPihldmVudENvbmZpZ3VyYXRpb24ucGVyZkJ1ZmZlclNpemUpO1xuICAgIHRoaXMucGVyZkV2ZW50VHJhY2skID0gdGhpcy5wZXJmRXZlbnRUcmFjay5hc09ic2VydmFibGUoKTtcblxuICAgIHRoaXMucGVyZlRyYWNraW5nQWN0aXZlJC5zdWJzY3JpYmUoKGFjdGl2YXRlZCkgPT4gdGhpcy5pc1BlcmZUcmFja2luZ0FjdGl2ZSA9IGFjdGl2YXRlZCk7XG5cbiAgICBjb25zdCByb3V0ZXJOYXZpZ2F0aW9uRW5kJCA9IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBOYXZpZ2F0aW9uRW5kID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpO1xuICAgIGNvbnN0IHRyYWNraW5nTmF2aWdhdGlvbkVuZCQgPSByb3V0ZXJOYXZpZ2F0aW9uRW5kJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMucGVyZlRyYWNraW5nQWN0aXZlJCkpO1xuXG4gICAgLy8gSGFuZGxlcyBmaXJzdCBsb2FkIG5hdmlnYXRpb25cbiAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgdHJhY2tpbmdOYXZpZ2F0aW9uRW5kJC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdHlwZW9mIHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcgIT09ICd1bmRlZmluZWQnKSxcbiAgICAgICAgdGFrZVdoaWxlKChbX2V2ZW50LCBhY3RpdmVdKSA9PiBhY3RpdmUpXG4gICAgICApLFxuICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ2xvYWQnKS5waXBlKGRlbGF5KDApKVxuICAgICkuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChldmVudENvbmZpZ3VyYXRpb24udXNlQnJvd3NlckFwaUZvckZpcnN0RlApIHtcbiAgICAgICAgY29uc3QgYnJvd3NlckVudHJpZXMgPSB3aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSAmJiB3aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgncGFpbnQnKTtcbiAgICAgICAgY29uc3QgYnJvd3NlckZQID0gYnJvd3NlckVudHJpZXMgJiYgYnJvd3NlckVudHJpZXMuZmluZCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09ICdmaXJzdC1wYWludCcpO1xuICAgICAgICBpZiAoYnJvd3NlckZQKSB7XG4gICAgICAgICAgY29uc3QgZW5kVGltZSA9IE1hdGgucm91bmQoYnJvd3NlckZQLnN0YXJ0VGltZSk7XG4gICAgICAgICAgdGhpcy5hZGRGUFRvUGVyZlBheWxvYWQoeyBzdGFydFRpbWU6IDAsIGVuZFRpbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5maXJzdFBhaW50KSB7IC8vIElmIHRoZXJlIGlzIGEgcmVnaXN0ZXJlZCBmaXJzdFBhaW50IHZhbHVlIGVtaXQgaXRcbiAgICAgICAgdGhpcy5hZGRGUFRvUGVyZlBheWxvYWQoYXdhaXQgdGhpcy5maXJzdFBhaW50KTtcbiAgICAgICAgdGhpcy5maXJzdFBhaW50ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXJrRmlyc3RMb2FkKCk7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGVzIGxhdGVyIG5hdmlnYXRpb25cbiAgICB0cmFja2luZ05hdmlnYXRpb25FbmQkLnBpcGUoXG4gICAgICBza2lwKDEpLFxuICAgICAgc2tpcFdoaWxlKChbX2V2ZW50LCBhY3RpdmVdKSA9PiAhYWN0aXZlKVxuICAgICkuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuaXNGaXJzdExvYWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzZXRQZXJmTWFya3MoKTtcbiAgICAgIGlmICh0aGlzLmZpcnN0UGFpbnQpIHsgLy8gSWYgdGhlcmUgaXMgYSByZWdpc3RlcmVkIGZpcnN0UGFpbnQgdmFsdWUgZW1pdCBpdFxuICAgICAgICB0aGlzLmFkZEZQVG9QZXJmUGF5bG9hZChhd2FpdCB0aGlzLmZpcnN0UGFpbnQpO1xuICAgICAgICB0aGlzLmZpcnN0UGFpbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgZmlyc3QgbG9hZCBvZiB0aGUgYXBwbGljYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRmlyc3RMb2FkRGF0YSgpOiBGaXJzdExvYWREYXRhUGF5bG9hZCB7XG4gICAgY29uc3QgbmF2aWdhdGlvbiA9IHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmc7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbm5lY3Rpb246IE1hdGgucm91bmQobmF2aWdhdGlvbi5jb25uZWN0RW5kIC0gbmF2aWdhdGlvbi5uYXZpZ2F0aW9uU3RhcnQpLFxuICAgICAgcmVxdWVzdDogTWF0aC5yb3VuZChuYXZpZ2F0aW9uLnJlc3BvbnNlU3RhcnQgLSBuYXZpZ2F0aW9uLmNvbm5lY3RFbmQpLFxuICAgICAgcmVzcG9uc2U6IE1hdGgucm91bmQobmF2aWdhdGlvbi5yZXNwb25zZUVuZCAtIG5hdmlnYXRpb24ucmVzcG9uc2VTdGFydCksXG4gICAgICBET006IE1hdGgucm91bmQobmF2aWdhdGlvbi5sb2FkRXZlbnRFbmQgLSBuYXZpZ2F0aW9uLnJlc3BvbnNlRW5kKSxcbiAgICAgIHRvdGFsOiBNYXRoLnJvdW5kKG5hdmlnYXRpb24ubG9hZEV2ZW50RW5kIC0gbmF2aWdhdGlvbi5uYXZpZ2F0aW9uU3RhcnQpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSBwZXJmb3JtYW5jZSBwYXlsb2FkIHdpdGggRlAgb2JqZWN0XG4gICAqIEBwYXJhbSBGUFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRGUFRvUGVyZlBheWxvYWQoRlA6IEV2ZW50VGltaW5nKSB7XG4gICAgY29uc3QgcGVyZkZpcnN0UGFpbnQgPSB7XG4gICAgICAuLi50aGlzLnBlcmZvcm1hbmNlUGF5bG9hZCxcbiAgICAgIHBlcmNlaXZlZDoge1xuICAgICAgICAuLi50aGlzLnBlcmZvcm1hbmNlUGF5bG9hZC5wZXJjZWl2ZWQsXG4gICAgICAgIEZQXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnBlcmZvcm1hbmNlUGF5bG9hZCA9IHBlcmZGaXJzdFBhaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCBtZXRyaWNzIHRvIGluaXRpYWwgc3RhdGU7IEFkZCB0aGUgcGFnZU5hbWUgb24gdG9wIG9mIGl0XG4gICAqL1xuICBwdWJsaWMgcmVzZXRQZXJmTWFya3MoKSB7XG4gICAgdGhpcy5wZXJmb3JtYW5jZVBheWxvYWQgPSB7IC4uLnBlcmZvcm1hbmNlTWFya3NJbml0aWFsU3RhdGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrIHRoZSBmaXJzdCBsb2FkIG1ldHJpY3MgdXNpbmcgdGhlIG5hdmlnYXRpb24gQVBJLlxuICAgKiBUaGlzIGhhcyB0byBiZSBjYWxsZWQgb25seSBvbmNlIGluIGEgc2luZ2xlIHBhZ2UgYXBwbGljYXRpb24sIGJlaW5nIG1lYW5pbmdmdWwgb25seSBmb3IgdGhlIGZpcnN0IGxvYWRcbiAgICogVGhpcyBtYXJrIGlzIHBvcHVsYXRlZCBieSBkZWZhdWx0IGluIHRoaXMgc2VydmljZSB3aGVuIHRoZSBOYXZpZ2F0aW9uRW5kIGV2ZW50IG9mIHRoZSByb3V0ZXIgZW1pdHMgZm9yIHRoZSBmaXJzdCB0aW1lXG4gICAqL1xuICBwdWJsaWMgbWFya0ZpcnN0TG9hZCgpIHtcbiAgICBjb25zdCBmaXJzdExvYWQgPSB0aGlzLmNyZWF0ZUZpcnN0TG9hZERhdGEoKTtcbiAgICB0aGlzLnBlcmZvcm1hbmNlUGF5bG9hZCA9IHsgLi4udGhpcy5wZXJmb3JtYW5jZVBheWxvYWQsIGZpcnN0TG9hZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhlIGZpcnN0IHBhaW50IHZhbHVlXG4gICAqIFN0b3JlIHRoZSBmaXJzdCBwYWludCB0aW1pbmcgdmFsdWUgdG8gYmUgZW1pdHRlZCBhdCBOYXZpZ2F0aW9uIEVuZFxuICAgKiBAcGFyYW0gZW1pdCBJZiB0cnVlLCBzZXRzIHRoZSBGUCB0byB0aGUgY3VycmVudCBwYWdlLiBPdGhlcndpc2UsIHdhaXQgZm9yIG5leHQgTmF2aWdhdGlvbkVuZCBldmVudCB0byBoYXBwZW5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYXJrRlAoZW1pdCA9IGZhbHNlKSB7XG4gICAgdGhpcy5maXJzdFBhaW50ID0gdGhpcy5nZXRUaW1pbmcoKTtcbiAgICBpZiAoZW1pdCkge1xuICAgICAgdGhpcy5hZGRGUFRvUGVyZlBheWxvYWQoYXdhaXQgdGhpcy5maXJzdFBhaW50KTtcbiAgICAgIHRoaXMuZmlyc3RQYWludCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFyayB0aGUgZmlyc3QgbWVhbmluZ2Z1bCBwYWludCB2YWx1ZS5cbiAgICogQHBhcmFtIG1hcmtPbmx5Rmlyc3RMb2FkIElmIGZhbHNlLCBtYXJrcyB0aGUgRk1QIGZvciBzdWJzZXF1ZW50IGxvYWRzIGVsc2Ugb25seSBmb3IgdGhlIGZpcnN0IGxvYWQgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFya0ZNUChtYXJrT25seUZpcnN0TG9hZCA9IHRydWUpIHtcbiAgICBpZiAoIW1hcmtPbmx5Rmlyc3RMb2FkIHx8IChtYXJrT25seUZpcnN0TG9hZCAmJiB0aGlzLmlzRmlyc3RMb2FkKSkge1xuICAgICAgY29uc3QgdGltaW5nID0gYXdhaXQgdGhpcy5nZXRUaW1pbmcoKTtcbiAgICAgIGNvbnN0IHBlcmZGaXJzdE1lYW5pbmdmdWxQYWludCA9IHtcbiAgICAgICAgLi4udGhpcy5wZXJmb3JtYW5jZVBheWxvYWQsXG4gICAgICAgIHBlcmNlaXZlZDoge1xuICAgICAgICAgIC4uLnRoaXMucGVyZm9ybWFuY2VQYXlsb2FkLnBlcmNlaXZlZCxcbiAgICAgICAgICBGTVA6IHRpbWluZ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5wZXJmb3JtYW5jZVBheWxvYWQgPSBwZXJmRmlyc3RNZWFuaW5nZnVsUGFpbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBkYXRhIHJlYWR5IHBlcmNlaXZlZCBldmVudFxuICAgKiBUaGlzIHByb2JlIG1hcmtzIHRoZSB0aW1lIHdoZW4gdGhlIHBhZ2UgY29uc2lkZXJzIGl0IGhhcyBhbGwgdGhlIGRhdGEgdG8gYmVjb21lIGludGVyYWN0aXZlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFya0RhdGFSZWFkeSgpIHtcbiAgICBjb25zdCB0aW1pbmcgPSBhd2FpdCB0aGlzLmdldFRpbWluZygpO1xuICAgIGNvbnN0IHBlcmZEYXRhUmVhZHkgPSB7XG4gICAgICAuLi50aGlzLnBlcmZvcm1hbmNlUGF5bG9hZCxcbiAgICAgIHBlcmNlaXZlZDoge1xuICAgICAgICAuLi50aGlzLnBlcmZvcm1hbmNlUGF5bG9hZC5wZXJjZWl2ZWQsXG4gICAgICAgIGRhdGFSZWFkeTogdGltaW5nXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnBlcmZvcm1hbmNlUGF5bG9hZCA9IHBlcmZEYXRhUmVhZHk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY3VzdG9tIGV2ZW50IGFuZCBpdHMgbWVhc3VyZW1lbnRzXG4gICAqIEBwYXJhbSBsYWJlbCBUaGUgZXZlbnQgbmFtZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFkZEN1c3RvbU1hcmsobGFiZWw6IHN0cmluZykge1xuICAgIGNvbnN0IHRpbWluZyA9IGF3YWl0IHRoaXMuZ2V0VGltaW5nKCk7XG4gICAgY29uc3QgY3VzdG9tTWFyayA9IHsgbGFiZWwsIHRpbWluZyB9IGFzIGNvbnN0IHNhdGlzZmllcyBDdXN0b21FdmVudE1hcmtzO1xuICAgIGNvbnN0IHBlcmYgPSB7IC4uLnRoaXMucGVyZm9ybWFuY2VQYXlsb2FkLCBjdXN0b21NYXJrczogdGhpcy5wZXJmb3JtYW5jZVBheWxvYWQuY3VzdG9tTWFya3MuY29uY2F0KGN1c3RvbU1hcmspIH07XG4gICAgdGhpcy5wZXJmb3JtYW5jZVBheWxvYWQgPSBwZXJmO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNlcnZlciBjYWxsIG9iamVjdCBpbiB0aGUgbGlzdCBvZiBzZXJ2ZXIgY2FsbHMgbWV0cmljc1xuICAgKiBAcGFyYW0gc2VydmVyQ2FsbCBUaGUgb2JqZWN0IHRvIGFkZCBpbiB0aGUgc2VydmVyIGNhbGxzIG1ldHJpY3NcbiAgICovXG4gIHB1YmxpYyBhZGRTZXJ2ZXJDYWxsTWFyayhzZXJ2ZXJDYWxsOiBTZXJ2ZXJDYWxsTWV0cmljKSB7XG4gICAgY29uc3QgcGVyZiA9IHsgLi4udGhpcy5wZXJmb3JtYW5jZVBheWxvYWQsIHNlcnZlckNhbGxzOiB0aGlzLnBlcmZvcm1hbmNlUGF5bG9hZC5zZXJ2ZXJDYWxscy5jb25jYXQoc2VydmVyQ2FsbCkgfTtcbiAgICB0aGlzLnBlcmZvcm1hbmNlUGF5bG9hZCA9IHBlcmY7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgRHhBUEkgU0RLIHNlcnZlciBjYWxsIG9iamVjdCwgY3JlYXRlZCBieSB0aGUgU0RLIFByb2JlIHBsdWdpbiwgaW4gdGhlIGxpc3Qgb2Ygc2VydmVyIGNhbGxzIG1ldHJpY3MuXG4gICAqIEluIG9yZGVyIHRvIGhhdmUgcmVxdWVzdElkIGZvciB0aGUgRHhBUEkgY2FsbHMsIHlvdXIgc2VydmVyIGhhcyB0byBleHBvc2UgJ2FtYS1yZXF1ZXN0LWlkJyB2aWEgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnNcbiAgICogQHBhcmFtIHNlcnZlck1hcmsgVGhlIG1hcmsgb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWRkU0RLU2VydmVyQ2FsbE1hcmsoc2VydmVyTWFyazogTWFyaykge1xuICAgIGxldCBzZXJ2ZXJDYWxsTWV0cmljOiBTZXJ2ZXJDYWxsTWV0cmljID0ge1xuICAgICAgdXJsOiBzZXJ2ZXJNYXJrLnVybCxcbiAgICAgIGh0dHBNZXRob2Q6IHNlcnZlck1hcmsucmVxdWVzdE9wdGlvbnMubWV0aG9kLFxuICAgICAgaHR0cFN0YXR1czogc2VydmVyTWFyay5yZXNwb25zZSAmJiBzZXJ2ZXJNYXJrLnJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHRpbWluZzogeyBzdGFydFRpbWU6IHNlcnZlck1hcmsuc3RhcnRUaW1lLCBlbmRUaW1lOiBzZXJ2ZXJNYXJrLmVuZFRpbWUgfSxcbiAgICAgIGVycm9yOiBzZXJ2ZXJNYXJrLmVycm9yXG4gICAgfTtcbiAgICBpZiAoc2VydmVyTWFyay5yZXNwb25zZSkge1xuICAgICAgY29uc3QgY2xvbmVkUmVzcG9uc2UgPSBzZXJ2ZXJNYXJrLnJlc3BvbnNlLmNsb25lKCk7XG4gICAgICBjb25zdCBhbWFSZXF1ZXN0SWQgPSBjbG9uZWRSZXNwb25zZS5oZWFkZXJzLmdldCgnYW1hLXJlcXVlc3QtaWQnKTtcbiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBjbG9uZWRSZXNwb25zZS5ibG9iKCk7XG4gICAgICBzZXJ2ZXJDYWxsTWV0cmljID0ge1xuICAgICAgICAuLi5zZXJ2ZXJDYWxsTWV0cmljLFxuICAgICAgICByZXNwb25zZVNpemU6IGJsb2Iuc2l6ZSxcbiAgICAgICAgcmVxdWVzdElkOiBhbWFSZXF1ZXN0SWQgfHwgdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmFkZFNlcnZlckNhbGxNYXJrKHNlcnZlckNhbGxNZXRyaWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGN1c3RvbSBldmVudCBhbmQgbWFyayB0aGUgc3RhcnQgdGltZSwgYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgaW5kZXhcbiAgICogQHBhcmFtIGxhYmVsIEV2ZW50IG5hbWVcbiAgICogQHJldHVybnMgdGhlIGVsZW1lbnQgaW5kZXggaWYgdHJhY2tpbmcgaXMgYWN0aXZlLiBPdGhlcndpc2UsIC0xXG4gICAqL1xuICBwdWJsaWMgc3RhcnRDdXN0b21NYXJrKGxhYmVsOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuaXNQZXJmVHJhY2tpbmdBY3RpdmUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gTWF0aC5yb3VuZCh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkpO1xuICAgIGNvbnN0IGN1c3RvbU1hcmsgPSB7IGxhYmVsLCB0aW1pbmc6IHsgc3RhcnRUaW1lIH0gfSBhcyBjb25zdCBzYXRpc2ZpZXMgQ3VzdG9tRXZlbnRNYXJrcztcbiAgICBjb25zdCBwZXJmID0geyAuLi50aGlzLnBlcmZvcm1hbmNlUGF5bG9hZCwgY3VzdG9tTWFya3M6IHRoaXMucGVyZm9ybWFuY2VQYXlsb2FkLmN1c3RvbU1hcmtzLmNvbmNhdChjdXN0b21NYXJrKSB9O1xuICAgIHRoaXMucGVyZm9ybWFuY2VQYXlsb2FkID0gcGVyZjtcbiAgICByZXR1cm4gdGhpcy5wZXJmb3JtYW5jZVBheWxvYWQuY3VzdG9tTWFya3MubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgdGhlIGV2ZW50IG1hcmsgZ2l2ZW4gaW4gcGFyYW1ldGVyO1xuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBjdXN0b20gZXZlbnQgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIGN1c3RvbSBtYXJrczsgdHJ1ZSBvdGhlcndpc2VcbiAgICogQHBhcmFtIGV2ZW50SW5kZXggSW5kZXggb2YgdGhlIGN1c3RvbSBldmVudCB0byBiZSBtYXJrZWQgYXMgZW5kZWRcbiAgICovXG4gIHB1YmxpYyBlbmRDdXN0b21NYXJrKGV2ZW50SW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5pc1BlcmZUcmFja2luZ0FjdGl2ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHBlcmYgPSB7XG4gICAgICAuLi50aGlzLnBlcmZvcm1hbmNlUGF5bG9hZCxcbiAgICAgIGN1c3RvbU1hcmtzOiB0aGlzLnBlcmZvcm1hbmNlUGF5bG9hZC5jdXN0b21NYXJrcy5tYXAoKGV2ZW50T2JqLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoaW5kZXggIT09IGV2ZW50SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnRPYmo7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBNYXRoLnJvdW5kKHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSk7XG4gICAgICAgIHJldHVybiB7IGxhYmVsOiBldmVudE9iai5sYWJlbCwgdGltaW5nOiB7IC4uLmV2ZW50T2JqLnRpbWluZywgZW5kVGltZSB9IH07XG4gICAgICB9KVxuICAgIH07XG4gICAgdGhpcy5wZXJmb3JtYW5jZVBheWxvYWQgPSBwZXJmO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBnb2FsIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNvbXB1dGUgYSB0aW1lIHJhbmdlIGR1cmF0aW9uIGJldHdlZW4gdGhlIG1vbWVudCB5b3UgY2FsbCB0aGUgZnVuY3Rpb24gKGxvd2VyIGJvdW5kIHRpbWVzdGFtcClcbiAgICogYW5kIHRoZSBlbmQgb2YgdGhlIGNvbXBvc2l0ZSByZW5kZXJpbmcgKHVwcGVyIGJvdW5kIG1lYXN1cmVtZW50IC0gYSB0aW1lIG1hcmsgdGhhdCBvY2N1cnMgYWZ0ZXIgdGhlIHJlYWwgY29tcG9zaXRlKVxuICAgKiBGb3IgdGhlIGZpcnN0IGxvYWQgb2YgdGhlIGFwcGxpY2F0aW9uLCB0aGUgc3RhcnQgdGltZSBpcyBjb25zaWRlcmVkIGFzIHRoZSBzdGFydCBvZiBuYXZpZ2F0aW9uIHRvIGVuc3VyZSBhIGN1bXVsYXRpdmUgbWVhc3VyZS5cbiAgICogSXQgaXMgdXNpbmcgdGhlICdOZ1pvbmUnIHNlcnZpY2UgdG8gcnVuT3V0c2lkZUFuZ3VsYXIgdG8gcHJldmVudCBhbnkgY2hhbmdlIGRldGVjdGlvbiB0byBvY2N1ciwgbm9yIGFuZ3VsYXIgZXJyb3IgaGFuZGxpbmcsIHNwZWVkaW5nIHVwIHRoZSBtZWFzdXJlbWVudC5cbiAgICogRXhhbXBsZSB7QGxpbmsgbWFya0ZNUH0gaXMgY2FsbGVkIGluIHtAbGluayBuZ0FmdGVyVmlld0luaXR9LCB0aGUgZW5kIHRpbWUgd2lsbCBiZSBjb21wdXRlZCBvbmNlIHRoZSByZW5kZXIgcGlwZWxpbmUgc3RhZ2UgY29tcGxldGVkIHRoZSBjaGFuZ2VzIHRyaWdnZXJlZCBieSB0aGUgamF2YXNjcmlwdFxuICAgKi9cbiAgcHVibGljIGdldFRpbWluZygpOiBQcm9taXNlPEV2ZW50VGltaW5nPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gdGhpcy5pc0ZpcnN0TG9hZCA/IDAgOiBNYXRoLnJvdW5kKHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbmRUaW1lID0gTWF0aC5yb3VuZCh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkpO1xuICAgICAgICAgIHJlc29sdmUoeyBzdGFydFRpbWUsIGVuZFRpbWUgfSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IHRvIHRoZSBzdHJlYW0gb2YgY2FwdHVyZWQgVUkgZXZlbnRzXG4gICAqIEBwYXJhbSB1aUV2ZW50IGVtaXR0ZWQgZXZlbnQgb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgYWRkVWlFdmVudCh1aUV2ZW50OiBVaUV2ZW50UGF5bG9hZCkge1xuICAgIHRoaXMudWlFdmVudFRyYWNrLm5leHQodWlFdmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IHRvIHRoZSBzdHJlYW0gb2YgY2FwdHVyZWQgY3VzdG9tIGV2ZW50c1xuICAgKiBAcGFyYW0gY3VzdG9tRXZlbnQgZW1pdHRlZCBldmVudCBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBhZGRDdXN0b21FdmVudChjdXN0b21FdmVudDogQ3VzdG9tRXZlbnRQYXlsb2FkKSB7XG4gICAgdGhpcy5jdXN0b21FdmVudFRyYWNrLm5leHQoY3VzdG9tRXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlL2RlYWN0aXZhdGUgdGhlIHRyYWNraW5nIG1vZGUgZm9yIFVJIGV2ZW50c1xuICAgKiBAcGFyYW0gYWN0aXZhdGUgYWN0aXZhdGlvbi9kZWFjdGl2YXRpb24gYm9vbGVhblxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVVpVHJhY2tpbmcoYWN0aXZhdGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVpVHJhY2tpbmdBY3RpdmF0ZWQubmV4dChhY3RpdmF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUvZGVhY3RpdmF0ZSB0aGUgdHJhY2tpbmcgbW9kZSBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzXG4gICAqIEBwYXJhbSBhY3RpdmF0ZSBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBib29sZWFuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlUGVyZlRyYWNraW5nKGFjdGl2YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy5wZXJmVHJhY2tpbmdBY3RpdmF0ZWQubmV4dChhY3RpdmF0ZSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export * from './event-track.configuration';
|
|
2
|
-
export * from './event-track.service';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZXZlbnQtdHJhY2svaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ldmVudC10cmFjay5jb25maWd1cmF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnQtdHJhY2suc2VydmljZSc7XG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export * from './event-track/index';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZXZlbnQtdHJhY2svaW5kZXgnO1xuIl19
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { createAction, props, } from '@ngrx/store';
|
|
2
|
-
/** StateActions */
|
|
3
|
-
const ACTION_SET = '[EventTrack] set';
|
|
4
|
-
const ACTION_UPDATE = '[EventTrack] update';
|
|
5
|
-
const ACTION_REGISTER_HERO_COMPONENT = '[EventTrack] register hero component';
|
|
6
|
-
const ACTION_SET_HERO_COMPONENT_TTI = '[EventTrack] set hero component TTI';
|
|
7
|
-
const ACTION_RESET = '[EventTrack] reset';
|
|
8
|
-
/**
|
|
9
|
-
* Clear the current store object and replace it with the new one
|
|
10
|
-
*/
|
|
11
|
-
export const setEventTrack = createAction(ACTION_SET, props());
|
|
12
|
-
/**
|
|
13
|
-
* Change a part or the whole object in the store.
|
|
14
|
-
*/
|
|
15
|
-
export const updateEventTrack = createAction(ACTION_UPDATE, props());
|
|
16
|
-
/**
|
|
17
|
-
* Clear the whole state, return to the initial one
|
|
18
|
-
*/
|
|
19
|
-
export const resetEventTrack = createAction(ACTION_RESET);
|
|
20
|
-
/**
|
|
21
|
-
* Register hero component in the store
|
|
22
|
-
*/
|
|
23
|
-
export const registerHeroComponent = createAction(ACTION_REGISTER_HERO_COMPONENT, props());
|
|
24
|
-
/**
|
|
25
|
-
* Set the TTI measure for a hero component in the store
|
|
26
|
-
*/
|
|
27
|
-
export const setHeroComponentTTI = createAction(ACTION_SET_HERO_COMPONENT_TTI, props());
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtdHJhY2suYWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdG9yZXMvZXZlbnQtdHJhY2svZXZlbnQtdHJhY2suYWN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsWUFBWSxFQUNaLEtBQUssR0FDTixNQUFNLGFBQWEsQ0FBQztBQU1yQixtQkFBbUI7QUFDbkIsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUM7QUFDdEMsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUM7QUFDNUMsTUFBTSw4QkFBOEIsR0FBRyxzQ0FBc0MsQ0FBQztBQUM5RSxNQUFNLDZCQUE2QixHQUFHLHFDQUFxQyxDQUFDO0FBQzVFLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDO0FBd0IxQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBOEIsQ0FBQyxDQUFDO0FBRTNGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQXVDLENBQUMsQ0FBQztBQUUxRzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFMUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLENBQUMsOEJBQThCLEVBQUUsS0FBSyxFQUEyQyxDQUFDLENBQUM7QUFFcEk7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxFQUF5QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjcmVhdGVBY3Rpb24sXG4gIHByb3BzLFxufSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQge1xuICBFdmVudFRyYWNrU3RhdGUsXG4gIFJlZ2lzdGVySGVyb0NvbXBvbmVudFBheWxvYWQsXG59IGZyb20gJy4vZXZlbnQtdHJhY2suc3RhdGUnO1xuXG4vKiogU3RhdGVBY3Rpb25zICovXG5jb25zdCBBQ1RJT05fU0VUID0gJ1tFdmVudFRyYWNrXSBzZXQnO1xuY29uc3QgQUNUSU9OX1VQREFURSA9ICdbRXZlbnRUcmFja10gdXBkYXRlJztcbmNvbnN0IEFDVElPTl9SRUdJU1RFUl9IRVJPX0NPTVBPTkVOVCA9ICdbRXZlbnRUcmFja10gcmVnaXN0ZXIgaGVybyBjb21wb25lbnQnO1xuY29uc3QgQUNUSU9OX1NFVF9IRVJPX0NPTVBPTkVOVF9UVEkgPSAnW0V2ZW50VHJhY2tdIHNldCBoZXJvIGNvbXBvbmVudCBUVEknO1xuY29uc3QgQUNUSU9OX1JFU0VUID0gJ1tFdmVudFRyYWNrXSByZXNldCc7XG5cbi8qKlxuICogVGhlIHBheWxvYWQgZm9yIHNldHRpbmcgVFRJIGZvciBhIGhlcm8gY29tcG9uZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0SGVyb0NvbXBvbmVudFRUSVBheWxvYWQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGhlcm8gY29tcG9uZW50XG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVFRJIG1lYXN1cmUgZm9yIHRoZSBoZXJvIGNvbXBvbmVudFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAtLSBuYW1pbmcgY29udmVudGlvbiBpbXBvc2VkIGJ5IExpZ2h0aG91c2VcbiAgVFRJOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgQVBJIGVuZHBvaW50cyB1c2VkIGluIHRoZSBIZXJvIGNvbXBvbmVudCBhbmQgaXQncyBzdWJjb21wb25lbnRzXG4gICAqIFRoZXNlIGFyZSB0aGUgQVBJJ3MgaW52b2tlZCB3aGVuIHRoZSBUVEkgaXMgbWVhc3VyZWRcbiAgICovXG4gIGludm9sdmVkQXBpRW5kcG9pbnRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIGN1cnJlbnQgc3RvcmUgb2JqZWN0IGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIG5ldyBvbmVcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV2ZW50VHJhY2sgPSBjcmVhdGVBY3Rpb24oQUNUSU9OX1NFVCwgcHJvcHM8eyBtb2RlbDogRXZlbnRUcmFja1N0YXRlIH0+KCkpO1xuXG4vKipcbiAqIENoYW5nZSBhIHBhcnQgb3IgdGhlIHdob2xlIG9iamVjdCBpbiB0aGUgc3RvcmUuXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVFdmVudFRyYWNrID0gY3JlYXRlQWN0aW9uKEFDVElPTl9VUERBVEUsIHByb3BzPFBhcnRpYWw8eyBtb2RlbDogRXZlbnRUcmFja1N0YXRlIH0+PigpKTtcblxuLyoqXG4gKiBDbGVhciB0aGUgd2hvbGUgc3RhdGUsIHJldHVybiB0byB0aGUgaW5pdGlhbCBvbmVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0RXZlbnRUcmFjayA9IGNyZWF0ZUFjdGlvbihBQ1RJT05fUkVTRVQpO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGhlcm8gY29tcG9uZW50IGluIHRoZSBzdG9yZVxuICovXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJIZXJvQ29tcG9uZW50ID0gY3JlYXRlQWN0aW9uKEFDVElPTl9SRUdJU1RFUl9IRVJPX0NPTVBPTkVOVCwgcHJvcHM8eyBtb2RlbDogUmVnaXN0ZXJIZXJvQ29tcG9uZW50UGF5bG9hZCB9PigpKTtcblxuLyoqXG4gKiBTZXQgdGhlIFRUSSBtZWFzdXJlIGZvciBhIGhlcm8gY29tcG9uZW50IGluIHRoZSBzdG9yZVxuICovXG5leHBvcnQgY29uc3Qgc2V0SGVyb0NvbXBvbmVudFRUSSA9IGNyZWF0ZUFjdGlvbihBQ1RJT05fU0VUX0hFUk9fQ09NUE9ORU5UX1RUSSwgcHJvcHM8eyBtb2RlbDogU2V0SGVyb0NvbXBvbmVudFRUSVBheWxvYWQgfT4oKSk7XG4iXX0=
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, NgModule, } from '@angular/core';
|
|
2
|
-
import { StoreModule, } from '@ngrx/store';
|
|
3
|
-
import { eventTrackReducer, } from './event-track.reducer';
|
|
4
|
-
import { EVENT_TRACK_STORE_NAME, } from './event-track.state';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@ngrx/store";
|
|
7
|
-
/** Token of the EventTrack reducer */
|
|
8
|
-
export const EVENT_TRACK_REDUCER_TOKEN = new InjectionToken('Feature EventTrack Reducer');
|
|
9
|
-
/** Provide default reducer for EventTrack store */
|
|
10
|
-
export function getDefaultEventTrackReducer() {
|
|
11
|
-
return eventTrackReducer;
|
|
12
|
-
}
|
|
13
|
-
export class EventTrackStoreModule {
|
|
14
|
-
static forRoot(reducerFactory) {
|
|
15
|
-
return {
|
|
16
|
-
ngModule: EventTrackStoreModule,
|
|
17
|
-
providers: [
|
|
18
|
-
{ provide: EVENT_TRACK_REDUCER_TOKEN, useFactory: reducerFactory }
|
|
19
|
-
]
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventTrackStoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
23
|
-
/** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: EventTrackStoreModule, imports: [i1.StoreFeatureModule] }); }
|
|
24
|
-
/** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventTrackStoreModule, providers: [
|
|
25
|
-
{ provide: EVENT_TRACK_REDUCER_TOKEN, useFactory: getDefaultEventTrackReducer }
|
|
26
|
-
], imports: [StoreModule.forFeature(EVENT_TRACK_STORE_NAME, EVENT_TRACK_REDUCER_TOKEN)] }); }
|
|
27
|
-
}
|
|
28
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventTrackStoreModule, decorators: [{
|
|
29
|
-
type: NgModule,
|
|
30
|
-
args: [{
|
|
31
|
-
imports: [
|
|
32
|
-
StoreModule.forFeature(EVENT_TRACK_STORE_NAME, EVENT_TRACK_REDUCER_TOKEN)
|
|
33
|
-
],
|
|
34
|
-
providers: [
|
|
35
|
-
{ provide: EVENT_TRACK_REDUCER_TOKEN, useFactory: getDefaultEventTrackReducer }
|
|
36
|
-
]
|
|
37
|
-
}]
|
|
38
|
-
}] });
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtdHJhY2subW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N0b3Jlcy9ldmVudC10cmFjay9ldmVudC10cmFjay5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGNBQWMsRUFFZCxRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLFdBQVcsR0FDWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsaUJBQWlCLEdBQ2xCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLHNCQUFzQixHQUV2QixNQUFNLHFCQUFxQixDQUFDOzs7QUFFN0Isc0NBQXNDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLElBQUksY0FBYyxDQUF5Qyw0QkFBNEIsQ0FBQyxDQUFDO0FBRWxJLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsMkJBQTJCO0lBQ3pDLE9BQU8saUJBQWlCLENBQUM7QUFDM0IsQ0FBQztBQVVELE1BQU0sT0FBTyxxQkFBcUI7SUFDekIsTUFBTSxDQUFDLE9BQU8sQ0FBNEIsY0FBOEM7UUFDN0YsT0FBTztZQUNMLFFBQVEsRUFBRSxxQkFBcUI7WUFDL0IsU0FBUyxFQUFFO2dCQUNULEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUU7YUFDbkU7U0FDRixDQUFDO0lBQ0osQ0FBQztrSUFSVSxxQkFBcUI7bUlBQXJCLHFCQUFxQjttSUFBckIscUJBQXFCLGFBSnJCO1lBQ1QsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsVUFBVSxFQUFFLDJCQUEyQixFQUFFO1NBQ2hGLFlBSkMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSx5QkFBeUIsQ0FBQzs7NEZBTWhFLHFCQUFxQjtrQkFSakMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsV0FBVyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSx5QkFBeUIsQ0FBQztxQkFDMUU7b0JBQ0QsU0FBUyxFQUFFO3dCQUNULEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFVBQVUsRUFBRSwyQkFBMkIsRUFBRTtxQkFDaEY7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3Rpb25Ub2tlbixcbiAgTW9kdWxlV2l0aFByb3ZpZGVycyxcbiAgTmdNb2R1bGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aW9uLFxuICBBY3Rpb25SZWR1Y2VyLFxuICBTdG9yZU1vZHVsZSxcbn0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgZXZlbnRUcmFja1JlZHVjZXIsXG59IGZyb20gJy4vZXZlbnQtdHJhY2sucmVkdWNlcic7XG5pbXBvcnQge1xuICBFVkVOVF9UUkFDS19TVE9SRV9OQU1FLFxuICBFdmVudFRyYWNrU3RhdGUsXG59IGZyb20gJy4vZXZlbnQtdHJhY2suc3RhdGUnO1xuXG4vKiogVG9rZW4gb2YgdGhlIEV2ZW50VHJhY2sgcmVkdWNlciAqL1xuZXhwb3J0IGNvbnN0IEVWRU5UX1RSQUNLX1JFRFVDRVJfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48QWN0aW9uUmVkdWNlcjxFdmVudFRyYWNrU3RhdGUsIEFjdGlvbj4+KCdGZWF0dXJlIEV2ZW50VHJhY2sgUmVkdWNlcicpO1xuXG4vKiogUHJvdmlkZSBkZWZhdWx0IHJlZHVjZXIgZm9yIEV2ZW50VHJhY2sgc3RvcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0RXZlbnRUcmFja1JlZHVjZXIoKSB7XG4gIHJldHVybiBldmVudFRyYWNrUmVkdWNlcjtcbn1cblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIFN0b3JlTW9kdWxlLmZvckZlYXR1cmUoRVZFTlRfVFJBQ0tfU1RPUkVfTkFNRSwgRVZFTlRfVFJBQ0tfUkVEVUNFUl9UT0tFTilcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBFVkVOVF9UUkFDS19SRURVQ0VSX1RPS0VOLCB1c2VGYWN0b3J5OiBnZXREZWZhdWx0RXZlbnRUcmFja1JlZHVjZXIgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEV2ZW50VHJhY2tTdG9yZU1vZHVsZSB7XG4gIHB1YmxpYyBzdGF0aWMgZm9yUm9vdDxUIGV4dGVuZHMgRXZlbnRUcmFja1N0YXRlPihyZWR1Y2VyRmFjdG9yeTogKCkgPT4gQWN0aW9uUmVkdWNlcjxULCBBY3Rpb24+KTogTW9kdWxlV2l0aFByb3ZpZGVyczxFdmVudFRyYWNrU3RvcmVNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IEV2ZW50VHJhY2tTdG9yZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IEVWRU5UX1RSQUNLX1JFRFVDRVJfVE9LRU4sIHVzZUZhY3Rvcnk6IHJlZHVjZXJGYWN0b3J5IH1cbiAgICAgIF1cbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { createReducer, on, } from '@ngrx/store';
|
|
2
|
-
import * as actions from './event-track.actions';
|
|
3
|
-
/** The initial value of the Hero component */
|
|
4
|
-
export const heroComponentInitialState = { id: '', TTI: 0, involvedApiEndpoints: [] };
|
|
5
|
-
/**
|
|
6
|
-
* eventTrack initial state
|
|
7
|
-
*/
|
|
8
|
-
export const eventTrackInitialState = {
|
|
9
|
-
heroComponent: heroComponentInitialState,
|
|
10
|
-
isTTIComputed: false
|
|
11
|
-
};
|
|
12
|
-
/**
|
|
13
|
-
* Return all the involved API endpoints present in the component including its child & subchild
|
|
14
|
-
* Iterate recursively till the component with no children
|
|
15
|
-
* @param component
|
|
16
|
-
* @returns string[]
|
|
17
|
-
*/
|
|
18
|
-
function getComponentInvolvedEndPoints(component) {
|
|
19
|
-
return Array.from((component.children || []).reduce((accum, value) => {
|
|
20
|
-
getComponentInvolvedEndPoints(value).forEach((item) => accum.add(item));
|
|
21
|
-
return accum;
|
|
22
|
-
}, new Set(component.involvedApiEndpoints)));
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Get all the involved API endpoints of the heroComponent with maximum TTI value
|
|
26
|
-
* If the parent contains max TTI, then all its child & subchild end points are used
|
|
27
|
-
* otherwise only component with max TTI end points are used
|
|
28
|
-
* @param component
|
|
29
|
-
* @param maxTTI
|
|
30
|
-
* @returns string[]
|
|
31
|
-
*/
|
|
32
|
-
function getInvolvedAPIEndpoints(component, maxTTI) {
|
|
33
|
-
if (component.componentTTI === maxTTI) {
|
|
34
|
-
return getComponentInvolvedEndPoints(component);
|
|
35
|
-
}
|
|
36
|
-
return Array.from((component.children || []).reduce((accum, value) => {
|
|
37
|
-
getInvolvedAPIEndpoints(value, maxTTI).forEach((endpoint) => accum.add(endpoint));
|
|
38
|
-
return accum;
|
|
39
|
-
}, new Set()));
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Recursively iterate the page hierarchy
|
|
43
|
-
* and set the TTI for the specified component
|
|
44
|
-
* and compute the TTI for the corresponding parent
|
|
45
|
-
* @param component the parent component/page
|
|
46
|
-
* @param id the identifier of the component/page
|
|
47
|
-
* @param value the TTI value
|
|
48
|
-
* @param endpoints API URLs of the component
|
|
49
|
-
* @returns HeroComponent
|
|
50
|
-
*/
|
|
51
|
-
function computeTTI(component, id, value, endpoints = []) {
|
|
52
|
-
const computedComponent = { ...component };
|
|
53
|
-
if (computedComponent.id === id) {
|
|
54
|
-
computedComponent.TTI = value;
|
|
55
|
-
computedComponent.hasBeenLogged = true;
|
|
56
|
-
computedComponent.involvedApiEndpoints = endpoints;
|
|
57
|
-
computedComponent.componentTTI = value;
|
|
58
|
-
}
|
|
59
|
-
else if (computedComponent.children) {
|
|
60
|
-
computedComponent.children = computedComponent.children.map((child) => computeTTI(child, id, value, endpoints));
|
|
61
|
-
}
|
|
62
|
-
// Compute the TTI of the current component comparing the child TTI measures
|
|
63
|
-
if (computedComponent.children && computedComponent.children.length > 0) {
|
|
64
|
-
const maxChildTTI = Math.max(...computedComponent.children.map((child) => child.TTI));
|
|
65
|
-
computedComponent.TTI = Math.max(maxChildTTI, computedComponent.TTI);
|
|
66
|
-
}
|
|
67
|
-
return computedComponent;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Check if the TTI for the page is computed
|
|
71
|
-
* @param component the parent component/page
|
|
72
|
-
* @returns boolean
|
|
73
|
-
*/
|
|
74
|
-
function isTTIComputed(component) {
|
|
75
|
-
if (component.measureSelf && !component.hasBeenLogged) {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
return component.children && component.children.length > 0 ? component.children.every((child) => isTTIComputed(child)) : component.TTI > 0;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* List of basic actions for EventTrack
|
|
82
|
-
*/
|
|
83
|
-
export const eventTrackReducerFeatures = [
|
|
84
|
-
on(actions.setEventTrack, (_state, payload) => ({ ...payload.model })),
|
|
85
|
-
on(actions.updateEventTrack, (state, payload) => ({ ...state, ...payload.model })),
|
|
86
|
-
on(actions.resetEventTrack, () => eventTrackInitialState),
|
|
87
|
-
on(actions.registerHeroComponent, (state, payload) => ({ ...state, heroComponent: { ...payload.model, TTI: 0 } })),
|
|
88
|
-
on(actions.setHeroComponentTTI, (state, payload) => {
|
|
89
|
-
const updatedHeroComponent = computeTTI(state.heroComponent, payload.model.id, payload.model.TTI, payload.model.involvedApiEndpoints);
|
|
90
|
-
const isComputed = isTTIComputed(updatedHeroComponent);
|
|
91
|
-
if (isComputed) {
|
|
92
|
-
updatedHeroComponent.involvedApiEndpoints = getInvolvedAPIEndpoints(updatedHeroComponent, updatedHeroComponent.TTI) || [];
|
|
93
|
-
}
|
|
94
|
-
return { ...state, heroComponent: updatedHeroComponent, isTTIComputed: isComputed };
|
|
95
|
-
})
|
|
96
|
-
];
|
|
97
|
-
/**
|
|
98
|
-
* EventTrack Store default reducer
|
|
99
|
-
*/
|
|
100
|
-
export const eventTrackReducer = createReducer(eventTrackInitialState, ...eventTrackReducerFeatures);
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtdHJhY2sucmVkdWNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdG9yZXMvZXZlbnQtdHJhY2svZXZlbnQtdHJhY2sucmVkdWNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsYUFBYSxFQUNiLEVBQUUsR0FFSCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBTWpELDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBa0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFFckc7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBb0I7SUFDckQsYUFBYSxFQUFFLHlCQUF5QjtJQUN4QyxhQUFhLEVBQUUsS0FBSztDQUNyQixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxTQUFTLDZCQUE2QixDQUFDLFNBQXdCO0lBQzdELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FDZixDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ2pELDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFTLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQ3BELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsdUJBQXVCLENBQUMsU0FBd0IsRUFBRSxNQUFjO0lBQ3ZFLElBQUksU0FBUyxDQUFDLFlB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QUN0QixHQUFHLHlCQUF5QixDQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWN0aW9uQ3JlYXRvcixcbiAgY3JlYXRlUmVkdWNlcixcbiAgb24sXG4gIFJlZHVjZXJUeXBlcyxcbn0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICcuL2V2ZW50LXRyYWNrLmFjdGlvbnMnO1xuaW1wb3J0IHtcbiAgRXZlbnRUcmFja1N0YXRlLFxuICBIZXJvQ29tcG9uZW50LFxufSBmcm9tICcuL2V2ZW50LXRyYWNrLnN0YXRlJztcblxuLyoqIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBIZXJvIGNvbXBvbmVudCAqL1xuZXhwb3J0IGNvbnN0IGhlcm9Db21wb25lbnRJbml0aWFsU3RhdGU6IEhlcm9Db21wb25lbnQgPSB7IGlkOiAnJywgVFRJOiAwLCBpbnZvbHZlZEFwaUVuZHBvaW50czogW10gfTtcblxuLyoqXG4gKiBldmVudFRyYWNrIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGV2ZW50VHJhY2tJbml0aWFsU3RhdGU6IEV2ZW50VHJhY2tTdGF0ZSA9IHtcbiAgaGVyb0NvbXBvbmVudDogaGVyb0NvbXBvbmVudEluaXRpYWxTdGF0ZSxcbiAgaXNUVElDb21wdXRlZDogZmFsc2Vcbn07XG5cbi8qKlxuICogUmV0dXJuIGFsbCB0aGUgaW52b2x2ZWQgQVBJIGVuZHBvaW50cyBwcmVzZW50IGluIHRoZSBjb21wb25lbnQgaW5jbHVkaW5nIGl0cyBjaGlsZCAmIHN1YmNoaWxkXG4gKiBJdGVyYXRlIHJlY3Vyc2l2ZWx5IHRpbGwgdGhlIGNvbXBvbmVudCB3aXRoIG5vIGNoaWxkcmVuXG4gKiBAcGFyYW0gY29tcG9uZW50XG4gKiBAcmV0dXJucyBzdHJpbmdbXVxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnRJbnZvbHZlZEVuZFBvaW50cyhjb21wb25lbnQ6IEhlcm9Db21wb25lbnQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIChjb21wb25lbnQuY2hpbGRyZW4gfHwgW10pLnJlZHVjZSgoYWNjdW0sIHZhbHVlKSA9PiB7XG4gICAgICBnZXRDb21wb25lbnRJbnZvbHZlZEVuZFBvaW50cyh2YWx1ZSkuZm9yRWFjaCgoaXRlbSkgPT4gYWNjdW0uYWRkKGl0ZW0pKTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBuZXcgU2V0PHN0cmluZz4oY29tcG9uZW50Lmludm9sdmVkQXBpRW5kcG9pbnRzKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBHZXQgYWxsIHRoZSBpbnZvbHZlZCBBUEkgZW5kcG9pbnRzIG9mIHRoZSBoZXJvQ29tcG9uZW50IHdpdGggbWF4aW11bSBUVEkgdmFsdWVcbiAqIElmIHRoZSBwYXJlbnQgY29udGFpbnMgbWF4IFRUSSwgdGhlbiBhbGwgaXRzIGNoaWxkICYgc3ViY2hpbGQgZW5kIHBvaW50cyBhcmUgdXNlZFxuICogb3RoZXJ3aXNlIG9ubHkgY29tcG9uZW50IHdpdGggbWF4IFRUSSBlbmQgcG9pbnRzIGFyZSB1c2VkXG4gKiBAcGFyYW0gY29tcG9uZW50XG4gKiBAcGFyYW0gbWF4VFRJXG4gKiBAcmV0dXJucyBzdHJpbmdbXVxuICovXG5mdW5jdGlvbiBnZXRJbnZvbHZlZEFQSUVuZHBvaW50cyhjb21wb25lbnQ6IEhlcm9Db21wb25lbnQsIG1heFRUSTogbnVtYmVyKTogc3RyaW5nW10ge1xuICBpZiAoY29tcG9uZW50LmNvbXBvbmVudFRUSSA9PT0gbWF4VFRJKSB7XG4gICAgcmV0dXJuIGdldENvbXBvbmVudEludm9sdmVkRW5kUG9pbnRzKGNvbXBvbmVudCk7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgKGNvbXBvbmVudC5jaGlsZHJlbiB8fCBbXSkucmVkdWNlKChhY2N1bSwgdmFsdWUpID0+IHtcbiAgICAgIGdldEludm9sdmVkQVBJRW5kcG9pbnRzKHZhbHVlLCBtYXhUVEkpLmZvckVhY2goKGVuZHBvaW50KSA9PiBhY2N1bS5hZGQoZW5kcG9pbnQpKTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBuZXcgU2V0PHN0cmluZz4oKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBpdGVyYXRlIHRoZSBwYWdlIGhpZXJhcmNoeVxuICogYW5kIHNldCB0aGUgVFRJIGZvciB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudFxuICogYW5kIGNvbXB1dGUgdGhlIFRUSSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGFyZW50XG4gKiBAcGFyYW0gY29tcG9uZW50IHRoZSBwYXJlbnQgY29tcG9uZW50L3BhZ2VcbiAqIEBwYXJhbSBpZCB0aGUgaWRlbnRpZmllciBvZiB0aGUgY29tcG9uZW50L3BhZ2VcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgVFRJIHZhbHVlXG4gKiBAcGFyYW0gZW5kcG9pbnRzIEFQSSBVUkxzIG9mIHRoZSBjb21wb25lbnRcbiAqIEByZXR1cm5zIEhlcm9Db21wb25lbnRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVRUSShjb21wb25lbnQ6IEhlcm9Db21wb25lbnQsIGlkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIsIGVuZHBvaW50czogc3RyaW5nW10gPSBbXSk6IEhlcm9Db21wb25lbnQge1xuICBjb25zdCBjb21wdXRlZENvbXBvbmVudCA9IHsgLi4uY29tcG9uZW50IH07XG4gIGlmIChjb21wdXRlZENvbXBvbmVudC5pZCA9PT0gaWQpIHtcbiAgICBjb21wdXRlZENvbXBvbmVudC5UVEkgPSB2YWx1ZTtcbiAgICBjb21wdXRlZENvbXBvbmVudC5oYXNCZWVuTG9nZ2VkID0gdHJ1ZTtcbiAgICBjb21wdXRlZENvbXBvbmVudC5pbnZvbHZlZEFwaUVuZHBvaW50cyA9IGVuZHBvaW50cztcbiAgICBjb21wdXRlZENvbXBvbmVudC5jb21wb25lbnRUVEkgPSB2YWx1ZTtcbiAgfSBlbHNlIGlmIChjb21wdXRlZENvbXBvbmVudC5jaGlsZHJlbikge1xuICAgIGNvbXB1dGVkQ29tcG9uZW50LmNoaWxkcmVuID0gY29tcHV0ZWRDb21wb25lbnQuY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gY29tcHV0ZVRUSShjaGlsZCwgaWQsIHZhbHVlLCBlbmRwb2ludHMpKTtcbiAgfVxuICAvLyBDb21wdXRlIHRoZSBUVEkgb2YgdGhlIGN1cnJlbnQgY29tcG9uZW50IGNvbXBhcmluZyB0aGUgY2hpbGQgVFRJIG1lYXN1cmVzXG4gIGlmIChjb21wdXRlZENvbXBvbmVudC5jaGlsZHJlbiAmJiBjb21wdXRlZENvbXBvbmVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbWF4Q2hpbGRUVEkgPSBNYXRoLm1heCguLi5jb21wdXRlZENvbXBvbmVudC5jaGlsZHJlbi5tYXAoKGNoaWxkOiBIZXJvQ29tcG9uZW50KSA9PiBjaGlsZC5UVEkpKTtcbiAgICBjb21wdXRlZENvbXBvbmVudC5UVEkgPSBNYXRoLm1heChtYXhDaGlsZFRUSSwgY29tcHV0ZWRDb21wb25lbnQuVFRJKTtcbiAgfVxuICByZXR1cm4gY29tcHV0ZWRDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIFRUSSBmb3IgdGhlIHBhZ2UgaXMgY29tcHV0ZWRcbiAqIEBwYXJhbSBjb21wb25lbnQgdGhlIHBhcmVudCBjb21wb25lbnQvcGFnZVxuICogQHJldHVybnMgYm9vbGVhblxuICovXG5mdW5jdGlvbiBpc1RUSUNvbXB1dGVkKGNvbXBvbmVudDogSGVyb0NvbXBvbmVudCk6IGJvb2xlYW4ge1xuICBpZiAoY29tcG9uZW50Lm1lYXN1cmVTZWxmICYmICFjb21wb25lbnQuaGFzQmVlbkxvZ2dlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gY29tcG9uZW50LmNoaWxkcmVuICYmIGNvbXBvbmVudC5jaGlsZHJlbi5sZW5ndGggPiAwID8gY29tcG9uZW50LmNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gaXNUVElDb21wdXRlZChjaGlsZCkpIDogY29tcG9uZW50LlRUSSA+IDA7XG59XG5cbi8qKlxuICogTGlzdCBvZiBiYXNpYyBhY3Rpb25zIGZvciBFdmVudFRyYWNrXG4gKi9cbmV4cG9ydCBjb25zdCBldmVudFRyYWNrUmVkdWNlckZlYXR1cmVzOiBSZWR1Y2VyVHlwZXM8RXZlbnRUcmFja1N0YXRlLCBBY3Rpb25DcmVhdG9yW10+W10gPSBbXG4gIG9uKGFjdGlvbnMuc2V0RXZlbnRUcmFjaywgKF9zdGF0ZSwgcGF5bG9hZCkgPT4gKHsgLi4ucGF5bG9hZC5tb2RlbCB9KSksXG5cbiAgb24oYWN0aW9ucy51cGRhdGVFdmVudFRyYWNrLCAoc3RhdGUsIHBheWxvYWQpID0+ICh7IC4uLnN0YXRlLCAuLi5wYXlsb2FkLm1vZGVsIH0pKSxcblxuICBvbihhY3Rpb25zLnJlc2V0RXZlbnRUcmFjaywgKCkgPT4gZXZlbnRUcmFja0luaXRpYWxTdGF0ZSksXG5cbiAgb24oYWN0aW9ucy5yZWdpc3Rlckhlcm9Db21wb25lbnQsIChzdGF0ZSwgcGF5bG9hZCkgPT4gKHsgLi4uc3RhdGUsIGhlcm9Db21wb25lbnQ6IHsgLi4ucGF5bG9hZC5tb2RlbCwgVFRJOiAwIH0gfSkpLFxuXG4gIG9uKGFjdGlvbnMuc2V0SGVyb0NvbXBvbmVudFRUSSwgKHN0YXRlLCBwYXlsb2FkKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZEhlcm9Db21wb25lbnQgPSBjb21wdXRlVFRJKHN0YXRlLmhlcm9Db21wb25lbnQsIHBheWxvYWQubW9kZWwuaWQsIHBheWxvYWQubW9kZWwuVFRJLCBwYXlsb2FkLm1vZGVsLmludm9sdmVkQXBpRW5kcG9pbnRzKTtcbiAgICBjb25zdCBpc0NvbXB1dGVkID0gaXNUVElDb21wdXRlZCh1cGRhdGVkSGVyb0NvbXBvbmVudCk7XG4gICAgaWYgKGlzQ29tcHV0ZWQpIHtcbiAgICAgIHVwZGF0ZWRIZXJvQ29tcG9uZW50Lmludm9sdmVkQXBpRW5kcG9pbnRzID0gZ2V0SW52b2x2ZWRBUElFbmRwb2ludHModXBkYXRlZEhlcm9Db21wb25lbnQsIHVwZGF0ZWRIZXJvQ29tcG9uZW50LlRUSSkgfHwgW107XG4gICAgfVxuICAgIHJldHVybiB7IC4uLnN0YXRlLCBoZXJvQ29tcG9uZW50OiB1cGRhdGVkSGVyb0NvbXBvbmVudCwgaXNUVElDb21wdXRlZDogaXNDb21wdXRlZCB9O1xuICB9KVxuXTtcblxuLyoqXG4gKiBFdmVudFRyYWNrIFN0b3JlIGRlZmF1bHQgcmVkdWNlclxuICovXG5leHBvcnQgY29uc3QgZXZlbnRUcmFja1JlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKFxuICBldmVudFRyYWNrSW5pdGlhbFN0YXRlLFxuICAuLi5ldmVudFRyYWNrUmVkdWNlckZlYXR1cmVzXG4pO1xuIl19
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { createFeatureSelector, createSelector, } from '@ngrx/store';
|
|
2
|
-
import { EVENT_TRACK_STORE_NAME, } from './event-track.state';
|
|
3
|
-
/** Select EventTrack State */
|
|
4
|
-
export const selectEventTrackState = createFeatureSelector(EVENT_TRACK_STORE_NAME);
|
|
5
|
-
/** Select hero component status */
|
|
6
|
-
export const selectHeroComponentStatus = createSelector(selectEventTrackState, (state) => (state.isTTIComputed ? state.heroComponent.TTI : undefined));
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtdHJhY2suc2VsZWN0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N0b3Jlcy9ldmVudC10cmFjay9ldmVudC10cmFjay5zZWxlY3RvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixjQUFjLEdBQ2YsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLHNCQUFzQixHQUV2QixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLDhCQUE4QjtBQUM5QixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBa0Isc0JBQXNCLENBQUMsQ0FBQztBQUVwRyxtQ0FBbUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxFQUFzQixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZUZlYXR1cmVTZWxlY3RvcixcbiAgY3JlYXRlU2VsZWN0b3IsXG59IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7XG4gIEVWRU5UX1RSQUNLX1NUT1JFX05BTUUsXG4gIEV2ZW50VHJhY2tTdGF0ZSxcbn0gZnJvbSAnLi9ldmVudC10cmFjay5zdGF0ZSc7XG5cbi8qKiBTZWxlY3QgRXZlbnRUcmFjayBTdGF0ZSAqL1xuZXhwb3J0IGNvbnN0IHNlbGVjdEV2ZW50VHJhY2tTdGF0ZSA9IGNyZWF0ZUZlYXR1cmVTZWxlY3RvcjxFdmVudFRyYWNrU3RhdGU+KEVWRU5UX1RSQUNLX1NUT1JFX05BTUUpO1xuXG4vKiogU2VsZWN0IGhlcm8gY29tcG9uZW50IHN0YXR1cyAqL1xuZXhwb3J0IGNvbnN0IHNlbGVjdEhlcm9Db21wb25lbnRTdGF0dXMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFdmVudFRyYWNrU3RhdGUsIChzdGF0ZSk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiAoc3RhdGUuaXNUVElDb21wdXRlZCA/IHN0YXRlLmhlcm9Db21wb25lbnQuVFRJIDogdW5kZWZpbmVkKSk7XG4iXX0=
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Name of the EventTrack Store
|
|
3
|
-
*/
|
|
4
|
-
export const EVENT_TRACK_STORE_NAME = 'eventTrack';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtdHJhY2suc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3RvcmVzL2V2ZW50LXRyYWNrL2V2ZW50LXRyYWNrLnN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTREQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgSGVybyBjb21wb25lbnQsIHdoaWNoIGRldGVybWluZXMgdGhlIFRpbWUgVG8gSW50ZXJhY3RpdmUgKFRUSSkgZm9yIGEgcGFnZVxuICogSXQgZm9sbG93cyBhIFRyZWUgZGF0YSBzdHJ1Y3R1cmUsIHdpdGggdGhlIHJvb3Qgbm9kZSBhcyB0aGUgUGFnZSBhbmQgdGhlIGhlcm8gY29tcG9uZW50cyBhc1xuICogaXRzIGNoaWxkcmVuLiBFYWNoIGNoaWxkIGNhbiBoYXZlIGl0cyBvd24gaGVybyBjb21wb25lbnRzLiBUaGUgVFRJIGZvciB0aGUgcGFnZVxuICogd291bGQgYmUgY29tcHV0ZWQgdXNpbmcgYSBib3R0b20tdXAgYXBwcm9hY2ggc3RhcnRpbmcgZnJvbSB0aGUgY2hpbGRyZW4gYXQgdGhlIGJvdHRvbSAobGVhZiBub2RlcykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVyb0NvbXBvbmVudCBleHRlbmRzIFJlZ2lzdGVySGVyb0NvbXBvbmVudFBheWxvYWQge1xuICAvKiogVGhlIFRpbWUgVG8gSW50ZXJhY3RpdmUoVFRJKSBtZWFzdXJlIGZvciB0aGUgY29tcG9uZW50ICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gLS0gbmFtaW5nIGNvbnZlbnRpb24gaW1wb3NlZCBieSBMaWdodGhvdXNlXG4gIFRUSTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIHRvIGluZGljYXRlIGlmIHRoZSBUVEkgZm9yIHRoZSBjb21wb25lbnRcbiAgICogaGFzIGJlZW4gZXhwbGljaXRseSBtZWFzdXJlZCBhbmQgbG9nZ2VkXG4gICAqL1xuICBoYXNCZWVuTG9nZ2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGlzdCBvZiBBUEkgZW5kcG9pbnRzIHVzZWQgaW4gdGhlIEhlcm8gY29tcG9uZW50IGFuZCBpdCdzIHN1YmNvbXBvbmVudHNcbiAgICogVGhlc2UgYXJlIHRoZSBBUEkncyBpbnZva2VkIHdoZW4gdGhlIFRUSSBpcyBtZWFzdXJlZFxuICAgKi9cbiAgaW52b2x2ZWRBcGlFbmRwb2ludHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQWN0dWFsIFRUSSBtZWFzdXJlIG9mIHRoZSBjb21wb25lbnQsXG4gICAqIGRvZXNuJ3QgY2hhbmdlIHVwb24gaXQncyBjaGlsZHJlbiBNYXggVFRJIHZhbHVlXG4gICAqL1xuICBjb21wb25lbnRUVEk/OiBudW1iZXI7XG59XG5cbi8qKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgcmVnaXN0ZXIgaGVybyBjb21wb25lbnQgcGF5bG9hZCwgd2hpY2ggaXMgdXNlZCB0byByZWdpc3RlciBhIGhlcm8gY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJIZXJvQ29tcG9uZW50UGF5bG9hZCB7XG4gIC8qKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgaGVybyBjb21wb25lbnQgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEJvb2xlYW4gdG8gaW5kaWNhdGUgaWYgdGhlIFRUSSBjb21wdXRhdGlvbiBzaG91bGQgdGFrZSBpbnRvIGFjY291bnRcbiAgICogdGhlIFRUSSBvZiB0aGUgY29tcG9uZW50IGl0c2VsZiBpbiBhZGRpdGlvbiB0byB0aGF0IG9mIGl0cyBjaGlsZCBjb21wb25lbnRzXG4gICAqL1xuICBtZWFzdXJlU2VsZj86IGJvb2xlYW47XG4gIC8qKiBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIGNoaWxkcmVuIGhlcm8gY29tcG9uZW50cyAqL1xuICBjaGlsZHJlbj86IEhlcm9Db21wb25lbnRbXTtcbn1cblxuLyoqXG4gKiBFdmVudFRyYWNrIHN0b3JlIHN0YXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRUcmFja1N0YXRlIHtcbiAgLyoqIFRoZSBoZXJvIGNvbXBvbmVudCBmb3IgY29tcHV0aW5nIFRUSSAqL1xuICBoZXJvQ29tcG9uZW50OiBIZXJvQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIHRvIGluZGljYXRlIHRoZSBjb21wbGV0aW9uIG9mIFRUSSBjb21wdXRhdGlvblxuICAgKiBUVEkgZm9yIGEgaGVybyBjb21wb25lbnQgaXMgY29uc2lkZXJlZCB0byBiZSBjb21wdXRlZFxuICAgKiBvbmx5IHdoZW4gdGhlIFRUSSBvZiBhbGwgaXRzIGNoaWxkcmVuIGhhdmUgYmVlbiBjb21wdXRlZFxuICAgKiBlZzogZm9yIGEgY29tcG9uZW50IEEgaGF2aW5nIEIgYW5kIEMgYXMgY2hpbGRyZW4sIHRoaXMgdmFsdWVcbiAgICogaXMgc2V0IG9ubHkgd2hlbiBUVEkgZm9yIGFsbCBBLCBCIGFuZCBDIGhhdmUgYmVlbiBzZXRcbiAgICovXG4gIGlzVFRJQ29tcHV0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTmFtZSBvZiB0aGUgRXZlbnRUcmFjayBTdG9yZVxuICovXG5leHBvcnQgY29uc3QgRVZFTlRfVFJBQ0tfU1RPUkVfTkFNRSA9ICdldmVudFRyYWNrJztcblxuLyoqXG4gKiBFdmVudFRyYWNrIFN0b3JlIEludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50VHJhY2tTdG9yZSB7XG4gIC8qKiBFdmVudFRyYWNrIHN0YXRlICovXG4gIFtFVkVOVF9UUkFDS19TVE9SRV9OQU1FXTogRXZlbnRUcmFja1N0YXRlO1xufVxuIl19
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { eventTrackInitialState, } from './event-track.reducer';
|
|
2
|
-
export const eventTrackStorageSync = {
|
|
3
|
-
deserialize: (rawObject) => {
|
|
4
|
-
return rawObject ? rawObject : eventTrackInitialState;
|
|
5
|
-
}
|
|
6
|
-
};
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtdHJhY2suc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdG9yZXMvZXZlbnQtdHJhY2svZXZlbnQtdHJhY2suc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQ0wsc0JBQXNCLEdBQ3ZCLE1BQU0sdUJBQXVCLENBQUM7QUFLL0IsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQTBDO0lBQzFFLFdBQVcsRUFBRSxDQUFDLFNBQWMsRUFBRSxFQUFFO1FBQzlCLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUE0QixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQztJQUMzRSxDQUFDO0NBQ08sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgU2VyaWFsaXplcixcbn0gZnJvbSAnQG8zci9jb3JlJztcbmltcG9ydCB7XG4gIGV2ZW50VHJhY2tJbml0aWFsU3RhdGUsXG59IGZyb20gJy4vZXZlbnQtdHJhY2sucmVkdWNlcic7XG5pbXBvcnQge1xuICBFdmVudFRyYWNrU3RhdGUsXG59IGZyb20gJy4vZXZlbnQtdHJhY2suc3RhdGUnO1xuXG5leHBvcnQgY29uc3QgZXZlbnRUcmFja1N0b3JhZ2VTeW5jOiBSZWFkb25seTxTZXJpYWxpemVyPEV2ZW50VHJhY2tTdGF0ZT4+ID0ge1xuICBkZXNlcmlhbGl6ZTogKHJhd09iamVjdDogYW55KSA9PiB7XG4gICAgcmV0dXJuIHJhd09iamVjdCA/IHJhd09iamVjdCBhcyBFdmVudFRyYWNrU3RhdGUgOiBldmVudFRyYWNrSW5pdGlhbFN0YXRlO1xuICB9XG59IGFzIGNvbnN0O1xuIl19
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export * from './event-track.actions';
|
|
2
|
-
export * from './event-track.module';
|
|
3
|
-
export * from './event-track.reducer';
|
|
4
|
-
export * from './event-track.selectors';
|
|
5
|
-
export * from './event-track.state';
|
|
6
|
-
export * from './event-track.sync';
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3RvcmVzL2V2ZW50LXRyYWNrL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ldmVudC10cmFjay5hY3Rpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnQtdHJhY2subW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnQtdHJhY2sucmVkdWNlcic7XG5leHBvcnQgKiBmcm9tICcuL2V2ZW50LXRyYWNrLnNlbGVjdG9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2V2ZW50LXRyYWNrLnN0YXRlJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnQtdHJhY2suc3luYyc7XG4iXX0=
|
package/esm2022/stores/index.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export * from './event-track/index';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2V2ZW50LXRyYWNrL2luZGV4JztcbiJdfQ==
|