@vgroup/dialbox 0.0.83 → 0.0.84
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/esm2020/lib/dialbox.component.mjs +3 -33
- package/esm2020/lib/service/twilio.service.mjs +42 -84
- package/fesm2015/vgroup-dialbox.mjs +40 -112
- package/fesm2015/vgroup-dialbox.mjs.map +1 -1
- package/fesm2020/vgroup-dialbox.mjs +41 -113
- package/fesm2020/vgroup-dialbox.mjs.map +1 -1
- package/lib/dialbox.component.d.ts +0 -2
- package/lib/service/twilio.service.d.ts +5 -7
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { HttpParams } from '@angular/common/http';
|
|
2
|
-
import { HttpHeaders } from "@angular/common/http";
|
|
1
|
+
import { HttpHeaders, HttpParams } from '@angular/common/http';
|
|
3
2
|
import { Injectable } from '@angular/core';
|
|
3
|
+
import { BehaviorSubject, of, throwError } from 'rxjs';
|
|
4
|
+
import { catchError, shareReplay, tap } from 'rxjs/operators';
|
|
4
5
|
import { Device } from '@twilio/voice-sdk';
|
|
5
|
-
import {
|
|
6
|
-
import { environment } from "../environments/environments";
|
|
6
|
+
import { environment } from '../environments/environments';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
import * as i1 from "@angular/common/http";
|
|
9
9
|
import * as i2 from "./extension.service";
|
|
@@ -30,85 +30,48 @@ export class TwilioService {
|
|
|
30
30
|
this.isAvailableNumber = new BehaviorSubject(false);
|
|
31
31
|
this.callerIdList = new BehaviorSubject([]);
|
|
32
32
|
this.triggerSMSReload = new BehaviorSubject(false);
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
this.tokenInitialized = false;
|
|
34
|
+
this.tokenInitialization$ = null;
|
|
35
|
+
this.initializeToken();
|
|
36
|
+
}
|
|
37
|
+
initializeToken() {
|
|
38
|
+
if (this.tokenInitialized) {
|
|
39
|
+
return this.tokenInitialization$ || of(null);
|
|
40
|
+
}
|
|
41
|
+
this.tokenInitialization$ = this.extensionService.getIncomingCallToken().pipe(tap((data) => {
|
|
42
|
+
this.incomingCallToken = data.token;
|
|
43
|
+
localStorage.setItem('in-token', data.token);
|
|
44
|
+
this.tokenInitialized = true;
|
|
45
|
+
this.initializeDevice();
|
|
46
|
+
}), catchError(error => {
|
|
47
|
+
console.error('Error initializing Twilio token:', error);
|
|
48
|
+
return throwError(() => error);
|
|
49
|
+
}), shareReplay(1) // Cache the result for subsequent subscribers
|
|
50
|
+
);
|
|
51
|
+
return this.tokenInitialization$;
|
|
52
|
+
}
|
|
53
|
+
initializeTwilioDevice() {
|
|
54
|
+
if (this.tokenInitialized && this.incomingCallToken) {
|
|
55
|
+
this.initializeDevice();
|
|
39
56
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
startTokenCheck() {
|
|
44
|
-
// Check every 2 seconds if we have a token
|
|
45
|
-
this.tokenCheckInterval = setInterval(() => {
|
|
46
|
-
const currentToken = localStorage.getItem('ext_token');
|
|
47
|
-
if (currentToken && currentToken !== this.token) {
|
|
48
|
-
this.token = currentToken;
|
|
49
|
-
this.initializeTwilioDevice();
|
|
50
|
-
}
|
|
51
|
-
}, 2000);
|
|
52
|
-
}
|
|
53
|
-
ngOnDestroy() {
|
|
54
|
-
if (this.tokenCheckInterval) {
|
|
55
|
-
clearInterval(this.tokenCheckInterval);
|
|
57
|
+
else {
|
|
58
|
+
this.initializeToken().subscribe();
|
|
56
59
|
}
|
|
60
|
+
}
|
|
61
|
+
initializeDevice() {
|
|
57
62
|
if (this.device) {
|
|
58
63
|
this.device.destroy();
|
|
59
64
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
// Prevent multiple initializations
|
|
63
|
-
if (this.deviceInitialized || this.initializationInProgress || !this.token) {
|
|
65
|
+
if (!this.incomingCallToken) {
|
|
66
|
+
console.error('No Twilio token available');
|
|
64
67
|
return;
|
|
65
68
|
}
|
|
66
|
-
this.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
this.incomingCallToken = data.token;
|
|
71
|
-
localStorage.setItem('in-token', data.token);
|
|
72
|
-
// Destroy existing device if it exists
|
|
73
|
-
if (this.device) {
|
|
74
|
-
this.device.destroy();
|
|
75
|
-
}
|
|
76
|
-
// Initialize Twilio Device with required options
|
|
77
|
-
const deviceOptions = {
|
|
78
|
-
allowIncomingWhileBusy: true,
|
|
79
|
-
closeProtection: true
|
|
80
|
-
};
|
|
81
|
-
// Only add debug in development
|
|
82
|
-
if (!environment.production) {
|
|
83
|
-
deviceOptions.debug = false;
|
|
84
|
-
}
|
|
85
|
-
this.device = new Device(this.incomingCallToken, deviceOptions);
|
|
86
|
-
this.device.register();
|
|
87
|
-
this.deviceInitialized = true;
|
|
88
|
-
this.initializationInProgress = false;
|
|
89
|
-
console.log('Twilio Device initialized successfully');
|
|
90
|
-
this.setupDeviceEventHandlers();
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
console.error('Error initializing Twilio Device:', error);
|
|
94
|
-
this.initializationInProgress = false;
|
|
95
|
-
// Retry after a delay
|
|
96
|
-
setTimeout(() => this.initializeTwilioDevice(), 5000);
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
error: (error) => {
|
|
100
|
-
console.error('Error getting Twilio token:', error);
|
|
101
|
-
this.initializationInProgress = false;
|
|
102
|
-
// Retry after a delay
|
|
103
|
-
setTimeout(() => this.initializeTwilioDevice(), 5000);
|
|
104
|
-
}
|
|
69
|
+
this.device = new Device(this.incomingCallToken, {
|
|
70
|
+
allowIncomingWhileBusy: true,
|
|
71
|
+
closeProtection: true
|
|
105
72
|
});
|
|
106
|
-
|
|
107
|
-
setupDeviceEventHandlers() {
|
|
108
|
-
if (!this.device)
|
|
109
|
-
return;
|
|
73
|
+
this.device.register();
|
|
110
74
|
this.device.on('incoming', (call) => {
|
|
111
|
-
console.log('Incoming call received:', call.parameters);
|
|
112
75
|
this.currentCall.next(call);
|
|
113
76
|
this.callType.next('INCOMING');
|
|
114
77
|
this.currentCallState.next('incoming');
|
|
@@ -116,20 +79,15 @@ export class TwilioService {
|
|
|
116
79
|
});
|
|
117
80
|
this.device.on('error', (error) => {
|
|
118
81
|
console.error('Twilio Device Error:', error);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
if (error.code === 31201 || error.code === 20101) {
|
|
122
|
-
console.log('Authentication error, reinitializing device...');
|
|
123
|
-
this.initializeTwilioDevice();
|
|
124
|
-
}
|
|
82
|
+
// Reset initialization state on error to allow retry
|
|
83
|
+
this.tokenInitialized = false;
|
|
125
84
|
});
|
|
126
85
|
this.device.on('registered', () => {
|
|
127
|
-
console.log('Twilio Device registered');
|
|
128
|
-
this.deviceInitialized = true;
|
|
86
|
+
console.log('Twilio Device registered successfully');
|
|
129
87
|
});
|
|
130
88
|
this.device.on('unregistered', () => {
|
|
131
89
|
console.log('Twilio Device unregistered');
|
|
132
|
-
this.
|
|
90
|
+
this.tokenInitialized = false;
|
|
133
91
|
});
|
|
134
92
|
}
|
|
135
93
|
// onIncomingCall(){
|
|
@@ -232,4 +190,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
232
190
|
providedIn: 'root'
|
|
233
191
|
}]
|
|
234
192
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ExtensionService }, { type: i3.NotificationService }]; } });
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdpbGlvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2VydmljZS90d2lsaW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFRLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFBOzs7OztBQWdCMUQsTUFBTSxPQUFPLGFBQWE7SUE2QnhCLFlBQW9CLElBQWdCLEVBQVUsZ0JBQWtDLEVBQ3BFLG1CQUF3QztRQURoQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNwRSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBNUJwRCwwQkFBcUIsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUM1RCxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFjLElBQUksQ0FBQyxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUMsaUNBQWlDO1FBSXRGLGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBUyxLQUFLLENBQUMsQ0FBQztRQUM5Qyx5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztRQUM3RixVQUFLLEdBQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxzQkFBaUIsR0FB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QWlCLEVBQUUsT0FBZTtRQUM1QyxNQUFNLFdBQVcsR0FBRztZQUNsQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDM0gsTUFBTSxFQUFFLElBQUksVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUM7U0FDakQsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUN2RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFLLFdBQVcsQ0FBQyxNQUFNLEdBQUcseUNBQXlDLEdBQUcsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BILENBQUM7OzJHQXhQVSxhQUFhOytHQUFiLGFBQWEsY0FGWixNQUFNOzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYWxsLCBEZXZpY2UgfSBmcm9tICdAdHdpbGlvL3ZvaWNlLXNkayc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSBcIi4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudHNcIlxuaW1wb3J0IHsgRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4vZXh0ZW5zaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vTm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpYWxQYXlsb2FkIHtcbiAgbnVtYmVyOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaW1nOiBzdHJpbmc7XG4gIGNhbGxlcklkOnN0cmluZztcbiAgaXNEaWFsRnJvbUhpc3Rvcnk6Ym9vbGVhbjtcbiAgZnJvbTpzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnICBcbn0pXG5leHBvcnQgY2xhc3MgVHdpbGlvU2VydmljZSB7XG4gIFxuICBvcGVuSW5Qcm9ncmVzc0RpYWxwYWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgY3VycmVudENhbGwgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGwgfCBudWxsPihudWxsKTtcbiAgY3VycmVudENhbGxTdGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pignbm9uZScpOyAvL2luLXByb2dyZXNzLCBvdXQtcHJvZ3Jlc3MsIG5vbmVcbiAgZGV2aWNlOmFueTtcbiAgaW5jb21pbmdDYWxsVG9rZW4/OnN0cmluZztcbiAgb3V0Z29pbmdDYWxsVG9rZW4/OnN0cmluZztcbiAgY2FsbFR5cGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJ05JTCcpO1xuICBpc0luY29taW5nQ2FsbFBpY2tlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpOyAvLyBmb3IgYm90aCBpbmNvbWluZyBhbmQgb3V0Z29pbmdcbiAgdG9rZW46YW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpO1xuICBpc05ld0NvbnRhY3RBZGRlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICB1cGRhdGVSZWNlbnRDYWxsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGNhbGxoYW5kbGVGcm9tTm90aWZpY2F0aW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHt9KTtcblxuICBlbmRDYWxsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGRpYWxOdW1iZXJGcm9tT3RoZXJNb2R1bGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERpYWxQYXlsb2FkPih7IG51bWJlcjogJycsIG5hbWU6ICcnLCBpbWc6ICcnLCBjYWxsZXJJZDogJycsIGlzRGlhbEZyb21IaXN0b3J5OiBmYWxzZSwgZnJvbTogJycgfSk7XG5cbiAgdG9nZ2xlQ2FsbGVySWRBbGVydCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIGlzVHJpYWxPdmVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGlzUGF5bWVudER1ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBpc0F2YWlsYWJsZU51bWJlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBjYWxsZXJJZExpc3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gIHRyaWdnZXJTTVNSZWxvYWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIGRldmljZUluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgaW5pdGlhbGl6YXRpb25JblByb2dyZXNzID0gZmFsc2U7XG4gIHByaXZhdGUgdG9rZW5DaGVja0ludGVydmFsOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGV4dGVuc2lvblNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsXG4gICAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcml2Y2U6IE5vdGlmaWNhdGlvblNlcnZpY2VcbiAgKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBpbW1lZGlhdGVseSBpZiB0b2tlbiBleGlzdHNcbiAgICB0aGlzLnRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpO1xuICAgIGlmICh0aGlzLnRva2VuKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVUd2lsaW9EZXZpY2UoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU2V0IHVwIGEgcG9sbGluZyBtZWNoYW5pc20gdG8gY2hlY2sgZm9yIHRva2VuIGF2YWlsYWJpbGl0eVxuICAgIHRoaXMuc3RhcnRUb2tlbkNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VG9rZW5DaGVjaygpIHtcbiAgICAvLyBDaGVjayBldmVyeSAyIHNlY29uZHMgaWYgd2UgaGF2ZSBhIHRva2VuXG4gICAgdGhpcy50b2tlbkNoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XG4gICAgICBpZiAoY3VycmVudFRva2VuICYmIGN1cnJlbnRUb2tlbiAhPT0gdGhpcy50b2tlbikge1xuICAgICAgICB0aGlzLnRva2VuID0gY3VycmVudFRva2VuO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVUd2lsaW9EZXZpY2UoKTtcbiAgICAgIH1cbiAgICB9LCAyMDAwKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnRva2VuQ2hlY2tJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRva2VuQ2hlY2tJbnRlcnZhbCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRldmljZSkge1xuICAgICAgdGhpcy5kZXZpY2UuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gICBwdWJsaWMgaW5pdGlhbGl6ZVR3aWxpb0RldmljZSgpIHtcbiAgICAvLyBQcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgIGlmICh0aGlzLmRldmljZUluaXRpYWxpemVkIHx8IHRoaXMuaW5pdGlhbGl6YXRpb25JblByb2dyZXNzIHx8ICF0aGlzLnRva2VuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIFxuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRJbmNvbWluZ0NhbGxUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxUb2tlbiA9IGRhdGEudG9rZW47XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2luLXRva2VuJywgZGF0YS50b2tlbik7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRGVzdHJveSBleGlzdGluZyBkZXZpY2UgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgaWYgKHRoaXMuZGV2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmRldmljZS5kZXN0cm95KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEluaXRpYWxpemUgVHdpbGlvIERldmljZSB3aXRoIHJlcXVpcmVkIG9wdGlvbnNcbiAgICAgICAgICBjb25zdCBkZXZpY2VPcHRpb25zOiBhbnkgPSB7XG4gICAgICAgICAgICBhbGxvd0luY29taW5nV2hpbGVCdXN5OiB0cnVlLFxuICAgICAgICAgICAgY2xvc2VQcm90ZWN0aW9uOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBPbmx5IGFkZCBkZWJ1ZyBpbiBkZXZlbG9wbWVudFxuICAgICAgICAgIGlmICghZW52aXJvbm1lbnQucHJvZHVjdGlvbikge1xuICAgICAgICAgICAgZGV2aWNlT3B0aW9ucy5kZWJ1ZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLmRldmljZSA9IG5ldyBEZXZpY2UodGhpcy5pbmNvbWluZ0NhbGxUb2tlbiEsIGRldmljZU9wdGlvbnMpO1xuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMuZGV2aWNlLnJlZ2lzdGVyKCk7XG4gICAgICAgICAgdGhpcy5kZXZpY2VJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVHdpbGlvIERldmljZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknKTtcblxuICAgICAgICAgIHRoaXMuc2V0dXBEZXZpY2VFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIFR3aWxpbyBEZXZpY2U6JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb25JblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgLy8gUmV0cnkgYWZ0ZXIgYSBkZWxheVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbml0aWFsaXplVHdpbGlvRGV2aWNlKCksIDUwMDApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXR0aW5nIFR3aWxpbyB0b2tlbjonLCBlcnJvcik7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb25JblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIC8vIFJldHJ5IGFmdGVyIGEgZGVsYXlcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmluaXRpYWxpemVUd2lsaW9EZXZpY2UoKSwgNTAwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwRGV2aWNlRXZlbnRIYW5kbGVycygpIHtcbiAgICBpZiAoIXRoaXMuZGV2aWNlKSByZXR1cm47XG5cbiAgICB0aGlzLmRldmljZS5vbignaW5jb21pbmcnLCAoY2FsbDogQ2FsbCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ0luY29taW5nIGNhbGwgcmVjZWl2ZWQ6JywgY2FsbC5wYXJhbWV0ZXJzKTtcbiAgICAgIHRoaXMuY3VycmVudENhbGwubmV4dChjYWxsKTtcbiAgICAgIHRoaXMuY2FsbFR5cGUubmV4dCgnSU5DT01JTkcnKTtcbiAgICAgIHRoaXMuY3VycmVudENhbGxTdGF0ZS5uZXh0KCdpbmNvbWluZycpO1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJpdmNlLnNob3dOb3RpZmljYXRpb24oY2FsbCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRldmljZS5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignVHdpbGlvIERldmljZSBFcnJvcjonLCBlcnJvcik7XG4gICAgICB0aGlzLmRldmljZUluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICBcbiAgICAgIC8vIEF0dGVtcHQgdG8gcmVpbml0aWFsaXplIG9uIGVycm9yXG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMzEyMDEgfHwgZXJyb3IuY29kZSA9PT0gMjAxMDEpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0F1dGhlbnRpY2F0aW9uIGVycm9yLCByZWluaXRpYWxpemluZyBkZXZpY2UuLi4nKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVHdpbGlvRGV2aWNlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRldmljZS5vbigncmVnaXN0ZXJlZCcsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW8gRGV2aWNlIHJlZ2lzdGVyZWQnKTtcbiAgICAgIHRoaXMuZGV2aWNlSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kZXZpY2Uub24oJ3VucmVnaXN0ZXJlZCcsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdUd2lsaW8gRGV2aWNlIHVucmVnaXN0ZXJlZCcpO1xuICAgICAgdGhpcy5kZXZpY2VJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gb25JbmNvbWluZ0NhbGwoKXtcbiAgLy8gICB0aGlzLmRldmljZS5vbignaW5jb21pbmcnLCAoY2FsbDphbnkpID0+IHtcbiAgLy8gICAgIGNvbnNvbGUubG9nKGNhbGwpO1xuICAgICBcbiAgLy8gICAgIC8vY2FsbC5hY2NlcHQoKTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuICBzYXZlQ29udGFjdChwYXlsb2FkOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9hZGQvY29udGFjdHMvbWFudWFsbHknLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cbiAgdXBkYXRlQ29udGFjdChwYXlsb2FkOmFueSl7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdGhpcy50b2tlbn0pIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBkYXRlL2NvbnRhY3QnLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cbiAgXG4gIGRlbGV0ZUNvbnRhY3QoaWQ6c3RyaW5nKXtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIHBob25lYm9va2lkOiBpZFxuICAgIH1cbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kZWxldGUvY29udGFjdC8nK2lkLHBheWxvYWQsIGh0dHBPcHRpb25zKTtcbiAgfVxuICBnZXRDb250YWN0TGlzdCgpe1xuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svcmVhZC9jb250YWN0cycsIGh0dHBPcHRpb25zKTtcbiAgfVxuXG4gIGFkZENvbnRhY3RUb0Zhdm91cml0ZShwYXlsb2FkOiBhbnkpe1xuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3VwZGF0ZS9mYXZvdXJpdGUnLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICBnZXRGYXZvdXJpdENvbnRhY3RzKCl7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9mYXZvdXJpdGUvY29udGFjdHMnLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICBnZXRSZWNlbnRDYWxscyhwYWdlSW5kZXg/OiBzdHJpbmcsIHBhZ2VTaXplPzogc3RyaW5nLCl7XG4gICAgLy8gbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgLy8gcGFyYW1zID0gcGFyYW1zLnNldCgnc2l6ZScsIHBhZ2VTaXplKTtcbiAgICAvLyBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwYWdlJywgcGFnZUluZGV4KTtcbiAgICBjb25zdCBoZWFkZXJzID0gIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfTtcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9e2hlYWRlcnN9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9yZWNlbnQvY2FsbHMnLCBodHRwT3B0aW9ucyk7XG4gIH1cbiAgZGVsZXRlUmVjZW50Q2FsbExvZyhpZDpzdHJpbmd8IHN0cmluZ1tdKXtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIHJlY29yZElkOiBpZFxuICAgIH1cbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kZWxldGUvY2FsbHMvJytpZCxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICB1cGxvYWRQaG90byhwYXlsb2FkOiBhbnkpe1xuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBsb2FkL3Bob3RvJyxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICBkZWxldGVQaG90byhpZDpzdHJpbmcpe1xuICAgIGxldCBwYXlsb2FkID0ge1xuICAgICAgcGhvbmVib29raWQ6IGlkXG4gICAgfVxuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svZGVsZXRlL3Bob3RvLycraWQscGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xuICB9XG5cbiAgLy8gdG9nZ2xlQ2FsbGVySWRBbGVydEZuKHZhbDogYW55KSB7XG4gIC8vICAgbGV0IGh0dHBPcHRpb25zID0ge1xuICAvLyAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgLy8gICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJylcbiAgLy8gICAgIH0pXG4gIC8vICAgfTtcbiAgLy8gICByZXR1cm4gdGhpcy5odHRwLnB1dDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2NhbGxlcmlkL2FsZXJ0LycgKyB2YWwsIHt9LCBodHRwT3B0aW9ucyk7XG4gIC8vIH1cblxuICB0b2dnbGVDb3V0cnlDb2RlVG9hc3QodmFsOmFueSl7XG4gICAgbGV0IGh0dHBPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJylcbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2NvdW50cnljb2RlL2FsZXJ0LycgKyB2YWwsIHt9LCBodHRwT3B0aW9ucyk7XG4gIH1cbiAgZ2V0VG9OdW1iZXIoZGlhbGxlZE5vOiBzdHJpbmcsIGlzb0NvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IGh0dHBPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSksXG4gICAgICBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdpc29Db2RlJywgaXNvQ29kZSlcbiAgICB9O1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdpc29Db2RlJywgaXNvQ29kZSlcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2NoZWNrL2NvdW50cnlDb2RlLycgKyBkaWFsbGVkTm8sIGh0dHBPcHRpb25zKTtcbiAgfSBcblxufVxuIl19
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdpbGlvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvc2VydmljZS90d2lsaW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUdqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7O0FBYzNELE1BQU0sT0FBTyxhQUFhO0lBNEJ4QixZQUNVLElBQWdCLEVBQ2hCLGdCQUFrQyxFQUNsQyxtQkFBd0M7UUFGeEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUE3QmxELDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzVELGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWMsSUFBSSxDQUFDLENBQUM7UUFDckQscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQU0sTUFBTSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFJdEYsYUFBUSxHQUFHLElBQUksZUFBZSxDQUFTLEtBQUssQ0FBQyxDQUFDO1FBQzlDLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsaUNBQWlDO1FBQzdGLFVBQUssR0FBTyxZ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O1NBQ2pELENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDdkQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSyxXQUFXLENBQUMsTUFBTSxHQUFHLHlDQUF5QyxHQUFHLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwSCxDQUFDOzsyR0E3TVUsYUFBYTsrR0FBYixhQUFhLGNBRlosTUFBTTs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzaGFyZVJlcGxheSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGV2aWNlLCBDYWxsIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4vZXh0ZW5zaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vTm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBEaWFsUGF5bG9hZCB7XG4gIG51bWJlcjogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGltZzogc3RyaW5nO1xuICBjYWxsZXJJZDpzdHJpbmc7XG4gIGlzRGlhbEZyb21IaXN0b3J5OmJvb2xlYW47XG4gIGZyb206c3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290JyAgXG59KVxuZXhwb3J0IGNsYXNzIFR3aWxpb1NlcnZpY2Uge1xuICBcbiAgb3BlbkluUHJvZ3Jlc3NEaWFscGFkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGN1cnJlbnRDYWxsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDYWxsIHwgbnVsbD4obnVsbCk7XG4gIGN1cnJlbnRDYWxsU3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oJ25vbmUnKTsgLy9pbi1wcm9ncmVzcywgb3V0LXByb2dyZXNzLCBub25lXG4gIGRldmljZTphbnk7XG4gIGluY29taW5nQ2FsbFRva2VuPzpzdHJpbmc7XG4gIG91dGdvaW5nQ2FsbFRva2VuPzpzdHJpbmc7XG4gIGNhbGxUeXBlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCdOSUwnKTtcbiAgaXNJbmNvbWluZ0NhbGxQaWNrZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTsgLy8gZm9yIGJvdGggaW5jb21pbmcgYW5kIG91dGdvaW5nXG4gIHRva2VuOmFueSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKTtcbiAgaXNOZXdDb250YWN0QWRkZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgdXBkYXRlUmVjZW50Q2FsbCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBjYWxsaGFuZGxlRnJvbU5vdGlmaWNhdGlvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7fSk7XG5cbiAgZW5kQ2FsbCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBkaWFsTnVtYmVyRnJvbU90aGVyTW9kdWxlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEaWFsUGF5bG9hZD4oeyBudW1iZXI6ICcnLCBuYW1lOiAnJywgaW1nOiAnJywgY2FsbGVySWQ6ICcnLCBpc0RpYWxGcm9tSGlzdG9yeTogZmFsc2UsIGZyb206ICcnIH0pO1xuXG4gIHRvZ2dsZUNhbGxlcklkQWxlcnQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBpc1RyaWFsT3ZlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBpc1BheW1lbnREdWUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgaXNBdmFpbGFibGVOdW1iZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgY2FsbGVySWRMaXN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICB0cmlnZ2VyU01TUmVsb2FkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSB0b2tlbkluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgdG9rZW5Jbml0aWFsaXphdGlvbiQ6IE9ic2VydmFibGU8YW55PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgXG4gICAgcHJpdmF0ZSBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VyaXZjZTogTm90aWZpY2F0aW9uU2VydmljZVxuICApIHtcbiAgICB0aGlzLmluaXRpYWxpemVUb2tlbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVG9rZW4oKSB7XG4gICAgaWYgKHRoaXMudG9rZW5Jbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9rZW5Jbml0aWFsaXphdGlvbiQgfHwgb2YobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJCA9IHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRJbmNvbWluZ0NhbGxUb2tlbigpLnBpcGUoXG4gICAgICB0YXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmluY29taW5nQ2FsbFRva2VuID0gZGF0YS50b2tlbjtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2luLXRva2VuJywgZGF0YS50b2tlbik7XG4gICAgICAgIHRoaXMudG9rZW5Jbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURldmljZSgpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIFR3aWxpbyB0b2tlbjonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoMSkgLy8gQ2FjaGUgdGhlIHJlc3VsdCBmb3Igc3Vic2VxdWVudCBzdWJzY3JpYmVyc1xuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy50b2tlbkluaXRpYWxpemF0aW9uJDtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplVHdpbGlvRGV2aWNlKCkge1xuICAgIGlmICh0aGlzLnRva2VuSW5pdGlhbGl6ZWQgJiYgdGhpcy5pbmNvbWluZ0NhbGxUb2tlbikge1xuICAgICAgdGhpcy5pbml0aWFsaXplRGV2aWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVRva2VuKCkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRGV2aWNlKCkge1xuICAgIGlmICh0aGlzLmRldmljZSkge1xuICAgICAgdGhpcy5kZXZpY2UuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pbmNvbWluZ0NhbGxUb2tlbikge1xuICAgICAgY29uc29sZS5lcnJvcignTm8gVHdpbGlvIHRva2VuIGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGV2aWNlID0gbmV3IERldmljZSh0aGlzLmluY29taW5nQ2FsbFRva2VuLCB7IFxuICAgICAgYWxsb3dJbmNvbWluZ1doaWxlQnVzeTogdHJ1ZSxcbiAgICAgIGNsb3NlUHJvdGVjdGlvbjogdHJ1ZVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuZGV2aWNlLnJlZ2lzdGVyKCk7XG5cbiAgICB0aGlzLmRldmljZS5vbignaW5jb21pbmcnLCAoY2FsbDogQ2FsbCkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q2FsbC5uZXh0KGNhbGwpO1xuICAgICAgdGhpcy5jYWxsVHlwZS5uZXh0KCdJTkNPTUlORycpO1xuICAgICAgdGhpcy5jdXJyZW50Q2FsbFN0YXRlLm5leHQoJ2luY29taW5nJyk7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcml2Y2Uuc2hvd05vdGlmaWNhdGlvbihjYWxsKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGV2aWNlLm9uKCdlcnJvcicsIChlcnJvcjogYW55KSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdUd2lsaW8gRGV2aWNlIEVycm9yOicsIGVycm9yKTtcbiAgICAgIC8vIFJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlIG9uIGVycm9yIHRvIGFsbG93IHJldHJ5XG4gICAgICB0aGlzLnRva2VuSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGV2aWNlLm9uKCdyZWdpc3RlcmVkJywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1R3aWxpbyBEZXZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHknKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGV2aWNlLm9uKCd1bnJlZ2lzdGVyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnVHdpbGlvIERldmljZSB1bnJlZ2lzdGVyZWQnKTtcbiAgICAgIHRoaXMudG9rZW5Jbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gb25JbmNvbWluZ0NhbGwoKXtcbiAgLy8gICB0aGlzLmRldmljZS5vbignaW5jb21pbmcnLCAoY2FsbDphbnkpID0+IHtcbiAgLy8gICAgIGNvbnNvbGUubG9nKGNhbGwpO1xuICAgICBcbiAgLy8gICAgIC8vY2FsbC5hY2NlcHQoKTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuICBzYXZlQ29udGFjdChwYXlsb2FkOiBhbnkpOiBPYnNlcnZhYmxlPFtdPiB7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpfSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9hZGQvY29udGFjdHMvbWFudWFsbHknLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cbiAgdXBkYXRlQ29udGFjdChwYXlsb2FkOmFueSl7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgdGhpcy50b2tlbn0pIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBkYXRlL2NvbnRhY3QnLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cbiAgXG4gIGRlbGV0ZUNvbnRhY3QoaWQ6c3RyaW5nKXtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIHBob25lYm9va2lkOiBpZFxuICAgIH1cbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kZWxldGUvY29udGFjdC8nK2lkLHBheWxvYWQsIGh0dHBPcHRpb25zKTtcbiAgfVxuICBnZXRDb250YWN0TGlzdCgpe1xuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svcmVhZC9jb250YWN0cycsIGh0dHBPcHRpb25zKTtcbiAgfVxuXG4gIGFkZENvbnRhY3RUb0Zhdm91cml0ZShwYXlsb2FkOiBhbnkpe1xuICAgIGNvbnN0IGh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aC1LZXknOiBcIkJlYXJlciBcIiArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB9KSB9O1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvcGhvbmVib29rL3VwZGF0ZS9mYXZvdXJpdGUnLCBwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICBnZXRGYXZvdXJpdENvbnRhY3RzKCl7XG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIH0pIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9mYXZvdXJpdGUvY29udGFjdHMnLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICBnZXRSZWNlbnRDYWxscyhwYWdlSW5kZXg/OiBzdHJpbmcsIHBhZ2VTaXplPzogc3RyaW5nLCl7XG4gICAgLy8gbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgLy8gcGFyYW1zID0gcGFyYW1zLnNldCgnc2l6ZScsIHBhZ2VTaXplKTtcbiAgICAvLyBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwYWdlJywgcGFnZUluZGV4KTtcbiAgICBjb25zdCBoZWFkZXJzID0gIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfTtcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9e2hlYWRlcnN9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9yZWNlbnQvY2FsbHMnLCBodHRwT3B0aW9ucyk7XG4gIH1cbiAgZGVsZXRlUmVjZW50Q2FsbExvZyhpZDpzdHJpbmd8IHN0cmluZ1tdKXtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIHJlY29yZElkOiBpZFxuICAgIH1cbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSkgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8W10+KGVudmlyb25tZW50LmFwaVVybCArICcvdXRpbGl0aWVzL3Bob25lYm9vay9kZWxldGUvY2FsbHMvJytpZCxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICB1cGxvYWRQaG90byhwYXlsb2FkOiBhbnkpe1xuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svdXBsb2FkL3Bob3RvJyxwYXlsb2FkLCBodHRwT3B0aW9ucyk7XG4gIH1cblxuICBkZWxldGVQaG90byhpZDpzdHJpbmcpe1xuICAgIGxldCBwYXlsb2FkID0ge1xuICAgICAgcGhvbmVib29raWQ6IGlkXG4gICAgfVxuICAgIGxldCBodHRwT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBdXRoLUtleSc6IFwiQmVhcmVyIFwiICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFtdPihlbnZpcm9ubWVudC5hcGlVcmwgKyAnL3V0aWxpdGllcy9waG9uZWJvb2svZGVsZXRlL3Bob3RvLycraWQscGF5bG9hZCwgaHR0cE9wdGlvbnMpO1xuICB9XG5cbiAgLy8gdG9nZ2xlQ2FsbGVySWRBbGVydEZuKHZhbDogYW55KSB7XG4gIC8vICAgbGV0IGh0dHBPcHRpb25zID0ge1xuICAvLyAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgLy8gICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJylcbiAgLy8gICAgIH0pXG4gIC8vICAgfTtcbiAgLy8gICByZXR1cm4gdGhpcy5odHRwLnB1dDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2NhbGxlcmlkL2FsZXJ0LycgKyB2YWwsIHt9LCBodHRwT3B0aW9ucyk7XG4gIC8vIH1cblxuICB0b2dnbGVDb3V0cnlDb2RlVG9hc3QodmFsOmFueSl7XG4gICAgbGV0IGh0dHBPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJylcbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2NvdW50cnljb2RlL2FsZXJ0LycgKyB2YWwsIHt9LCBodHRwT3B0aW9ucyk7XG4gIH1cbiAgZ2V0VG9OdW1iZXIoZGlhbGxlZE5vOiBzdHJpbmcsIGlzb0NvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IGh0dHBPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGgtS2V5JzogXCJCZWFyZXIgXCIgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfSksXG4gICAgICBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdpc29Db2RlJywgaXNvQ29kZSlcbiAgICB9O1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdpc29Db2RlJywgaXNvQ29kZSlcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxbXT4oZW52aXJvbm1lbnQuYXBpVXJsICsgJy91dGlsaXRpZXMvc29mdHBob25lL2NoZWNrL2NvdW50cnlDb2RlLycgKyBkaWFsbGVkTm8sIGh0dHBPcHRpb25zKTtcbiAgfSBcblxufVxuIl19
|
|
@@ -3,11 +3,11 @@ import * as i0 from '@angular/core';
|
|
|
3
3
|
import { Injectable, EventEmitter, Component, Input, Output, ViewChild, Inject, NgModule } from '@angular/core';
|
|
4
4
|
import swal from 'sweetalert2';
|
|
5
5
|
import { AsYouType } from 'libphonenumber-js';
|
|
6
|
-
import { throwError, BehaviorSubject, interval, Subscription } from 'rxjs';
|
|
6
|
+
import { throwError, BehaviorSubject, of, interval, Subscription } from 'rxjs';
|
|
7
7
|
import * as i1 from '@angular/common/http';
|
|
8
8
|
import { HttpHeaders, HttpParams, HttpClientModule } from '@angular/common/http';
|
|
9
|
+
import { catchError, switchMap, map, tap, shareReplay } from 'rxjs/operators';
|
|
9
10
|
import { Device } from '@twilio/voice-sdk';
|
|
10
|
-
import { catchError, switchMap, map } from 'rxjs/operators';
|
|
11
11
|
import * as i3$1 from '@angular/material/dialog';
|
|
12
12
|
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
13
13
|
import * as i5 from '@angular/router';
|
|
@@ -1388,85 +1388,48 @@ class TwilioService {
|
|
|
1388
1388
|
this.isAvailableNumber = new BehaviorSubject(false);
|
|
1389
1389
|
this.callerIdList = new BehaviorSubject([]);
|
|
1390
1390
|
this.triggerSMSReload = new BehaviorSubject(false);
|
|
1391
|
-
this.
|
|
1392
|
-
this.
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1391
|
+
this.tokenInitialized = false;
|
|
1392
|
+
this.tokenInitialization$ = null;
|
|
1393
|
+
this.initializeToken();
|
|
1394
|
+
}
|
|
1395
|
+
initializeToken() {
|
|
1396
|
+
if (this.tokenInitialized) {
|
|
1397
|
+
return this.tokenInitialization$ || of(null);
|
|
1397
1398
|
}
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
}, 2000);
|
|
1399
|
+
this.tokenInitialization$ = this.extensionService.getIncomingCallToken().pipe(tap((data) => {
|
|
1400
|
+
this.incomingCallToken = data.token;
|
|
1401
|
+
localStorage.setItem('in-token', data.token);
|
|
1402
|
+
this.tokenInitialized = true;
|
|
1403
|
+
this.initializeDevice();
|
|
1404
|
+
}), catchError(error => {
|
|
1405
|
+
console.error('Error initializing Twilio token:', error);
|
|
1406
|
+
return throwError(() => error);
|
|
1407
|
+
}), shareReplay(1) // Cache the result for subsequent subscribers
|
|
1408
|
+
);
|
|
1409
|
+
return this.tokenInitialization$;
|
|
1410
1410
|
}
|
|
1411
|
-
|
|
1412
|
-
if (this.
|
|
1413
|
-
|
|
1411
|
+
initializeTwilioDevice() {
|
|
1412
|
+
if (this.tokenInitialized && this.incomingCallToken) {
|
|
1413
|
+
this.initializeDevice();
|
|
1414
|
+
}
|
|
1415
|
+
else {
|
|
1416
|
+
this.initializeToken().subscribe();
|
|
1414
1417
|
}
|
|
1418
|
+
}
|
|
1419
|
+
initializeDevice() {
|
|
1415
1420
|
if (this.device) {
|
|
1416
1421
|
this.device.destroy();
|
|
1417
1422
|
}
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
// Prevent multiple initializations
|
|
1421
|
-
if (this.deviceInitialized || this.initializationInProgress || !this.token) {
|
|
1423
|
+
if (!this.incomingCallToken) {
|
|
1424
|
+
console.error('No Twilio token available');
|
|
1422
1425
|
return;
|
|
1423
1426
|
}
|
|
1424
|
-
this.
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
try {
|
|
1428
|
-
this.incomingCallToken = data.token;
|
|
1429
|
-
localStorage.setItem('in-token', data.token);
|
|
1430
|
-
// Destroy existing device if it exists
|
|
1431
|
-
if (this.device) {
|
|
1432
|
-
this.device.destroy();
|
|
1433
|
-
}
|
|
1434
|
-
// Initialize Twilio Device with required options
|
|
1435
|
-
const deviceOptions = {
|
|
1436
|
-
allowIncomingWhileBusy: true,
|
|
1437
|
-
closeProtection: true
|
|
1438
|
-
};
|
|
1439
|
-
// Only add debug in development
|
|
1440
|
-
if (!environment.production) {
|
|
1441
|
-
deviceOptions.debug = false;
|
|
1442
|
-
}
|
|
1443
|
-
this.device = new Device(this.incomingCallToken, deviceOptions);
|
|
1444
|
-
this.device.register();
|
|
1445
|
-
this.deviceInitialized = true;
|
|
1446
|
-
this.initializationInProgress = false;
|
|
1447
|
-
console.log('Twilio Device initialized successfully');
|
|
1448
|
-
this.setupDeviceEventHandlers();
|
|
1449
|
-
}
|
|
1450
|
-
catch (error) {
|
|
1451
|
-
console.error('Error initializing Twilio Device:', error);
|
|
1452
|
-
this.initializationInProgress = false;
|
|
1453
|
-
// Retry after a delay
|
|
1454
|
-
setTimeout(() => this.initializeTwilioDevice(), 5000);
|
|
1455
|
-
}
|
|
1456
|
-
},
|
|
1457
|
-
error: (error) => {
|
|
1458
|
-
console.error('Error getting Twilio token:', error);
|
|
1459
|
-
this.initializationInProgress = false;
|
|
1460
|
-
// Retry after a delay
|
|
1461
|
-
setTimeout(() => this.initializeTwilioDevice(), 5000);
|
|
1462
|
-
}
|
|
1427
|
+
this.device = new Device(this.incomingCallToken, {
|
|
1428
|
+
allowIncomingWhileBusy: true,
|
|
1429
|
+
closeProtection: true
|
|
1463
1430
|
});
|
|
1464
|
-
|
|
1465
|
-
setupDeviceEventHandlers() {
|
|
1466
|
-
if (!this.device)
|
|
1467
|
-
return;
|
|
1431
|
+
this.device.register();
|
|
1468
1432
|
this.device.on('incoming', (call) => {
|
|
1469
|
-
console.log('Incoming call received:', call.parameters);
|
|
1470
1433
|
this.currentCall.next(call);
|
|
1471
1434
|
this.callType.next('INCOMING');
|
|
1472
1435
|
this.currentCallState.next('incoming');
|
|
@@ -1474,20 +1437,15 @@ class TwilioService {
|
|
|
1474
1437
|
});
|
|
1475
1438
|
this.device.on('error', (error) => {
|
|
1476
1439
|
console.error('Twilio Device Error:', error);
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
if (error.code === 31201 || error.code === 20101) {
|
|
1480
|
-
console.log('Authentication error, reinitializing device...');
|
|
1481
|
-
this.initializeTwilioDevice();
|
|
1482
|
-
}
|
|
1440
|
+
// Reset initialization state on error to allow retry
|
|
1441
|
+
this.tokenInitialized = false;
|
|
1483
1442
|
});
|
|
1484
1443
|
this.device.on('registered', () => {
|
|
1485
|
-
console.log('Twilio Device registered');
|
|
1486
|
-
this.deviceInitialized = true;
|
|
1444
|
+
console.log('Twilio Device registered successfully');
|
|
1487
1445
|
});
|
|
1488
1446
|
this.device.on('unregistered', () => {
|
|
1489
1447
|
console.log('Twilio Device unregistered');
|
|
1490
|
-
this.
|
|
1448
|
+
this.tokenInitialized = false;
|
|
1491
1449
|
});
|
|
1492
1450
|
}
|
|
1493
1451
|
// onIncomingCall(){
|
|
@@ -2299,28 +2257,7 @@ class DialboxComponent {
|
|
|
2299
2257
|
return;
|
|
2300
2258
|
this.token = localStorage.getItem('ext_token') || '';
|
|
2301
2259
|
if (!this.token) {
|
|
2302
|
-
console.
|
|
2303
|
-
// Clear any existing interval to prevent multiple intervals
|
|
2304
|
-
if (this.twilioInitializationInterval) {
|
|
2305
|
-
clearInterval(this.twilioInitializationInterval);
|
|
2306
|
-
}
|
|
2307
|
-
// Set up a check for when token becomes available
|
|
2308
|
-
this.twilioInitializationInterval = setInterval(() => {
|
|
2309
|
-
const newToken = localStorage.getItem('ext_token');
|
|
2310
|
-
if (newToken) {
|
|
2311
|
-
clearInterval(this.twilioInitializationInterval);
|
|
2312
|
-
this.token = newToken;
|
|
2313
|
-
this.initializeTwilio();
|
|
2314
|
-
}
|
|
2315
|
-
}, 2000);
|
|
2316
|
-
// Add cleanup for this interval
|
|
2317
|
-
this.subscriptions.add({
|
|
2318
|
-
unsubscribe: () => {
|
|
2319
|
-
if (this.twilioInitializationInterval) {
|
|
2320
|
-
clearInterval(this.twilioInitializationInterval);
|
|
2321
|
-
}
|
|
2322
|
-
}
|
|
2323
|
-
});
|
|
2260
|
+
console.error('No authentication token found');
|
|
2324
2261
|
return;
|
|
2325
2262
|
}
|
|
2326
2263
|
this.isInitialized = true;
|
|
@@ -2439,10 +2376,8 @@ class DialboxComponent {
|
|
|
2439
2376
|
// }
|
|
2440
2377
|
ngOnInit() {
|
|
2441
2378
|
try {
|
|
2442
|
-
// Initialize Twilio when component loads
|
|
2443
|
-
this.initializeTwilio();
|
|
2444
|
-
// Get token and load initial data
|
|
2445
2379
|
this.token = localStorage.getItem('ext_token') || '';
|
|
2380
|
+
//this.isCallInProgress = true;
|
|
2446
2381
|
this.getContactList();
|
|
2447
2382
|
this.getUserCallSetting();
|
|
2448
2383
|
const sub1 = this.twilioService.dialNumberFromOtherModule.subscribe((contact) => {
|
|
@@ -3308,13 +3243,6 @@ class DialboxComponent {
|
|
|
3308
3243
|
if (this.subscriptions) {
|
|
3309
3244
|
this.subscriptions.unsubscribe();
|
|
3310
3245
|
}
|
|
3311
|
-
// Clear any active intervals
|
|
3312
|
-
if (this.tokenCheckInterval) {
|
|
3313
|
-
clearInterval(this.tokenCheckInterval);
|
|
3314
|
-
}
|
|
3315
|
-
if (this.twilioInitializationInterval) {
|
|
3316
|
-
clearInterval(this.twilioInitializationInterval);
|
|
3317
|
-
}
|
|
3318
3246
|
// Clean up Twilio device when component is destroyed
|
|
3319
3247
|
if (this.twilioService['device']) {
|
|
3320
3248
|
this.twilioService['device'].destroy();
|