@kolektor/nucleus-notifications 0.0.12-pre.7931 → 0.1.130-pre.1
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/README.md +7 -0
- package/esm2022/index.mjs +4 -0
- package/esm2022/kolektor-nucleus-notifications.mjs +5 -0
- package/esm2022/lib/models.mjs +23 -0
- package/esm2022/lib/nucleus-notifications.module.mjs +23 -0
- package/esm2022/lib/nucleus-notifications.service.mjs +387 -0
- package/{fesm2020 → fesm2022}/kolektor-nucleus-notifications.mjs +414 -389
- package/fesm2022/kolektor-nucleus-notifications.mjs.map +1 -0
- package/index.d.ts +3 -5
- package/lib/models.d.ts +65 -65
- package/lib/nucleus-notifications.module.d.ts +9 -9
- package/lib/nucleus-notifications.service.d.ts +56 -56
- package/package.json +25 -31
- package/esm2020/kolektor-nucleus-notifications.mjs +0 -5
- package/esm2020/lib/models.mjs +0 -23
- package/esm2020/lib/nucleus-notifications.module.mjs +0 -25
- package/esm2020/lib/nucleus-notifications.service.mjs +0 -356
- package/esm2020/public-api.mjs +0 -7
- package/fesm2015/kolektor-nucleus-notifications.mjs +0 -412
- package/fesm2015/kolektor-nucleus-notifications.mjs.map +0 -1
- package/fesm2020/kolektor-nucleus-notifications.mjs.map +0 -1
- package/public-api.d.ts +0 -3
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { SwPush } from '@angular/service-worker';
|
|
4
|
-
import { PushNotifications } from '@capacitor/push-notifications';
|
|
5
|
-
import { NucleusAppService } from '@kolektor/nucleus-common';
|
|
6
|
-
import { of, Subject } from 'rxjs';
|
|
7
|
-
import { NucleusNotificationsConfig } from './models';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/common/http";
|
|
10
|
-
import * as i2 from "@angular/service-worker";
|
|
11
|
-
import * as i3 from "@kolektor/nucleus-common";
|
|
12
|
-
import * as i4 from "./models";
|
|
13
|
-
export class NucleusNotificationsService {
|
|
14
|
-
constructor(http, swPush, appService, config) {
|
|
15
|
-
this.http = http;
|
|
16
|
-
this.swPush = swPush;
|
|
17
|
-
this.appService = appService;
|
|
18
|
-
this.apiUrl = null;
|
|
19
|
-
this.registrationStorageKey = 'NucleusNotificationsRegistrationId';
|
|
20
|
-
this.notificationsStorageKey = 'NucleusNotificationsLocalCache';
|
|
21
|
-
this._isInitialized = false;
|
|
22
|
-
this._newNotifications = new Subject();
|
|
23
|
-
this._clicksSubject = new Subject();
|
|
24
|
-
this._stateChangesSubject = new Subject();
|
|
25
|
-
this.notifications = [];
|
|
26
|
-
let url = config.serverApiUrl;
|
|
27
|
-
if (!url.endsWith('/')) {
|
|
28
|
-
url += '/';
|
|
29
|
-
}
|
|
30
|
-
this.apiUrl = url;
|
|
31
|
-
}
|
|
32
|
-
get unreadCount() {
|
|
33
|
-
return this.notifications.filter(x => !x.isRead).length;
|
|
34
|
-
}
|
|
35
|
-
get newNotifications() {
|
|
36
|
-
return this._newNotifications.asObservable();
|
|
37
|
-
}
|
|
38
|
-
get clicks() {
|
|
39
|
-
return this._clicksSubject.asObservable();
|
|
40
|
-
}
|
|
41
|
-
get stateChanges() {
|
|
42
|
-
return this._stateChangesSubject.asObservable();
|
|
43
|
-
}
|
|
44
|
-
get isInitialized() {
|
|
45
|
-
return this._isInitialized;
|
|
46
|
-
}
|
|
47
|
-
async initialize() {
|
|
48
|
-
// make sure app service has finished initializing
|
|
49
|
-
await this.appService.init();
|
|
50
|
-
this.loadFromStorage();
|
|
51
|
-
if (this.appService.isNative) {
|
|
52
|
-
this._platform = this.appService.deviceInfo.platform;
|
|
53
|
-
await this.registerCapacitorEvents();
|
|
54
|
-
}
|
|
55
|
-
else if (this.swPush.isEnabled) {
|
|
56
|
-
this._platform = 'web';
|
|
57
|
-
this.registerWebPushEvents();
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
console.warn('Nucleus.Notifications: There is no push capability, timer will be used to update notifications');
|
|
61
|
-
setInterval(() => {
|
|
62
|
-
console.log('Updating notifications...');
|
|
63
|
-
this.refresh(true);
|
|
64
|
-
}, 5 * 60 * 1000);
|
|
65
|
-
}
|
|
66
|
-
this._isInitialized = true;
|
|
67
|
-
this.refresh();
|
|
68
|
-
}
|
|
69
|
-
register() {
|
|
70
|
-
return new Promise((_resolve, _reject) => {
|
|
71
|
-
this.getRegistrationInfo().then((info) => {
|
|
72
|
-
this.http.post(this.apiUrl + 'registration', info).subscribe((regResult) => {
|
|
73
|
-
window.localStorage.setItem(this.registrationStorageKey, regResult.id);
|
|
74
|
-
_resolve(null);
|
|
75
|
-
}, error => {
|
|
76
|
-
console.log('Nucleus.Notifications: Failed to send notification registration to server.', error);
|
|
77
|
-
_reject(error);
|
|
78
|
-
});
|
|
79
|
-
}).catch((error) => _reject(error));
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
unregister() {
|
|
83
|
-
return new Promise((_resolve, _reject) => {
|
|
84
|
-
this.getRegistrationInfo().then((info) => {
|
|
85
|
-
this.http.request('DELETE', this.apiUrl + 'registration', { body: info }).subscribe(() => {
|
|
86
|
-
window.localStorage.removeItem(this.registrationStorageKey);
|
|
87
|
-
_resolve(null);
|
|
88
|
-
}, error => {
|
|
89
|
-
console.log('Nucleus.Notifications: Failed to remove registration from server.', error);
|
|
90
|
-
_reject(error);
|
|
91
|
-
});
|
|
92
|
-
}).catch((error) => _reject(error));
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
refresh(notifyAboutNew = false) {
|
|
96
|
-
this.http.get(this.apiUrl + 'notifications').subscribe(res => {
|
|
97
|
-
this.updateNotifications(res, notifyAboutNew);
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
getNotification(id) {
|
|
101
|
-
const localNotification = this.notifications.find(x => x.id === id);
|
|
102
|
-
if (localNotification) {
|
|
103
|
-
return of(localNotification);
|
|
104
|
-
}
|
|
105
|
-
return this.http.get(this.apiUrl + 'notifications/' + id);
|
|
106
|
-
}
|
|
107
|
-
readNotification(id) {
|
|
108
|
-
const n = this.notifications.find(x => x.id === id);
|
|
109
|
-
if (n && !n.isRead) {
|
|
110
|
-
n.isRead = true;
|
|
111
|
-
this.notifyStateChanged();
|
|
112
|
-
}
|
|
113
|
-
this.http.get(this.apiUrl + 'notifications/read/' + id).subscribe();
|
|
114
|
-
}
|
|
115
|
-
dismissNotification(id) {
|
|
116
|
-
this.deleteNotificaton(id);
|
|
117
|
-
this.http.delete(this.apiUrl + 'notifications/' + id).subscribe();
|
|
118
|
-
this.removeDeliveredNotification(id);
|
|
119
|
-
}
|
|
120
|
-
dismissAll() {
|
|
121
|
-
this.notifications.splice(0);
|
|
122
|
-
this.notifyStateChanged();
|
|
123
|
-
this.http.delete(this.apiUrl + 'notifications/all').subscribe();
|
|
124
|
-
if (this._platform === 'ios' || this._platform === 'android') {
|
|
125
|
-
PushNotifications.removeAllDeliveredNotifications();
|
|
126
|
-
}
|
|
127
|
-
else if (this._platform === 'web') {
|
|
128
|
-
// TODO: remove all web push notifications
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
readAll() {
|
|
132
|
-
for (const n of this.notifications) {
|
|
133
|
-
n.isRead = true;
|
|
134
|
-
}
|
|
135
|
-
this.notifyStateChanged();
|
|
136
|
-
this.http.get(this.apiUrl + 'notifications/read/all').subscribe();
|
|
137
|
-
}
|
|
138
|
-
getChannelConfig(senderId, channelId, language = null) {
|
|
139
|
-
return this.http.get(this.apiUrl + `settings/channel/${senderId}/${channelId}?language=${language}`);
|
|
140
|
-
}
|
|
141
|
-
getChannelConfigsForSender(senderId, channelIds, language = null) {
|
|
142
|
-
const idsStr = channelIds.map(x => senderId + ',' + x).join(';');
|
|
143
|
-
return this.getChannelConfigsInternal(idsStr, language);
|
|
144
|
-
}
|
|
145
|
-
getChannelConfigs(ids, language = null) {
|
|
146
|
-
const idsStr = ids.map(x => x.senderId + ',' + x.channelId).join(';');
|
|
147
|
-
return this.getChannelConfigsInternal(idsStr, language);
|
|
148
|
-
}
|
|
149
|
-
setChannelConfig(senderId, config) {
|
|
150
|
-
return this.http.post(`${this.apiUrl}settings/channel/${senderId}`, config);
|
|
151
|
-
}
|
|
152
|
-
setChannelConfigs(configs) {
|
|
153
|
-
return this.http.post(`${this.apiUrl}settings/channels`, configs);
|
|
154
|
-
}
|
|
155
|
-
getChannelConfigsInternal(ids, language) {
|
|
156
|
-
return this.http.get(`${this.apiUrl}settings/channels?ids=${ids}&language=${language}`);
|
|
157
|
-
}
|
|
158
|
-
updateNotifications(newNotifications, notifyAboutNew = false) {
|
|
159
|
-
let stateChanged = false;
|
|
160
|
-
for (const n of newNotifications) {
|
|
161
|
-
const existing = this.notifications.find(x => x.id === n.id);
|
|
162
|
-
if (existing) {
|
|
163
|
-
if (existing.isRead !== n.isRead) {
|
|
164
|
-
existing.isRead = n.isRead;
|
|
165
|
-
stateChanged = true;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
let i = 0;
|
|
170
|
-
while (i < this.notifications.length && n.dateCreated < this.notifications[i].dateCreated) {
|
|
171
|
-
i++;
|
|
172
|
-
}
|
|
173
|
-
this.notifications.splice(i, 0, n);
|
|
174
|
-
stateChanged = true;
|
|
175
|
-
if (notifyAboutNew) {
|
|
176
|
-
this._newNotifications.next(n);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
const now = Date.now();
|
|
181
|
-
for (let i = this.notifications.length - 1; i >= 0; i--) {
|
|
182
|
-
const n = this.notifications[i];
|
|
183
|
-
if (new Date(n.expirationDate).getTime() < now || !newNotifications.find(x => x.id === n.id)) {
|
|
184
|
-
this.notifications.splice(i, 1);
|
|
185
|
-
stateChanged = true;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
if (stateChanged) {
|
|
189
|
-
this.notifyStateChanged();
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
saveToStorage() {
|
|
193
|
-
const str = JSON.stringify(this.notifications);
|
|
194
|
-
window.localStorage.setItem(this.notificationsStorageKey, str);
|
|
195
|
-
}
|
|
196
|
-
loadFromStorage() {
|
|
197
|
-
try {
|
|
198
|
-
const str = window.localStorage.getItem(this.notificationsStorageKey);
|
|
199
|
-
if (str) {
|
|
200
|
-
const notifications = JSON.parse(str);
|
|
201
|
-
this.notifications = notifications.filter(x => !!x);
|
|
202
|
-
// precaution for notification.isRead of undefined error
|
|
203
|
-
this.notifyStateChanged(false);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
catch { }
|
|
207
|
-
}
|
|
208
|
-
handleNotificationEvent(id, eventType) {
|
|
209
|
-
if (eventType.startsWith('new') || eventType === 'updated') { // we are handling new and newSilent
|
|
210
|
-
this.getNotification(id).subscribe(n => {
|
|
211
|
-
if (eventType.startsWith('new') && !n.isRead) {
|
|
212
|
-
this._newNotifications.next(n);
|
|
213
|
-
}
|
|
214
|
-
const existing = this.notifications.find(x => x.id === n.id);
|
|
215
|
-
if (existing) {
|
|
216
|
-
existing.isRead = n.isRead;
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
this.notifications.splice(0, 0, n);
|
|
220
|
-
}
|
|
221
|
-
this.notifyStateChanged();
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
else if (eventType === 'deleted') {
|
|
225
|
-
this.deleteNotificaton(id);
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
this.refresh();
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
deleteNotificaton(id) {
|
|
232
|
-
const i = this.notifications.findIndex(x => x.id === id);
|
|
233
|
-
if (i >= 0) {
|
|
234
|
-
this.notifications.splice(i, 1);
|
|
235
|
-
this.notifyStateChanged();
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
notifyStateChanged(persistState = true) {
|
|
239
|
-
if (persistState) {
|
|
240
|
-
this.saveToStorage();
|
|
241
|
-
}
|
|
242
|
-
this._stateChangesSubject.next();
|
|
243
|
-
}
|
|
244
|
-
handleNotificationAction(notificationAction) {
|
|
245
|
-
const arr = notificationAction.split(':');
|
|
246
|
-
const notificationClick = {
|
|
247
|
-
id: arr[0],
|
|
248
|
-
type: arr[1],
|
|
249
|
-
routerLink: arr[2]
|
|
250
|
-
};
|
|
251
|
-
const validNotificationClickTypes = ['default', 'deeplink'];
|
|
252
|
-
if (validNotificationClickTypes.includes(notificationClick.type)) {
|
|
253
|
-
this._clicksSubject.next(notificationClick);
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
console.error(`Nucleus.Notifications: Unknown notification action: '${notificationAction}'.`);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
removeDeliveredNotification(id) {
|
|
260
|
-
if (this._platform === 'ios' || this._platform === 'android') {
|
|
261
|
-
PushNotifications.getDeliveredNotifications().then(list => {
|
|
262
|
-
const toRemove = list.notifications.filter(n => {
|
|
263
|
-
const data = this.getNotificationPayloadData(n);
|
|
264
|
-
return (data.notificationId === id);
|
|
265
|
-
});
|
|
266
|
-
// TODO: On Android this does not currently work because notificationID is not set.
|
|
267
|
-
// This my solve the issue: https://github.com/ionic-team/capacitor/pull/3523
|
|
268
|
-
PushNotifications.removeDeliveredNotifications({
|
|
269
|
-
notifications: toRemove
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
else if (this._platform === 'web') {
|
|
274
|
-
// TODO: remove web push notification
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
getNotificationPayloadData(pushNotification) {
|
|
278
|
-
return (this._platform === 'ios') ? pushNotification.data.data : pushNotification.data;
|
|
279
|
-
}
|
|
280
|
-
async registerCapacitorEvents() {
|
|
281
|
-
await PushNotifications.addListener('pushNotificationReceived', n => {
|
|
282
|
-
const data = this.getNotificationPayloadData(n);
|
|
283
|
-
console.log('Nucleus.Notifications: Received capacitor push event: ' + data.eventType, n);
|
|
284
|
-
this.handleNotificationEvent(data.notificationId, data.eventType);
|
|
285
|
-
});
|
|
286
|
-
await PushNotifications.addListener('pushNotificationActionPerformed', a => {
|
|
287
|
-
let action = a.notification.data.notificationAction;
|
|
288
|
-
if (this._platform === 'ios') {
|
|
289
|
-
action = a.notification.data.data.notificationAction;
|
|
290
|
-
}
|
|
291
|
-
console.log('Nucleus.Notifications: Received capacitor action event', action);
|
|
292
|
-
this.handleNotificationAction(action);
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
registerWebPushEvents() {
|
|
296
|
-
this.swPush.messages.subscribe((n) => {
|
|
297
|
-
const data = n.data;
|
|
298
|
-
console.log('Nucleus.Notifications: Received WebPush event: ' + data.eventType, n);
|
|
299
|
-
this.handleNotificationEvent(data.notificationId, data.eventType);
|
|
300
|
-
});
|
|
301
|
-
this.swPush.notificationClicks.subscribe((action) => {
|
|
302
|
-
console.log('Nucleus.Notifications: Received WebPush action event', action);
|
|
303
|
-
const tag = action.notification.tag;
|
|
304
|
-
this.handleNotificationAction(tag);
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
getRegistrationInfo() {
|
|
308
|
-
return new Promise((_resolve, _reject) => {
|
|
309
|
-
const registrationId = window.localStorage.getItem(this.registrationStorageKey);
|
|
310
|
-
if (this._platform === 'android' || this._platform === 'ios') {
|
|
311
|
-
// capacitor platform
|
|
312
|
-
const listener = PushNotifications.addListener('registration', token => {
|
|
313
|
-
listener.remove();
|
|
314
|
-
_resolve({ id: registrationId, token: token.value, platform: this._platform });
|
|
315
|
-
});
|
|
316
|
-
PushNotifications.register().catch(error => _reject('Could not register for notifications:' + error));
|
|
317
|
-
}
|
|
318
|
-
else if (this._platform === 'web') {
|
|
319
|
-
// Web Push API
|
|
320
|
-
this.http.get(this.apiUrl + 'registration/webkey').subscribe(key => {
|
|
321
|
-
this.getWebPushSubscription(key.publicKey).then(subscription => {
|
|
322
|
-
const t = JSON.stringify(subscription.toJSON());
|
|
323
|
-
_resolve({ id: registrationId, token: t, platform: 'web' });
|
|
324
|
-
});
|
|
325
|
-
}, error => _reject(error));
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
_reject(`Nucleus.Notifications: Platform is not supported`);
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
getWebPushSubscription(publicKey) {
|
|
333
|
-
return new Promise((_resolve, _reject) => {
|
|
334
|
-
this.swPush.subscription.subscribe(subscription => {
|
|
335
|
-
if (subscription != null) {
|
|
336
|
-
_resolve(subscription);
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
this.swPush.requestSubscription({ serverPublicKey: publicKey }).then(s => _resolve(s)).catch(e => _reject(e));
|
|
340
|
-
}
|
|
341
|
-
}, error => {
|
|
342
|
-
console.error('Nucleus.Notifications: Cannot get web push subscription', error);
|
|
343
|
-
_reject(error);
|
|
344
|
-
});
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
NucleusNotificationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NucleusNotificationsService, deps: [{ token: i1.HttpClient }, { token: i2.SwPush }, { token: i3.NucleusAppService }, { token: i4.NucleusNotificationsConfig }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
349
|
-
NucleusNotificationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NucleusNotificationsService, providedIn: 'root' });
|
|
350
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NucleusNotificationsService, decorators: [{
|
|
351
|
-
type: Injectable,
|
|
352
|
-
args: [{
|
|
353
|
-
providedIn: 'root'
|
|
354
|
-
}]
|
|
355
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SwPush }, { type: i3.NucleusAppService }, { type: i4.NucleusNotificationsConfig }]; } });
|
|
356
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1ub3RpZmljYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9udWNsZXVzLW5vdGlmaWNhdGlvbnMvc3JjL2xpYi9udWNsZXVzLW5vdGlmaWNhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGlCQUFpQixFQUEwQixNQUFNLCtCQUErQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFNTCwwQkFBMEIsRUFPM0IsTUFBTSxVQUFVLENBQUM7Ozs7OztBQUtsQixNQUFNLE9BQU8sMkJBQTJCO0lBRXRDLFlBQ1UsSUFBZ0IsRUFDaEIsTUFBYyxFQUNkLFVBQTZCLEVBQ3JDLE1BQWtDO1FBSDFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBVS9CLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFDTCwyQkFBc0IsR0FBRyxvQ0FBb0MsQ0FBQztRQUM5RCw0QkFBdUIsR0FBRyxnQ0FBZ0MsQ0FBQztRQUVwRSxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBZ0IsQ0FBQztRQUNoRCxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFxQixDQUFDO1FBQ2xELHlCQUFvQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFNUMsa0JBQWEs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Q0FBQzthQUM3RDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQixDQUFDLFNBQWlCO1FBQzlDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNoRCxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7b0JBQ3hCLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDeEI7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvRztZQUNILENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLHlEQUF5RCxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoRixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O3dIQTlXVSwyQkFBMkI7NEhBQTNCLDJCQUEyQixjQUYxQixNQUFNOzJGQUVQLDJCQUEyQjtrQkFIdkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN3UHVzaCB9IGZyb20gJ0Bhbmd1bGFyL3NlcnZpY2Utd29ya2VyJztcclxuaW1wb3J0IHsgUHVzaE5vdGlmaWNhdGlvbnMsIFB1c2hOb3RpZmljYXRpb25TY2hlbWEgfSBmcm9tICdAY2FwYWNpdG9yL3B1c2gtbm90aWZpY2F0aW9ucyc7XHJcbmltcG9ydCB7IE51Y2xldXNBcHBTZXJ2aWNlIH0gZnJvbSAnQGtvbGVrdG9yL251Y2xldXMtY29tbW9uJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBDaGFubmVsSWQsXHJcbiAgTm90aWZpY2F0aW9uLFxyXG4gIE5vdGlmaWNhdGlvbkNsaWNrLFxyXG4gIE5vdGlmaWNhdGlvbkV2ZW50VHlwZSxcclxuICBOb3RpZmljYXRpb25UeXBlLFxyXG4gIE51Y2xldXNOb3RpZmljYXRpb25zQ29uZmlnLFxyXG4gIFBheWxvYWREYXRhLFxyXG4gIFBsYXRmb3JtVmFsdWUsXHJcbiAgUmVnaXN0cmF0aW9uLFxyXG4gIFJlZ2lzdHJhdGlvblJlc3VsdCxcclxuICBVc2VyQ2hhbm5lbENvbmZpZyxcclxuICBXZWJLZXlcclxufSBmcm9tICcuL21vZGVscyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOdWNsZXVzTm90aWZpY2F0aW9uc1NlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgc3dQdXNoOiBTd1B1c2gsXHJcbiAgICBwcml2YXRlIGFwcFNlcnZpY2U6IE51Y2xldXNBcHBTZXJ2aWNlLFxyXG4gICAgY29uZmlnOiBOdWNsZXVzTm90aWZpY2F0aW9uc0NvbmZpZ1xyXG4gICkge1xyXG4gICAgbGV0IHVybCA9IGNvbmZpZy5zZXJ2ZXJBcGlVcmw7XHJcbiAgICBpZiAoIXVybC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgIHVybCArPSAnLyc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwaVVybCA9IHVybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBpVXJsID0gbnVsbDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblN0b3JhZ2VLZXkgPSAnTnVjbGV1c05vdGlmaWNhdGlvbnNSZWdpc3RyYXRpb25JZCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBub3RpZmljYXRpb25zU3RvcmFnZUtleSA9ICdOdWNsZXVzTm90aWZpY2F0aW9uc0xvY2FsQ2FjaGUnO1xyXG4gIHByaXZhdGUgX3BsYXRmb3JtOiBQbGF0Zm9ybVZhbHVlO1xyXG4gIHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9uZXdOb3RpZmljYXRpb25zID0gbmV3IFN1YmplY3Q8Tm90aWZpY2F0aW9uPigpO1xyXG4gIHByaXZhdGUgX2NsaWNrc1N1YmplY3QgPSBuZXcgU3ViamVjdDxOb3RpZmljYXRpb25DbGljaz4oKTtcclxuICBwcml2YXRlIF9zdGF0ZUNoYW5nZXNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbltdID0gW107XHJcblxyXG4gIHB1YmxpYyBnZXQgdW5yZWFkQ291bnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25zLmZpbHRlcih4ID0+ICF4LmlzUmVhZCkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBuZXdOb3RpZmljYXRpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX25ld05vdGlmaWNhdGlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNsaWNrcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9jbGlja3NTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHN0YXRlQ2hhbmdlcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGF0ZUNoYW5nZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc0luaXRpYWxpemVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzSW5pdGlhbGl6ZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcclxuICAgIC8vIG1ha2Ugc3VyZSBhcHAgc2VydmljZSBoYXMgZmluaXNoZWQgaW5pdGlhbGl6aW5nXHJcbiAgICBhd2FpdCB0aGlzLmFwcFNlcnZpY2UuaW5pdCgpO1xyXG5cclxuICAgIHRoaXMubG9hZEZyb21TdG9yYWdlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuYXBwU2VydmljZS5pc05hdGl2ZSkge1xyXG4gICAgICB0aGlzLl9wbGF0Zm9ybSA9IHRoaXMuYXBwU2VydmljZS5kZXZpY2VJbmZvLnBsYXRmb3JtIGFzIFBsYXRmb3JtVmFsdWU7XHJcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJDYXBhY2l0b3JFdmVudHMoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zd1B1c2guaXNFbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuX3BsYXRmb3JtID0gJ3dlYic7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJXZWJQdXNoRXZlbnRzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ051Y2xldXMuTm90aWZpY2F0aW9uczogVGhlcmUgaXMgbm8gcHVzaCBjYXBhYmlsaXR5LCB0aW1lciB3aWxsIGJlIHVzZWQgdG8gdXBkYXRlIG5vdGlmaWNhdGlvbnMnKTtcclxuICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdVcGRhdGluZyBub3RpZmljYXRpb25zLi4uJyk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKHRydWUpO1xyXG4gICAgICB9LCA1ICogNjAgKiAxMDAwKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVnaXN0ZXIoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5nZXRSZWdpc3RyYXRpb25JbmZvKCkudGhlbigoaW5mbykgPT4ge1xyXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0PFJlZ2lzdHJhdGlvblJlc3VsdD4odGhpcy5hcGlVcmwgKyAncmVnaXN0cmF0aW9uJywgaW5mbykuc3Vic2NyaWJlKChyZWdSZXN1bHQpID0+IHtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnJlZ2lzdHJhdGlvblN0b3JhZ2VLZXksIHJlZ1Jlc3VsdC5pZCk7XHJcbiAgICAgICAgICBfcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBGYWlsZWQgdG8gc2VuZCBub3RpZmljYXRpb24gcmVnaXN0cmF0aW9uIHRvIHNlcnZlci4nLCBlcnJvcik7XHJcbiAgICAgICAgICBfcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiBfcmVqZWN0KGVycm9yKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1bnJlZ2lzdGVyKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZ2V0UmVnaXN0cmF0aW9uSW5mbygpLnRoZW4oKGluZm8pID0+IHtcclxuICAgICAgICB0aGlzLmh0dHAucmVxdWVzdDxhbnk+KCdERUxFVEUnLCB0aGlzLmFwaVVybCArICdyZWdpc3RyYXRpb24nLCB7IGJvZHk6IGluZm8gfSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnJlZ2lzdHJhdGlvblN0b3JhZ2VLZXkpO1xyXG4gICAgICAgICAgX3Jlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ051Y2xldXMuTm90aWZpY2F0aW9uczogRmFpbGVkIHRvIHJlbW92ZSByZWdpc3RyYXRpb24gZnJvbSBzZXJ2ZXIuJywgZXJyb3IpO1xyXG4gICAgICAgICAgX3JlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gX3JlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaChub3RpZnlBYm91dE5ldyA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLmh0dHAuZ2V0PE5vdGlmaWNhdGlvbltdPih0aGlzLmFwaVVybCArICdub3RpZmljYXRpb25zJykuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlTm90aWZpY2F0aW9ucyhyZXMsIG5vdGlmeUFib3V0TmV3KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE5vdGlmaWNhdGlvbihpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb24+IHtcclxuICAgIGNvbnN0IGxvY2FsTm90aWZpY2F0aW9uID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbmQoeCA9PiB4LmlkID09PSBpZCk7XHJcbiAgICBpZiAobG9jYWxOb3RpZmljYXRpb24pIHtcclxuICAgICAgcmV0dXJuIG9mKGxvY2FsTm90aWZpY2F0aW9uKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5vdGlmaWNhdGlvbj4odGhpcy5hcGlVcmwgKyAnbm90aWZpY2F0aW9ucy8nICsgaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlYWROb3RpZmljYXRpb24oaWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgbiA9IHRoaXMubm90aWZpY2F0aW9ucy5maW5kKHggPT4geC5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKG4gJiYgIW4uaXNSZWFkKSB7XHJcbiAgICAgIG4uaXNSZWFkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuaHR0cC5nZXQodGhpcy5hcGlVcmwgKyAnbm90aWZpY2F0aW9ucy9yZWFkLycgKyBpZCkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzbWlzc05vdGlmaWNhdGlvbihpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRlbGV0ZU5vdGlmaWNhdG9uKGlkKTtcclxuICAgIHRoaXMuaHR0cC5kZWxldGUodGhpcy5hcGlVcmwgKyAnbm90aWZpY2F0aW9ucy8nICsgaWQpLnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5yZW1vdmVEZWxpdmVyZWROb3RpZmljYXRpb24oaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc21pc3NBbGwoKSB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKDApO1xyXG4gICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcclxuICAgIHRoaXMuaHR0cC5kZWxldGUodGhpcy5hcGlVcmwgKyAnbm90aWZpY2F0aW9ucy9hbGwnKS5zdWJzY3JpYmUoKTtcclxuICAgIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ2lvcycgfHwgdGhpcy5fcGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xyXG4gICAgICBQdXNoTm90aWZpY2F0aW9ucy5yZW1vdmVBbGxEZWxpdmVyZWROb3RpZmljYXRpb25zKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3BsYXRmb3JtID09PSAnd2ViJykge1xyXG4gICAgICAvLyBUT0RPOiByZW1vdmUgYWxsIHdlYiBwdXNoIG5vdGlmaWNhdGlvbnNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWFkQWxsKCkge1xyXG4gICAgZm9yIChjb25zdCBuIG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xyXG4gICAgICBuLmlzUmVhZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlZCgpO1xyXG4gICAgdGhpcy5odHRwLmdldCh0aGlzLmFwaVVybCArICdub3RpZmljYXRpb25zL3JlYWQvYWxsJykuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2hhbm5lbENvbmZpZyhzZW5kZXJJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgbGFuZ3VhZ2U6IHN0cmluZyA9IG51bGwpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVzZXJDaGFubmVsQ29uZmlnPih0aGlzLmFwaVVybCArIGBzZXR0aW5ncy9jaGFubmVsLyR7c2VuZGVySWR9LyR7Y2hhbm5lbElkfT9sYW5ndWFnZT0ke2xhbmd1YWdlfWApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoYW5uZWxDb25maWdzRm9yU2VuZGVyKHNlbmRlcklkOiBzdHJpbmcsIGNoYW5uZWxJZHM6IHN0cmluZ1tdLCBsYW5ndWFnZTogc3RyaW5nID0gbnVsbCkge1xyXG4gICAgY29uc3QgaWRzU3RyID0gY2hhbm5lbElkcy5tYXAoeCA9PiBzZW5kZXJJZCArICcsJyArIHgpLmpvaW4oJzsnKTtcclxuICAgIHJldHVybiB0aGlzLmdldENoYW5uZWxDb25maWdzSW50ZXJuYWwoaWRzU3RyLCBsYW5ndWFnZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2hhbm5lbENvbmZpZ3MoaWRzOiBDaGFubmVsSWRbXSwgbGFuZ3VhZ2U6IHN0cmluZyA9IG51bGwpIHtcclxuICAgIGNvbnN0IGlkc1N0ciA9IGlkcy5tYXAoeCA9PiB4LnNlbmRlcklkICsgJywnICsgeC5jaGFubmVsSWQpLmpvaW4oJzsnKTtcclxuICAgIHJldHVybiB0aGlzLmdldENoYW5uZWxDb25maWdzSW50ZXJuYWwoaWRzU3RyLCBsYW5ndWFnZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q2hhbm5lbENvbmZpZyhzZW5kZXJJZDogc3RyaW5nLCBjb25maWc6IFVzZXJDaGFubmVsQ29uZmlnKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8dm9pZD4oYCR7dGhpcy5hcGlVcmx9c2V0dGluZ3MvY2hhbm5lbC8ke3NlbmRlcklkfWAsIGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q2hhbm5lbENvbmZpZ3MoY29uZmlnczogVXNlckNoYW5uZWxDb25maWdbXSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PHZvaWQ+KGAke3RoaXMuYXBpVXJsfXNldHRpbmdzL2NoYW5uZWxzYCwgY29uZmlncyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENoYW5uZWxDb25maWdzSW50ZXJuYWwoaWRzOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVzZXJDaGFubmVsQ29uZmlnW10+KGAke3RoaXMuYXBpVXJsfXNldHRpbmdzL2NoYW5uZWxzP2lkcz0ke2lkc30mbGFuZ3VhZ2U9JHtsYW5ndWFnZX1gKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTm90aWZpY2F0aW9ucyhuZXdOb3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25bXSwgbm90aWZ5QWJvdXROZXcgPSBmYWxzZSkge1xyXG4gICAgbGV0IHN0YXRlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgZm9yIChjb25zdCBuIG9mIG5ld05vdGlmaWNhdGlvbnMpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLm5vdGlmaWNhdGlvbnMuZmluZCh4ID0+IHguaWQgPT09IG4uaWQpO1xyXG4gICAgICBpZiAoZXhpc3RpbmcpIHtcclxuICAgICAgICBpZiAoZXhpc3RpbmcuaXNSZWFkICE9PSBuLmlzUmVhZCkge1xyXG4gICAgICAgICAgZXhpc3RpbmcuaXNSZWFkID0gbi5pc1JlYWQ7XHJcbiAgICAgICAgICBzdGF0ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgd2hpbGUgKGkgPCB0aGlzLm5vdGlmaWNhdGlvbnMubGVuZ3RoICYmIG4uZGF0ZUNyZWF0ZWQgPCB0aGlzLm5vdGlmaWNhdGlvbnNbaV0uZGF0ZUNyZWF0ZWQpIHtcclxuICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZShpLCAwLCBuKTtcclxuICAgICAgICBzdGF0ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChub3RpZnlBYm91dE5ldykge1xyXG4gICAgICAgICAgdGhpcy5fbmV3Tm90aWZpY2F0aW9ucy5uZXh0KG4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICBmb3IgKGxldCBpID0gdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGNvbnN0IG4gPSB0aGlzLm5vdGlmaWNhdGlvbnNbaV07XHJcbiAgICAgIGlmIChuZXcgRGF0ZShuLmV4cGlyYXRpb25EYXRlKS5nZXRUaW1lKCkgPCBub3cgfHwgIW5ld05vdGlmaWNhdGlvbnMuZmluZCh4ID0+IHguaWQgPT09IG4uaWQpKSB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZShpLCAxKTtcclxuICAgICAgICBzdGF0ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlQ2hhbmdlZCkge1xyXG4gICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlVG9TdG9yYWdlKCkge1xyXG4gICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5ub3RpZmljYXRpb25zKTtcclxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLm5vdGlmaWNhdGlvbnNTdG9yYWdlS2V5LCBzdHIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkRnJvbVN0b3JhZ2UoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzdHIgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5ub3RpZmljYXRpb25zU3RvcmFnZUtleSk7XHJcbiAgICAgIGlmIChzdHIpIHtcclxuICAgICAgICBjb25zdCBub3RpZmljYXRpb25zID0gSlNPTi5wYXJzZShzdHIpIGFzIE5vdGlmaWNhdGlvbltdO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG5vdGlmaWNhdGlvbnMuZmlsdGVyKHggPT4gISF4KTtcclxuICAgICAgICAvLyBwcmVjYXV0aW9uIGZvciBub3RpZmljYXRpb24uaXNSZWFkIG9mIHVuZGVmaW5lZCBlcnJvclxyXG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCB7IH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoaWQ6IHN0cmluZywgZXZlbnRUeXBlOiBOb3RpZmljYXRpb25FdmVudFR5cGUpIHtcclxuICAgIGlmIChldmVudFR5cGUuc3RhcnRzV2l0aCgnbmV3JykgfHwgZXZlbnRUeXBlID09PSAndXBkYXRlZCcpIHsgLy8gd2UgYXJlIGhhbmRsaW5nIG5ldyBhbmQgbmV3U2lsZW50XHJcbiAgICAgIHRoaXMuZ2V0Tm90aWZpY2F0aW9uKGlkKS5zdWJzY3JpYmUobiA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50VHlwZS5zdGFydHNXaXRoKCduZXcnKSAmJiAhbi5pc1JlYWQpIHtcclxuICAgICAgICAgIHRoaXMuX25ld05vdGlmaWNhdGlvbnMubmV4dChuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLm5vdGlmaWNhdGlvbnMuZmluZCh4ID0+IHguaWQgPT09IG4uaWQpO1xyXG4gICAgICAgIGlmIChleGlzdGluZykge1xyXG4gICAgICAgICAgZXhpc3RpbmcuaXNSZWFkID0gbi5pc1JlYWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UoMCwgMCwgbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2VkKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdkZWxldGVkJykge1xyXG4gICAgICB0aGlzLmRlbGV0ZU5vdGlmaWNhdG9uKGlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWxldGVOb3RpZmljYXRvbihpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBpID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbmRJbmRleCh4ID0+IHguaWQgPT09IGlkKTtcclxuICAgIGlmIChpID49IDApIHtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZShpLCAxKTtcclxuICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm90aWZ5U3RhdGVDaGFuZ2VkKHBlcnNpc3RTdGF0ZSA9IHRydWUpIHtcclxuICAgIGlmIChwZXJzaXN0U3RhdGUpIHtcclxuICAgICAgdGhpcy5zYXZlVG9TdG9yYWdlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZXNTdWJqZWN0Lm5leHQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlTm90aWZpY2F0aW9uQWN0aW9uKG5vdGlmaWNhdGlvbkFjdGlvbjogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBhcnIgPSBub3RpZmljYXRpb25BY3Rpb24uc3BsaXQoJzonKTtcclxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbkNsaWNrOiBOb3RpZmljYXRpb25DbGljayA9IHtcclxuICAgICAgaWQ6IGFyclswXSxcclxuICAgICAgdHlwZTogYXJyWzFdIGFzIE5vdGlmaWNhdGlvblR5cGUsXHJcbiAgICAgIHJvdXRlckxpbms6IGFyclsyXVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB2YWxpZE5vdGlmaWNhdGlvbkNsaWNrVHlwZXMgPSBbJ2RlZmF1bHQnLCAnZGVlcGxpbmsnXTtcclxuICAgIGlmICh2YWxpZE5vdGlmaWNhdGlvbkNsaWNrVHlwZXMuaW5jbHVkZXMobm90aWZpY2F0aW9uQ2xpY2sudHlwZSkpIHtcclxuICAgICAgdGhpcy5fY2xpY2tzU3ViamVjdC5uZXh0KG5vdGlmaWNhdGlvbkNsaWNrKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE51Y2xldXMuTm90aWZpY2F0aW9uczogVW5rbm93biBub3RpZmljYXRpb24gYWN0aW9uOiAnJHtub3RpZmljYXRpb25BY3Rpb259Jy5gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGVsaXZlcmVkTm90aWZpY2F0aW9uKGlkOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLl9wbGF0Zm9ybSA9PT0gJ2lvcycgfHwgdGhpcy5fcGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xyXG4gICAgICBQdXNoTm90aWZpY2F0aW9ucy5nZXREZWxpdmVyZWROb3RpZmljYXRpb25zKCkudGhlbihsaXN0ID0+IHtcclxuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IGxpc3Qubm90aWZpY2F0aW9ucy5maWx0ZXIobiA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXROb3RpZmljYXRpb25QYXlsb2FkRGF0YShuKTtcclxuICAgICAgICAgIHJldHVybiAoZGF0YS5ub3RpZmljYXRpb25JZCA9PT0gaWQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBUT0RPOiBPbiBBbmRyb2lkIHRoaXMgZG9lcyBub3QgY3VycmVudGx5IHdvcmsgYmVjYXVzZSBub3RpZmljYXRpb25JRCBpcyBub3Qgc2V0LlxyXG4gICAgICAgIC8vIFRoaXMgbXkgc29sdmUgdGhlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vaW9uaWMtdGVhbS9jYXBhY2l0b3IvcHVsbC8zNTIzXHJcbiAgICAgICAgUHVzaE5vdGlmaWNhdGlvbnMucmVtb3ZlRGVsaXZlcmVkTm90aWZpY2F0aW9ucyh7XHJcbiAgICAgICAgICBub3RpZmljYXRpb25zOiB0b1JlbW92ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5fcGxhdGZvcm0gPT09ICd3ZWInKSB7XHJcbiAgICAgIC8vIFRPRE86IHJlbW92ZSB3ZWIgcHVzaCBub3RpZmljYXRpb25cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Tm90aWZpY2F0aW9uUGF5bG9hZERhdGEocHVzaE5vdGlmaWNhdGlvbjogUHVzaE5vdGlmaWNhdGlvblNjaGVtYSk6IFBheWxvYWREYXRhIHtcclxuICAgIHJldHVybiAodGhpcy5fcGxhdGZvcm0gPT09ICdpb3MnKSA/IHB1c2hOb3RpZmljYXRpb24uZGF0YS5kYXRhIDogcHVzaE5vdGlmaWNhdGlvbi5kYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckNhcGFjaXRvckV2ZW50cygpIHtcclxuICAgIGF3YWl0IFB1c2hOb3RpZmljYXRpb25zLmFkZExpc3RlbmVyKCdwdXNoTm90aWZpY2F0aW9uUmVjZWl2ZWQnLCBuID0+IHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0Tm90aWZpY2F0aW9uUGF5bG9hZERhdGEobik7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFJlY2VpdmVkIGNhcGFjaXRvciBwdXNoIGV2ZW50OiAnICsgZGF0YS5ldmVudFR5cGUsIG4pO1xyXG4gICAgICB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGRhdGEubm90aWZpY2F0aW9uSWQsIGRhdGEuZXZlbnRUeXBlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGF3YWl0IFB1c2hOb3RpZmljYXRpb25zLmFkZExpc3RlbmVyKCdwdXNoTm90aWZpY2F0aW9uQWN0aW9uUGVyZm9ybWVkJywgYSA9PiB7XHJcbiAgICAgIGxldCBhY3Rpb24gPSAoYSBhcyBhbnkpLm5vdGlmaWNhdGlvbi5kYXRhLm5vdGlmaWNhdGlvbkFjdGlvbjtcclxuICAgICAgaWYgKHRoaXMuX3BsYXRmb3JtID09PSAnaW9zJykge1xyXG4gICAgICAgIGFjdGlvbiA9IChhIGFzIGFueSkubm90aWZpY2F0aW9uLmRhdGEuZGF0YS5ub3RpZmljYXRpb25BY3Rpb247XHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coJ051Y2xldXMuTm90aWZpY2F0aW9uczogUmVjZWl2ZWQgY2FwYWNpdG9yIGFjdGlvbiBldmVudCcsIGFjdGlvbik7XHJcbiAgICAgIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uQWN0aW9uKGFjdGlvbik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVnaXN0ZXJXZWJQdXNoRXZlbnRzKCkge1xyXG4gICAgdGhpcy5zd1B1c2gubWVzc2FnZXMuc3Vic2NyaWJlKChuKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGE6IFBheWxvYWREYXRhID0gKG4gYXMgYW55KS5kYXRhO1xyXG4gICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBSZWNlaXZlZCBXZWJQdXNoIGV2ZW50OiAnICsgZGF0YS5ldmVudFR5cGUsIG4pO1xyXG4gICAgICB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGRhdGEubm90aWZpY2F0aW9uSWQsIGRhdGEuZXZlbnRUeXBlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3dQdXNoLm5vdGlmaWNhdGlvbkNsaWNrcy5zdWJzY3JpYmUoKGFjdGlvbikgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5Ob3RpZmljYXRpb25zOiBSZWNlaXZlZCBXZWJQdXNoIGFjdGlvbiBldmVudCcsIGFjdGlvbik7XHJcbiAgICAgIGNvbnN0IHRhZyA9IGFjdGlvbi5ub3RpZmljYXRpb24udGFnO1xyXG4gICAgICB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbkFjdGlvbih0YWcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlZ2lzdHJhdGlvbkluZm8oKTogUHJvbWlzZTxSZWdpc3RyYXRpb24+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgcmVnaXN0cmF0aW9uSWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5yZWdpc3RyYXRpb25TdG9yYWdlS2V5KTtcclxuICAgICAgaWYgKHRoaXMuX3BsYXRmb3JtID09PSAnYW5kcm9pZCcgfHwgdGhpcy5fcGxhdGZvcm0gPT09ICdpb3MnKSB7XHJcbiAgICAgICAgLy8gY2FwYWNpdG9yIHBsYXRmb3JtXHJcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSBQdXNoTm90aWZpY2F0aW9ucy5hZGRMaXN0ZW5lcigncmVnaXN0cmF0aW9uJywgdG9rZW4gPT4ge1xyXG4gICAgICAgICAgbGlzdGVuZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICBfcmVzb2x2ZSh7IGlkOiByZWdpc3RyYXRpb25JZCwgdG9rZW46IHRva2VuLnZhbHVlLCBwbGF0Zm9ybTogdGhpcy5fcGxhdGZvcm0gfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgUHVzaE5vdGlmaWNhdGlvbnMucmVnaXN0ZXIoKS5jYXRjaChlcnJvciA9PiBfcmVqZWN0KCdDb3VsZCBub3QgcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnM6JyArIGVycm9yKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fcGxhdGZvcm0gPT09ICd3ZWInKSB7XHJcbiAgICAgICAgLy8gV2ViIFB1c2ggQVBJXHJcbiAgICAgICAgdGhpcy5odHRwLmdldDxXZWJLZXk+KHRoaXMuYXBpVXJsICsgJ3JlZ2lzdHJhdGlvbi93ZWJrZXknKS5zdWJzY3JpYmUoa2V5ID0+IHtcclxuICAgICAgICAgIHRoaXMuZ2V0V2ViUHVzaFN1YnNjcmlwdGlvbihrZXkucHVibGljS2V5KS50aGVuKHN1YnNjcmlwdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHQgPSBKU09OLnN0cmluZ2lmeShzdWJzY3JpcHRpb24udG9KU09OKCkpO1xyXG4gICAgICAgICAgICBfcmVzb2x2ZSh7IGlkOiByZWdpc3RyYXRpb25JZCwgdG9rZW46IHQsIHBsYXRmb3JtOiAnd2ViJyB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIGVycm9yID0+IF9yZWplY3QoZXJyb3IpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfcmVqZWN0KGBOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IFBsYXRmb3JtIGlzIG5vdCBzdXBwb3J0ZWRgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFdlYlB1c2hTdWJzY3JpcHRpb24ocHVibGljS2V5OiBzdHJpbmcpOiBQcm9taXNlPFB1c2hTdWJzY3JpcHRpb24+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5zd1B1c2guc3Vic2NyaXB0aW9uLnN1YnNjcmliZShzdWJzY3JpcHRpb24gPT4ge1xyXG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24gIT0gbnVsbCkge1xyXG4gICAgICAgICAgX3Jlc29sdmUoc3Vic2NyaXB0aW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zd1B1c2gucmVxdWVzdFN1YnNjcmlwdGlvbih7IHNlcnZlclB1YmxpY0tleTogcHVibGljS2V5IH0pLnRoZW4ocyA9PiBfcmVzb2x2ZShzKSkuY2F0Y2goZSA9PiBfcmVqZWN0KGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdOdWNsZXVzLk5vdGlmaWNhdGlvbnM6IENhbm5vdCBnZXQgd2ViIHB1c2ggc3Vic2NyaXB0aW9uJywgZXJyb3IpO1xyXG4gICAgICAgIF9yZWplY3QoZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
|
package/esm2020/public-api.mjs
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of nucleus-notifications
|
|
3
|
-
*/
|
|
4
|
-
export * from './lib/nucleus-notifications.service';
|
|
5
|
-
export * from './lib/nucleus-notifications.module';
|
|
6
|
-
export * from './lib/models';
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL251Y2xldXMtbm90aWZpY2F0aW9ucy9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBudWNsZXVzLW5vdGlmaWNhdGlvbnNcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9udWNsZXVzLW5vdGlmaWNhdGlvbnMuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL251Y2xldXMtbm90aWZpY2F0aW9ucy5tb2R1bGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMnO1xyXG4iXX0=
|