@aether-stack-dev/client-sdk 1.0.0
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 +257 -0
- package/dist/AStackCSRClient.d.ts +60 -0
- package/dist/AStackCSRClient.d.ts.map +1 -0
- package/dist/AStackClient.d.ts +90 -0
- package/dist/AStackClient.d.ts.map +1 -0
- package/dist/AStackEventSetup.d.ts +35 -0
- package/dist/AStackEventSetup.d.ts.map +1 -0
- package/dist/AStackMediaController.d.ts +34 -0
- package/dist/AStackMediaController.d.ts.map +1 -0
- package/dist/AnalyticsCollector.d.ts +63 -0
- package/dist/AnalyticsCollector.d.ts.map +1 -0
- package/dist/BillingMonitor.d.ts +35 -0
- package/dist/BillingMonitor.d.ts.map +1 -0
- package/dist/ConnectionStateManager.d.ts +48 -0
- package/dist/ConnectionStateManager.d.ts.map +1 -0
- package/dist/PerformanceMonitor.d.ts +34 -0
- package/dist/PerformanceMonitor.d.ts.map +1 -0
- package/dist/SecurityLogger.d.ts +30 -0
- package/dist/SecurityLogger.d.ts.map +1 -0
- package/dist/SessionManager.d.ts +20 -0
- package/dist/SessionManager.d.ts.map +1 -0
- package/dist/SupabaseSignalingClient.d.ts +35 -0
- package/dist/SupabaseSignalingClient.d.ts.map +1 -0
- package/dist/UsageTracker.d.ts +22 -0
- package/dist/UsageTracker.d.ts.map +1 -0
- package/dist/WebRTCManager.d.ts +26 -0
- package/dist/WebRTCManager.d.ts.map +1 -0
- package/dist/__tests__/setup.d.ts +32 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/audio/AudioPlayer.d.ts +27 -0
- package/dist/audio/AudioPlayer.d.ts.map +1 -0
- package/dist/audio/index.d.ts +3 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/avatar/TalkingHeadAvatar.d.ts +9 -0
- package/dist/avatar/TalkingHeadAvatar.d.ts.map +1 -0
- package/dist/avatar/VRMAvatar.d.ts +10 -0
- package/dist/avatar/VRMAvatar.d.ts.map +1 -0
- package/dist/avatar/constants.d.ts +4 -0
- package/dist/avatar/constants.d.ts.map +1 -0
- package/dist/avatar/index.d.ts +7 -0
- package/dist/avatar/index.d.ts.map +1 -0
- package/dist/core.d.ts +14 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +2245 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2258 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.d.ts +9 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/useAStack.d.ts +34 -0
- package/dist/react/useAStack.d.ts.map +1 -0
- package/dist/react/useAStackCSR.d.ts +20 -0
- package/dist/react/useAStackCSR.d.ts.map +1 -0
- package/dist/react.esm.js +2871 -0
- package/dist/react.esm.js.map +1 -0
- package/dist/react.js +2895 -0
- package/dist/react.js.map +1 -0
- package/dist/types.d.ts +221 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import { PerformanceMetrics, PerformanceBenchmark } from './types';
|
|
3
|
+
export interface PerformanceMonitorConfig {
|
|
4
|
+
collectionInterval?: number;
|
|
5
|
+
apiEndpoint: string;
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
enableAutoReport?: boolean;
|
|
8
|
+
reportingInterval?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class PerformanceMonitor extends EventEmitter {
|
|
11
|
+
private config;
|
|
12
|
+
private metrics;
|
|
13
|
+
private collectionTimer?;
|
|
14
|
+
private reportingTimer?;
|
|
15
|
+
private startTime;
|
|
16
|
+
private benchmarks;
|
|
17
|
+
private isCollecting;
|
|
18
|
+
constructor(config: PerformanceMonitorConfig);
|
|
19
|
+
private initializeMetrics;
|
|
20
|
+
startCollection(sessionId?: string): void;
|
|
21
|
+
stopCollection(): void;
|
|
22
|
+
recordLatency(type: 'signaling' | 'websocket' | 'audio' | 'webrtc' | 'video', latency: number): void;
|
|
23
|
+
updateThroughput(type: 'audio' | 'video' | 'data', direction: 'inbound' | 'outbound', bytesPerSecond: number): void;
|
|
24
|
+
updateQuality(quality: Partial<PerformanceMetrics['quality']>): void;
|
|
25
|
+
updateResources(resources: Partial<PerformanceMetrics['resources']>): void;
|
|
26
|
+
recordBenchmark(benchmark: Omit<PerformanceBenchmark, 'timestamp'>): void;
|
|
27
|
+
getMetrics(): PerformanceMetrics;
|
|
28
|
+
getBenchmarks(): PerformanceBenchmark[];
|
|
29
|
+
getLatencyStats(type?: 'signaling' | 'websocket' | 'audio' | 'webrtc' | 'video'): any;
|
|
30
|
+
reportMetrics(): Promise<void>;
|
|
31
|
+
private collectMetrics;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=PerformanceMonitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PerformanceMonitor.d.ts","sourceRoot":"","sources":["../src/PerformanceMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,wBAAwB;IAc5C,OAAO,CAAC,iBAAiB;IAuBlB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBzC,cAAc,IAAI,IAAI;IAsBtB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAepG,gBAAgB,CACrB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,EAChC,SAAS,EAAE,SAAS,GAAG,UAAU,EACjC,cAAc,EAAE,MAAM,GACrB,IAAI;IAOA,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI;IAIpE,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAI1E,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAAG,IAAI;IAezE,UAAU,IAAI,kBAAkB;IAIhC,aAAa,IAAI,oBAAoB,EAAE;IAIvC,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO;IAQzE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3C,OAAO,CAAC,cAAc;IAOf,OAAO,IAAI,IAAI;CAKvB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SecurityEvent } from './types';
|
|
2
|
+
export interface SecurityLoggerConfig {
|
|
3
|
+
apiEndpoint: string;
|
|
4
|
+
apiKey: string;
|
|
5
|
+
sessionId?: string;
|
|
6
|
+
organizationId?: string;
|
|
7
|
+
enableLocalLogging?: boolean;
|
|
8
|
+
batchSize?: number;
|
|
9
|
+
flushInterval?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class SecurityLogger {
|
|
12
|
+
private eventQueue;
|
|
13
|
+
private flushInterval?;
|
|
14
|
+
private config;
|
|
15
|
+
constructor(config: SecurityLoggerConfig);
|
|
16
|
+
setSessionId(sessionId: string): void;
|
|
17
|
+
logEvent(eventType: SecurityEvent['eventType'], severity: SecurityEvent['severity'], details: Record<string, any>): void;
|
|
18
|
+
logAuthFailure(reason: string, details?: Record<string, any>): void;
|
|
19
|
+
logRateLimit(limit: number, current: number, endpoint?: string): void;
|
|
20
|
+
logInvalidRequest(reason: string, request?: any): void;
|
|
21
|
+
logSessionHijackAttempt(details: Record<string, any>): void;
|
|
22
|
+
private sanitizeRequest;
|
|
23
|
+
private logToConsole;
|
|
24
|
+
private getConsoleLogLevel;
|
|
25
|
+
flush(): Promise<void>;
|
|
26
|
+
private startAutoFlush;
|
|
27
|
+
private stopAutoFlush;
|
|
28
|
+
destroy(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=SecurityLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityLogger.d.ts","sourceRoot":"","sources":["../src/SecurityLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAC,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAiC;gBAEnC,MAAM,EAAE,oBAAoB;IAexC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC,QAAQ,CACN,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,EACrC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,IAAI;IAyBP,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAOnE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IASrE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAOtD,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAI3D,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,YAAY;IAGpB,OAAO,CAAC,kBAAkB;IAcpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,aAAa;IAOf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SessionCredentials, SessionCreateRequest, WorkerInfo } from './types';
|
|
2
|
+
export declare class SessionManager {
|
|
3
|
+
private apiEndpoint;
|
|
4
|
+
private sessionCredentials;
|
|
5
|
+
private workerInfo;
|
|
6
|
+
private expirationTimer;
|
|
7
|
+
private onSessionExpiring?;
|
|
8
|
+
private sessionExpirationWarning;
|
|
9
|
+
constructor(apiEndpoint: string, sessionExpirationWarning?: number, onSessionExpiring?: (minutesRemaining: number) => void);
|
|
10
|
+
createSession(request: SessionCreateRequest): Promise<SessionCredentials>;
|
|
11
|
+
renewSession(apiKey: string): Promise<SessionCredentials>;
|
|
12
|
+
private scheduleExpirationWarning;
|
|
13
|
+
getCredentials(): SessionCredentials | null;
|
|
14
|
+
isSessionValid(): boolean;
|
|
15
|
+
getTimeUntilExpiration(): number;
|
|
16
|
+
clearSession(): void;
|
|
17
|
+
getWorkerInfo(): WorkerInfo | null;
|
|
18
|
+
destroy(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=SessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../src/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAkD,UAAU,EAAE,MAAM,SAAS,CAAC;AAE/H,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,iBAAiB,CAAC,CAAqC;IAC/D,OAAO,CAAC,wBAAwB,CAAS;gBAGvC,WAAW,EAAE,MAAM,EACnB,wBAAwB,GAAE,MAAU,EACpC,iBAAiB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,IAAI;IAOlD,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA6DzE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAe/D,OAAO,CAAC,yBAAyB;IAuBjC,cAAc,IAAI,kBAAkB,GAAG,IAAI;IAI3C,cAAc,IAAI,OAAO;IAOzB,sBAAsB,IAAI,MAAM;IAQhC,YAAY,IAAI,IAAI;IASpB,aAAa,IAAI,UAAU,GAAG,IAAI;IAIlC,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import { AStackConfig } from './types';
|
|
3
|
+
export declare class SupabaseSignalingClient extends EventEmitter {
|
|
4
|
+
private supabase;
|
|
5
|
+
private channel;
|
|
6
|
+
private config;
|
|
7
|
+
private sessionId;
|
|
8
|
+
private channelName;
|
|
9
|
+
private wsToken;
|
|
10
|
+
private channelId;
|
|
11
|
+
private connected;
|
|
12
|
+
private reconnectAttempts;
|
|
13
|
+
private maxReconnectAttempts;
|
|
14
|
+
private reconnectDelay;
|
|
15
|
+
private heartbeatInterval;
|
|
16
|
+
constructor(config: AStackConfig);
|
|
17
|
+
connect(sessionId: string, channelName: string, wsToken: string): Promise<void>;
|
|
18
|
+
private handleSignalingMessage;
|
|
19
|
+
private handlePresenceSync;
|
|
20
|
+
private updateChannelStatus;
|
|
21
|
+
sendText(text: string): Promise<void>;
|
|
22
|
+
sendAudio(audioData: string, metadata?: Record<string, any>): Promise<void>;
|
|
23
|
+
sendControl(action: string, data?: Record<string, any>): Promise<void>;
|
|
24
|
+
private sendSignalingMessage;
|
|
25
|
+
sendTextMessage(text: string): void;
|
|
26
|
+
sendAudioData(audioBlob: Blob): void;
|
|
27
|
+
private startHeartbeat;
|
|
28
|
+
private stopHeartbeat;
|
|
29
|
+
private attemptReconnect;
|
|
30
|
+
leaveSession(): Promise<void>;
|
|
31
|
+
isConnected(): boolean;
|
|
32
|
+
getSessionId(): string | null;
|
|
33
|
+
disconnect(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=SupabaseSignalingClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseSignalingClient.d.ts","sourceRoot":"","sources":["../src/SupabaseSignalingClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,YAAY,EAA6C,MAAM,SAAS,CAAC;AAWlF,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,iBAAiB,CAAuB;gBAEpC,MAAM,EAAE,YAAY;IAmBnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAsF9E,sBAAsB;IA+BpC,OAAO,CAAC,kBAAkB;YAeZ,mBAAmB;IAWpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3E,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAIrE,oBAAoB;IA6B3B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAInC,aAAa,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI;IAS3C,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,aAAa;YAOP,gBAAgB;IA0BjB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IASnC,WAAW,IAAI,OAAO;IAItB,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAYzC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { UsageMetrics } from './types';
|
|
2
|
+
export declare class UsageTracker {
|
|
3
|
+
private sessionId;
|
|
4
|
+
private startTime;
|
|
5
|
+
private endTime?;
|
|
6
|
+
private inputTokens;
|
|
7
|
+
private outputTokens;
|
|
8
|
+
private errorCount;
|
|
9
|
+
private qualityScores;
|
|
10
|
+
constructor(sessionId: string);
|
|
11
|
+
start(): void;
|
|
12
|
+
stop(): void;
|
|
13
|
+
trackInputTokens(tokens: number): void;
|
|
14
|
+
trackOutputTokens(tokens: number): void;
|
|
15
|
+
trackError(): void;
|
|
16
|
+
trackQualityScore(score: number): void;
|
|
17
|
+
getDuration(): number;
|
|
18
|
+
getAverageQualityScore(): number | undefined;
|
|
19
|
+
getMetrics(): UsageMetrics;
|
|
20
|
+
reset(): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=UsageTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsageTracker.d.ts","sourceRoot":"","sources":["../src/UsageTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,OAAO,CAAC,CAAO;IACvB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAgB;gBAEzB,SAAS,EAAE,MAAM;IAK7B,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAIZ,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIvC,UAAU,IAAI,IAAI;IAIlB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMtC,WAAW,IAAI,MAAM;IAKrB,sBAAsB,IAAI,MAAM,GAAG,SAAS;IAM5C,UAAU,IAAI,YAAY;IAW1B,KAAK,IAAI,IAAI;CAQd"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import { AStackConfig, MediaStreamInfo } from './types';
|
|
3
|
+
export declare class WebRTCManager extends EventEmitter {
|
|
4
|
+
private config;
|
|
5
|
+
private localStream;
|
|
6
|
+
constructor(config: AStackConfig);
|
|
7
|
+
initialize(): Promise<void>;
|
|
8
|
+
getStats(): Promise<any>;
|
|
9
|
+
getUserMedia(): Promise<MediaStream>;
|
|
10
|
+
addLocalStream(stream: MediaStream): Promise<void>;
|
|
11
|
+
removeLocalStream(streamId: string): void;
|
|
12
|
+
getLocalStreams(): MediaStreamInfo[];
|
|
13
|
+
getRemoteStreams(): MediaStreamInfo[];
|
|
14
|
+
getMediaDevices(): Promise<MediaDeviceInfo[]>;
|
|
15
|
+
switchAudioInput(deviceId: string): Promise<void>;
|
|
16
|
+
muteAudio(): void;
|
|
17
|
+
unmuteAudio(): void;
|
|
18
|
+
muteVideo(): void;
|
|
19
|
+
unmuteVideo(): void;
|
|
20
|
+
createOffer(): Promise<RTCSessionDescriptionInit>;
|
|
21
|
+
createAnswer(remoteSdp: string): Promise<RTCSessionDescriptionInit>;
|
|
22
|
+
handleAnswer(answer: RTCSessionDescriptionInit): Promise<void>;
|
|
23
|
+
addIceCandidate(candidate: RTCIceCandidateInit): Promise<void>;
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=WebRTCManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebRTCManager.d.ts","sourceRoot":"","sources":["../src/WebRTCManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAExD,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAA4B;gBAEnC,MAAM,EAAE,YAAY;IAKnB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;IAIxB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;IAWpC,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQzC,eAAe,IAAI,eAAe,EAAE;IAUpC,gBAAgB,IAAI,eAAe,EAAE;IAI/B,eAAe,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAI7C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD,SAAS,IAAI,IAAI;IAMjB,WAAW,IAAI,IAAI;IAMnB,SAAS,IAAI,IAAI;IAMjB,WAAW,IAAI,IAAI;IAMb,WAAW,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAKjD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAKnE,YAAY,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,eAAe,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAOpC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
declare const createMockAudioTrack: () => {
|
|
2
|
+
kind: string;
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
muted: boolean;
|
|
7
|
+
readyState: string;
|
|
8
|
+
stop: jest.Mock<any, any, any>;
|
|
9
|
+
clone: jest.Mock<any, any, any>;
|
|
10
|
+
addEventListener: jest.Mock<any, any, any>;
|
|
11
|
+
removeEventListener: jest.Mock<any, any, any>;
|
|
12
|
+
};
|
|
13
|
+
declare class MockMediaStream {
|
|
14
|
+
id: string;
|
|
15
|
+
active: boolean;
|
|
16
|
+
audioTracks: any[];
|
|
17
|
+
videoTracks: any[];
|
|
18
|
+
constructor(constraints?: {});
|
|
19
|
+
}
|
|
20
|
+
declare const mockMediaStreamTrack: {
|
|
21
|
+
kind: string;
|
|
22
|
+
id: string;
|
|
23
|
+
label: string;
|
|
24
|
+
enabled: boolean;
|
|
25
|
+
muted: boolean;
|
|
26
|
+
readyState: string;
|
|
27
|
+
stop: jest.Mock<any, any, any>;
|
|
28
|
+
clone: jest.Mock<any, any, any>;
|
|
29
|
+
addEventListener: jest.Mock<any, any, any>;
|
|
30
|
+
removeEventListener: jest.Mock<any, any, any>;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAgCA,QAAA,MAAM,oBAAoB;;;;;;;;;;;CAWxB,CAAC;AAEH,cAAM,eAAe;IACnB,EAAE,SAAoB;IACtB,MAAM,UAAQ;IACd,WAAW,QAAM;IACjB,WAAW,QAAM;gBAEL,WAAW,KAAK;CAkC7B;AAID,QAAA,MAAM,oBAAoB;;;;;;;;;;;CAWzB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
export interface AudioChunk {
|
|
3
|
+
audio: ArrayBuffer;
|
|
4
|
+
blendshapes?: number[][];
|
|
5
|
+
}
|
|
6
|
+
export interface AudioPlayerEvents {
|
|
7
|
+
blendshapeUpdate: (blendshapes: number[]) => void;
|
|
8
|
+
playbackStarted: () => void;
|
|
9
|
+
playbackEnded: () => void;
|
|
10
|
+
queueEmpty: () => void;
|
|
11
|
+
error: (error: Error) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare class AudioPlayer extends EventEmitter<AudioPlayerEvents> {
|
|
14
|
+
private audioContext;
|
|
15
|
+
private audioQueue;
|
|
16
|
+
private isPlaying;
|
|
17
|
+
private sampleRate;
|
|
18
|
+
constructor(sampleRate?: number);
|
|
19
|
+
private ensureAudioContext;
|
|
20
|
+
enqueue(chunk: AudioChunk): void;
|
|
21
|
+
clearQueue(): void;
|
|
22
|
+
private playNext;
|
|
23
|
+
private generateAmplitudeBlendshapes;
|
|
24
|
+
private playChunk;
|
|
25
|
+
destroy(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=AudioPlayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioPlayer.d.ts","sourceRoot":"","sources":["../../src/audio/AudioPlayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAClD,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B;AAED,qBAAa,WAAY,SAAQ,YAAY,CAAC,iBAAiB,CAAC;IAC9D,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,SAAQ;YAKhB,kBAAkB;IAUzB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAShC,UAAU,IAAI,IAAI;YAMX,QAAQ;IAWtB,OAAO,CAAC,4BAA4B;YA8BtB,SAAS;IAyEV,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAQtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface TalkingHeadAvatarProps {
|
|
2
|
+
blendshapes: number[];
|
|
3
|
+
width?: number;
|
|
4
|
+
height?: number;
|
|
5
|
+
avatarUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function TalkingHeadAvatar({ blendshapes, width, height, avatarUrl }: TalkingHeadAvatarProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default TalkingHeadAvatar;
|
|
9
|
+
//# sourceMappingURL=TalkingHeadAvatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TalkingHeadAvatar.d.ts","sourceRoot":"","sources":["../../src/avatar/TalkingHeadAvatar.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,KAAW,EACX,MAAY,EACZ,SAA0M,EAC3M,EAAE,sBAAsB,2CAuKxB;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface VRMAvatarProps {
|
|
2
|
+
blendshapes: number[];
|
|
3
|
+
width?: number;
|
|
4
|
+
height?: number;
|
|
5
|
+
modelUrl?: string;
|
|
6
|
+
backgroundColor?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function VRMAvatar({ blendshapes, width, height, modelUrl, backgroundColor }: VRMAvatarProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export default VRMAvatar;
|
|
10
|
+
//# sourceMappingURL=VRMAvatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VRMAvatar.d.ts","sourceRoot":"","sources":["../../src/avatar/VRMAvatar.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,KAAW,EACX,MAAY,EACZ,QAA+B,EAC/B,eAA0B,EAC3B,EAAE,cAAc,2CAyNhB;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const ARKIT_BLENDSHAPES: readonly ["jawOpen", "jawForward", "jawLeft", "jawRight", "mouthClose", "mouthFunnel", "mouthPucker", "mouthLeft", "mouthRight", "mouthSmileLeft", "mouthSmileRight", "mouthFrownLeft", "mouthFrownRight", "mouthDimpleLeft", "mouthDimpleRight", "mouthStretchLeft", "mouthStretchRight", "mouthRollLower", "mouthRollUpper", "mouthShrugLower", "mouthShrugUpper", "mouthPressLeft", "mouthPressRight", "mouthLowerDownLeft", "mouthLowerDownRight", "mouthUpperUpLeft", "mouthUpperUpRight", "tongueOut", "cheekPuff", "cheekSquintLeft", "cheekSquintRight", "noseSneerLeft", "noseSneerRight", "eyeBlinkLeft", "eyeBlinkRight", "eyeLookDownLeft", "eyeLookDownRight", "eyeLookInLeft", "eyeLookInRight", "eyeLookOutLeft", "eyeLookOutRight", "eyeLookUpLeft", "eyeLookUpRight", "eyeSquintLeft", "eyeSquintRight", "eyeWideLeft", "eyeWideRight", "browDownLeft", "browDownRight", "browInnerUp", "browOuterUpLeft", "browOuterUpRight"];
|
|
2
|
+
export type ARKitBlendshapeName = typeof ARKIT_BLENDSHAPES[number];
|
|
3
|
+
export declare const BLENDSHAPE_COUNT = 52;
|
|
4
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/avatar/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,i5BAgBpB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAEnE,eAAO,MAAM,gBAAgB,KAAK,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { VRMAvatar } from './VRMAvatar';
|
|
2
|
+
export type { VRMAvatarProps } from './VRMAvatar';
|
|
3
|
+
export { TalkingHeadAvatar } from './TalkingHeadAvatar';
|
|
4
|
+
export type { TalkingHeadAvatarProps } from './TalkingHeadAvatar';
|
|
5
|
+
export { ARKIT_BLENDSHAPES, BLENDSHAPE_COUNT } from './constants';
|
|
6
|
+
export type { ARKitBlendshapeName } from './constants';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AStackClient } from './AStackClient';
|
|
2
|
+
import { WebRTCManager } from './WebRTCManager';
|
|
3
|
+
import { SupabaseSignalingClient } from './SupabaseSignalingClient';
|
|
4
|
+
export { AStackClient, WebRTCManager, SupabaseSignalingClient };
|
|
5
|
+
export { AStackCSRClient } from './AStackCSRClient';
|
|
6
|
+
export type { AStackCSRConfig, AStackCSREvents, CallStatus } from './AStackCSRClient';
|
|
7
|
+
export { AudioPlayer } from './audio/AudioPlayer';
|
|
8
|
+
export type { AudioChunk, AudioPlayerEvents } from './audio/AudioPlayer';
|
|
9
|
+
export { ARKIT_BLENDSHAPES, BLENDSHAPE_COUNT } from './avatar/constants';
|
|
10
|
+
export type { ARKitBlendshapeName } from './avatar/constants';
|
|
11
|
+
export type { AStackConfig, SessionStatus, MediaStreamInfo, MediaDeviceInfo, AIResponse, SignalingMessage, ConnectionStats, AStackEvents, AStackEventName, AStackEventHandler } from './types';
|
|
12
|
+
export { AStackError, ErrorCodes } from './types';
|
|
13
|
+
export default AStackClient;
|
|
14
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,uBAAuB,EAAE,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEtF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,YAAY,EACV,YAAY,EACZ,aAAa,EACb,eAAe,EACf,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAElD,eAAe,YAAY,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export { AStackClient } from './AStackClient';
|
|
2
|
+
export { SupabaseSignalingClient } from './SupabaseSignalingClient';
|
|
3
|
+
export { SessionManager } from './SessionManager';
|
|
4
|
+
export { UsageTracker } from './UsageTracker';
|
|
5
|
+
export { BillingMonitor } from './BillingMonitor';
|
|
6
|
+
export { SecurityLogger } from './SecurityLogger';
|
|
7
|
+
export { ConnectionStateManager } from './ConnectionStateManager';
|
|
8
|
+
export type { ConnectionState, ConnectionQuality } from './ConnectionStateManager';
|
|
9
|
+
export { PerformanceMonitor } from './PerformanceMonitor';
|
|
10
|
+
export { AnalyticsCollector } from './AnalyticsCollector';
|
|
11
|
+
export type { AnalyticsEvent, SessionAnalytics } from './AnalyticsCollector';
|
|
12
|
+
export { AStackCSRClient } from './AStackCSRClient';
|
|
13
|
+
export type { AStackCSRConfig, AStackCSREvents, CallStatus } from './AStackCSRClient';
|
|
14
|
+
export { AudioPlayer } from './audio/AudioPlayer';
|
|
15
|
+
export type { AudioChunk, AudioPlayerEvents } from './audio/AudioPlayer';
|
|
16
|
+
export { ARKIT_BLENDSHAPES, BLENDSHAPE_COUNT } from './avatar/constants';
|
|
17
|
+
export type { ARKitBlendshapeName } from './avatar/constants';
|
|
18
|
+
export type { AStackConfig, SessionStatus, SessionCredentials, SessionCreateRequest, SessionCreateResponse, UsageMetrics, BillingInfo, SecurityEvent, MediaStreamInfo, MediaDeviceInfo, AIResponse, SignalingMessage, ConnectionStats, AStackEvents, AStackEventName, AStackEventHandler, PerformanceMetrics, PerformanceBenchmark, LatencyMetric, WorkerPreferences, WorkerInfo } from './types';
|
|
19
|
+
export { AStackError, ErrorCodes } from './types';
|
|
20
|
+
import { AStackClient as DefaultAStackClient } from './AStackClient';
|
|
21
|
+
export default DefaultAStackClient;
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEtF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,YAAY,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,UAAU,EACX,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrE,eAAe,mBAAmB,CAAC"}
|