@hivegpt/hiveai-angular 0.0.581 → 0.0.583
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/bundles/hivegpt-hiveai-angular.umd.js +420 -490
- package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
- package/esm2015/hivegpt-hiveai-angular.js +4 -5
- package/esm2015/lib/components/voice-agent/services/audio-analyzer.service.js +3 -3
- package/esm2015/lib/components/voice-agent/services/voice-agent.service.js +195 -83
- package/esm2015/lib/components/voice-agent/services/websocket-voice-client.service.js +160 -49
- package/esm2015/lib/components/voice-agent/voice-agent.module.js +3 -5
- package/fesm2015/hivegpt-hiveai-angular.js +338 -416
- package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
- package/hivegpt-hiveai-angular.d.ts +3 -4
- package/hivegpt-hiveai-angular.d.ts.map +1 -1
- package/hivegpt-hiveai-angular.metadata.json +1 -1
- package/lib/components/voice-agent/services/audio-analyzer.service.d.ts +2 -2
- package/lib/components/voice-agent/services/voice-agent.service.d.ts +22 -13
- package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
- package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts +30 -20
- package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts.map +1 -1
- package/lib/components/voice-agent/voice-agent.module.d.ts +1 -1
- package/lib/components/voice-agent/voice-agent.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/esm2015/lib/components/voice-agent/services/daily-voice-client.service.js +0 -305
- package/lib/components/voice-agent/services/daily-voice-client.service.d.ts +0 -62
- package/lib/components/voice-agent/services/daily-voice-client.service.d.ts.map +0 -1
|
@@ -1,71 +1,79 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable, NgZone } from '@angular/core';
|
|
2
3
|
import { Subject } from 'rxjs';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
/**
|
|
5
|
-
* WebSocket
|
|
6
|
+
* Native WebSocket client for voice session (signaling, transcripts, speaking hints).
|
|
6
7
|
* CRITICAL: Uses native WebSocket only. NO Socket.IO, NO ngx-socket-io.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - Parse JSON messages (room_created, user_transcript, bot_transcript)
|
|
11
|
-
* - Emit roomCreated$, userTranscript$, botTranscript$
|
|
12
|
-
* - NO audio logic, NO mic logic. Audio is handled by Daily.js (WebRTC).
|
|
9
|
+
* Connects to `ws_url` from `POST {baseUrl}/ai/ask-voice-socket`.
|
|
10
|
+
* Parses JSON messages for transcripts and optional assistant/user speaking flags.
|
|
13
11
|
*/
|
|
14
12
|
export class WebSocketVoiceClientService {
|
|
15
|
-
constructor() {
|
|
13
|
+
constructor(ngZone) {
|
|
14
|
+
this.ngZone = ngZone;
|
|
16
15
|
this.ws = null;
|
|
17
|
-
|
|
16
|
+
/** True when {@link disconnect} initiated the close (not counted as remote close). */
|
|
17
|
+
this.closeInitiatedByClient = false;
|
|
18
|
+
this.openedSubject = new Subject();
|
|
19
|
+
this.remoteCloseSubject = new Subject();
|
|
18
20
|
this.userTranscriptSubject = new Subject();
|
|
19
21
|
this.botTranscriptSubject = new Subject();
|
|
20
|
-
|
|
21
|
-
this.
|
|
22
|
-
|
|
22
|
+
this.assistantSpeakingSubject = new Subject();
|
|
23
|
+
this.serverUserSpeakingSubject = new Subject();
|
|
24
|
+
this.audioChunkSubject = new Subject();
|
|
25
|
+
/** Fires once each time the WebSocket reaches OPEN. */
|
|
26
|
+
this.opened$ = this.openedSubject.asObservable();
|
|
27
|
+
/** Fires when the socket closes without a client-initiated {@link disconnect}. */
|
|
28
|
+
this.remoteClose$ = this.remoteCloseSubject.asObservable();
|
|
23
29
|
this.userTranscript$ = this.userTranscriptSubject.asObservable();
|
|
24
|
-
/** Emits bot transcript updates. */
|
|
25
30
|
this.botTranscript$ = this.botTranscriptSubject.asObservable();
|
|
31
|
+
/** Assistant/bot speaking, when the server sends explicit events (see {@link handleJsonMessage}). */
|
|
32
|
+
this.assistantSpeaking$ = this.assistantSpeakingSubject.asObservable();
|
|
33
|
+
/** User speaking from server-side VAD, if provided. */
|
|
34
|
+
this.serverUserSpeaking$ = this.serverUserSpeakingSubject.asObservable();
|
|
35
|
+
/** Binary audio frames from server (when backend streams bot audio over WS). */
|
|
36
|
+
this.audioChunk$ = this.audioChunkSubject.asObservable();
|
|
26
37
|
}
|
|
27
|
-
/** Connect to signaling WebSocket. No audio over this connection. */
|
|
28
38
|
connect(wsUrl) {
|
|
29
39
|
var _a;
|
|
30
40
|
if (((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) {
|
|
31
41
|
return;
|
|
32
42
|
}
|
|
33
43
|
if (this.ws) {
|
|
44
|
+
this.closeInitiatedByClient = true;
|
|
34
45
|
this.ws.close();
|
|
35
|
-
this.ws = null;
|
|
36
46
|
}
|
|
37
47
|
try {
|
|
38
|
-
|
|
39
|
-
this.ws
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
else if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'bot_transcript' && typeof msg.text === 'string') {
|
|
56
|
-
this.botTranscriptSubject.next(msg.text);
|
|
48
|
+
const socket = new WebSocket(wsUrl);
|
|
49
|
+
this.ws = socket;
|
|
50
|
+
socket.onopen = () => {
|
|
51
|
+
if (this.ws !== socket)
|
|
52
|
+
return;
|
|
53
|
+
this.ngZone.run(() => this.openedSubject.next());
|
|
54
|
+
};
|
|
55
|
+
socket.onmessage = (event) => {
|
|
56
|
+
if (this.ws !== socket)
|
|
57
|
+
return;
|
|
58
|
+
void this.handleIncomingMessage(event.data);
|
|
59
|
+
};
|
|
60
|
+
socket.onerror = () => {
|
|
61
|
+
this.ngZone.run(() => {
|
|
62
|
+
if (this.ws === socket && socket.readyState !== WebSocket.CLOSED) {
|
|
63
|
+
socket.close();
|
|
57
64
|
}
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
socket.onclose = () => {
|
|
68
|
+
if (this.ws === socket) {
|
|
69
|
+
this.ws = null;
|
|
58
70
|
}
|
|
59
|
-
|
|
60
|
-
|
|
71
|
+
const client = this.closeInitiatedByClient;
|
|
72
|
+
this.closeInitiatedByClient = false;
|
|
73
|
+
if (!client) {
|
|
74
|
+
this.ngZone.run(() => this.remoteCloseSubject.next());
|
|
61
75
|
}
|
|
62
76
|
};
|
|
63
|
-
this.ws.onerror = () => {
|
|
64
|
-
this.disconnect();
|
|
65
|
-
};
|
|
66
|
-
this.ws.onclose = () => {
|
|
67
|
-
this.ws = null;
|
|
68
|
-
};
|
|
69
77
|
}
|
|
70
78
|
catch (err) {
|
|
71
79
|
console.error('WebSocketVoiceClient: connect failed', err);
|
|
@@ -73,23 +81,126 @@ export class WebSocketVoiceClientService {
|
|
|
73
81
|
throw err;
|
|
74
82
|
}
|
|
75
83
|
}
|
|
76
|
-
|
|
84
|
+
handleIncomingMessage(payload) {
|
|
85
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
if (typeof payload === 'string') {
|
|
87
|
+
this.handleJsonString(payload);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (payload instanceof ArrayBuffer) {
|
|
91
|
+
this.handleBinaryMessage(payload);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (payload instanceof Blob) {
|
|
95
|
+
const ab = yield payload.arrayBuffer();
|
|
96
|
+
this.handleBinaryMessage(ab);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
handleJsonString(jsonText) {
|
|
101
|
+
try {
|
|
102
|
+
const msg = JSON.parse(jsonText);
|
|
103
|
+
this.ngZone.run(() => this.handleJsonMessage(msg));
|
|
104
|
+
}
|
|
105
|
+
catch (_a) {
|
|
106
|
+
// Ignore non-JSON
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
handleBinaryMessage(buffer) {
|
|
110
|
+
// Some backends wrap JSON events inside binary WS frames.
|
|
111
|
+
const maybeText = this.tryDecodeUtf8(buffer);
|
|
112
|
+
if (maybeText !== null) {
|
|
113
|
+
this.handleJsonString(maybeText);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Otherwise treat binary as streamed assistant audio.
|
|
117
|
+
this.ngZone.run(() => this.audioChunkSubject.next(buffer));
|
|
118
|
+
}
|
|
119
|
+
tryDecodeUtf8(buffer) {
|
|
120
|
+
try {
|
|
121
|
+
const text = new TextDecoder('utf-8', { fatal: true }).decode(buffer);
|
|
122
|
+
const trimmed = text.trim();
|
|
123
|
+
if (!trimmed || (trimmed[0] !== '{' && trimmed[0] !== '[')) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
return trimmed;
|
|
127
|
+
}
|
|
128
|
+
catch (_a) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
handleJsonMessage(msg) {
|
|
133
|
+
const type = msg.type;
|
|
134
|
+
const typeStr = typeof type === 'string' ? type : '';
|
|
135
|
+
if (typeStr === 'session_ready' || typeStr === 'connected' || typeStr === 'voice_session_started') {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (typeStr === 'assistant_speaking' ||
|
|
139
|
+
typeStr === 'bot_speaking') {
|
|
140
|
+
if (msg.active === true || msg.speaking === true) {
|
|
141
|
+
this.assistantSpeakingSubject.next(true);
|
|
142
|
+
}
|
|
143
|
+
else if (msg.active === false || msg.speaking === false) {
|
|
144
|
+
this.assistantSpeakingSubject.next(false);
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (typeStr === 'user_speaking') {
|
|
149
|
+
if (msg.active === true || msg.speaking === true) {
|
|
150
|
+
this.serverUserSpeakingSubject.next(true);
|
|
151
|
+
}
|
|
152
|
+
else if (msg.active === false || msg.speaking === false) {
|
|
153
|
+
this.serverUserSpeakingSubject.next(false);
|
|
154
|
+
}
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (typeStr === 'input_audio_buffer.speech_started') {
|
|
158
|
+
this.serverUserSpeakingSubject.next(true);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (typeStr === 'input_audio_buffer.speech_stopped') {
|
|
162
|
+
this.serverUserSpeakingSubject.next(false);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (typeStr === 'response.audio.delta') {
|
|
166
|
+
this.assistantSpeakingSubject.next(true);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (typeStr === 'response.audio.done' ||
|
|
170
|
+
typeStr === 'response.output_audio.done') {
|
|
171
|
+
this.assistantSpeakingSubject.next(false);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (typeStr === 'user_transcript' && typeof msg.text === 'string') {
|
|
175
|
+
this.userTranscriptSubject.next({
|
|
176
|
+
text: msg.text,
|
|
177
|
+
final: msg.final === true,
|
|
178
|
+
});
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (typeStr === 'bot_transcript' && typeof msg.text === 'string') {
|
|
182
|
+
this.botTranscriptSubject.next(msg.text);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
77
185
|
disconnect() {
|
|
78
|
-
if (this.ws) {
|
|
79
|
-
|
|
80
|
-
this.ws = null;
|
|
186
|
+
if (!this.ws) {
|
|
187
|
+
return;
|
|
81
188
|
}
|
|
189
|
+
this.closeInitiatedByClient = true;
|
|
190
|
+
this.ws.close();
|
|
82
191
|
}
|
|
83
|
-
/** Whether the WebSocket is open. */
|
|
84
192
|
get isConnected() {
|
|
85
193
|
var _a;
|
|
86
194
|
return ((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN;
|
|
87
195
|
}
|
|
88
196
|
}
|
|
89
|
-
WebSocketVoiceClientService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WebSocketVoiceClientService_Factory() { return new WebSocketVoiceClientService(); }, token: WebSocketVoiceClientService, providedIn: "root" });
|
|
197
|
+
WebSocketVoiceClientService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WebSocketVoiceClientService_Factory() { return new WebSocketVoiceClientService(i0.ɵɵinject(i0.NgZone)); }, token: WebSocketVoiceClientService, providedIn: "root" });
|
|
90
198
|
WebSocketVoiceClientService.decorators = [
|
|
91
199
|
{ type: Injectable, args: [{
|
|
92
200
|
providedIn: 'root',
|
|
93
201
|
},] }
|
|
94
202
|
];
|
|
95
|
-
|
|
203
|
+
WebSocketVoiceClientService.ctorParameters = () => [
|
|
204
|
+
{ type: NgZone }
|
|
205
|
+
];
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXZvaWNlLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3NlcnZpY2VzL3dlYnNvY2tldC12b2ljZS1jbGllbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUF1QjNDOzs7Ozs7R0FNRztBQUlILE1BQU0sT0FBTywyQkFBMkI7SUFvQ3RDLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBbkMxQixPQUFFLEdBQXFCLElBQUksQ0FBQztRQUNwQyxzRkFBc0Y7UUFDOUUsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNwQyx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3pDLDBCQUFxQixHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO1FBQ3RELHlCQUFvQixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFDN0MsNkJBQXdCLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUNsRCw4QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ25ELHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFFdkQsdURBQXVEO1FBQ3ZELFlBQU8sR0FBcUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUU5RCxrRkFBa0Y7UUFDbEYsaUJBQVksR0FBcUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlB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QUssS0FBSyxJQUFJO2FBQzFCLENBQUMsQ0FBQztZQUNILE9BQU87U0FDUjtRQUNELElBQUksT0FBTyxLQUFLLGdCQUFnQixJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDaEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUM7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFdBQVc7O1FBQ2IsT0FBTyxDQUFBLE1BQUEsSUFBSSxDQUFDLEVBQUUsMENBQUUsVUFBVSxNQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDaEQsQ0FBQzs7OztZQTdNRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQWpDb0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG4vKiogV2ViU29ja2V0IG1lc3NhZ2UgdHlwZXMgZnJvbSBiYWNrZW5kICh2b2ljZSBzZXNzaW9uIG92ZXIgYSBzaW5nbGUgV1MpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc01lc3NhZ2VVc2VyVHJhbnNjcmlwdCB7XG4gIHR5cGU6ICd1c2VyX3RyYW5zY3JpcHQnO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGZpbmFsPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXc01lc3NhZ2VCb3RUcmFuc2NyaXB0IHtcbiAgdHlwZTogJ2JvdF90cmFuc2NyaXB0JztcbiAgdGV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBXc01lc3NhZ2UgPVxuICB8IFdzTWVzc2FnZVVzZXJUcmFuc2NyaXB0XG4gIHwgV3NNZXNzYWdlQm90VHJhbnNjcmlwdDtcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2NyaXB0RGF0YSB7XG4gIHRleHQ6IHN0cmluZztcbiAgZmluYWw6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTmF0aXZlIFdlYlNvY2tldCBjbGllbnQgZm9yIHZvaWNlIHNlc3Npb24gKHNpZ25hbGluZywgdHJhbnNjcmlwdHMsIHNwZWFraW5nIGhpbnRzKS5cbiAqIENSSVRJQ0FMOiBVc2VzIG5hdGl2ZSBXZWJTb2NrZXQgb25seS4gTk8gU29ja2V0LklPLCBOTyBuZ3gtc29ja2V0LWlvLlxuICpcbiAqIENvbm5lY3RzIHRvIGB3c191cmxgIGZyb20gYFBPU1Qge2Jhc2VVcmx9L2FpL2Fzay12b2ljZS1zb2NrZXRgLlxuICogUGFyc2VzIEpTT04gbWVzc2FnZXMgZm9yIHRyYW5zY3JpcHRzIGFuZCBvcHRpb25hbCBhc3Npc3RhbnQvdXNlciBzcGVha2luZyBmbGFncy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFZvaWNlQ2xpZW50U2VydmljZSB7XG4gIHByaXZhdGUgd3M6IFdlYlNvY2tldCB8IG51bGwgPSBudWxsO1xuICAvKiogVHJ1ZSB3aGVuIHtAbGluayBkaXNjb25uZWN0fSBpbml0aWF0ZWQgdGhlIGNsb3NlIChub3QgY291bnRlZCBhcyByZW1vdGUgY2xvc2UpLiAqL1xuICBwcml2YXRlIGNsb3NlSW5pdGlhdGVkQnlDbGllbnQgPSBmYWxzZTtcblxuICBwcml2YXRlIG9wZW5lZFN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlbW90ZUNsb3NlU3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgdXNlclRyYW5zY3JpcHRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VHJhbnNjcmlwdERhdGE+KCk7XG4gIHByaXZhdGUgYm90VHJhbnNjcmlwdFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgYXNzaXN0YW50U3BlYWtpbmdTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSBzZXJ2ZXJVc2VyU3BlYWtpbmdTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSBhdWRpb0NodW5rU3ViamVjdCA9IG5ldyBTdWJqZWN0PEFycmF5QnVmZmVyPigpO1xuXG4gIC8qKiBGaXJlcyBvbmNlIGVhY2ggdGltZSB0aGUgV2ViU29ja2V0IHJlYWNoZXMgT1BFTi4gKi9cbiAgb3BlbmVkJDogT2JzZXJ2YWJsZTx2b2lkPiA9IHRoaXMub3BlbmVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogRmlyZXMgd2hlbiB0aGUgc29ja2V0IGNsb3NlcyB3aXRob3V0IGEgY2xpZW50LWluaXRpYXRlZCB7QGxpbmsgZGlzY29ubmVjdH0uICovXG4gIHJlbW90ZUNsb3NlJDogT2JzZXJ2YWJsZTx2b2lkPiA9IHRoaXMucmVtb3RlQ2xvc2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHVzZXJUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxUcmFuc2NyaXB0RGF0YT4gPVxuICAgIHRoaXMudXNlclRyYW5zY3JpcHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGJvdFRyYW5zY3JpcHQkOiBPYnNlcnZhYmxlPHN0cmluZz4gPVxuICAgIHRoaXMuYm90VHJhbnNjcmlwdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIEFzc2lzdGFudC9ib3Qgc3BlYWtpbmcsIHdoZW4gdGhlIHNlcnZlciBzZW5kcyBleHBsaWNpdCBldmVudHMgKHNlZSB7QGxpbmsgaGFuZGxlSnNvbk1lc3NhZ2V9KS4gKi9cbiAgYXNzaXN0YW50U3BlYWtpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID1cbiAgICB0aGlzLmFzc2lzdGFudFNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogVXNlciBzcGVha2luZyBmcm9tIHNlcnZlci1zaWRlIFZBRCwgaWYgcHJvdmlkZWQuICovXG4gIHNlcnZlclVzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPVxuICAgIHRoaXMuc2VydmVyVXNlclNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogQmluYXJ5IGF1ZGlvIGZyYW1lcyBmcm9tIHNlcnZlciAod2hlbiBiYWNrZW5kIHN0cmVhbXMgYm90IGF1ZGlvIG92ZXIgV1MpLiAqL1xuICBhdWRpb0NodW5rJDogT2JzZXJ2YWJsZTxBcnJheUJ1ZmZlcj4gPSB0aGlzLmF1ZGlvQ2h1bmtTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgY29ubmVjdCh3c1VybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLndzKSB7XG4gICAgICB0aGlzLmNsb3NlSW5pdGlhdGVkQnlDbGllbnQgPSB0cnVlO1xuICAgICAgdGhpcy53cy5jbG9zZSgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICAgIHRoaXMud3MgPSBzb2NrZXQ7XG4gICAgICBzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy53cyAhPT0gc29ja2V0KSByZXR1cm47XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9wZW5lZFN1YmplY3QubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBzb2NrZXQub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMud3MgIT09IHNvY2tldCkgcmV0dXJuO1xuICAgICAgICB2b2lkIHRoaXMuaGFuZGxlSW5jb21pbmdNZXNzYWdlKGV2ZW50LmRhdGEpO1xuICAgICAgfTtcbiAgICAgIHNvY2tldC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLndzID09PSBzb2NrZXQgJiYgc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5DTE9TRUQpIHtcbiAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLndzID09PSBzb2NrZXQpIHtcbiAgICAgICAgICB0aGlzLndzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsb3NlSW5pdGlhdGVkQnlDbGllbnQ7XG4gICAgICAgIHRoaXMuY2xvc2VJbml0aWF0ZWRCeUNsaWVudCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWNsaWVudCkge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnJlbW90ZUNsb3NlU3ViamVjdC5uZXh0KCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignV2ViU29ja2V0Vm9pY2VDbGllbnQ6IGNvbm5lY3QgZmFpbGVkJywgZXJyKTtcbiAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW5jb21pbmdNZXNzYWdlKHBheWxvYWQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmhhbmRsZUpzb25TdHJpbmcocGF5bG9hZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwYXlsb2FkIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRoaXMuaGFuZGxlQmluYXJ5TWVzc2FnZShwYXlsb2FkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHBheWxvYWQgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICBjb25zdCBhYiA9IGF3YWl0IHBheWxvYWQuYXJyYXlCdWZmZXIoKTtcbiAgICAgIHRoaXMuaGFuZGxlQmluYXJ5TWVzc2FnZShhYik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVKc29uU3RyaW5nKGpzb25UZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbXNnID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5oYW5kbGVKc29uTWVzc2FnZShtc2cpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yZSBub24tSlNPTlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQmluYXJ5TWVzc2FnZShidWZmZXI6IEFycmF5QnVmZmVyKTogdm9pZCB7XG4gICAgLy8gU29tZSBiYWNrZW5kcyB3cmFwIEpTT04gZXZlbnRzIGluc2lkZSBiaW5hcnkgV1MgZnJhbWVzLlxuICAgIGNvbnN0IG1heWJlVGV4dCA9IHRoaXMudHJ5RGVjb2RlVXRmOChidWZmZXIpO1xuICAgIGlmIChtYXliZVRleHQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuaGFuZGxlSnNvblN0cmluZyhtYXliZVRleHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UgdHJlYXQgYmluYXJ5IGFzIHN0cmVhbWVkIGFzc2lzdGFudCBhdWRpby5cbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5hdWRpb0NodW5rU3ViamVjdC5uZXh0KGJ1ZmZlcikpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnlEZWNvZGVVdGY4KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGV4dCA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7IGZhdGFsOiB0cnVlIH0pLmRlY29kZShidWZmZXIpO1xuICAgICAgY29uc3QgdHJpbW1lZCA9IHRleHQudHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkIHx8ICh0cmltbWVkWzBdICE9PSAneycgJiYgdHJpbW1lZFswXSAhPT0gJ1snKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmltbWVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVKc29uTWVzc2FnZShtc2c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgY29uc3QgdHlwZSA9IG1zZy50eXBlO1xuICAgIGNvbnN0IHR5cGVTdHIgPSB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyB0eXBlIDogJyc7XG5cbiAgICBpZiAodHlwZVN0ciA9PT0gJ3Nlc3Npb25fcmVhZHknIHx8IHR5cGVTdHIgPT09ICdjb25uZWN0ZWQnIHx8IHR5cGVTdHIgPT09ICd2b2ljZV9zZXNzaW9uX3N0YXJ0ZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZVN0ciA9PT0gJ2Fzc2lzdGFudF9zcGVha2luZycgfHxcbiAgICAgIHR5cGVTdHIgPT09ICdib3Rfc3BlYWtpbmcnXG4gICAgKSB7XG4gICAgICBpZiAobXNnLmFjdGl2ZSA9PT0gdHJ1ZSB8fCBtc2cuc3BlYWtpbmcgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5hc3Npc3RhbnRTcGVha2luZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAobXNnLmFjdGl2ZSA9PT0gZmFsc2UgfHwgbXNnLnNwZWFraW5nID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmFzc2lzdGFudFNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZVN0ciA9PT0gJ3VzZXJfc3BlYWtpbmcnKSB7XG4gICAgICBpZiAobXNnLmFjdGl2ZSA9PT0gdHJ1ZSB8fCBtc2cuc3BlYWtpbmcgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKG1zZy5hY3RpdmUgPT09IGZhbHNlIHx8IG1zZy5zcGVha2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlU3RyID09PSAnaW5wdXRfYXVkaW9fYnVmZmVyLnNwZWVjaF9zdGFydGVkJykge1xuICAgICAgdGhpcy5zZXJ2ZXJVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlU3RyID09PSAnaW5wdXRfYXVkaW9fYnVmZmVyLnNwZWVjaF9zdG9wcGVkJykge1xuICAgICAgdGhpcy5zZXJ2ZXJVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlU3RyID09PSAncmVzcG9uc2UuYXVkaW8uZGVsdGEnKSB7XG4gICAgICB0aGlzLmFzc2lzdGFudFNwZWFraW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlU3RyID09PSAncmVzcG9uc2UuYXVkaW8uZG9uZScgfHxcbiAgICAgIHR5cGVTdHIgPT09ICdyZXNwb25zZS5vdXRwdXRfYXVkaW8uZG9uZSdcbiAgICApIHtcbiAgICAgIHRoaXMuYXNzaXN0YW50U3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlU3RyID09PSAndXNlcl90cmFuc2NyaXB0JyAmJiB0eXBlb2YgbXNnLnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5uZXh0KHtcbiAgICAgICAgdGV4dDogbXNnLnRleHQsXG4gICAgICAgIGZpbmFsOiBtc2cuZmluYWwgPT09IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVTdHIgPT09ICdib3RfdHJhbnNjcmlwdCcgJiYgdHlwZW9mIG1zZy50ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5uZXh0KG1zZy50ZXh0KTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy53cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlSW5pdGlhdGVkQnlDbGllbnQgPSB0cnVlO1xuICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgfVxuXG4gIGdldCBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU47XG4gIH1cbn1cbiJdfQ==
|
|
@@ -4,9 +4,8 @@ import { VoiceAgentModalComponent } from './components/voice-agent-modal/voice-a
|
|
|
4
4
|
import { VoiceAgentService } from './services/voice-agent.service';
|
|
5
5
|
import { AudioAnalyzerService } from './services/audio-analyzer.service';
|
|
6
6
|
import { WebSocketVoiceClientService } from './services/websocket-voice-client.service';
|
|
7
|
-
import { DailyVoiceClientService } from './services/daily-voice-client.service';
|
|
8
7
|
/**
|
|
9
|
-
* Voice agent module. Uses native WebSocket
|
|
8
|
+
* Voice agent module. Uses native WebSocket for the voice session.
|
|
10
9
|
* Does NOT use Socket.IO or ngx-socket-io.
|
|
11
10
|
*/
|
|
12
11
|
export class VoiceAgentModule {
|
|
@@ -22,12 +21,11 @@ VoiceAgentModule.decorators = [
|
|
|
22
21
|
providers: [
|
|
23
22
|
VoiceAgentService,
|
|
24
23
|
AudioAnalyzerService,
|
|
25
|
-
WebSocketVoiceClientService
|
|
26
|
-
DailyVoiceClientService
|
|
24
|
+
WebSocketVoiceClientService
|
|
27
25
|
],
|
|
28
26
|
exports: [
|
|
29
27
|
VoiceAgentModalComponent
|
|
30
28
|
]
|
|
31
29
|
},] }
|
|
32
30
|
];
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3ZvaWNlLWFnZW50Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUV4Rjs7O0dBR0c7QUFpQkgsTUFBTSxPQUFPLGdCQUFnQjs7O1lBaEI1QixRQUFRLFNBQUM7Z0JBQ1IsWUFBWSxFQUFFO29CQUNaLHdCQUF3QjtpQkFDekI7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLFlBQVk7aUJBQ2I7Z0JBQ0QsU0FBUyxFQUFFO29CQUNULGlCQUFpQjtvQkFDakIsb0JBQW9CO29CQUNwQiwyQkFBMkI7aUJBQzVCO2dCQUNELE9BQU8sRUFBRTtvQkFDUCx3QkFBd0I7aUJBQ3pCO2FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFZvaWNlQWdlbnRNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy92b2ljZS1hZ2VudC1tb2RhbC92b2ljZS1hZ2VudC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXplclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2F1ZGlvLWFuYWx5emVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy93ZWJzb2NrZXQtdm9pY2UtY2xpZW50LnNlcnZpY2UnO1xuXG4vKipcbiAqIFZvaWNlIGFnZW50IG1vZHVsZS4gVXNlcyBuYXRpdmUgV2ViU29ja2V0IGZvciB0aGUgdm9pY2Ugc2Vzc2lvbi5cbiAqIERvZXMgTk9UIHVzZSBTb2NrZXQuSU8gb3Igbmd4LXNvY2tldC1pby5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgVm9pY2VBZ2VudE1vZGFsQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGVcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgVm9pY2VBZ2VudFNlcnZpY2UsXG4gICAgQXVkaW9BbmFseXplclNlcnZpY2UsXG4gICAgV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBWb2ljZUFnZW50TW9kYWxDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50TW9kdWxlIHsgfVxuIl19
|