@xmov/avatar 2.0.0-alpha.38
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 +139 -0
- package/dist/agent/__tests__/agent.test.d.ts +1 -0
- package/dist/agent/audio-debug.d.ts +3 -0
- package/dist/agent/audio-uplink.d.ts +62 -0
- package/dist/agent/avatar.cjs +2 -0
- package/dist/agent/avatar.cjs.map +1 -0
- package/dist/agent/avatar.modern.js +2 -0
- package/dist/agent/avatar.modern.js.map +1 -0
- package/dist/agent/avatar.module.js +2 -0
- package/dist/agent/avatar.module.js.map +1 -0
- package/dist/agent/avatar.umd.js +2 -0
- package/dist/agent/avatar.umd.js.map +1 -0
- package/dist/agent/e2e-client.d.ts +32 -0
- package/dist/agent/fixed-audio-track.d.ts +48 -0
- package/dist/agent/index.cjs +5 -0
- package/dist/agent/index.d.ts +104 -0
- package/dist/agent/index.umd.js +10 -0
- package/dist/agent/microphone.d.ts +49 -0
- package/dist/agent/types.d.ts +153 -0
- package/dist/baseRender/AudioRenderer.d.ts +46 -0
- package/dist/baseRender/AudioWorklet.d.ts +78 -0
- package/dist/baseRender/AvatarRenderer.d.ts +226 -0
- package/dist/baseRender/MSEAudioPlayer.d.ts +51 -0
- package/dist/baseRender/UIRenderer.d.ts +39 -0
- package/dist/baseRender/pcm-audio-processor.d.ts +63 -0
- package/dist/control/APIForwarder.d.ts +23 -0
- package/dist/control/DataCacheQueue.d.ts +69 -0
- package/dist/control/EventDispatcher.d.ts +35 -0
- package/dist/control/RenderScheduler.d.ts +162 -0
- package/dist/control/SaveAndDownload.d.ts +14 -0
- package/dist/control/StreamingClient.d.ts +33 -0
- package/dist/control/VideoPlayer.d.ts +47 -0
- package/dist/control/ttsa.d.ts +111 -0
- package/dist/encoding/media-recorder-encoder.d.ts +33 -0
- package/dist/encoding/pcm-webm-encoder.d.ts +13 -0
- package/dist/encoding/webcodec-opus-encoder.d.ts +41 -0
- package/dist/encoding/webm-muxer.d.ts +90 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +231 -0
- package/dist/index.modern.js +2 -0
- package/dist/index.modern.js.map +1 -0
- package/dist/index.module.js +2 -0
- package/dist/index.module.js.map +1 -0
- package/dist/index.umd.js +2 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/modules/Composition.d.ts +28 -0
- package/dist/modules/ResourceManager.d.ts +295 -0
- package/dist/modules/TrackRenderer/base-track.d.ts +4 -0
- package/dist/modules/TrackRenderer/index.d.ts +12 -0
- package/dist/modules/TrackRenderer/render-implements.d.ts +19 -0
- package/dist/modules/TrackRenderer/track-pic.d.ts +8 -0
- package/dist/modules/TrackRenderer/track-subtitle.d.ts +8 -0
- package/dist/modules/cache-manager.d.ts +5 -0
- package/dist/modules/decoder.d.ts +84 -0
- package/dist/modules/error-handle.d.ts +17 -0
- package/dist/modules/network.d.ts +21 -0
- package/dist/proto/face_data_pb.d.ts +0 -0
- package/dist/types/capability.d.ts +15 -0
- package/dist/types/error.d.ts +70 -0
- package/dist/types/event.d.ts +25 -0
- package/dist/types/frame-data.d.ts +107 -0
- package/dist/types/index.d.ts +187 -0
- package/dist/types/render.d.ts +18 -0
- package/dist/utils/DataInterface.d.ts +113 -0
- package/dist/utils/GLDevice.d.ts +46 -0
- package/dist/utils/GLPipeline.d.ts +84 -0
- package/dist/utils/GLPipelineDebugTools.d.ts +5 -0
- package/dist/utils/Math.d.ts +21 -0
- package/dist/utils/__tests__/capability-checker.test.d.ts +1 -0
- package/dist/utils/audio-session.d.ts +11 -0
- package/dist/utils/audio.d.ts +1 -0
- package/dist/utils/capability-checker.d.ts +23 -0
- package/dist/utils/encodeToken.d.ts +7 -0
- package/dist/utils/face.d.ts +1 -0
- package/dist/utils/float32-decoder.d.ts +26 -0
- package/dist/utils/fpsTracker.d.ts +27 -0
- package/dist/utils/index.d.ts +22 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/media-recorder-timestamp.d.ts +15 -0
- package/dist/utils/pcmAnalyzer.d.ts +40 -0
- package/dist/utils/perfermance.d.ts +15 -0
- package/dist/utils/request.d.ts +19 -0
- package/dist/utils/requestAnimateFrames.d.ts +31 -0
- package/dist/utils/time.d.ts +9 -0
- package/dist/view/DebugOverlay.d.ts +54 -0
- package/dist/worker/streaming-video.d.ts +1 -0
- package/package.json +82 -0
- package/src/agent/__tests__/agent.test.ts +3787 -0
- package/src/agent/audio-debug.ts +36 -0
- package/src/agent/audio-uplink.ts +392 -0
- package/src/agent/e2e-client.ts +215 -0
- package/src/agent/fixed-audio-track.ts +547 -0
- package/src/agent/index.ts +1393 -0
- package/src/agent/microphone.ts +534 -0
- package/src/agent/types.ts +197 -0
- package/src/baseRender/AudioRenderer.ts +317 -0
- package/src/baseRender/AudioWorklet.ts +776 -0
- package/src/baseRender/AvatarRenderer.ts +1559 -0
- package/src/baseRender/MSEAudioPlayer.ts +243 -0
- package/src/baseRender/UIRenderer.ts +195 -0
- package/src/baseRender/pcm-audio-processor.js +267 -0
- package/src/control/APIForwarder.ts +67 -0
- package/src/control/DataCacheQueue.ts +372 -0
- package/src/control/EventDispatcher.ts +106 -0
- package/src/control/RenderScheduler.ts +945 -0
- package/src/control/SaveAndDownload.js +77 -0
- package/src/control/StreamingClient.ts +138 -0
- package/src/control/VideoPlayer.ts +306 -0
- package/src/control/ttsa.ts +676 -0
- package/src/encoding/media-recorder-encoder.ts +175 -0
- package/src/encoding/pcm-webm-encoder.ts +72 -0
- package/src/encoding/webcodec-opus-encoder.ts +258 -0
- package/src/encoding/webm-muxer.ts +337 -0
- package/src/global.d.ts +105 -0
- package/src/index.ts +1920 -0
- package/src/modules/Composition.ts +79 -0
- package/src/modules/ResourceManager.ts +899 -0
- package/src/modules/TrackRenderer/base-track.ts +7 -0
- package/src/modules/TrackRenderer/index.ts +40 -0
- package/src/modules/TrackRenderer/render-implements.ts +269 -0
- package/src/modules/TrackRenderer/track-pic.ts +19 -0
- package/src/modules/TrackRenderer/track-subtitle.ts +16 -0
- package/src/modules/cache-manager.ts +10 -0
- package/src/modules/decoder.ts +515 -0
- package/src/modules/error-handle.ts +20 -0
- package/src/modules/network.ts +71 -0
- package/src/proto/face_data.proto +45 -0
- package/src/proto/face_data_pb.js +1297 -0
- package/src/proto/protobuf.min.js +8 -0
- package/src/types/capability.ts +23 -0
- package/src/types/error.ts +211 -0
- package/src/types/event.ts +38 -0
- package/src/types/frame-data.ts +121 -0
- package/src/types/index.ts +207 -0
- package/src/types/render.ts +18 -0
- package/src/utils/DataInterface.ts +746 -0
- package/src/utils/GLDevice.ts +286 -0
- package/src/utils/GLPipeline.ts +1293 -0
- package/src/utils/GLPipelineDebugTools.ts +174 -0
- package/src/utils/Math.ts +266 -0
- package/src/utils/__tests__/capability-checker.test.ts +159 -0
- package/src/utils/audio-session.ts +144 -0
- package/src/utils/audio.ts +44 -0
- package/src/utils/blueimp-md5.d.ts +3 -0
- package/src/utils/capability-checker.ts +379 -0
- package/src/utils/encodeToken.ts +100 -0
- package/src/utils/face.ts +29 -0
- package/src/utils/float32-decoder.js +130 -0
- package/src/utils/fpsTracker.ts +100 -0
- package/src/utils/index.ts +182 -0
- package/src/utils/logger.js +36 -0
- package/src/utils/media-recorder-timestamp.ts +79 -0
- package/src/utils/pcmAnalyzer.ts +154 -0
- package/src/utils/perfermance.ts +141 -0
- package/src/utils/request.ts +95 -0
- package/src/utils/requestAnimateFrames.ts +195 -0
- package/src/utils/time.ts +32 -0
- package/src/view/DebugOverlay.ts +404 -0
- package/src/worker/streaming-video.ts +4647 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.modern.js","sources":["../src/types/error.ts","../src/types/index.ts","../src/types/frame-data.ts","../src/control/DataCacheQueue.ts","../src/utils/GLDevice.ts","../src/utils/Math.ts","../src/utils/perfermance.ts","../src/utils/GLPipeline.ts","../src/modules/TrackRenderer/render-implements.ts","../src/utils/DataInterface.ts","../src/utils/index.ts","../src/baseRender/AvatarRenderer.ts","../src/modules/TrackRenderer/base-track.ts","../src/modules/TrackRenderer/track-pic.ts","../src/modules/TrackRenderer/track-subtitle.ts","../src/modules/TrackRenderer/index.ts","../src/baseRender/UIRenderer.ts","../src/utils/fpsTracker.ts","../src/modules/Composition.ts","../src/worker/streaming-video.ts","../src/utils/float32-decoder.js","../src/modules/decoder.ts","../src/utils/requestAnimateFrames.ts","../src/utils/audio-session.ts","../src/baseRender/AudioWorklet.ts","../src/baseRender/MSEAudioPlayer.ts","../src/baseRender/AudioRenderer.ts","../src/control/SaveAndDownload.js","../src/control/RenderScheduler.ts","../node_modules/.pnpm/pako@2.1.0/node_modules/pako/dist/pako.esm.mjs","../src/utils/request.ts","../node_modules/.pnpm/blueimp-md5@2.19.0/node_modules/blueimp-md5/js/md5.js","../src/utils/encodeToken.ts","../src/modules/cache-manager.ts","../src/modules/ResourceManager.ts","../node_modules/.pnpm/engine.io-parser@5.2.3/node_modules/engine.io-parser/build/esm/commons.js","../node_modules/.pnpm/engine.io-parser@5.2.3/node_modules/engine.io-parser/build/esm/encodePacket.browser.js","../node_modules/.pnpm/engine.io-parser@5.2.3/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","../node_modules/.pnpm/engine.io-parser@5.2.3/node_modules/engine.io-parser/build/esm/decodePacket.browser.js","../node_modules/.pnpm/engine.io-parser@5.2.3/node_modules/engine.io-parser/build/esm/index.js","../node_modules/.pnpm/@socket.io+component-emitter@3.1.2/node_modules/@socket.io/component-emitter/lib/esm/index.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/globals.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/util.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/contrib/parseqs.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/transport.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/transports/polling.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/contrib/has-cors.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/transports/polling-xhr.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/transports/websocket.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/transports/webtransport.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/transports/index.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/contrib/parseuri.js","../node_modules/.pnpm/engine.io-client@6.6.3/node_modules/engine.io-client/build/esm/socket.js","../node_modules/.pnpm/socket.io-client@4.8.1/node_modules/socket.io-client/build/esm/url.js","../node_modules/.pnpm/socket.io-parser@4.2.4/node_modules/socket.io-parser/build/esm/is-binary.js","../node_modules/.pnpm/socket.io-parser@4.2.4/node_modules/socket.io-parser/build/esm/binary.js","../node_modules/.pnpm/socket.io-parser@4.2.4/node_modules/socket.io-parser/build/esm/index.js","../node_modules/.pnpm/socket.io-client@4.8.1/node_modules/socket.io-client/build/esm/on.js","../node_modules/.pnpm/socket.io-client@4.8.1/node_modules/socket.io-client/build/esm/socket.js","../node_modules/.pnpm/socket.io-client@4.8.1/node_modules/socket.io-client/build/esm/contrib/backo2.js","../node_modules/.pnpm/socket.io-client@4.8.1/node_modules/socket.io-client/build/esm/manager.js","../node_modules/.pnpm/socket.io-client@4.8.1/node_modules/socket.io-client/build/esm/index.js","../src/proto/face_data_pb.js","../src/proto/protobuf.min.js","../src/control/ttsa.ts","../src/utils/time.ts","../src/view/DebugOverlay.ts","../src/modules/network.ts","../src/modules/error-handle.ts","../src/utils/logger.js","../src/utils/GLPipelineDebugTools.ts","../src/control/StreamingClient.ts","../src/control/VideoPlayer.ts","../src/control/EventDispatcher.ts","../src/control/APIForwarder.ts","../src/utils/capability-checker.ts","../src/encoding/webcodec-opus-encoder.ts","../src/encoding/webm-muxer.ts","../src/encoding/pcm-webm-encoder.ts","../src/encoding/media-recorder-encoder.ts","../src/index.ts"],"sourcesContent":["/**\n * @file 错误码和定义\n */\n\nexport enum EErrorCode {\n // 初始化错误\n // 容器不存在\n CONTAINER_NOT_FOUND = 10001,\n // socket连接错误\n CONNECT_SOCKET_ERROR = 10002,\n // 会话错误,start_session进入catch(/api/session的接口数据异常,均使用response.error_code)\n START_SESSION_ERROR = 10003,\n // 会话错误,stop_session进入catch\n STOP_SESSION_ERROR = 10004,\n // 初始化错误\n INIT_ERROR = 10005,\n // socket被动连接断开\n SOCKET_QUIT = 10006,\n // socket_disconnect\n SOCKET_DISCONNECT = 10007,\n\n // 前端处理逻辑错误\n // 视频抽帧错误\n VIDEO_FRAME_EXTRACT_ERROR = 20001,\n // 初始化视频抽帧WORKER错误\n INIT_WORKER_ERROR = 20002,\n // 抽帧视频流处理错误\n PROCESS_VIDEO_STREAM_ERROR = 20003,\n // 表情处理错误\n FACE_PROCESSING_ERROR = 20004,\n // 渲染错误\n RENDER_BODY_ERROR = 20005,\n RENDER_FACE_ERROR = 20006,\n // webgl渲染异常\n WebGL_RENDER_ERROR = 20007,\n // 渲染数据缺失\n RENDER_DATA_MISSING = 20008,\n // 渲染表情数据缺失\n RENDER_FACE_DATA_MISSING = 20009,\n // 事件中包含不包含speech_id的事件\n EVENT_WITHOUT_SPEECH_ID = 20010,\n // 新speak_start到来,兜底打断上一轮播放(注意:历史分组位于60xxx上下文管理系列,实际与WebGL无关,语义归本类)\n EVENT_TRIGGERED = 20011,\n\n // 资源管理错误\n // 背景图片加载错误\n BACKGROUND_IMAGE_LOAD_ERROR = 30001,\n // 表情数据加载错误\n FACE_BIN_LOAD_ERROR = 30002,\n // body数据无Name\n INVALID_BODY_NAME = 30003,\n // 视频下载错误\n VIDEO_DOWNLOAD_ERROR = 30004,\n // 身体数据过期\n BODY_DATA_EXPIRED = 30005,\n // speak_start过期 收到speak_start过期,主动重置avatarRender状态标记,并且调用speakStateChange\n EVENT_SPEAK_START_EXPIRED = 30006,\n // voice_start过期 收到voice_start过期,主动调用onVoiceStateChange\n EVENT_VOICE_START_EXPIRED = 30007,\n\n // sdk 获取ttsa数据解压缩错误\n AUDIO_DECODE_ERROR = 40001, // 音频解码错误\n FACE_DECODE_ERROR = 40002, // 表情解码错误\n VIDEO_DECODE_ERROR = 40003, // 身体视频解码错误\n EVENT_DECODE_ERROR = 40004, // 事件解码错误\n INVALID_DATA_STRUCTURE = 40005, // ttsa返回数据类型错误,非audio、body、face、event等\n TTSA_ERROR = 40006, // ttsa下行发送异常信息\n AUDIO_DATA_EXPIRED = 40007, // ttsa下发音频数据过期\n\n // 网络错误\n NETWORK_DOWN = 50001, // 离线模式\n NETWORK_UP = 50002, // 在线模式\n NETWORK_RETRY = 50003, // 网络重试\n NETWORK_BREAK = 50004, // 网络断开\n\n // 上下文丢失与恢复\n WEBGL_CONTEXT_LOST = 60001,\n // 上下文恢复(浏览器主动触发 webglcontextrestored 事件后的进入恢复流程通知)\n WEBGL_CONTEXT_RESTORED = 60002,\n /** @deprecated 未在任何场景实际触发,仅保留枚举值以兼容旧文档解析 */\n WEBGL_CONTEXT_RESTORE_TIMEOUT = 60003,\n // 分阶段上下文恢复成功(light/medium/full 任一阶段,附 stage/recoveryTime/reducedResolution)\n WEBGL_CONTEXT_RECOVERED = 60004,\n // 单次恢复尝试失败(附 stage + attempt),非最终失败,后续会重试或升级阶段\n WEBGL_CONTEXT_RECOVERY_FAILED = 60005,\n // 当前阶段所有尝试均用尽,升级下一阶段/全部放弃需重启SDK\n WEBGL_CONTEXT_RECOVERY_MAX_ATTEMPTS = 60006,\n // full 阶段降级分辨率稳定 30s 后,成功恢复原始分辨率\n WEBGL_RESOLUTION_RESTORED = 60007,\n // 业务主动调用 restartWebGL() 重建 canvas + pipeline 成功\n WEBGL_CONTEXT_MANUAL_RESTARTED = 60008,\n}\n\n/**\n * 错误码新旧映射表\n * key: 旧错误码(1xxxx-6xxxx)\n * value: 新错误码(31xx-36xx)\n */\nexport const ERROR_CODE_MAP: Record<number, number> = {\n // 初始化错误\n 10001: 3101,\n 10002: 3102,\n 10003: 3103,\n 10004: 3104,\n 10005: 3105,\n 10006: 3106,\n 10007: 3107,\n // 前端处理逻辑错误\n 20001: 3201,\n 20002: 3202,\n 20003: 3203,\n 20004: 3204,\n 20005: 3205,\n 20006: 3206,\n 20007: 3207,\n 20008: 3208,\n 20009: 3209,\n 20010: 3210,\n 20011: 3211,\n // 资源管理\n 30001: 3301,\n 30002: 3302,\n 30003: 3303,\n 30004: 3304,\n 30005: 3305,\n 30006: 3306,\n 30007: 3307,\n // 数据解码\n 40001: 3401,\n 40002: 3402,\n 40003: 3403,\n 40004: 3404,\n 40005: 3405,\n 40006: 3406,\n 40007: 3407,\n // 网络错误\n 50001: 3501,\n 50002: 3502,\n 50003: 3503,\n 50004: 3504,\n // 上下文管理\n 60001: 3601,\n 60002: 3602,\n 60003: 3603,\n 60004: 3604,\n 60005: 3605,\n 60006: 3606,\n 60007: 3607,\n 60008: 3608,\n};\n\n/**\n * 错误码名称映射\n */\nexport const ERROR_NAME_MAP: Record<number, string> = {\n 10001: 'CONTAINER_NOT_FOUND',\n 10002: 'CONNECT_SOCKET_ERROR',\n 10003: 'START_SESSION_ERROR',\n 10004: 'STOP_SESSION_ERROR',\n 10005: 'INIT_ERROR',\n 10006: 'SOCKET_QUIT',\n 10007: 'SOCKET_DISCONNECT',\n 20001: 'VIDEO_FRAME_EXTRACT_ERROR',\n 20002: 'INIT_WORKER_ERROR',\n 20003: 'PROCESS_VIDEO_STREAM_ERROR',\n 20004: 'FACE_PROCESSING_ERROR',\n 20005: 'RENDER_BODY_ERROR',\n 20006: 'RENDER_FACE_ERROR',\n 20007: 'WebGL_RENDER_ERROR',\n 20008: 'RENDER_DATA_MISSING',\n 20009: 'RENDER_FACE_DATA_MISSING',\n 20010: 'EVENT_WITHOUT_SPEECH_ID',\n 20011: 'EVENT_TRIGGERED', // 分组迁移:历史归WebGL,实际为speak_start兜底打断,保留旧号\n 30001: 'BACKGROUND_IMAGE_LOAD_ERROR',\n 30002: 'FACE_BIN_LOAD_ERROR',\n 30003: 'INVALID_BODY_NAME',\n 30004: 'VIDEO_DOWNLOAD_ERROR',\n 30005: 'BODY_DATA_EXPIRED',\n 30006: 'EVENT_SPEAK_START_EXPIRED',\n 30007: 'EVENT_VOICE_START_EXPIRED',\n 40001: 'AUDIO_DECODE_ERROR',\n 40002: 'FACE_DECODE_ERROR',\n 40003: 'VIDEO_DECODE_ERROR',\n 40004: 'EVENT_DECODE_ERROR',\n 40005: 'INVALID_DATA_STRUCTURE',\n 40006: 'TTSA_ERROR',\n 40007: 'AUDIO_DATA_EXPIRED',\n 50001: 'NETWORK_DOWN',\n 50002: 'NETWORK_UP',\n 50003: 'NETWORK_RETRY',\n 50004: 'NETWORK_BREAK',\n 60001: 'WEBGL_CONTEXT_LOST',\n 60002: 'WEBGL_CONTEXT_RESTORED',\n 60003: 'WEBGL_CONTEXT_RESTORE_TIMEOUT',\n 60004: 'WEBGL_CONTEXT_RECOVERED',\n 60005: 'WEBGL_CONTEXT_RECOVERY_FAILED',\n 60006: 'WEBGL_CONTEXT_RECOVERY_MAX_ATTEMPTS',\n 60007: 'WEBGL_RESOLUTION_RESTORED',\n 60008: 'WEBGL_CONTEXT_MANUAL_RESTARTED',\n};\n\nexport interface SDKError {\n code: EErrorCode;\n error_code: number; // 新错误码(31xx-36xx),从 ERROR_CODE_MAP 查找\n error_name: string; // 错误名称,从 ERROR_NAME_MAP 查找\n message: string;\n session_id: string; // 会话 ID\n client_speak_id?: string; // 可选,当前 speak 的唯一标识\n timestamp: number;\n originalError?: any;\n}","import type XmovAvatar from \"../index\"\nimport type { IRawWidgetData } from \"./frame-data\"\nimport type { SDKError } from \"./error\"\nimport type { TDownloadProgress } from \"../modules/ResourceManager\"\nimport { FPSStats } from \"../utils/fpsTracker\";\n\nexport { ERROR_CODE_MAP, ERROR_NAME_MAP } from './error';\n\nexport type {\n CapabilitySeverity,\n CapabilityName,\n ICapabilityCheckItem,\n ICapabilityCheckReport,\n} from './capability';\n\nexport enum AvatarStatus {\n // initialized = 0,\n online = 0, // 在线可见状态(合并了原来的 playing)\n offline = 1,\n network_on = 2, // 已废弃\n network_off = 3, // 已废弃\n close = 4,\n visible = 5, // 可见状态\n invisible = 6, // 隐身状态(原来的 paused)\n stopped = 7, // 已废弃\n}\n\n\n/**\n * 渲染状态枚举\n * 用于表示渲染器的状态,与数字人状态(AvatarStatus)分离\n */\nexport enum RenderState {\n init = 'init', // 开始渲染(初始状态,准备开始)\n rendering = 'rendering', // 渲染中(正在渲染)\n pausing = 'pausing', // 暂停渲染中(正在暂停渲染)\n paused = 'paused', // 暂停渲染(暂停但保留数据)\n resumed = 'resumed', // 恢复渲染(从暂停恢复)\n stopped = 'stopped', // 渲染停止(完全停止)\n}\n\n\n/**\n * 网络情况\n * @params downlink 下载速率(Mbps)\n * @params rtt 延迟(毫秒)\n */\nexport interface INetworkInfo {\n downlink: number\n rtt: number\n networkStatus: boolean\n}\n\nexport enum InitModel {\n normal = 'normal',\n invisible = 'invisible',\n}\n\nexport interface IInitParams {\n scaleDownBy?: any\n useAlphaMask?: any\n initModel?: InitModel\n onDownloadProgress: TDownloadProgress;\n}\nexport interface IAvatarOptions {\n sdkInstance?: XmovAvatar\n containerId: string\n container?: HTMLElement\n appId: string\n appSecret: string\n gatewayServer: string // back\n tag?: string // 标签 指定特定房间\n gateway_type?: string // gateway类型,默认为default\n asr_id?: number // Agent ASR 配置 ID\n llm_id?: number // Agent LLM 配置 ID\n session_speak_req_id?: 0 | 1 // Agent 会话播报序号起始值:0 无开场白,1 有开场白\n headers?: Record<string, string> // 自定义请求头\n cacheServer?: string\n env?: string\n config?: any\n hardwareAcceleration?: string\n enableClientInterrupt?: boolean\n enableLogger?: boolean // 是否启用日志\n enableDebugger?: boolean // 是否启用调试模式\n audioOnlyMode?: boolean // 音频+事件模式(无渲染模式):仅保留音频播放和UI事件,不执行数字人渲染\n renderMode?: 'client' | 'server' // 渲染模式:client=薄客户端(video播放),server/undefined=完整渲染\n streamingServer?: string // 薄客户端模式下,Streaming Server 的 WebSocket 地址\n useAlphaMask?: boolean // 是否启用 alpha mask 透明背景(双路流方案)\n scaleDownBy?: number\n onMessage: (error: SDKError) => void\n onStartSessionWarning?: (message: Object) => void\n onAAFrameHandle?: (data: any) => void\n onNetworkInfo?(networkInfo: INetworkInfo): void\n onWidgetEvent?(data: IRawWidgetData): void\n proxyWidget?: {\n [key: string]: (data: any) => void\n }\n onStateChange?(state: string): void;\n onStateRenderChange?(state: string, duration: number): void;\n onSpeakStateChange?(state: string, client_speak_id: string | number): void;\n onRenderChange?(state: RenderState): void;\n onVoiceStateChange?(state: string, duration?: number, client_speak_id?: string | number): void;\n onStatusChange?(status: AvatarStatus): void;\n onWalkStateChange?(state: string): void;\n onFPSUpdate?(stats: FPSStats): void;\n /**\n * 数字人音频实时播放数据回调\n * - MSE/WebM 模式(raw_audio=false):通过 AudioWorklet + WebCodecs 捕获和编码\n * - PCM 模式(raw_audio=true):通过 capture worklet + WebCodecs/MediaRecorder 编码\n * 两种模式输出格式完全一致(WebM/Opus),业务侧无需区分\n */\n onAudioPlaybackData?(data: IAudioPlaybackData): void;\n /**\n * 每帧数据回调\n * 返回当前帧的 face + body 原始数据(帧号、body_id 等)\n */\n onFrameDataUpdate?(data: IFrameDataUpdate): void;\n}\n\n/**\n * 音频播放数据回调参数(farend 格式)\n * 用于 ASR 回声消除(AEC),由 Agent 封装为 AU v1 farend Binary 帧\n */\nexport interface IAudioPlaybackData {\n data: ArrayBuffer; // opus 音频原始数据(WebM 容器)\n codec: string; // 编码格式,固定 \"opus\"\n isFirstChunk: boolean; // 是否为该 speak 段的首段数据(包含 WebM 容器头)\n sampleRate: number; // 采样率\n samples: number; // 等效采样点数(100ms 对应的采样数)\n timestamp: number; // 当前 100ms 音频块起点的 epoch 毫秒时间戳\n speech_id: number; // 当前轮次id\n}\n\n/**\n * 帧数据回调参数\n * 用于返回每一帧的 face + body 原始数据(不包含渲染数据)\n */\nexport interface IFrameDataUpdate {\n /** 客户端帧号 */\n frameIndex: number;\n /** body 数据 */\n body: {\n /** body_id */\n body_id: number;\n /** 视频名称 */\n name: string;\n /** 视频内帧号(相对于视频起始的帧偏移) */\n video_frame: number;\n /** 起始帧号 */\n sf: number;\n /** 当前状态 */\n state: string;\n } | null;\n /** face 数据(不包含骨骼渲染数据) */\n face: {\n /** body_id */\n body_id: number;\n /** 起始帧号 */\n sf: number;\n /** 结束帧号 */\n ef: number;\n /** 状态 */\n state: string;\n /** face 帧类型:0=原始数据,1=实时数据 */\n face_frame_type: number;\n } | null;\n}\n\nexport interface DeviceInfo {\n device_id: string\n device_brand: string\n device_model: string\n os_version: string\n browser: string\n browser_version: string\n browser_ua: string\n sdk_version: string\n resolution: {\n width: number\n height: number\n }\n download_speed: number\n decode_speed: number\n render_speed: number\n}\n\nexport interface Layout {\n container: {\n size: number[]\n },\n avatar: {\n v_align: string //'left' | 'center' | 'right'\n h_align: string //'top' | 'center' | 'bottom'\n scale: number | string\n offset_x: number\n offset_y: number\n }\n}\n\nexport interface WalkConfig {\n min_x_offset: number\n max_x_offset: number\n walk_points: {\n [key: string]: number\n }\n init_point?: number\n}\n","import type { IWidget } from \"./event\"\nimport { IBRAnimationFrameData_NN } from \"../utils/DataInterface\"\n\nexport enum EFrameDataType {\n AUDIO = 'tts_audio',\n BODY = 'body_data',\n FACE = 'face_data',\n EVENT = 'event_data',\n AA_FRAME = 'aa_frame',\n SYNC_FRAME = 'sync_frame',\n}\n\nexport const FRAME_SOURCE_SOURCE = 'xmov_avatar_js_sdk'\n\n/** socket.io 原数据格式 */\nexport interface IRawBaseFrameData {\n sf: number\n ef: number\n}\nexport interface IRawBodyFrameData extends IRawBaseFrameData {\n hfd: boolean\n aef: number\n asf: number\n id: number\n n: string\n s: string\n body_id: number\n x_offset: Uint8Array\n}\n\n/**\n * tts下发的face数据\n */\n\nexport interface ITtsFaceFrameData {\n body_id: number;\n bsw: number[]\n ef: number\n htmi?: number[]\n htpw?: number[]\n id: number\n mjt?: number[][]\n s: string\n sf: number\n cs: string\n ttmi?: number[]\n ttpw?: number[]\n ms: {\n index: number\n weights: number[]\n }[]\n js: {\n translate: number[]\n rotate: number[]\n }[]\n face_frame_type: number\n // 机器人表情-新增\n asf?: number\n aef?: number\n n?: string\n}\nexport interface IRawFaceFrameData extends IRawBaseFrameData {\n FaceFrameData: IBRAnimationFrameData_NN;\n frameIndex: number;\n state: string;\n id: number;\n body_id: number;\n cs: string;\n face_frame_type: number;\n}\nexport interface IRawAudioFrameData extends IRawBaseFrameData {\n ad: any\n id: number\n sid: number\n multi_turn_conversation_id: string;\n}\nexport interface IRawWidgetData {\n type: string;\n data?: IWidget;\n text?: string;\n speech_id?: number;\n client_speak_id?: number;\n}\nexport interface IRawEventFrameData extends IRawBaseFrameData {\n id: number\n s: string\n e: IRawWidgetData[]\n}\nexport type IRawFrameData =\n | IRawBodyFrameData\n | ITtsFaceFrameData\n | IRawFaceFrameData\n | IRawAudioFrameData\n | IRawEventFrameData\n\nexport interface SYNC_FRAME_DATA {\n server_time: number;\n client_time: number;\n server_client_frame: number;\n source: string;\n}\n\nexport type bodyFile = {\n name: string;\n id: number;\n frameState: string;\n start: number;\n end: number;\n data: ArrayBuffer;\n hfd: boolean;\n startFrameIndex: number;\n endFrameIndex: number;\n body_id: number;\n x_offset: any;\n}\n\nexport interface StateChangeInfo {\n state: string;\n params: object;\n start_frame: number;\n}","import {\n EFrameDataType,\n IRawAudioFrameData,\n IRawFaceFrameData,\n IRawEventFrameData,\n IRawFrameData,\n StateChangeInfo,\n} from \"../types/frame-data\";\n\nexport interface IBodyFrame {\n frame: any;\n frameIndex: number;\n frameState: string;\n id: number;\n name: string;\n body_id: number;\n hfd: boolean;\n sf: number;\n offset: number;\n}\n\nexport class DataCacheQueue {\n private TAG = \"[DataCacheQueue]\";\n // body视频抽帧副本,使用 Map 优化查找和删除性能\n private _bodyQueue: Map<number, IBodyFrame> = new Map();\n // 表情match信息列表\n private _facialQueue: Array<IRawFaceFrameData> = [];\n // 原始表情数据\n private _realFacialQueue: Array<IRawFaceFrameData> = [];\n // 音频队列\n private audioQueue: Array<IRawAudioFrameData> = [];\n // UI事件队列\n private eventQueue: Array<IRawEventFrameData> = [];\n // 当前处理好的视频id组\n private videoIdList: string[] = [];\n // 当前状态\n private _currentPlayState: string = \"idle\";\n // 当前ttsa状态\n private _currentTtsaState: StateChangeInfo | null = null;\n constructor() {\n // @ts-ignore\n window[\"__dev_event_queue__\"] = this.eventQueue;\n }\n\n set currentPlayState(state: string) {\n this._currentPlayState = state;\n }\n\n get currentPlayState() {\n return this._currentPlayState;\n }\n\n set currentTtsaState(state: StateChangeInfo | null) {\n this._currentTtsaState = state;\n }\n get currentTtsaState() {\n return this._currentTtsaState;\n }\n\n get bodyQueue() {\n return Array.from(this._bodyQueue.values());\n }\n\n // 更新body视频抽帧副本\n _updateBodyImageBitmap(data: IBodyFrame) {\n const old = this._bodyQueue.get(data.frameIndex);\n if (old && old.frame && typeof old.frame.close === \"function\") {\n old.frame.close();\n }\n // 清理过期帧,根据data.body_id,删除所有小于的帧\n for (const [curIndex, curFrame] of this._bodyQueue.entries()) {\n if (curFrame.body_id < data.body_id && curFrame.frameIndex >= data.frameIndex) {\n curFrame.frame.close();\n this._bodyQueue.delete(curIndex);\n }\n }\n this._bodyQueue.set(data.frameIndex, data);\n }\n\n clearOldFrames(sf: number) {\n for (const [curIndex, curFrame] of this._bodyQueue.entries()) {\n if (curIndex >= sf) {\n curFrame.frame.close();\n this._bodyQueue.delete(curIndex);\n }\n }\n }\n\n clearOldFaceData(frameNumber: number) {\n this._facialQueue = this._facialQueue.filter(\n (item) => item.frameIndex >= frameNumber\n );\n this._realFacialQueue = this._realFacialQueue.filter(\n (item) => item.frameIndex >= frameNumber\n );\n }\n\n setVideoIdList(videoId: string) {\n if (!this.videoIdList.includes(videoId)) {\n this.videoIdList.push(videoId);\n }\n }\n\n getVideoIdList() {\n return this.videoIdList;\n }\n\n /**\n * 获取指定帧并从Map中删除\n * @param frameIndex 要获取的帧索引\n * @returns 找到的帧数据(未找到则返回undefined)\n */\n _getBodyImageBitmap(frameIndex: number) {\n const frame = this._bodyQueue.get(frameIndex);\n \n // 清理过期帧\n for (const [curIndex, curFrame] of this._bodyQueue.entries()) {\n if (curIndex < frameIndex) {\n curFrame.frame.close();\n this._bodyQueue.delete(curIndex);\n }\n }\n\n if (frame) {\n return frame;\n }\n return undefined;\n }\n\n // 获取body内的视频名称list\n getBodyVideoNameListLength() {\n const list: string[] = [];\n this.bodyQueue.forEach((item) => {\n if (!list.includes(item.name)) {\n list.push(item.name);\n }\n });\n return list.length;\n }\n\n _getFaceImageBitmap(frameIndex: number, body_id: number) {\n // 找出face中frameIndex和body_id相同的帧\n let targetItem: IRawFaceFrameData | null = null;\n for (let i = this._facialQueue.length - 1; i >= 0; i--) {\n const item = this._facialQueue[i];\n if (item.frameIndex === frameIndex && item.body_id === body_id) {\n targetItem = item;\n break; // 找到后立即退出循环\n }\n }\n // 删除所有小于frameIndex的帧\n this._facialQueue = this._facialQueue.filter(\n (item) => item.frameIndex >= frameIndex\n );\n return targetItem;\n }\n // 更新表情队列\n _updateFacial(data: Array<IRawFaceFrameData>) {\n this._facialQueue.push(...data);\n }\n get facialQueue() {\n return this._facialQueue;\n }\n _getRealFaceImageBitmap(frameIndex: number, body_id: number) {\n // 找出face中frameIndex和body_id相同的帧\n let targetItem: IRawFaceFrameData | null = null;\n for (let i = this._realFacialQueue.length - 1; i >= 0; i--) {\n const item = this._realFacialQueue[i];\n if (item?.frameIndex === frameIndex && item?.body_id === body_id) {\n targetItem = item;\n break; // 找到后立即退出循环\n }\n }\n // 删除所有小于frameIndex的帧\n this._realFacialQueue = this._realFacialQueue.filter(\n (item) => item?.frameIndex >= frameIndex\n );\n return targetItem;\n }\n _updateRealFacial(data: Array<IRawFaceFrameData>) {\n this._realFacialQueue.push(...data);\n }\n get realFacialQueue() {\n return this._realFacialQueue;\n }\n\n /**\n * 清空所有表情数据(用于切换隐身模式时)\n */\n clearAllFaceData() {\n this._facialQueue = [];\n this._realFacialQueue = [];\n (window as any).avatarSDKLogger?.log(\n this.TAG,\n \"已清空所有表情数据\"\n );\n }\n _updateAudio(data: Array<IRawAudioFrameData>) {\n this.audioQueue.push(...data);\n }\n\n _clearAudio(speech_id: number) {\n if (speech_id !== -1) {\n this.audioQueue = this.audioQueue.filter(item => item.sid !== speech_id);\n } else {\n this.audioQueue = [];\n }\n }\n\n _getAudio(frameIndex: number) {\n const targetIndex = this.audioQueue.findIndex(\n (item) => item.sf === frameIndex\n );\n if (targetIndex === -1) {\n return;\n }\n const [targetItem] = this.audioQueue.splice(targetIndex, 1);\n return targetItem;\n }\n\n _getAudioInterval(startFrame: number, endFrame: number) {\n const audioList = this.audioQueue.filter(\n (item) => item.sf >= startFrame && item.sf <= endFrame\n );\n if (audioList.length === 0) {\n return;\n }\n const audio = audioList[audioList.length - 1];\n const index = this.audioQueue.findIndex((item) => item.id === audio.id);\n this.audioQueue.splice(index, 1);\n return audio;\n }\n\n _updateUiEvent(data: Array<IRawEventFrameData>) {\n this.eventQueue.push(...data);\n }\n\n clearOldEvent(frame: number) {\n this.eventQueue = this.eventQueue.filter(item => item.sf >= frame);\n }\n\n clearSubtitleOn(speech_id: number) {\n this.eventQueue = this.eventQueue.map(item => ({\n ...item,\n e: item.e?.filter((subItem: any) => subItem.speech_id > speech_id || subItem.type !== \"subtitle_on\")\n }));\n }\n\n _clearEvent() {\n this.eventQueue = [];\n }\n\n // 获取指定帧的事件,并合并相同 sf 的 e 数组\n _getEvent(frame: number) {\n // 1. 找出所有匹配 sf 的事件\n const matchedItems = this.eventQueue.filter(item => item.sf === frame);\n if (matchedItems.length === 0) return;\n\n // 2. 从原队列删除这些事件\n this.eventQueue = this.eventQueue.filter(item => item.sf !== frame);\n\n // 3. 合并所有 e 数组(核心逻辑)\n return this._mergeEventsBySf(matchedItems);\n }\n\n // 获取区间内事件,并合并相同 sf 的 e 数组\n _getEventInterval(startFrame: number, endFrame: number) {\n // 1. 找出所有区间内的事件\n const matchedItems = this.eventQueue.filter(\n item => item.sf >= startFrame && item.sf <= endFrame\n );\n if (matchedItems.length === 0) return;\n\n // 2. 从原队列删除这些事件\n this.eventQueue = this.eventQueue.filter(\n item => !(item.sf >= startFrame && item.sf <= endFrame)\n );\n\n // 3. 合并所有 e 数组(核心逻辑)\n return this._mergeEventsBySf(matchedItems);\n }\n\n // 【工具方法】合并相同 sf 的事件,把 e 数组拼接在一起\n _mergeEventsBySf(events: any[]) {\n // 以 sf 为 key 分组合并\n const grouped = {};\n for (const event of events) {\n const key = event.sf;\n if (!grouped[key]) {\n // 第一次遇到该 sf,创建基础结构\n grouped[key] = { ...event, e: [] };\n }\n // 把当前事件的 e 数组 push 进去(合并)\n grouped[key].e.push(...event.e);\n }\n\n // 取出合并后的结果(你这里 sf 都相同,只会有一个)\n const mergedList:any = Object.values(grouped);\n if(mergedList.length === 0) return null\n if (mergedList.length > 1) {\n // 合并所有帧的e到一个数组\n const allE: any[] = [];\n mergedList.forEach((item:any) => allE.push(...item.e));\n // 构造单个event对象,和你原来代码格式完全一致\n return {\n ...mergedList[0],\n mergeFrameFlag: 1,\n e: allE\n };\n } else{\n return mergedList[0];\n }\n }\n\n /**\n * 检查数据是否因seek等原因失效,并清理缓存。\n * @param data 新的数据帧数组\n * @param type 数据类型\n */\n checkValidData(data: Array<IRawFrameData>, type: string) {\n switch (type) {\n case EFrameDataType.BODY:\n break;\n case EFrameDataType.FACE: {\n // 根据bodyId获取face,暂时去掉过滤\n // if (this._facialQueue.length === 0 || data.length === 0) {\n // return;\n // }\n // const isDiscontinuous =\n // this._facialQueue[this._facialQueue.length - 1]?.ef >= data[0].sf ||\n // data[0].sf <= this._facialQueue[0]?.sf;\n // if (isDiscontinuous) {\n // const facialIndex = this._facialQueue.findIndex(\n // (item) => item.sf >= data[0].sf\n // );\n // if (facialIndex !== -1) {\n // this._facialQueue.length = facialIndex;\n // }\n // }\n break;\n }\n case EFrameDataType.AUDIO: {\n if (this.audioQueue.length === 0 || data.length === 0) {\n return;\n }\n const isDiscontinuous =\n this.audioQueue[this.audioQueue.length - 1]?.ef < data[0].sf ||\n data[0].sf < this.audioQueue[0]?.sf;\n if (isDiscontinuous) {\n const audioIndex = this.audioQueue.findIndex(\n (item) => item.sf >= data[0].sf\n );\n if (audioIndex !== -1) {\n this.audioQueue.length = audioIndex;\n }\n }\n break;\n }\n }\n }\n destroy() {\n this._bodyQueue.forEach((item) => {\n if (item.frame && typeof item.frame.close === \"function\") {\n item.frame.close();\n }\n });\n this._bodyQueue.clear();\n this._facialQueue = [];\n this.audioQueue = [];\n this.eventQueue = [];\n }\n}\n","// @ts-nocheck\n\nexport class GLDevice {\n private _ElementTypeMap_JS2GL!: { readonly [index: string]: number };\n private _FormatTypeMap_Ext2Int!: Map<number, Map<number, number>>;\n private _FormatTypeMap_Ext2Str!: Map<number, string>;\n private shaderStage!: { readonly [index: string]: number };\n private running: boolean = true;\n private syncMedia: HTMLVideoElement | null = null;\n private syncMediaTime: DOMHighResTimeStamp | null = null;\n private _lost_context_sim: WEBGL_lose_context | null = null;\n canvas: HTMLCanvasElement;\n gl!: WebGL2RenderingContext;\n frameID: number | null;\n cbRender: (device: GLDevice) => void;\n private _isDestroyed: boolean = false;\n private _onContextLost: (e: Event) => void;\n private _onContextRestored: () => void;\n private _onContextCreationError: (e: Event) => void;\n\n constructor(canvas: HTMLCanvasElement) {\n this.canvas = canvas;\n this.frameID = null;\n\n const initContext = () => {\n const gl = this.canvas.getContext('webgl2', { antialias: false, premultipliedAlpha: true, preserveDrawingBuffer: true });\n if (!gl) throw Error(\"WebGL context cannot be created.\"); else this.gl = gl;\n\n this._lost_context_sim = this.gl.getExtension(\"WEBGL_lose_context\");\n\n this.shaderStage = {\n \"vertex\": this.gl.VERTEX_SHADER,\n \"fragment\": this.gl.FRAGMENT_SHADER\n }\n\n this._ElementTypeMap_JS2GL = {\n \"Uint8Array\": this.gl.UNSIGNED_BYTE,\n \"Uint8ClampedArray\": this.gl.UNSIGNED_BYTE,\n \"Int8Array\": this.gl.BYTE,\n \"Uint16Array\": this.gl.UNSIGNED_SHORT,\n \"Int16Array\": this.gl.SHORT,\n \"Uint32Array\": this.gl.UNSIGNED_INT,\n \"Int32Array\": this.gl.INT,\n \"Float16Array\": this.gl.HALF_FLOAT,\n \"Float32Array\": this.gl.FLOAT\n };\n\n const _FormatTypeMap_Ext2Int_Raw: [number, [number, number][]][] = [\n [this.gl.UNSIGNED_BYTE, [[this.gl.RED, this.gl.R8], [this.gl.RED_INTEGER, this.gl.R8UI], [this.gl.RG, this.gl.RG8], [this.gl.RG_INTEGER, this.gl.RG8UI], [this.gl.RGB, this.gl.RGB8], [this.gl.RGB_INTEGER, this.gl.RGB8UI], [this.gl.RGBA, this.gl.RGBA8], [this.gl.RGBA_INTEGER, this.gl.RGBA8UI]]],\n [this.gl.BYTE, [[this.gl.RED, this.gl.R8_SNORM], [this.gl.RED_INTEGER, this.gl.R8I], [this.gl.RG, this.gl.RG8_SNORM], [this.gl.RG_INTEGER, this.gl.RG8I], [this.gl.RGB, this.gl.RGB8_SNORM], [this.gl.RGB_INTEGER, this.gl.RGB8I], [this.gl.RGBA, this.gl.RGBA8_SNORM], [this.gl.RGBA_INTEGER, this.gl.RGBA8I]]],\n [this.gl.UNSIGNED_SHORT, [[this.gl.RED_INTEGER, this.gl.R16UI], [this.gl.RG_INTEGER, this.gl.RG16UI], [this.gl.RGB_INTEGER, this.gl.RGB16UI], [this.gl.RGBA_INTEGER, this.gl.RGBA16UI], [this.gl.DEPTH_COMPONENT, this.gl.DEPTH_COMPONENT16]]],\n [this.gl.SHORT, [[this.gl.RED_INTEGER, this.gl.R16I], [this.gl.RG_INTEGER, this.gl.RG16I], [this.gl.RGB_INTEGER, this.gl.RGB16I], [this.gl.RGBA_INTEGER, this.gl.RGBA16I]]],\n [this.gl.UNSIGNED_INT, [[this.gl.RED_INTEGER, this.gl.R32UI], [this.gl.RG_INTEGER, this.gl.RG32UI], [this.gl.RGB_INTEGER, this.gl.RGB32UI], [this.gl.RGBA_INTEGER, this.gl.RGBA32UI], [this.gl.DEPTH_COMPONENT, this.gl.DEPTH_COMPONENT24]]],\n [this.gl.INT, [[this.gl.RED_INTEGER, this.gl.R32I], [this.gl.RG_INTEGER, this.gl.RG32I], [this.gl.RGB_INTEGER, this.gl.RGB32I], [this.gl.RGBA_INTEGER, this.gl.RGBA32I]]],\n [this.gl.HALF_FLOAT, [[this.gl.RED, this.gl.R16F], [this.gl.RG, this.gl.RG16F], [this.gl.RGB, this.gl.RGB16F], [this.gl.RGBA, this.gl.RGBA16F]]],\n [this.gl.FLOAT, [[this.gl.RED, this.gl.R32F], [this.gl.RG, this.gl.RG32F], [this.gl.RGB, this.gl.RGB32F], [this.gl.RGBA, this.gl.RGBA32F], [this.gl.DEPTH_COMPONENT, this.gl.DEPTH_COMPONENT32F]]],\n [this.gl.UNSIGNED_SHORT_5_6_5, [[this.gl.RGB, this.gl.RGB565]]],\n [this.gl.UNSIGNED_SHORT_4_4_4_4, [[this.gl.RGBA, this.gl.RGBA4]]],\n [this.gl.UNSIGNED_SHORT_5_5_5_1, [[this.gl.RGBA, this.gl.RGB5_A1]]],\n [this.gl.UNSIGNED_INT_2_10_10_10_REV, [[this.gl.RGBA, this.gl.RGB10_A2]]],\n [this.gl.UNSIGNED_INT_10F_11F_11F_REV, [[this.gl.RGB, this.gl.R11F_G11F_B10F]]],\n [this.gl.UNSIGNED_INT_5_9_9_9_REV, [[this.gl.RGB, this.gl.RGB9_E5]]],\n [this.gl.UNSIGNED_INT_24_8, [[this.gl.DEPTH_STENCIL, this.gl.DEPTH24_STENCIL8]]],\n [this.gl.FLOAT_32_UNSIGNED_INT_24_8_REV, [[this.gl.DEPTH_STENCIL, this.gl.DEPTH32F_STENCIL8]]]\n ];\n this._FormatTypeMap_Ext2Int = new Map();\n for (const [elemType, formats] of _FormatTypeMap_Ext2Int_Raw) {\n const formatMap = new Map<number, number>();\n for (const [extFormat, intFormat] of formats) formatMap.set(extFormat, intFormat);\n this._FormatTypeMap_Ext2Int.set(elemType, formatMap);\n }\n\n const _FormatTypeMap_Ext2Str_Raw: { [name: string]: number } = {\n \"GL_RED\": this.gl.RED,\n \"GL_RED_INTEGER\": this.gl.RED_INTEGER,\n \"GL_RG\": this.gl.RG,\n \"GL_RG_INTEGER\": this.gl.RG_INTEGER,\n \"GL_RGB\": this.gl.RGB,\n \"GL_RGB_INTEGER\": this.gl.RGB_INTEGER,\n \"GL_RGBA\": this.gl.RGBA,\n \"GL_RGBA_INTEGER\": this.gl.RGBA_INTEGER,\n \"GL_DEPTH_COMPONENT\": this.gl.DEPTH_COMPONENT,\n \"GL_DEPTH_STENCIL\": this.gl.DEPTH_STENCIL\n }\n this._FormatTypeMap_Ext2Str = new Map();\n for (const [name, value] of Object.entries(_FormatTypeMap_Ext2Str_Raw)) this._FormatTypeMap_Ext2Str.set(value, name);\n };\n\n this.frameID = null;\n this.cbRender = () => { };\n\n // 使用命名函数引用,以便 destroy() 能正确移除监听器\n this._onContextLost = (e: Event) => {\n e.preventDefault();\n this.stop();\n };\n this._onContextRestored = initContext;\n this._onContextCreationError = (e: Event) => {\n console.error((e as WebGLContextEvent).statusMessage || \"WebGL context creation error: unknown error.\");\n };\n\n this.canvas.addEventListener(\"webglcontextlost\", this._onContextLost, false);\n this.canvas.addEventListener(\"webglcontextrestored\", this._onContextRestored, false);\n this.canvas.addEventListener(\"webglcontextcreationerror\", this._onContextCreationError, false);\n\n initContext();\n }\n compileShaderProgram(shaders: { readonly [index: string]: string }): WebGLProgram {\n let shaderProgram = this.gl.createProgram();\n if (!shaderProgram) throw new Error('WebGL shader program creation failed.');\n\n for (const [stage, code] of Object.entries(shaders)) {\n const shader = this.gl.createShader(this.shaderStage[stage]);\n if (!shader) throw new Error('WebGL shader creation failed.');\n this.gl.shaderSource(shader, code)\n this.gl.compileShader(shader)\n if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n const compile_log = this.gl.getShaderInfoLog(shader);\n this.gl.deleteShader(shader);\n throw new Error('WebGL shader compile failed:' + compile_log);\n }\n this.gl.attachShader(shaderProgram, shader);\n }\n\n this.gl.linkProgram(shaderProgram);\n if (!this.gl.getProgramParameter(shaderProgram, this.gl.LINK_STATUS)) {\n const link_log = this.gl.getProgramInfoLog(shaderProgram);\n this.gl.deleteProgram(shaderProgram);\n throw new Error('WebGL shader compile failed:' + link_log);\n }\n\n return shaderProgram;\n }\n getShaderProgramUniformLocation(program: WebGLProgram, attribNames: Array<string>): { [index: string]: WebGLUniformLocation } {\n let result: { [index: string]: WebGLUniformLocation } = {};\n for (const name of attribNames) result[name] = this.gl.getUniformLocation(program, name)!;\n return result;\n }\n getShaderProgramUniformBlockLocation(program: WebGLProgram, attribNames: Array<string>): { [index: string]: GLint } {\n let result: { [index: string]: GLint } = {};\n for (const name of attribNames) result[name] = this.gl.getUniformBlockIndex(program, name)!;\n return result;\n }\n getShaderProgramAttribLocation(program: WebGLProgram, attribNames: Array<string>): { [index: string]: GLint } {\n let result: { [index: string]: GLint } = {};\n for (const name of attribNames) result[name] = this.gl.getAttribLocation(program, name)!;\n return result;\n }\n getGLArrayElementType(arr: ArrayBufferView<ArrayBufferLike>): number | null {\n // @ts-ignore\n const tag = arr[Symbol.toStringTag] as string;\n if (tag in this._ElementTypeMap_JS2GL) return this._ElementTypeMap_JS2GL[tag]; else return null;\n }\n getGLTexInternalFormat(externalFormat: number, elementType: number): number | null {\n const formats = this._FormatTypeMap_Ext2Int.get(elementType);\n if (formats) {\n const internalFormat = formats.get(externalFormat);\n if (internalFormat) return internalFormat;\n }\n return null;\n }\n texImage2D(target: number, level: number, width: number, height: number, format: number, srcData: ArrayBufferView<ArrayBufferLike>) {\n const elementType = this.getGLArrayElementType(srcData);\n // @ts-ignore\n if (!elementType) throw new Error(`Unsupported data format: ${srcData[Symbol.toStringTag] as string}`);\n const internalFormat = this.getGLTexInternalFormat(format, elementType);\n // @ts-ignore\n if (!internalFormat) throw new Error(`No available internal format for ${srcData[Symbol.toStringTag] as string} and ${this._FormatTypeMap_Ext2Str.get(format) ?? \"unknown\"}.`);\n if (this.gl.HALF_FLOAT == elementType) srcData = new Uint16Array(srcData.buffer); // patch for Float16Array\n this.gl.texImage2D(target, level, internalFormat, width, height, 0, format, elementType, srcData);\n }\n texImage3D(target: number, level: number, width: number, height: number, depth: number, format: number, srcData: ArrayBufferView<ArrayBufferLike>) {\n const elementType = this.getGLArrayElementType(srcData);\n // @ts-ignore\n if (!elementType) throw new Error('Unsupported data format: ' + srcData[Symbol.toStringTag] as string);\n const internalFormat = this.getGLTexInternalFormat(format, elementType);\n // @ts-ignore\n if (!internalFormat) throw new Error(`No available internal format for ${srcData[Symbol.toStringTag] as string} and ${this._FormatTypeMap_Ext2Str.get(format) ?? \"unknown\"}.`);\n if (this.gl.HALF_FLOAT == elementType) srcData = new Uint16Array(srcData.buffer); // patch for Float16Array\n this.gl.texImage3D(target, level, internalFormat, width, height, depth, 0, format, elementType, srcData);\n }\n run(fn: (device: GLDevice) => void, syncMedia?: HTMLVideoElement) {\n this.running = true;\n this.cbRender = fn;\n if (syncMedia && syncMedia instanceof HTMLVideoElement) {\n this.syncMedia = syncMedia;\n const fnWrapper = (now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata) => {\n if (this.running) {\n this.syncMediaTime = metadata.mediaTime;\n this.cbRender(this);\n this.frameID = syncMedia.requestVideoFrameCallback(fnWrapper);\n }\n };\n this.syncMediaTime = syncMedia.currentTime;\n this.cbRender(this);\n syncMedia.requestVideoFrameCallback(fnWrapper);\n }\n else {\n const fnWrapper = () => {\n if (this.running) {\n this.cbRender(this);\n this.frameID = requestAnimationFrame(fnWrapper);\n }\n };\n fnWrapper();\n }\n }\n refresh() { this.cbRender(this); }\n getSyncMediaTime(): number | null { return this.syncMediaTime; }\n stop() {\n if (null !== this.frameID) {\n if (this.syncMedia) {\n this.syncMedia.cancelVideoFrameCallback(this.frameID);\n this.syncMedia = null;\n this.syncMediaTime = null;\n }\n else cancelAnimationFrame(this.frameID);\n this.frameID = null;\n }\n this.running = false;\n }\n simulateContextFault(contextAvailable: boolean) {\n if (this._lost_context_sim) {\n contextAvailable ? this._lost_context_sim.restoreContext() : this._lost_context_sim.loseContext();\n }\n }\n captureFrame() {\n const width = this.canvas.width\n const height = this.canvas.height\n const pixelData = new Uint8ClampedArray(width * height * 4)\n this.gl.readPixels(0, 0, width, height, this.gl.RGBA, this.gl.UNSIGNED_BYTE, pixelData);\n\n return {\n width,\n height,\n data: pixelData\n }\n }\n destroy(): void {\n // 1. 防止重复销毁\n if (this._isDestroyed || !this.gl) {\n return;\n }\n\n const gl = this.gl;\n\n try {\n // 主动丢失WebGL上下文(关键:通知浏览器回收上下文)\n const loseExtension = gl.getExtension(\"WEBGL_lose_context\");\n if (loseExtension) {\n loseExtension.loseContext(); // 触发上下文丢失,释放浏览器级资源\n }\n\n // 清理画布状态\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n gl.flush(); // 确保所有渲染命令执行完毕\n\n // 清除DOM/引用(助力垃圾回收)\n if (this.canvas) {\n // 可选:从DOM移除画布(根据业务需求决定是否保留)\n // this.canvas.remove();\n // 清空画布内容\n const ctx2d = this.canvas.getContext(\"2d\");\n if (ctx2d) {\n ctx2d.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n }\n\n // 移除事件监听器(使用命名函数引用,可正确移除)\n if (this.canvas) {\n this.canvas.removeEventListener(\"webglcontextlost\", this._onContextLost, false);\n this.canvas.removeEventListener(\"webglcontextrestored\", this._onContextRestored, false);\n this.canvas.removeEventListener(\"webglcontextcreationerror\", this._onContextCreationError, false);\n }\n\n // 标记上下文为null,防止后续误调用\n this.gl = null;\n this._isDestroyed = true;\n\n } catch (error) {\n // 即使出错,也标记为销毁(避免重复尝试)\n this._isDestroyed = true;\n }\n }\n\n}","export type vec3 = [number, number, number];\nexport type vec4 = [number, number, number, number];\nexport type mat3 = [vec3, vec3, vec3];\nexport type mat4 = [vec4, vec4, vec4, vec4];\n\nexport function length(vec: number[]): number { return Math.sqrt(vec.reduce((sum, val) => (sum + val * val), 0.0)); }\nexport function normalize(vec: number[]): number[] {\n let vec_len = length(vec);\n return vec.map((x) => (x / vec_len));\n}\nexport function mvmul(lhs: number[][], rhs: number[]): number[] {\n // lhs is row major.\n const size_row = lhs.length;\n const size_col = rhs.length;\n let result: number[] = Array(size_row);\n for (let i = 0; i < size_row; i++) {\n result[i] = 0.0;\n for (let j = 0; j < size_col; j++)result[i] += lhs[i][j] * rhs[j];\n }\n return result;\n}\nexport function mmul(lhs: number[][], rhs: number[][]): number[][] {\n // lhs and rhs is row major.\n const size_row = lhs.length;\n const size_mid = rhs.length;\n const size_col = rhs[0].length;\n let result: number[][] = Array(size_row);\n for (let i = 0; i < size_row; i++) {\n let result_row: number[] = Array(size_col);\n for (let j = 0; j < size_col; j++){\n result_row[j] = 0.0;\n for (let k = 0; k < size_mid; k++)result_row[j] += lhs[i][k] * rhs[k][j];\n }\n result[i] = result_row;\n }\n return result;\n}\nexport function transpose(mat: number[][]): number[][] {\n // lhs and rhs is row major.\n const size_row = mat.length;\n const size_col = mat[0].length;\n let result: number[][] = Array(size_col);\n for (let i = 0; i < size_col; i++) {\n let result_row: number[] = Array(size_row);\n for (let j = 0; j < size_row; j++) {\n result_row[j] = mat[j][i];\n }\n result[i] = result_row;\n }\n return result;\n}\nexport function identity(size: number): number[][] {\n let result: number[][] = Array(size);\n for (let i = 0; i < size; i++) {\n let result_row: number[] = Array(size);\n for (let j = 0; j < size; j++)result_row[j] = (i == j ? 1.0 : 0.0);\n result[i] = result_row;\n }\n return result;\n}\nexport function det3(mat: mat3): number {\n let result = 0.0;\n result += mat[0][0] * mat[1][1] * mat[2][2];\n result += mat[0][1] * mat[1][2] * mat[2][0];\n result += mat[0][2] * mat[1][0] * mat[2][1];\n result -= mat[0][2] * mat[1][1] * mat[2][0];\n result -= mat[0][1] * mat[1][0] * mat[2][2];\n result -= mat[0][0] * mat[1][2] * mat[2][1];\n return result;\n}\nexport function inv3(mat: mat3): mat3 {\n\tconst invdet = 1.0 / det3(mat);\n\treturn [\n [(mat[1][1] * mat[2][2] - mat[2][1] * mat[1][2]) * invdet, (mat[0][2] * mat[2][1] - mat[0][1] * mat[2][2]) * invdet, (mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1]) * invdet],\n [(mat[1][2] * mat[2][0] - mat[1][0] * mat[2][2]) * invdet, (mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0]) * invdet, (mat[1][0] * mat[0][2] - mat[0][0] * mat[1][2]) * invdet],\n\t [(mat[1][0] * mat[2][1] - mat[2][0] * mat[1][1]) * invdet, (mat[2][0] * mat[0][1] - mat[0][0] * mat[2][1]) * invdet, (mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1]) * invdet]\n ];\n}\nexport function inv4(mat: mat4): mat4 {\n //Gauss-Jordan inverse from http://dev.gameres.com/Program/Visual/3D/Mnquick.htm\n let result: mat4 = [[...mat[0]], [...mat[1]], [...mat[2]], [...mat[3]]];\n let xPos = [0, 0, 0, 0], yPos = [0, 0, 0, 0];\n let flip = 1;\n let det = 1, tmp = 0;\n\n for (let k = 0; k < 4; k++) {\n //Choose pivot element\n let pivot = 0;\n for (let i = k; i < 4; i++) {\n for (let j = k; j < 4; j++) {\n if (Math.abs(result[i][j]) > pivot) { pivot = Math.abs(result[i][j]); xPos[k] = i; yPos[k] = j; }\n }\n }\n if (pivot < Number.EPSILON) return new Array(4).fill(new Array(4).fill(NaN)) as mat4;\n //Swap pivot element to lead element\n if (xPos[k] != k) {\n flip = -flip;\n for (let i = 0; i < 4; i++) {\n tmp = result[k][i];\n result[k][i] = result[xPos[k]][i];\n result[xPos[k]][i] = tmp;\n }\n }\n if (yPos[k] != k) {\n flip = -flip;\n for (let i = 0; i < 4; i++) {\n tmp = result[i][k];\n result[i][k] = result[i][yPos[k]];\n result[i][yPos[k]] = tmp;\n }\n }\n det *= result[k][k];\n\n //elimination\n result[k][k] = 1 / result[k][k];\n for (let j = 0; j < 4; j++) {\n if (j != k) result[k][j] *= result[k][k];\n }\n for (let i = 0; i < 4; i++) {\n if (i != k) {\n for (let j = 0; j < 4; j++) {\n if (j != k) result[i][j] -= result[i][k] * result[k][j];\n }\n }\n }\n for (let i = 0; i < 4; i++) {\n if (i != k) result[i][k] *= -result[k][k];\n }\n }\n\n for (let k = 3; k >= 0; k--) {\n if (yPos[k] != k) {\n for (let i = 0; i < 4; i++) {\n tmp = result[k][i];\n result[k][i] = result[yPos[k]][i];\n result[yPos[k]][i] = tmp;\n }\n }\n if (xPos[k] != k) {\n for (let i = 0; i < 4; i++) {\n tmp = result[i][k];\n result[i][k] = result[i][xPos[k]];\n result[i][xPos[k]] = tmp;\n }\n }\n }\n return result;\n}\nexport function quaternion_conj(q: vec4): vec4 {\n return [q[0], -q[1], -q[2], -q[3]];\n}\nexport function quaternion_mul(lhs: vec4, rhs: vec4): vec4 {\n return [\n\t lhs[0] * rhs[0] - lhs[1] * rhs[1] - lhs[2] * rhs[2] - lhs[3] * rhs[3],\n\t lhs[0] * rhs[1] + lhs[1] * rhs[0] + lhs[2] * rhs[3] - lhs[3] * rhs[2],\n\t lhs[0] * rhs[2] - lhs[1] * rhs[3] + lhs[2] * rhs[0] + lhs[3] * rhs[1],\n\t lhs[0] * rhs[3] + lhs[1] * rhs[2] - lhs[2] * rhs[1] + lhs[3] * rhs[0],\n ];\n}\nexport function quaternion_to_mat(q: vec4): mat3 {\n const [r, i, j, k] = q;\n return [\n [r * r + i * i - j * j - k * k, 2 * (i * j - k * r), 2 * (i * k + j * r)],\n [2 * (i * j + k * r), r * r - i * i + j * j - k * k, 2 * (j * k - i * r)],\n [2 * (i * k - j * r), 2 * (j * k + i * r), r * r - i * i - j * j + k * k]\n ];\n}\nexport function mat_to_quaternion(mat: mat3 | mat4): vec4 {\n let trace: number;\n let result: vec4;\n if (mat[2][2] < 0.0) {\n if (mat[0][0] > mat[1][1]) {\n trace = 1.0 + mat[0][0] - mat[1][1] - mat[2][2];\n result = [mat[2][1] - mat[1][2], trace, mat[1][0] + mat[0][1], mat[0][2] + mat[2][0]];\n }\n else {\n trace = 1.0 - mat[0][0] + mat[1][1] - mat[2][2];\n result = [mat[0][2] - mat[2][0], mat[1][0] + mat[0][1], trace, mat[2][1] + mat[1][2]];\n }\n }\n else {\n if (mat[0][0] < -mat[1][1]) {\n trace = 1.0 - mat[0][0] - mat[1][1] + mat[2][2];\n result = [mat[1][0] - mat[0][1], mat[0][2] + mat[2][0], mat[2][1] + mat[1][2], trace];\n }\n else {\n trace = 1.0 + mat[0][0] + mat[1][1] + mat[2][2];\n result = [trace, mat[2][1] - mat[1][2], mat[0][2] - mat[2][0], mat[1][0] - mat[0][1]];\n }\n }\n let trace_2sqrt = 2.0 * Math.sqrt(trace); // need further check\n for (let i = 0; i < 4; i++)result[i] /= trace_2sqrt;\n return result;\n}\nexport function GivensTransform(mat: number[][], row0: number, row1: number, angle: number): void {\n // The angle should be in radian.\n\n const s = Math.sin(angle);\n const c = Math.cos(angle);\n const size_col = mat[0].length;\n for (let i = 0; i < size_col; i++) {\n const a1 = c * mat[row0][i] - s * mat[row1][i];\n const a2 = s * mat[row0][i] + c * mat[row1][i];\n mat[row0][i] = a1;\n mat[row1][i] = a2;\n }\n}\nexport function Euler_to_mat(angles: [number, number, number], order: string = \"xyz\"): mat3 {\n // The angle should be in radian.\n let result = identity(3) as mat3;\n \n switch(order){\n case \"xyz\":\n GivensTransform(result, 1, 2, angles[0]);\n GivensTransform(result, 2, 0, angles[1]);\n GivensTransform(result, 0, 1, angles[2]);\n break\n case \"yzx\":\n GivensTransform(result, 0, 1, angles[2]);\n GivensTransform(result, 1, 2, angles[0]);\n GivensTransform(result, 2, 0, angles[1]);\n break\n case \"zxy\":\n GivensTransform(result, 1, 2, angles[0]);\n GivensTransform(result, 2, 0, angles[1]);\n GivensTransform(result, 0, 1, angles[2]);\n break\n case \"xzy\":\n GivensTransform(result, 1, 2, angles[0]);\n GivensTransform(result, 0, 1, angles[2]);\n GivensTransform(result, 2, 0, angles[1]);\n break\n case \"yxz\":\n GivensTransform(result, 2, 0, angles[1]);\n GivensTransform(result, 1, 2, angles[0]);\n GivensTransform(result, 0, 1, angles[2]);\n break\n case \"zyx\":\n GivensTransform(result, 0, 1, angles[2]);\n GivensTransform(result, 2, 0, angles[1]);\n GivensTransform(result, 1, 2, angles[0]);\n break\n default:\n throw Error(\"Unrecognizable rotation order.\");\n }\n\n return result;\n}\nexport function make_homogeneous(mat: mat3, translation: vec3): mat4 {\n // lhs and rhs is row major.\n return [\n [mat[0][0], mat[0][1], mat[0][2], translation[0]],\n [mat[1][0], mat[1][1], mat[1][2], translation[1]],\n [mat[2][0], mat[2][1], mat[2][2], translation[2]],\n [0.0, 0.0, 0.0, 1.0]\n ]\n}\nexport function flatten(mat: number[][]): number[] {\n const size_row = mat.length;\n const size_col = mat[0].length;\n let result: number[] = Array(size_row * size_col);\n for (let i = 0; i < size_row; i++) {\n for (let j = 0; j < size_col; j++)result[i * size_col + j] = mat[i][j];\n }\n return result;\n}\n","import Ttsa from \"../control/ttsa\";\n\nexport const performanceConstant = {\n load_resource: 'load_resource',\n ttsa_connect: 'ttsa_connect',\n ttsa_ready: 'ttsa_ready',\n first_avatar_render: 'first_avatar_render',\n first_webgl_render: 'first_webgl_render',\n\n ttsa_body_res: 'ttsa_body_res',\n\n start_action_res: 'start_action_res',\n start_action_render: 'start_action_render',\n load_video: 'load_video',\n decode_video: 'decode_video',\n voice_response_play: 'voice_response_play',\n first_decode_video: 'first_decode_video',\n first_render: 'first_render',\n};\nconst performanceText={\n [performanceConstant.load_resource]: '加载资源',\n [performanceConstant.ttsa_connect]: 'ttsa连接',\n [performanceConstant.ttsa_ready]: 'ttsa准备返回first_start_timestamp',\n [performanceConstant.first_avatar_render]: '前端处理好第一帧渲染数据',\n [performanceConstant.first_webgl_render]: '前端处理好第一帧webgl渲染',\n [performanceConstant.ttsa_body_res]: 'ttsa返回body',\n [performanceConstant.start_action_res]: '触发行为返回',\n [performanceConstant.start_action_render]: '触发行为并渲染耗时',\n [performanceConstant.load_video]: '视频加载',\n [performanceConstant.decode_video]: '视频解码',\n [performanceConstant.voice_response_play]: 'speak音频响应',\n [performanceConstant.first_decode_video]: '第一帧视频解码',\n [performanceConstant.first_render]: '第一帧webgl渲染',\n}\n\ninterface PerformanceMark {\n state?: string;\n time: number;\n}\n\nclass PerformanceTracker {\n private marks: Map<keyof typeof performanceText, PerformanceMark> = new Map();\n private measures: Map<keyof typeof performanceText, PerformanceMark> = new Map();\n private reportFunc: Ttsa | null = null;\n private onStateRenderChange: (state: string, duration: number) => void = () => {};\n public firstDecodeTime = 0;\n public firstRenderTime = 0;\n constructor() {\n this.marks = new Map();\n this.measures = new Map();\n }\n getFirstInfo() {\n return {\n decode_speed: this.firstDecodeTime,\n render_speed: this.firstRenderTime,\n }\n }\n // 记录开始时间点\n markStart(key: string, state?: string) {\n this.marks.set(key as keyof typeof performanceText, {\n state,\n time: performance.now(),\n });\n }\n\n // 记录结束时间点并计算耗时\n markEnd(key: string, state?: string | any) {\n const mark = this.marks.get(key as keyof typeof performanceText);\n if (!mark) return;\n if(state && typeof state === 'string' && state!== mark?.state) {\n return;\n }\n const endTime = performance.now();\n const duration = endTime - mark.time;\n this.measures.set(key as keyof typeof performanceText, {\n state: mark?.state,\n time: duration,\n });\n // 提供给业务方状态改变到渲染耗时\n if(mark.state && key === performanceConstant.start_action_render) {\n this.onStateRenderChange(mark.state, duration);\n }\n this.reportMetric();\n \n if(key !== performanceConstant.load_video && key !== performanceConstant.decode_video) {\n this.marks.delete(key as keyof typeof performanceText);\n }\n // 记录第一帧解码时间\n if(key === performanceConstant.first_decode_video) {\n this.firstDecodeTime = duration;\n }\n // 记录第一帧渲染时间\n if(key === performanceConstant.first_render) {\n this.firstRenderTime = duration;\n }\n return duration;\n }\n\n // 获取所有性能数据\n getAllMetrics() {\n return Object.fromEntries(this.measures.entries());\n }\n\n getVideoMetrics() {\n const data = this.getAllMetrics();\n const filterData = Object.fromEntries(\n Object.entries(data).filter(([key]) => [performanceConstant.decode_video, performanceConstant.load_video].includes(key))\n );\n return filterData;\n }\n\n setReportFunc(ttsa: Ttsa) {\n this.reportFunc = ttsa;\n }\n\n // 上报数据到服务器\n reportMetric() {\n const data = this.getAllMetrics();\n if(Object.keys(data).length > 0 && this.reportFunc?.getStatus()) {\n // 过滤load_video和decode_video\n const filterData = Object.fromEntries(\n Object.entries(data).filter(([key]) => ![performanceConstant.load_video, performanceConstant.decode_video].includes(key))\n );\n if(Object.keys(filterData).length > 0) {\n this.reportFunc?.sendPerfLog(filterData);\n }\n // 遍历data\n for(const key in filterData) {\n if(key !== performanceConstant.decode_video && key !== performanceConstant.load_video) {\n this.measures.delete(key);\n }\n }\n }\n }\n setOnStateRenderChange(onStateRenderChange: (state: string, duration: number) => void) {\n this.onStateRenderChange = onStateRenderChange;\n }\n}\n\n// 创建全局单例\n(window as any).performanceTracker = new PerformanceTracker();","// @ts-nocheck\nimport { GLDevice } from './GLDevice'\nimport { RigidTransform, IBRAnimationGeneratorCharInfo_NN, IBRAnimationFrameData_NN, TextureFloat_3D } from './DataInterface'\nimport { vec3, mat3, mat4, transpose, identity, mmul, mvmul, inv3, inv4, flatten } from './Math'\nimport { performanceConstant } from \"./perfermance\";\n\nconst max_bones_per_vertex = 8; // need to be a multiple of 4\nconst shadow_sample_count = 4;\n\nconst shader_common = `\n float randFloat(vec2 p) {\n // generate a uniformely distributed float in [0, 1).\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n }\n bool isMaskedBitSet(uint value, uint mask){\n return bool(value & mask);\n }\n vec4 RGB2sRGB(vec4 color){\n for(uint i = 0u; i < 4u; i++){\n if(color[i] <= 0.0031308)color[i] *= 12.92;\n else color[i] = 1.055 * pow(color[i], 1.0 / 2.4) - 0.055;\n }\n return color;\n }\n vec4 sRGB2RGB(vec4 color){\n for(uint i = 0u; i < 4u; i++){\n if(color[i] <= 0.04045)color[i] /= 12.92;\n else color[i] = pow((color[i] + 0.055) / 1.055, 2.4);\n }\n return color;\n }\n`\n\nconst vs_background = `#version 300 es\n layout(location = 0) in vec2 pos;\n layout(location = 1) in vec2 texCoord;\n out vec2 v_texCoord;\n void main() {\n gl_Position = vec4(pos, 0, 1);\n v_texCoord = texCoord;\n }\n`\n\nconst fs_background = `#version 300 es\n precision mediump float;\n uniform sampler2D u_image_bg, u_image_char_body, u_image_mesh_color, u_image_mesh_alpha;\n uniform mat2 u_transform_2d; // mat2[0] = scale, mat2[1] = translation\n uniform uint flags; // 1 - has background, 2 - with multisample coverage, 4 - shadow fx\n\n layout (std140) uniform ub_shadow_fx_info {\n mat3 transform[2];\n vec4 color;\n vec4 sampleParams; // sample radius, unused, unused, unused \n } ub_shadow_fx;\n\n in vec2 v_texCoord;\n out vec4 fragColor;\n\n ${shader_common}\n\n vec2 tex2scr(vec2 coord){\n return vec2(coord.x * 2.0 - 1.0, 1.0 - coord.y * 2.0);\n }\n vec2 scr2tex(vec2 coord){\n return vec2(coord.x * 0.5 + 0.5, 0.5 - coord.y * 0.5);\n }\n vec2 randomUnitVec2D(float seed) {\n float theta = seed * 2.0 * 3.14159265359;\n return vec2(cos(theta), sin(theta));\n }\n float sampleOpacity(vec2 texCoord, mat2 u_transform_2d){\n float result = texture(u_image_mesh_color, vec2(texCoord.x, 1.0 - texCoord.y)).a;\n texCoord = texCoord * u_transform_2d[0] + u_transform_2d[1];\n texCoord.x = texCoord.x * 0.5 + 0.5;\n result += (1.0 - result) * texture(u_image_char_body, texCoord).r;\n return result;\n }\n float PI = 3.14159265359;\n\n void main() {\n float randSeed = randFloat(vec2(gl_FragCoord.xy));\n\n vec2 texcoord_transformed = v_texCoord * u_transform_2d[0] + u_transform_2d[1];\n texcoord_transformed = clamp(texcoord_transformed, 0.0, 1.0);\n vec2 texCoord_char_color = vec2(texcoord_transformed.x * 0.5, texcoord_transformed.y);\n vec2 texCoord_char_alpha = vec2(texcoord_transformed.x * 0.5 + 0.5, texcoord_transformed.y);\n vec2 texCoord_mesh = vec2(v_texCoord.x, 1.0 - v_texCoord.y);\n\n vec4 char_color = texture(u_image_char_body, texCoord_char_color);\n vec4 char_alpha = texture(u_image_char_body, texCoord_char_alpha);\n char_color = sRGB2RGB(char_color);\n char_alpha = sRGB2RGB(char_alpha);\n float char_alpha_back = char_alpha.r;\n float char_alpha_front = max(char_alpha.r - char_alpha.b, 0.0);\n\n vec4 mesh_color_srgb = texture(u_image_mesh_color, texCoord_mesh);\n float mesh_alpha = mesh_color_srgb.a;\n if(isMaskedBitSet(flags, 2u)){\n float mesh_coverage = texture(u_image_mesh_alpha, texCoord_mesh).r;\n mesh_color_srgb.rgb /= max(mesh_coverage, 9e-5); // epsilon for float16\n }\n\n vec3 final_rgb = char_alpha_back * char_color.rgb;\n float final_alpha = char_alpha_back;\n\n if(isMaskedBitSet(flags, 4u)){ // fake shadow\n vec3 pos_shadow = vec3(tex2scr(v_texCoord), 1.0);\n pos_shadow = ub_shadow_fx.transform[1] * pos_shadow;\n if(pos_shadow.z > 0.0 && pos_shadow.y > 0.0){\n // simple and noisy blur\n pos_shadow /= pos_shadow.z;\n float radius = ub_shadow_fx.sampleParams.x * pos_shadow.y;\n vec2 randVec = randomUnitVec2D(randSeed);\n mat2 randMat = mat2(randVec.x, randVec.y, -randVec.y, randVec.x);\n float shadow_opacity = 0.0;\n\n int sampleCount = radius > 0.0 ? ${shadow_sample_count} : 1;\n for(int i=0;i<sampleCount;i++){\n float sampleDist = (float(i) + 0.5) / float(sampleCount);\n float angle = 26.0 * PI * sampleDist; // prime number * 2pi\n sampleDist = radius * sqrt(sampleDist);\n vec2 sampleVec = sampleDist * randMat * vec2(cos(angle), sin(angle));\n\n vec3 pos_shadow_proj = ub_shadow_fx.transform[0] * (pos_shadow + vec3(sampleVec, 0.0));\n vec2 texCoord_shadow = clamp(pos_shadow_proj.xy / pos_shadow_proj.z, -1.0, 1.0);\n texCoord_shadow = scr2tex(texCoord_shadow);\n shadow_opacity += sampleOpacity(texCoord_shadow, u_transform_2d);\n }\n shadow_opacity /= float(sampleCount);\n float shadow_alpha = shadow_opacity * ub_shadow_fx.color.a;\n\n final_rgb = final_rgb + (1.0 - final_alpha) * shadow_alpha * ub_shadow_fx.color.rgb;\n final_alpha = final_alpha + (1.0 - final_alpha) * shadow_alpha;\n }\n }\n final_rgb = mesh_alpha * mesh_color_srgb.rgb + (1.0 - mesh_alpha) * final_rgb;\n final_alpha = mesh_alpha + (1.0 - mesh_alpha) * final_alpha;\n final_rgb = char_alpha_front * char_color.rgb + (1.0 - char_alpha_front) * final_rgb;\n final_alpha = char_alpha_front + (1.0 - char_alpha_front) * final_alpha;\n\n if(isMaskedBitSet(flags, 1u)){\n vec4 bg_color = sRGB2RGB(texture(u_image_bg, v_texCoord));\n final_rgb += bg_color.rgb * (1.0 - final_alpha);\n final_alpha = 1.0;\n }\n final_rgb = RGB2sRGB(vec4(final_rgb, 1.0)).rgb;\n fragColor = vec4(final_rgb, final_alpha);\n }\n`\n\nconst uniform_var_list_bg = [\n \"u_image_bg\", \"u_image_char_body\", \"u_image_mesh_color\", \"u_image_mesh_alpha\", \"u_transform_2d\", \"flags\"\n];\nconst uniform_block_list_bg = [\n \"ub_shadow_fx_info\"\n];\n\ninterface MeshStatistics {\n max_pca_component_count: number,\n max_bs_count: number,\n max_bones: number\n}\n\nfunction generateMeshPipelineShader(params: MeshStatistics): { [index: string]: string } {\n const vs_mesh = `#version 300 es\n precision highp float;\n\n layout (std140) uniform ub_rig_info {\n mat4 joint_matrices[${params.max_bones}];\n vec4 bs_weights[${params.max_bs_count / 4}];\n } ub_rig;\n \n uniform sampler2D u_image_bs; // used for blendshape deformation\n uniform mat4 u_proj_mat;\n uniform mat2 u_transform_2d; // mat2[0] = scale, mat2[1] = translation\n uniform uint u_bs_count; // number of bs weight vectors (divided by 4)\n uniform uint flags; // 1 - has opacity\n\n layout(location = 0) in vec3 pos;\n layout(location = 1) in vec2 tex_coord;\n layout(location = 2) in float opacity;\n layout(location = 3) in uvec4 bone_index_0_4;\n layout(location = 4) in uvec4 bone_index_4_8;\n layout(location = 5) in vec4 bone_weight_0_4;\n layout(location = 6) in vec4 bone_weight_4_8;\n\n out vec4 v_pos;\n out vec2 v_tex_coord;\n out float v_opacity;\n\n ${shader_common}\n\n vec4 lbs_transform(vec3 pos){\n float total_weight = 0.0;\n vec4 aug_pos = vec4(pos, 1.0);\n vec4 result = vec4(0.0);\n uint index;\n for(index = 0u;index < 8u;index++){\n uint joint_index;\n float joint_weight;\n if(index < 4u) {\n joint_index = bone_index_0_4[index];\n joint_weight = bone_weight_0_4[index];\n }\n else {\n joint_index = bone_index_4_8[index - 4u];\n joint_weight = bone_weight_4_8[index - 4u];\n }\n if(255u == joint_index)break;\n else result += joint_weight * (ub_rig.joint_matrices[joint_index] * aug_pos);\n }\n result /= result.w;\n return vec4(result.xyz, 1.0);\n }\n\n vec3 bs_accumulate(uint vertex_id){\n uint texWidth = uint(textureSize(u_image_bs, 0).x);\n vec3 pos = vec3(0.0);\n\n uint vertex_offset = vertex_id * u_bs_count * 3u;\n for(uint i = 0u; i < u_bs_count; i++){\n vec4 bs_weight_vec = ub_rig.bs_weights[i];\n for (uint j = 0u; j < 3u; j++){\n uint texel_offset = j * u_bs_count + vertex_offset + i;\n uint texel_x = texel_offset % texWidth;\n uint texel_y = texel_offset / texWidth;\n vec4 data = texelFetch(u_image_bs, ivec2(texel_x, texel_y), 0);\n pos[j] += dot(data, bs_weight_vec);\n }\n }\n return pos;\n }\n \n void main() {\n if(isMaskedBitSet(flags, 1u))v_opacity = opacity; else v_opacity = 1.0;\n \n vec3 bs_pos = vec3(0.0);\n if(u_bs_count > 0u)bs_pos = bs_accumulate(uint(gl_VertexID)) * v_opacity;\n v_pos = u_proj_mat * lbs_transform(pos + bs_pos);\n v_pos /= v_pos.w;\n v_pos.xy = u_transform_2d[0] * v_pos.xy + u_transform_2d[1];\n v_tex_coord = tex_coord;\n gl_Position = v_pos;\n }\n`\n\n const fs_mask = `#version 300 es\n precision highp float;\n \n in vec4 v_pos;\n in float v_opacity;\n in vec2 v_tex_coord;\n\n out vec4 fragColor;\n\n void main() {\n if(gl_FrontFacing)fragColor = vec4(1.0);\n else fragColor = vec4(0.0);\n }\n`\n\n const fs_mesh = `#version 300 es\n precision highp int;\n precision highp float;\n precision highp sampler2DArray;\n precision highp sampler3D;\n layout (std140) uniform ub_pca_info {\n vec4 weights[${params.max_pca_component_count / 4}];\n } ub_pca;\n uniform sampler2DArray u_image_pca;\n uniform sampler3D u_image_lut;\n uniform uint flags; // 2 - has LUT, 4 - unsigned PCA component\n uniform vec3 u_gamma;\n uniform vec3 u_color_balance; // r/c, g/m, b/y\n\n ${shader_common}\n \n vec4 pca_accumulate(vec2 tex_coord, bool _unsigned){\n ivec3 texSize = textureSize(u_image_pca, 0);\n vec4 result = vec4(0.0);\n for(int i = 0; i < texSize.z; i++){\n int vec_index = i / 4;\n int elem_index = i % 4;\n vec4 pca_sample = texture(u_image_pca, vec3(tex_coord, float(i)));\n if(_unsigned)pca_sample = 2.0 * pca_sample - 1.0;\n result += ub_pca.weights[vec_index][elem_index] * pca_sample;\n }\n return result;\n }\n \n in vec4 v_pos;\n in float v_opacity;\n in vec2 v_tex_coord;\n\n out vec4 fragColor;\n\n void main() {\n if(gl_FrontFacing){\n vec2 fragTexCoord = v_tex_coord;\n vec4 sample_color = pca_accumulate(v_tex_coord, isMaskedBitSet(flags, 4u));\n if(isMaskedBitSet(flags, 2u))sample_color = texture(u_image_lut, sample_color.rgb);\n // Apply gamma correction\n vec3 final_color = pow(sample_color.rgb, u_gamma);\n\n // Apply color balance\n // Convert -100 to 100 range to -0.5 to 0.5 range\n vec3 balance_adjusted = u_color_balance / 200.0; // Map -100..100 to -0.5..0.5\n\n // Red/Cyan adjustment\n final_color.r += balance_adjusted.x;\n final_color.g -= balance_adjusted.x; // Cyan is opposite of Red\n\n // Green/Magenta adjustment\n final_color.g += balance_adjusted.y;\n final_color.b -= balance_adjusted.y; // Magenta is opposite of Green\n\n // Blue/Yellow adjustment\n final_color.b += balance_adjusted.z;\n final_color.r -= balance_adjusted.z; // Yellow is opposite of Blue\n\n // Clamp values to [0, 1]\n final_color = clamp(final_color, 0.0, 1.0);\n fragColor = sRGB2RGB(vec4(final_color.bgr, v_opacity));\n }\n else fragColor = vec4(0.0);\n }\n`\n\n return { vertex: vs_mesh, fragment_mask: fs_mask, fragment: fs_mesh };\n}\n\nconst uniform_var_list_mesh = [\n \"u_proj_mat\", \"u_transform_2d\", \"u_image\", \"u_image_bs\", \"u_image_pca\", \"u_image_lut\", \"u_bs_count\", \"flags\", \"u_gamma\", \"u_color_balance\"\n];\nconst uniform_block_list_mesh = [\n \"ub_pca_info\", \"ub_rig_info\"\n];\n\ninterface PipelineInfo {\n program: WebGLProgram,\n progUniforms: { [index: string]: WebGLUniformLocation },\n progUniformBlocks: { [index: string]: GLint }\n}\ninterface TexturePCAModel {\n texture: WebGLTexture,\n unsigned: boolean,\n scalingFactor?: Float32Array;\n}\ninterface MeshInfo {\n VAO: WebGLVertexArrayObject,\n buffers: { [index: string]: WebGLBuffer },\n textures: { [index: string]: WebGLTexture },\n texturePCAModels: TexturePCAModel[],\n uniformUInts: { [index: string]: number }\n}\n\nexport interface ScaleTranslate2D {\n offsetX: number;\n offsetY: number;\n scaleX: number;\n scaleY: number;\n}\n\nexport interface GLPipelineCharData {\n char: IBRAnimationGeneratorCharInfo_NN | null,\n LUT: TextureFloat_3D | null,\n transform: ScaleTranslate2D;\n multisample: number | null;\n}\n\nexport interface GLPipelineFrameData {\n backgroundTexture: HTMLImageElement | HTMLVideoElement | null,\n charBodyTexture: HTMLImageElement | HTMLVideoElement,\n data: IBRAnimationFrameData_NN | null,\n fx: { [index: string]: unknown } | null,\n onPostRender: (pipeline: GLPipeline) => GLPipelineFrameData | null // used for capturing rendered images.\n}\n\nexport interface GLPipelineFXShadow {\n refPos: vec3;\n light: vec3;\n lightType: \"point\" | \"directional\";\n intensity: number;\n blurRadius: number;\n tint: vec3;\n}\n\ninterface GLPipelineFXShadowGeometryInfo {\n Mat_ShadowImage2World: mat3;\n Mat_World2ObjImage: mat3;\n}\n\nexport class GLPipeline {\n public readonly device: GLDevice;\n private compat_features: { [index: string]: unknown } = {};\n\n private charData: GLPipelineCharData | null = null;\n private backgroundPipelineInfo!: PipelineInfo\n private backgroundVAO!: WebGLVertexArrayObject;\n private backgroundBuffers: { [index: string]: WebGLBuffer } = {};\n private backgroundTextures: { [index: string]: WebGLTexture } = {};\n private backgroundTextureSrc: unknown = null;\n\n private meshPipelineInfo: PipelineInfo | null = null;\n private maskPipelineInfo: PipelineInfo | null = null;\n private meshInfos: Array<MeshInfo> = [];\n private meshStatistics: MeshStatistics = {\n max_pca_component_count: 4,\n max_bs_count: 4,\n max_bones: 1\n };\n\n private FrameTexture_meshColor: WebGLTexture | null = null;\n private FrameTexture_meshAlpha: WebGLTexture | null = null;\n private LUTTexture: WebGLTexture | null = null;\n\n private FrameBuffer_mesh: WebGLFramebuffer | null = null;\n private FrameBuffer_meshColor: WebGLFramebuffer | null = null;\n private FrameBuffer_meshAlpha: WebGLFramebuffer | null = null;\n private initSkeletonStatus: RigidTransform[] = [];\n\n private frameDataCallback: () => GLPipelineFrameData | null = () => null;\n\n private currentGamma: { r: number, g: number, b: number } = { r: 1.0, g: 1.0, b: 1.0 };\n private currentColorBalance: { rc: number, gm: number, by: number } = { rc: 0.0, gm: 0.0, by: 0.0 };\n\n private _ub_shadow_fx_data: Float32Array | null = null;\n private _ub_rig_info_data: Float32Array | null = null;\n private _ub_pca_info_data: Float32Array | null = null;\n private first_webgl_render: boolean = true;\n private sendSdkPoint: (point: string, data: any) => void = () => {};\n\n private assembleBackgroundPipeline() {\n this._ub_shadow_fx_data = new Float32Array(2 * 12 + 2 * 4);\n\n const program = this.device.compileShaderProgram({\n \"vertex\": vs_background,\n \"fragment\": fs_background\n });\n const progUniforms = this.device.getShaderProgramUniformLocation(program, uniform_var_list_bg);\n const progUniformBlocks = this.device.getShaderProgramUniformBlockLocation(program, uniform_block_list_bg);\n this.backgroundPipelineInfo = {\n program: program,\n progUniforms: progUniforms,\n progUniformBlocks: progUniformBlocks\n };\n this.device.gl.uniformBlockBinding(this.backgroundPipelineInfo.program, this.backgroundPipelineInfo.progUniformBlocks[\"ub_shadow_fx_info\"], 0);\n\n this.backgroundVAO = this.device.gl.createVertexArray();\n this.device.gl.bindVertexArray(this.backgroundVAO);\n\n // Setup buffers and attributes\n const positionBuffer = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.ARRAY_BUFFER, positionBuffer);\n const positions = [\n -1, -1, 0, 1,\n 1, -1, 1, 1,\n -1, 1, 0, 0,\n -1, 1, 0, 0,\n 1, -1, 1, 1,\n 1, 1, 1, 0\n ];\n this.device.gl.bufferData(this.device.gl.ARRAY_BUFFER, new Float32Array(positions), this.device.gl.STATIC_DRAW);\n\n // pos\n this.device.gl.enableVertexAttribArray(0);\n this.device.gl.vertexAttribPointer(0, 2, this.device.gl.FLOAT, false, 16, 0);\n\n // texCoord\n this.device.gl.enableVertexAttribArray(1);\n this.device.gl.vertexAttribPointer(1, 2, this.device.gl.FLOAT, false, 16, 8);\n this.device.gl.bindBuffer(this.device.gl.ARRAY_BUFFER, null);\n\n // Create buffer\n let buffers: { [index: string]: WebGLBuffer } = {}\n\n buffers['ub_shadow_fx_info'] = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.UNIFORM_BUFFER, buffers['ub_shadow_fx_info']);\n this.device.gl.bufferData(this.device.gl.UNIFORM_BUFFER, this._ub_shadow_fx_data, this.device.gl.DYNAMIC_DRAW);\n\n this.backgroundBuffers = buffers;\n\n this.device.gl.bindVertexArray(null);\n\n // Create texture\n let textures: { [index: string]: WebGLTexture } = {}\n\n textures[\"u_image_bg\"] = this.device.gl.createTexture();\n if (!textures[\"u_image_bg\"]) throw new Error('WebGL texture creation failed.');\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, textures[\"u_image_bg\"])\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_S, this.device.gl.CLAMP_TO_EDGE)\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_T, this.device.gl.CLAMP_TO_EDGE)\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_MIN_FILTER, this.device.gl.LINEAR)\n\n textures[\"u_image_char_body\"] = this.device.gl.createTexture();\n if (!textures[\"u_image_char_body\"]) throw new Error('WebGL texture creation failed.');\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, textures[\"u_image_char_body\"])\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_S, this.device.gl.CLAMP_TO_EDGE)\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_T, this.device.gl.CLAMP_TO_EDGE)\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_MIN_FILTER, this.device.gl.LINEAR)\n\n this.backgroundTextures = textures;\n }\n assembleMeshPipelines(data: GLPipelineCharData) {\n if(data.char){\n const char = data.char;\n\n // statistics\n let meshStatistics = {\n max_pca_component_count: 4,\n max_bs_count: 4,\n max_bones: Math.max(char.skeleton.length, 1)\n }\n for (let mesh_index = 0; mesh_index < char.mesh.length; mesh_index++) {\n const textureModels = char.mesh[mesh_index].textureModels;\n let pca_component_count = 0;\n for (let model of textureModels) {\n let pca_component_count_model = model.data.size[0] + (4 - 1);\n pca_component_count_model -= pca_component_count_model % 4;\n pca_component_count = Math.max(pca_component_count, pca_component_count_model);\n }\n meshStatistics.max_pca_component_count = Math.max(meshStatistics.max_pca_component_count, pca_component_count);\n\n let max_bs_count = char.mesh[mesh_index].blendshapes.size[2] + (4 - 1);\n max_bs_count -= max_bs_count % 4;\n meshStatistics.max_bs_count = Math.max(meshStatistics.max_bs_count, max_bs_count);\n }\n this.meshStatistics = meshStatistics;\n this._ub_rig_info_data = new Float32Array(this.meshStatistics.max_bones * 16 + this.meshStatistics.max_bs_count);\n this._ub_pca_info_data = new Float32Array(this.meshStatistics.max_pca_component_count);\n const shader = generateMeshPipelineShader(this.meshStatistics);\n\n let program = this.device.compileShaderProgram({ vertex: shader.vertex, fragment: shader.fragment });\n let progUniforms = this.device.getShaderProgramUniformLocation(program, uniform_var_list_mesh);\n let progUniformBlocks = this.device.getShaderProgramUniformBlockLocation(program, uniform_block_list_mesh);\n this.meshPipelineInfo = {\n program: program,\n progUniforms: progUniforms,\n progUniformBlocks: progUniformBlocks,\n };\n this.device.gl.uniformBlockBinding(this.meshPipelineInfo.program, this.meshPipelineInfo.progUniformBlocks[\"ub_rig_info\"], 0);\n this.device.gl.uniformBlockBinding(this.meshPipelineInfo.program, this.meshPipelineInfo.progUniformBlocks[\"ub_pca_info\"], 1);\n\n program = this.device.compileShaderProgram({ vertex: shader.vertex, fragment: shader.fragment_mask });\n progUniforms = this.device.getShaderProgramUniformLocation(program, uniform_var_list_mesh);\n progUniformBlocks = this.device.getShaderProgramUniformBlockLocation(program, uniform_block_list_mesh);\n this.maskPipelineInfo = {\n program: program,\n progUniforms: progUniforms,\n progUniformBlocks: progUniformBlocks,\n };\n this.device.gl.uniformBlockBinding(this.maskPipelineInfo.program, this.maskPipelineInfo.progUniformBlocks[\"ub_rig_info\"], 0);\n\n this.meshInfos = [];\n for (let mesh_index = 0; mesh_index < char.mesh.length; mesh_index++) {\n let currentMeshInfo: MeshInfo = {\n VAO: this.device.gl.createVertexArray(),\n buffers: {},\n textures: {},\n texturePCAModels: [],\n uniformUInts: {},\n };\n\n // Setup buffers and attributes\n this.device.gl.bindVertexArray(currentMeshInfo.VAO);\n\n if (null === this.device.getGLArrayElementType(char.mesh[mesh_index].blendshapes.data)) throw new Error(`Data type unsupported by WebGL: ${char.mesh[mesh_index].blendshapes.data}`);\n currentMeshInfo.buffers['pos'] = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.ARRAY_BUFFER, currentMeshInfo.buffers['pos']);\n this.device.gl.bufferData(this.device.gl.ARRAY_BUFFER, char.mesh[mesh_index].vertices.data, this.device.gl.STATIC_DRAW);\n this.device.gl.enableVertexAttribArray(0);\n this.device.gl.vertexAttribPointer(0, 3, this.device.getGLArrayElementType(char.mesh[mesh_index].blendshapes.data)!, false, 0, 0);\n\n if (null === this.device.getGLArrayElementType(char.mesh[mesh_index].UVCoord.data)) throw new Error(`Data type unsupported by WebGL: ${char.mesh[mesh_index].UVCoord.data}`);\n currentMeshInfo.buffers['tex_coord'] = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.ARRAY_BUFFER, currentMeshInfo.buffers['tex_coord']);\n this.device.gl.bufferData(this.device.gl.ARRAY_BUFFER, char.mesh[mesh_index].UVCoord.data, this.device.gl.STATIC_DRAW);\n this.device.gl.enableVertexAttribArray(1);\n this.device.gl.vertexAttribPointer(1, 2, this.device.getGLArrayElementType(char.mesh[mesh_index].UVCoord.data)!, true, 0, 0);\n\n if (char.mesh[mesh_index].opacity) {\n if (null === this.device.getGLArrayElementType(char.mesh[mesh_index].opacity!.data)) throw new Error(`Data type unsupported by WebGL: ${char.mesh[mesh_index].opacity!.data}`);\n currentMeshInfo.buffers['opacity'] = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.ARRAY_BUFFER, currentMeshInfo.buffers['opacity']);\n this.device.gl.bufferData(this.device.gl.ARRAY_BUFFER, char.mesh[mesh_index].opacity!.data, this.device.gl.STATIC_DRAW);\n this.device.gl.enableVertexAttribArray(2);\n this.device.gl.vertexAttribPointer(2, 1, this.device.getGLArrayElementType(char.mesh[mesh_index].opacity!.data)!, true, 0, 0);\n }\n\n currentMeshInfo.buffers['bone_indices'] = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.ARRAY_BUFFER, currentMeshInfo.buffers['bone_indices']);\n this.device.gl.bufferData(this.device.gl.ARRAY_BUFFER, char.mesh[mesh_index].jointIndex, this.device.gl.STATIC_DRAW);\n this.device.gl.enableVertexAttribArray(3);\n this.device.gl.vertexAttribIPointer(3, 4, this.device.gl.UNSIGNED_BYTE, 8, 0);\n this.device.gl.enableVertexAttribArray(4);\n this.device.gl.vertexAttribIPointer(4, 4, this.device.gl.UNSIGNED_BYTE, 8, 4);\n\n currentMeshInfo.buffers['bone_weight'] = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.ARRAY_BUFFER, currentMeshInfo.buffers['bone_weight']);\n this.device.gl.bufferData(this.device.gl.ARRAY_BUFFER, char.mesh[mesh_index].jointWeight, this.device.gl.STATIC_DRAW);\n this.device.gl.enableVertexAttribArray(5);\n this.device.gl.vertexAttribPointer(5, 4, this.device.gl.FLOAT, false, 32, 0)\n this.device.gl.enableVertexAttribArray(6);\n this.device.gl.vertexAttribPointer(6, 4, this.device.gl.FLOAT, false, 32, 16)\n this.device.gl.bindBuffer(this.device.gl.ARRAY_BUFFER, null);\n\n if (null === this.device.getGLArrayElementType(char.mesh[mesh_index].triangles.data)) throw new Error(`Data type unsupported by WebGL: ${char.mesh[mesh_index].triangles.data}`);\n currentMeshInfo.buffers['indices'] = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.ELEMENT_ARRAY_BUFFER, currentMeshInfo.buffers['indices']);\n this.device.gl.bufferData(this.device.gl.ELEMENT_ARRAY_BUFFER, char.mesh[mesh_index].triangles.data, this.device.gl.STATIC_DRAW);\n\n currentMeshInfo.buffers['ub_pca_info'] = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.UNIFORM_BUFFER, currentMeshInfo.buffers['ub_pca_info']);\n this.device.gl.bufferData(this.device.gl.UNIFORM_BUFFER, new Float32Array(meshStatistics.max_pca_component_count), this.device.gl.DYNAMIC_DRAW);\n\n currentMeshInfo.buffers['ub_rig_info'] = this.device.gl.createBuffer();\n this.device.gl.bindBuffer(this.device.gl.UNIFORM_BUFFER, currentMeshInfo.buffers['ub_rig_info']);\n this.device.gl.bufferData(this.device.gl.UNIFORM_BUFFER, new Float32Array(meshStatistics.max_bones * 16 + meshStatistics.max_bs_count), this.device.gl.DYNAMIC_DRAW);\n\n this.device.gl.bindVertexArray(null);\n\n // Create texture\n\n // blendshape texture\n if (char.mesh[mesh_index].blendshapes.size[2] > 0) {\n let bs_texture_size = [Math.ceil(char.mesh[mesh_index].blendshapes.size[2] / 4), char.mesh[mesh_index].blendshapes.size[0] * char.mesh[mesh_index].blendshapes.size[1]];\n // reshape the texture into a square one\n let square_bs_texture_size = Math.ceil(Math.sqrt(bs_texture_size[0] * bs_texture_size[1]));\n let bs_vec_stride = bs_texture_size[0] * 4;\n let bs_texture_data = new Float32Array(square_bs_texture_size * square_bs_texture_size * 4);\n for (let i = 0; i < bs_texture_size[1]; i++) {\n for (let j = 0; j < char.mesh[mesh_index].blendshapes.size[2]; j++)bs_texture_data[i * bs_vec_stride + j] = char.mesh[mesh_index].blendshapes.data[i * char.mesh[mesh_index].blendshapes.size[2] + j] as number;\n for (let j = char.mesh[mesh_index].blendshapes.size[2]; j < bs_vec_stride; j++)bs_texture_data[i * bs_vec_stride + j] = 0.0;\n }\n currentMeshInfo.textures[\"u_image_bs\"] = this.device.gl.createTexture();\n if (!currentMeshInfo.textures[\"u_image_bs\"]) throw new Error('WebGL texture creation failed.');\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, currentMeshInfo.textures[\"u_image_bs\"]);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_S, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_T, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_MIN_FILTER, this.device.gl.NEAREST);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_MAG_FILTER, this.device.gl.NEAREST);\n this.device.texImage2D(this.device.gl.TEXTURE_2D, 0, square_bs_texture_size, square_bs_texture_size, this.device.gl.RGBA, bs_texture_data);\n\n currentMeshInfo.uniformUInts[\"u_bs_count\"] = bs_texture_size[0];\n }\n else currentMeshInfo.uniformUInts[\"u_bs_count\"] = 0;\n\n // PCA textures\n for (let pca_model of char.mesh[mesh_index].textureModels) {\n let pca_texture = this.device.gl.createTexture();\n if (!pca_texture) throw new Error('WebGL texture creation failed.');\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D_ARRAY, pca_texture);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D_ARRAY, this.device.gl.TEXTURE_WRAP_R, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D_ARRAY, this.device.gl.TEXTURE_WRAP_S, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D_ARRAY, this.device.gl.TEXTURE_WRAP_T, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D_ARRAY, this.device.gl.TEXTURE_MIN_FILTER, this.device.gl.LINEAR);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D_ARRAY, this.device.gl.TEXTURE_MAG_FILTER, this.device.gl.LINEAR);\n\n let dataType = this.device.getGLArrayElementType(pca_model.data.data);\n let assembledPCAModel: TexturePCAModel = {\n texture: pca_texture,\n unsigned: this.device.gl.UNSIGNED_BYTE === dataType || this.device.gl.UNSIGNED_SHORT === dataType || this.device.gl.UNSIGNED_INT === dataType\n }\n\n let PCAData = pca_model.data.data;\n if (\"Float64Array\" === pca_model.data.data[Symbol.toStringTag]\n || (this.device.gl.FLOAT === dataType && !this.compat_features[\"OES_texture_float_linear\"])\n || (this.device.gl.HALF_FLOAT === dataType && !this.compat_features[\"OES_texture_half_float_linear\"])) {\n const texture_component_size = pca_model.data.size[1] * pca_model.data.size[2] * 3;\n const roundedTexture = new Uint8Array(pca_model.data.size[0] * texture_component_size);\n // for every component, calculate their scale factor and round (-1, 1) to (0, 255)\n let scalingFactor = new Float32Array(pca_model.data.size[0]);\n for (let i = 0; i < pca_model.data.size[0]; i++) {\n let scale_factor = 1e-6;\n for (let j = 0; j < texture_component_size; j++)scale_factor = Math.max(scale_factor, Math.abs(pca_model.data.data[i * texture_component_size + j] as number));\n let inv_scale_factor = 1.0 / scale_factor;\n for (let j = 0; j < texture_component_size; j++) {\n let scaled_value = pca_model.data.data[i * texture_component_size + j] as number * inv_scale_factor;\n roundedTexture[i * texture_component_size + j] = Math.round((scaled_value * 0.5 + 0.5) * 255.0);\n }\n scalingFactor[i] = scale_factor;\n }\n PCAData = roundedTexture;\n assembledPCAModel.unsigned = true;\n assembledPCAModel.scalingFactor = scalingFactor;\n }\n if (pca_model.scalingFactor) assembledPCAModel.scalingFactor = pca_model.scalingFactor.data as Float32Array;\n\n this.device.texImage3D(this.device.gl.TEXTURE_2D_ARRAY, 0, pca_model.data.size[1], pca_model.data.size[2], pca_model.data.size[0], this.device.gl.RGB, PCAData);\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D_ARRAY, null);\n currentMeshInfo.texturePCAModels.push(assembledPCAModel);\n }\n this.meshInfos.push(currentMeshInfo);\n }\n\n this.initSkeletonStatus = char.evalSkeleton();\n }\n\n // texture render targets\n this.FrameTexture_meshColor = this.device.gl.createTexture();\n if (!this.FrameTexture_meshColor) throw Error('WebGL texture creation failed.');\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, this.FrameTexture_meshColor);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_S, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_T, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_MIN_FILTER, this.device.gl.NEAREST);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_MAG_FILTER, this.device.gl.NEAREST);\n this.device.gl.texImage2D(this.device.gl.TEXTURE_2D, 0, this.device.gl.RGBA8, this.device.canvas.width, this.device.canvas.height, 0, this.device.gl.RGBA, this.device.gl.UNSIGNED_BYTE, null);\n\n if (data.multisample) {\n // FrameTexture_meshAlpha has to be RGBA to match the framebuffer format.\n this.FrameTexture_meshAlpha = this.device.gl.createTexture();\n if (!this.FrameTexture_meshAlpha) throw Error('WebGL texture creation failed.');\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, this.FrameTexture_meshAlpha);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_S, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_WRAP_T, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_MIN_FILTER, this.device.gl.NEAREST);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_2D, this.device.gl.TEXTURE_MAG_FILTER, this.device.gl.NEAREST);\n this.device.gl.texImage2D(this.device.gl.TEXTURE_2D, 0, this.device.gl.RGBA8, this.device.canvas.width, this.device.canvas.height, 0, this.device.gl.RGBA, this.device.gl.UNSIGNED_BYTE, null);\n\n this.FrameBuffer_meshColor = this.device.gl.createFramebuffer();\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_meshColor);\n this.device.gl.framebufferTexture2D(this.device.gl.FRAMEBUFFER, this.device.gl.COLOR_ATTACHMENT0, this.device.gl.TEXTURE_2D, this.FrameTexture_meshColor, 0);\n\n this.FrameBuffer_meshAlpha = this.device.gl.createFramebuffer();\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_meshAlpha);\n this.device.gl.framebufferTexture2D(this.device.gl.FRAMEBUFFER, this.device.gl.COLOR_ATTACHMENT0, this.device.gl.TEXTURE_2D, this.FrameTexture_meshAlpha, 0);\n\n // depth renderbuffer for mask rendering\n const depthBuffer = this.device.gl.createRenderbuffer();\n this.device.gl.bindRenderbuffer(this.device.gl.RENDERBUFFER, depthBuffer);\n this.device.gl.renderbufferStorageMultisample(this.device.gl.RENDERBUFFER, data.multisample, this.device.gl.DEPTH_COMPONENT16, this.device.canvas.width, this.device.canvas.height);\n\n const colorBuffer = this.device.gl.createRenderbuffer();\n this.device.gl.bindRenderbuffer(this.device.gl.RENDERBUFFER, colorBuffer);\n this.device.gl.renderbufferStorageMultisample(this.device.gl.RENDERBUFFER, data.multisample, this.device.gl.RGBA8, this.device.canvas.width, this.device.canvas.height);\n\n const coverageBuffer = this.device.gl.createRenderbuffer();\n this.device.gl.bindRenderbuffer(this.device.gl.RENDERBUFFER, coverageBuffer);\n this.device.gl.renderbufferStorageMultisample(this.device.gl.RENDERBUFFER, data.multisample, this.device.gl.R8, this.device.canvas.width, this.device.canvas.height);\n\n this.FrameBuffer_mesh = this.device.gl.createFramebuffer();\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_mesh);\n this.device.gl.framebufferRenderbuffer(this.device.gl.FRAMEBUFFER, this.device.gl.COLOR_ATTACHMENT0, this.device.gl.RENDERBUFFER, colorBuffer);\n this.device.gl.framebufferRenderbuffer(this.device.gl.FRAMEBUFFER, this.device.gl.COLOR_ATTACHMENT1, this.device.gl.RENDERBUFFER, coverageBuffer);\n this.device.gl.framebufferRenderbuffer(this.device.gl.FRAMEBUFFER, this.device.gl.DEPTH_ATTACHMENT, this.device.gl.RENDERBUFFER, depthBuffer);\n }\n else {\n this.FrameTexture_meshAlpha = null;\n this.FrameBuffer_meshColor = null;\n this.FrameBuffer_meshAlpha = null;\n\n // depth renderbuffer for mask rendering\n const depthBuffer = this.device.gl.createRenderbuffer();\n this.device.gl.bindRenderbuffer(this.device.gl.RENDERBUFFER, depthBuffer);\n this.device.gl.renderbufferStorage(this.device.gl.RENDERBUFFER, this.device.gl.DEPTH_COMPONENT16, this.device.canvas.width, this.device.canvas.height);\n\n this.FrameBuffer_mesh = this.device.gl.createFramebuffer();\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_mesh);\n this.device.gl.framebufferTexture2D(this.device.gl.FRAMEBUFFER, this.device.gl.COLOR_ATTACHMENT0, this.device.gl.TEXTURE_2D, this.FrameTexture_meshColor, 0);\n this.device.gl.framebufferRenderbuffer(this.device.gl.FRAMEBUFFER, this.device.gl.DEPTH_ATTACHMENT, this.device.gl.RENDERBUFFER, depthBuffer);\n }\n\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, null);\n\n // LUT textures\n if (data.LUT === null) this.LUTTexture = null;\n else {\n this.LUTTexture = this.device.gl.createTexture();\n if (!this.LUTTexture) throw new Error('WebGL texture creation failed.');\n this.device.gl.bindTexture(this.device.gl.TEXTURE_3D, this.LUTTexture);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_3D, this.device.gl.TEXTURE_WRAP_R, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_3D, this.device.gl.TEXTURE_WRAP_S, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_3D, this.device.gl.TEXTURE_WRAP_T, this.device.gl.CLAMP_TO_EDGE);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_3D, this.device.gl.TEXTURE_MIN_FILTER, this.device.gl.LINEAR);\n this.device.gl.texParameteri(this.device.gl.TEXTURE_3D, this.device.gl.TEXTURE_MAG_FILTER, this.device.gl.LINEAR);\n if (this.compat_features[\"OES_texture_float_linear\"]) {\n this.device.texImage3D(this.device.gl.TEXTURE_3D, 0, data.LUT.size[1], data.LUT.size[2], data.LUT.size[0], this.device.gl.RGB, data.LUT.data);\n }\n else {\n // this will reduce the quality of LUT color correction significantly\n const roundedTexture = new Uint8Array(data.LUT.size[0] * data.LUT.size[1] * data.LUT.size[2] * 3);\n // for the mean texture, convert float to uint8 directly\n for (let j = 0; j < roundedTexture.length; j++)roundedTexture[j] = Math.round(data.LUT.data[j] * 255.0);\n this.device.texImage3D(this.device.gl.TEXTURE_3D, 0, data.LUT.size[1], data.LUT.size[2], data.LUT.size[0], this.device.gl.RGB, roundedTexture);\n }\n this.device.gl.bindTexture(this.device.gl.TEXTURE_3D, null);\n }\n\n this.backgroundTextureSrc = null;\n }\n private getProjMat(camera: CameraConfig): mat4 {\n const char = this.charData!.char!;\n return mmul(camera.getProjMatrix([this.device.canvas.width, this.device.canvas.height], 200, 800), camera.getExtrinsicMatrix()) as mat4;\n }\n private initFrame() {\n this.device.gl.viewport(0, 0, this.device.gl.drawingBufferWidth, this.device.gl.drawingBufferHeight);\n this.device.gl.clearColor(0.0, 0.0, 0.0, 0.0);\n this.device.gl.clearDepth(1.0);\n if(this.charData){\n if(this.charData.multisample){\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_meshColor);\n this.device.gl.clear(this.device.gl.COLOR_BUFFER_BIT);\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_meshAlpha);\n this.device.gl.clear(this.device.gl.COLOR_BUFFER_BIT);\n }\n else {\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_mesh);\n this.device.gl.clear(this.device.gl.COLOR_BUFFER_BIT);\n }\n }\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, null);\n this.device.gl.clear(this.device.gl.COLOR_BUFFER_BIT | this.device.gl.DEPTH_BUFFER_BIT);\n }\n private renderBackground(frame_data: GLPipelineFrameData) {\n this.device.gl.disable(this.device.gl.DEPTH_TEST);\n this.device.gl.disable(this.device.gl.CULL_FACE);\n this.device.gl.disable(this.device.gl.BLEND);\n\n let flags = 0;\n if (frame_data.backgroundTexture) flags += 1;\n if (this.charData!.multisample) flags += 2;\n\n this.device.gl.useProgram(this.backgroundPipelineInfo.program);\n\n let transform = this.charData ? this.charData.transform : null;\n\n if (frame_data.fx) {\n if (frame_data.fx.transform) transform = frame_data.fx.transform as ScaleTranslate2D;\n if (frame_data.fx.shadow) {\n const fx = frame_data.fx.shadow as GLPipelineFXShadow;\n const geometryInfo = this.getBillboardShadowGeometryInfo(fx.refPos, fx.light, fx.lightType === \"point\");\n flags += 4;\n\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++)this._ub_shadow_fx_data![i * 4 + j] = geometryInfo.Mat_World2ObjImage[j][i];\n }\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++)this._ub_shadow_fx_data![i * 4 + j + 12] = geometryInfo.Mat_ShadowImage2World[j][i];\n }\n for (let i = 0; i < 3; i++)this._ub_shadow_fx_data![24 + i] = fx.tint[i];\n this._ub_shadow_fx_data![24 + 3] = fx.intensity;\n this._ub_shadow_fx_data![24 + 4] = fx.blurRadius;\n this.device.gl.bindBuffer(this.device.gl.UNIFORM_BUFFER, this.backgroundBuffers[\"ub_shadow_fx_info\"]);\n this.device.gl.bufferData(this.device.gl.UNIFORM_BUFFER, this._ub_shadow_fx_data, this.device.gl.DYNAMIC_DRAW);\n }\n }\n this.device.gl.bindBufferBase(this.device.gl.UNIFORM_BUFFER, 0, this.backgroundBuffers[\"ub_shadow_fx_info\"]);\n\n if (transform) {\n this.device.gl.uniformMatrix2fv(this.backgroundPipelineInfo.progUniforms['u_transform_2d'], false, new Float32Array([\n 1.0 / transform.scaleX, 1.0 / transform.scaleY, -transform.offsetX / transform.scaleX, -transform.offsetY / transform.scaleY\n ]));\n }\n\n else this.device.gl.uniformMatrix2fv(this.backgroundPipelineInfo.progUniforms['u_transform_2d'], false, new Float32Array([1.0, 1.0, 0.0, 0.0]));\n this.device.gl.uniform1ui(this.backgroundPipelineInfo.progUniforms['flags'], flags);\n this.device.gl.bindVertexArray(this.backgroundVAO);\n\n this.device.gl.uniform1i(this.backgroundPipelineInfo.progUniforms[`u_image_bg`], 0);\n if (frame_data.backgroundTexture !== null) {\n this.device.gl.activeTexture(this.device.gl.TEXTURE0 + 0);\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, this.backgroundTextures![\"u_image_bg\"]);\n if (this.backgroundTextureSrc !== frame_data.backgroundTexture) {\n this.device.gl.texImage2D(this.device.gl.TEXTURE_2D, 0, this.device.gl.RGB, this.device.gl.RGB, this.device.gl.UNSIGNED_BYTE, frame_data.backgroundTexture);\n this.backgroundTextureSrc = frame_data.backgroundTexture;\n }\n }\n this.device.gl.uniform1i(this.backgroundPipelineInfo.progUniforms[`u_image_char_body`], 1);\n this.device.gl.activeTexture(this.device.gl.TEXTURE0 + 1);\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, this.backgroundTextures![\"u_image_char_body\"]);\n this.device.gl.texImage2D(this.device.gl.TEXTURE_2D, 0, this.device.gl.RGB, this.device.gl.RGB, this.device.gl.UNSIGNED_BYTE, frame_data.charBodyTexture);\n if(this.charData){\n this.device.gl.uniform1i(this.backgroundPipelineInfo.progUniforms[`u_image_mesh_color`], 2);\n this.device.gl.activeTexture(this.device.gl.TEXTURE0 + 2);\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, this.FrameTexture_meshColor);\n this.device.gl.uniform1i(this.backgroundPipelineInfo.progUniforms[`u_image_mesh_alpha`], 3);\n if (this.charData.multisample) {\n this.device.gl.activeTexture(this.device.gl.TEXTURE0 + 3);\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, this.FrameTexture_meshAlpha);\n }\n }\n this.device.gl.drawArrays(this.device.gl.TRIANGLES, 0, 6);\n }\n private renderMesh(data: GLPipelineCharData, frame_data: GLPipelineFrameData) {\n this.device.gl.enable(this.device.gl.DEPTH_TEST);\n this.device.gl.disable(this.device.gl.CULL_FACE);\n this.device.gl.disable(this.device.gl.BLEND);\n\n const char = data.char!;\n\n let proj_mat = new Float32Array(flatten(this.getProjMat(char.cameraConfig)));\n let transform = this.charData ? this.charData.transform : null;\n if (frame_data.fx && frame_data.fx.transform) transform = frame_data.fx.transform as ScaleTranslate2D;\n let transform_2d_mat: Float32Array;\n if (transform) transform_2d_mat = new Float32Array([transform.scaleX, transform.scaleY, (transform.scaleX - 1.0) + 2.0 * transform.offsetX, (1.0 - transform.scaleY) - 2.0 * transform.offsetY]);\n else transform_2d_mat = new Float32Array([1.0, 1.0, 0.0, 0.0]);\n\n let currentSkeletonStatus = char.evalSkeletonFromMovable(frame_data.data!.movableJointTransforms);\n let joint_matrices = Array(char.skeleton.length);\n for (let i = 0; i < char.skeleton.length; i++) {\n const joint_transform = currentSkeletonStatus[i].apply(this.initSkeletonStatus[i].inv()) as RigidTransform;\n joint_matrices[i] = joint_transform.homogeneous_matrix();\n }\n\n let ub_rig_info_data_offset = 0;\n for (let i = 0; i < Math.min(this.meshStatistics.max_bones, char.skeleton.length); i++) {\n for (let j = 0; j < 4; j++) {\n for (let k = 0; k < 4; k++)this._ub_rig_info_data![ub_rig_info_data_offset + j * 4 + k] = joint_matrices[i][k][j];\n }\n ub_rig_info_data_offset += 16;\n }\n\n this.device.gl.clearColor(0.0, 0.0, 0.0, 0.0);\n this.device.gl.clearDepth(1.0);\n\n if (this.charData!.multisample) {\n // render mask\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_mesh);\n this.device.gl.clear(this.device.gl.COLOR_BUFFER_BIT | this.device.gl.DEPTH_BUFFER_BIT);\n\n this.device.gl.useProgram(this.maskPipelineInfo!.program);\n this.device.gl.uniformMatrix4fv(this.maskPipelineInfo!.progUniforms['u_proj_mat'], true, proj_mat);\n this.device.gl.uniformMatrix2fv(this.maskPipelineInfo!.progUniforms['u_transform_2d'], false, transform_2d_mat);\n for (let mesh_index = 0; mesh_index < char.mesh.length; mesh_index++) {\n if (char.mesh[mesh_index].genMask) {\n const currentMeshInfo = this.meshInfos[mesh_index];\n\n if (char.mesh[mesh_index].blendshapes.size[2] > 0) {\n ub_rig_info_data_offset = this.meshStatistics.max_bones * 16;\n let effective_bs_count = Math.min(char.mesh[mesh_index].blendshapeIndices.length, this.meshStatistics.max_bs_count);\n for (let i = 0; i < effective_bs_count; i++)this._ub_rig_info_data![ub_rig_info_data_offset + i] = frame_data.data!.blendshapeWeights[char.mesh[mesh_index].blendshapeIndices[i]];\n for (let i = effective_bs_count; i < this.meshStatistics.max_bs_count; i++)this._ub_rig_info_data![ub_rig_info_data_offset + i] = 0.0;\n }\n\n let flags = 0;\n if (char.mesh[mesh_index].opacity) flags += 1;\n\n for (const var_name in currentMeshInfo.uniformUInts) this.device.gl.uniform1ui(this.maskPipelineInfo!.progUniforms[var_name], currentMeshInfo.uniformUInts[var_name]);\n this.device.gl.uniform1ui(this.maskPipelineInfo!.progUniforms['flags'], flags);\n\n this.device.gl.bindBuffer(this.device.gl.UNIFORM_BUFFER, currentMeshInfo.buffers!['ub_rig_info']);\n this.device.gl.bufferData(this.device.gl.UNIFORM_BUFFER, this._ub_rig_info_data, this.device.gl.DYNAMIC_DRAW);\n this.device.gl.bindBufferBase(this.device.gl.UNIFORM_BUFFER, 0, currentMeshInfo.buffers![\"ub_rig_info\"]);\n\n this.device.gl.bindVertexArray(currentMeshInfo.VAO);\n this.device.gl.bindBuffer(this.device.gl.ELEMENT_ARRAY_BUFFER, currentMeshInfo.buffers![\"indices\"]);\n this.device.gl.uniform1i(this.maskPipelineInfo!.progUniforms[`u_image_bs`], 0);\n this.device.gl.activeTexture(this.device.gl.TEXTURE0 + 0);\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, currentMeshInfo.textures![\"u_image_bs\"]);\n\n this.device.gl.drawElements(this.device.gl.TRIANGLES, char.mesh[mesh_index].triangles.itemSize(), this.device.getGLArrayElementType(char.mesh[mesh_index].triangles.data)!, 0);\n }\n }\n this.device.gl.bindFramebuffer(this.device.gl.DRAW_FRAMEBUFFER, this.FrameBuffer_meshAlpha);\n this.device.gl.blitFramebuffer(0, 0, this.device.canvas.width, this.device.canvas.height, 0, 0, this.device.canvas.width, this.device.canvas.height, this.device.gl.COLOR_BUFFER_BIT, this.device.gl.NEAREST);\n }\n\n // render color\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_mesh);\n this.device.gl.clear(this.device.gl.COLOR_BUFFER_BIT | this.device.gl.DEPTH_BUFFER_BIT);\n this.device.gl.useProgram(this.meshPipelineInfo!.program);\n this.device.gl.uniformMatrix4fv(this.meshPipelineInfo!.progUniforms['u_proj_mat'], true, proj_mat);\n this.device.gl.uniformMatrix2fv(this.meshPipelineInfo!.progUniforms['u_transform_2d'], false, transform_2d_mat);\n let genMaskForCurrentMesh = true;\n for (let mesh_index = 0; mesh_index < char.mesh.length; mesh_index++) {\n const currentMeshInfo = this.meshInfos[mesh_index];\n let PCAModel = currentMeshInfo.texturePCAModels[frame_data.data!.mesh[mesh_index].textureModelIndex];\n\n if (char.mesh[mesh_index].blendshapes.size[0] > 0) {\n ub_rig_info_data_offset = this.meshStatistics.max_bones * 16;\n let effective_bs_count = Math.min(char.mesh[mesh_index].blendshapeIndices.length, this.meshStatistics.max_bs_count);\n for (let i = 0; i < effective_bs_count; i++)this._ub_rig_info_data![ub_rig_info_data_offset + i] = frame_data.data!.blendshapeWeights[char.mesh[mesh_index].blendshapeIndices[i]];\n for (let i = effective_bs_count; i < this.meshStatistics.max_bs_count; i++)this._ub_rig_info_data![ub_rig_info_data_offset + i] = 0.0;\n }\n\n let flags = 0;\n if (char.mesh[mesh_index].opacity) flags += 1;\n if (this.LUTTexture !== null) flags += 2;\n if (PCAModel.unsigned) flags += 4;\n\n if (genMaskForCurrentMesh != char.mesh[mesh_index].genMask) {\n if (char.mesh[mesh_index].genMask) {\n this.device.gl.colorMask(true, true, true, true);\n }\n else {\n this.device.gl.colorMask(true, true, true, false);\n }\n genMaskForCurrentMesh = char.mesh[mesh_index].genMask;\n }\n\n for (const var_name in currentMeshInfo.uniformUInts) this.device.gl.uniform1ui(this.meshPipelineInfo!.progUniforms[var_name], currentMeshInfo.uniformUInts[var_name]);\n this.device.gl.uniform1ui(this.meshPipelineInfo!.progUniforms['flags'], flags);\n this.device.gl.uniform3f(this.meshPipelineInfo!.progUniforms['u_gamma'], this.currentGamma.r, this.currentGamma.g, this.currentGamma.b);\n this.device.gl.uniform3f(this.meshPipelineInfo!.progUniforms['u_color_balance'], this.currentColorBalance.rc, this.currentColorBalance.gm, this.currentColorBalance.by);\n\n this.device.gl.bindBuffer(this.device.gl.UNIFORM_BUFFER, currentMeshInfo.buffers!['ub_rig_info']);\n this.device.gl.bufferData(this.device.gl.UNIFORM_BUFFER, this._ub_rig_info_data, this.device.gl.DYNAMIC_DRAW);\n this.device.gl.bindBufferBase(this.device.gl.UNIFORM_BUFFER, 0, currentMeshInfo.buffers![\"ub_rig_info\"]);\n\n let effective_pca_component_count = Math.min(frame_data.data!.mesh[mesh_index].texturePCAWeights.length + 1, this._ub_pca_info_data!.length);\n this._ub_pca_info_data![0] = 1.0;\n for (let i = 1; i < effective_pca_component_count; i++)this._ub_pca_info_data![i] = frame_data.data!.mesh[mesh_index].texturePCAWeights[i - 1];\n if (PCAModel.scalingFactor) {\n for (let i = 0; i < effective_pca_component_count; i++)this._ub_pca_info_data![i] *= PCAModel.scalingFactor[i];\n }\n for (let i = effective_pca_component_count; i < this.meshStatistics.max_pca_component_count; i++)this._ub_pca_info_data![i] = 0.0;\n this.device.gl.bindBuffer(this.device.gl.UNIFORM_BUFFER, currentMeshInfo.buffers!['ub_pca_info']);\n this.device.gl.bufferData(this.device.gl.UNIFORM_BUFFER, this._ub_pca_info_data, this.device.gl.DYNAMIC_DRAW);\n this.device.gl.bindBufferBase(this.device.gl.UNIFORM_BUFFER, 1, currentMeshInfo.buffers![\"ub_pca_info\"]);\n\n this.device.gl.bindVertexArray(currentMeshInfo.VAO);\n this.device.gl.bindBuffer(this.device.gl.ELEMENT_ARRAY_BUFFER, currentMeshInfo.buffers![\"indices\"]);\n this.device.gl.uniform1i(this.meshPipelineInfo!.progUniforms[`u_image_bs`], 0);\n this.device.gl.activeTexture(this.device.gl.TEXTURE0 + 0);\n this.device.gl.bindTexture(this.device.gl.TEXTURE_2D, currentMeshInfo.textures![\"u_image_bs\"]);\n this.device.gl.uniform1i(this.meshPipelineInfo!.progUniforms[`u_image_pca`], 1);\n this.device.gl.activeTexture(this.device.gl.TEXTURE0 + 1);\n if (PCAModel.texture) this.device.gl.bindTexture(this.device.gl.TEXTURE_2D_ARRAY, PCAModel.texture);\n this.device.gl.uniform1i(this.meshPipelineInfo!.progUniforms[`u_image_lut`], 2);\n if (this.LUTTexture) {\n this.device.gl.activeTexture(this.device.gl.TEXTURE0 + 2);\n this.device.gl.bindTexture(this.device.gl.TEXTURE_3D, this.LUTTexture);\n }\n this.device.gl.drawElements(this.device.gl.TRIANGLES, char.mesh[mesh_index].triangles.itemSize(), this.device.getGLArrayElementType(char.mesh[mesh_index].triangles.data)!, 0);\n }\n\n if (!genMaskForCurrentMesh) this.device.gl.colorMask(true, true, true, true);\n\n if (this.charData!.multisample) {\n this.device.gl.bindFramebuffer(this.device.gl.DRAW_FRAMEBUFFER, this.FrameBuffer_meshColor);\n this.device.gl.blitFramebuffer(0, 0, this.device.canvas.width, this.device.canvas.height, 0, 0, this.device.canvas.width, this.device.canvas.height, this.device.gl.COLOR_BUFFER_BIT, this.device.gl.NEAREST);\n }\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, null);\n }\n\n constructor(device: GLDevice, sendSdkPoint: (point: string, data: any) => void) {\n this.device = device;\n this.sendSdkPoint = sendSdkPoint;\n this.reinitialize();\n }\n public reinitialize() {\n this.compat_features = {};\n this.compat_features[\"OES_texture_float_linear\"] = this.device.gl.getExtension(\"OES_texture_float_linear\"); // this extension is essential for loseless PCA texture composition\n this.compat_features[\"OES_texture_half_float_linear\"] = this.device.gl.getExtension(\"OES_texture_half_float_linear\");\n this.assembleBackgroundPipeline();\n if (this.charData) this.assembleMeshPipelines(this.charData);\n }\n public setSyncMedia(syncMedia?: HTMLVideoElement) {\n this.device.run((device) => this.render(), syncMedia);\n }\n public setCharData(charData?: GLPipelineCharData) {\n if (charData) {\n this.charData = { ...charData }; // shallow copy\n // if (this.charData.multisample && this.charData.multisample <= 1) this.charData.multisample = null;\n this.charData.multisample = null;\n this.assembleMeshPipelines(this.charData);\n }\n else this.charData = null;\n }\n public setFrameDataCallback(cb: () => GLPipelineFrameData | null) {\n this.frameDataCallback = cb;\n }\n public setGamma(gammaR: number, gammaG: number, gammaB: number) {\n this.currentGamma = { r: gammaR, g: gammaG, b: gammaB };\n }\n public setColorBalance(rc: number, gm: number, by: number) {\n this.currentColorBalance = { rc: rc, gm: gm, by: by };\n }\n public getBillboardTransform2D(pos_orig: vec3, pos_new: vec3): ScaleTranslate2D {\n if (null == this.charData || null == this.charData.char) {\n return {\n offsetX: 0.0,\n offsetY: 0.0,\n scaleX: 1.0,\n scaleY: 1.0\n };\n }\n else {\n const projMat = this.getProjMat(this.charData.char.cameraConfig);\n const projMatInv = inv4(projMat);\n const posWorld = [\n [pos_orig[0], pos_new[0]],\n [pos_orig[1], pos_new[1]],\n [pos_orig[2], pos_new[2]],\n [1.0, 1.0]\n ];\n const posScr = mmul(projMat, posWorld);\n const w_ratio = posScr[3][0] / posScr[3][1];\n const dxdPx_orig = [\n projMatInv[0][0] - pos_orig[0] * projMatInv[3][0],\n projMatInv[1][0] - pos_orig[1] * projMatInv[3][0],\n projMatInv[2][0] - pos_orig[2] * projMatInv[3][0]\n ];\n const dxdPx_new = [\n projMatInv[0][0] - pos_new[0] * projMatInv[3][0],\n projMatInv[1][0] - pos_new[1] * projMatInv[3][0],\n projMatInv[2][0] - pos_new[2] * projMatInv[3][0]\n ];\n const dxdPy_orig = [\n projMatInv[0][1] - pos_orig[0] * projMatInv[3][1],\n projMatInv[1][1] - pos_orig[1] * projMatInv[3][1],\n projMatInv[2][1] - pos_orig[2] * projMatInv[3][1]\n ];\n const dxdPy_new = [\n projMatInv[0][1] - pos_new[0] * projMatInv[3][1],\n projMatInv[1][1] - pos_new[1] * projMatInv[3][1],\n projMatInv[2][1] - pos_new[2] * projMatInv[3][1]\n ];\n\n const scaleX = w_ratio * Math.sqrt(dxdPx_orig.reduce((sum, val) => (sum + val * val), 0.0) / dxdPx_new.reduce((sum, val) => (sum + val * val), 0.0));\n const scaleY = w_ratio * Math.sqrt(dxdPy_orig.reduce((sum, val) => (sum + val * val), 0.0) / dxdPy_new.reduce((sum, val) => (sum + val * val), 0.0));\n const offsetX = posScr[0][1] / posScr[3][1] - posScr[0][0] / posScr[3][0];\n const offsetY = posScr[1][1] / posScr[3][1] - posScr[1][0] / posScr[3][0];\n return {\n offsetX: 0.5 * (offsetX - (scaleX - 1.0)),\n offsetY: 0.5 * ((1.0 - scaleY) - offsetY),\n scaleX: scaleX,\n scaleY: scaleY\n };\n }\n }\n public getBillboardShadowGeometryInfo(pos_orig: vec3, light: vec3, point_src: boolean): GLPipelineFXShadowGeometryInfo {\n if (null == this.charData || null == this.charData.char) {\n return {\n Mat_ShadowImage2World: identity(3) as mat3,\n Mat_World2ObjImage: identity(3) as mat3\n };\n }\n else {\n const projMat = this.getProjMat(this.charData.char.cameraConfig);\n const projMatInv = inv4(projMat);\n\n // get transition mat\n const C1 = [\n [1.0, 0.0, 0.0],\n [0.0, pos_orig[1], 1.0],\n [0.0, 0.0, 0.0]\n ];\n const C2 = [\n [1.0, 0.0, 0.0],\n [0.0, pos_orig[2], 1.0],\n [0.0, 0.0, 0.0]\n ];\n\n if (point_src) {\n C1[2] = [light[0], light[1], 1.0];\n C2[2] = [pos_orig[0], -light[2], 0.0];\n }\n else {\n C1[2] = [light[0], light[1], 0.0];\n C2[2] = [0.0, -light[2], 0.0];\n }\n\n const transitionMat = transpose(mmul(inv3(C2 as mat3), C1));\n const posWorld = [pos_orig[0], pos_orig[1], pos_orig[2], 1.0];\n const posScr = mvmul(projMat, posWorld);\n const w_ratio = posScr[2] / posScr[3];\n const ProjMat_FixY = [\n [projMat[0][0], projMat[0][2], projMat[0][1] * pos_orig[1] + projMat[0][3]],\n [projMat[1][0], projMat[1][2], projMat[1][1] * pos_orig[1] + projMat[1][3]],\n [projMat[3][0], projMat[3][2], projMat[3][1] * pos_orig[1] + projMat[3][3]]\n ];\n const ProjMat_FixY_Inv = inv3(ProjMat_FixY as mat3);\n const ProjMat_FixY_Inv_transitioned = mmul(transitionMat, ProjMat_FixY_Inv);\n const ProjMatInv_FixZ = [\n [projMatInv[0][0], projMatInv[0][1], projMatInv[0][2] * w_ratio + projMatInv[0][3]],\n [projMatInv[1][0], projMatInv[1][1], projMatInv[1][2] * w_ratio + projMatInv[1][3]],\n [projMatInv[3][0], projMatInv[3][1], projMatInv[3][2] * w_ratio + projMatInv[3][3]]\n ];\n const ProjMatInv_FixZ_Inv = inv3(ProjMatInv_FixZ as mat3);\n return {\n Mat_ShadowImage2World: ProjMat_FixY_Inv_transitioned as mat3,\n Mat_World2ObjImage: ProjMatInv_FixZ_Inv as mat3\n };\n }\n }\n private render() {\n const frameData = this.frameDataCallback();\n if (null !== frameData) {\n this.initFrame();\n if(null !== this.charData && null !== this.charData.char && null !== frameData.data)this.renderMesh(this.charData, frameData);\n else {\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, this.FrameBuffer_mesh);\n this.device.gl.clear(this.device.gl.COLOR_BUFFER_BIT | this.device.gl.DEPTH_BUFFER_BIT);\n this.device.gl.bindFramebuffer(this.device.gl.FRAMEBUFFER, null);\n }\n this.renderBackground(frameData);\n if(null !== frameData.onPostRender)frameData.onPostRender(this);\n }\n \n this.device.gl?.flush();\n }\n public renderFrame(frame: GLPipelineFrameData) {\n this.initFrame();\n // 检查faceFrame数据是否有效\n if (null !== this.charData && null !== this.charData.char && null !== frame.data)this.renderMesh(this.charData!, frame);\n // 总是渲染背景\n this.renderBackground(frame);\n if(this.first_webgl_render) {\n (window as any).performanceTracker.markEnd(performanceConstant.first_render);\n (window as any).performanceTracker.markEnd(performanceConstant.first_webgl_render);\n this.first_webgl_render = false;\n this.sendSdkPoint('render_success_time', {\n timestamp: Date.now(),\n });\n }\n this.device.gl.flush();\n }\n \npublic destroy(): void {\n // 销毁网格相关资源\n if(this.device.gl) {\n if (this.meshInfos) {\n this.meshInfos.forEach(meshInfo => {\n // 销毁VAO\n if (meshInfo.VAO) {\n this.device.gl.deleteVertexArray(meshInfo.VAO);\n }\n\n // 销毁缓冲区\n Object.values(meshInfo.buffers).forEach(buffer => {\n if (buffer) {\n this.device.gl.deleteBuffer(buffer);\n }\n });\n\n // 销毁纹理\n Object.values(meshInfo.textures).forEach(texture => {\n if (texture) {\n this.device.gl.deleteTexture(texture);\n }\n });\n\n // 销毁PCA纹理数组\n meshInfo.texturePCAModels.forEach(pcaModel => {\n if (pcaModel.texture) {\n this.device.gl.deleteTexture(pcaModel.texture);\n }\n });\n });\n this.meshInfos = [];\n }\n\n // 销毁帧缓冲和渲染缓冲\n if (this.FrameBuffer_MSAA) {\n this.device.gl.deleteFramebuffer(this.FrameBuffer_MSAA);\n this.FrameBuffer_MSAA = null;\n }\n if (this.FrameBuffer_meshColor) {\n this.device.gl.deleteFramebuffer(this.FrameBuffer_meshColor);\n this.FrameBuffer_meshColor = null;\n }\n if (this.FrameBuffer_meshAlpha) {\n this.device.gl.deleteFramebuffer(this.FrameBuffer_meshAlpha);\n this.FrameBuffer_meshAlpha = null;\n }\n\n // 销毁帧纹理\n if (this.FrameTexture_meshColor) {\n this.device.gl.deleteTexture(this.FrameTexture_meshColor);\n this.FrameTexture_meshColor = null;\n }\n if (this.FrameTexture_meshAlpha) {\n this.device.gl.deleteTexture(this.FrameTexture_meshAlpha);\n this.FrameTexture_meshAlpha = null;\n }\n\n // 销毁LUT纹理\n if (this.LUTTexture) {\n this.device.gl.deleteTexture(this.LUTTexture);\n this.LUTTexture = null;\n }\n\n // 销毁着色器程序\n if (this.meshPipelineInfo?.program) {\n this.device.gl.deleteProgram(this.meshPipelineInfo.program);\n this.meshPipelineInfo.program = null;\n }\n if (this.maskPipelineInfo?.program) {\n this.device.gl.deleteProgram(this.maskPipelineInfo.program);\n this.maskPipelineInfo.program = null;\n }\n }\n\n // 清除数据数组引用\n this._ub_rig_info_data = null;\n this._ub_pca_info_data = null;\n this.first_webgl_render = true;\n\n // 通知设备销毁(如果需要)\n this.device.destroy?.();\n }\n}\n","/**\n * widget_xx 的默认实现\n */\nimport {\n IWidgetPic,\n IWidgetSubtitle,\n IWidget,\n} from \"../../types/event\";\nimport { IRawWidgetData } from \"../../types/frame-data\";\n\n// 用于跟踪已创建的widget,键格式为\"type-axisId\"\n// 使用容器元素的ID作为key(固定字符串),避免WeakMap对象引用问题\nconst containerWidgetMaps = new Map<string, Map<string, HTMLDivElement>>();\nlet containerIdCounter = 0;\n\n// 获取容器元素\nfunction getContainerElement(instance: any): HTMLElement | null {\n if (!instance) return null;\n // 优先从 instance.el 获取容器元素\n if (instance.el && instance.el instanceof HTMLElement) {\n return instance.el;\n }\n return null;\n}\n\n// 获取或生成容器的唯一ID\nfunction getContainerId(container: HTMLElement): string {\n // 如果容器已有ID,直接使用\n if (container.id) {\n return container.id;\n }\n // 如果容器有 data-widget-container-id 属性,使用它\n const existingId = container.getAttribute('data-widget-container-id');\n if (existingId) {\n return existingId;\n }\n // 生成新的唯一ID并设置\n const newId = `widget-container-${++containerIdCounter}`;\n container.setAttribute('data-widget-container-id', newId);\n return newId;\n}\n\n// 获取或创建容器元素的 widget Map(使用容器ID作为key)\nfunction getContainerWidgetMap(container: HTMLElement): Map<string, HTMLDivElement> {\n const containerId = getContainerId(container);\n if (!containerWidgetMaps.has(containerId)) {\n containerWidgetMaps.set(containerId, new Map<string, HTMLDivElement>());\n }\n return containerWidgetMaps.get(containerId)!;\n}\n\n// 检查 Map 中是否包含指定的容器\nfunction hasContainerInMap(container: HTMLElement): boolean {\n const containerId = getContainerId(container);\n return containerWidgetMaps.has(containerId);\n}\n\nconst subtitleStyle = \n`bottom: 50px;\nleft: 50%;\ntransform: translateX(-50%);\nbackground: rgba(0, 0, 0, 0.8);\ncolor: white;\npadding: 12px 20px;\nborder-radius: 8px;\nfont-size: 16px;\nfont-weight: 500;\nz-index: 1000;\nmax-width: 80%;\nmin-width: 200px;\nword-break: break-word;\nbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\ntext-align: center;`;\n\nconst WidgetDefaultRenderer: {\n _el(data: IWidget): HTMLDivElement;\n WIDGET_PIC(data: IWidgetPic, instance?: any): HTMLDivElement;\n // WIDGET_SLIDESHOW(data: IWidgetSlideshow): HTMLDivElement;\n WIDGET_SUBTITLE(data: IWidgetSubtitle, instance?: any): HTMLDivElement | null;\n // WIDGET_TEXT(data: IWidgetText): HTMLDivElement;\n // WIDGET_VIDEO(data: IWidgetVideo): HTMLDivElement;\n CUSTOM_WIDGET?(data: IRawWidgetData): void;\n PROXY_WIDGET?: {\n [key: string]: (data: any) => void\n }\n destroy(instance?: any): void;\n _getWidgetKey(type: string, axisId?: number): string;\n _replaceWidget(type: string, axisId: number, newElement: HTMLDivElement, instance?: any): void;\n _currentInstance?: any; // 当前实例引用\n} = {\n /**\n * 生成基础容器元素\n * @param axis_id 用于设置z-index的层级ID\n */\n _el(data: IWidget) {\n const { axis_id, x_location, y_location, width, height } = data;\n const _div = document.createElement('div');\n _div.setAttribute('class', 'avatar-sdk-widget-container');\n let style = 'position:absolute;';\n style += axis_id !== undefined ? `z-index:${axis_id};` : 'z-index:1;';\n if(x_location !== undefined && y_location !== undefined) {\n style += `top:${y_location * 100}%;left:${x_location * 100}%;`;\n }\n if(width !== undefined && height !== undefined) {\n style += `width:${width * 100}%;height:${height * 100}%;`;\n }\n _div.setAttribute('style', style);\n return _div;\n },\n\n /**\n * 生成widget的唯一标识键\n * @param type widget类型\n * @param axisId 层级ID\n * @returns 唯一标识字符串\n */\n _getWidgetKey(type: string, axisId?: number): string {\n // 使用默认值确保即使没有axisId也能正常工作\n const id = axisId ?? 'default';\n return `${type}-${id}`;\n },\n\n /**\n * 替换相同类型和层级的widget\n * @param type widget类型\n * @param axisId 层级ID\n * @param newElement 新的widget元素\n * @param instance 实例引用(用于区分不同数字人实例)\n */\n _replaceWidget(type: string, axisId: number, newElement: HTMLDivElement, instance?: any): void {\n const key = this._getWidgetKey(type, axisId);\n const actualInstance = instance || this._currentInstance;\n const container = getContainerElement(actualInstance);\n if (!container) {\n return;\n }\n const widgetMap = getContainerWidgetMap(container);\n if (widgetMap.has(key)) {\n const oldElement = widgetMap.get(key);\n if (oldElement && oldElement.parentNode) {\n oldElement.remove();\n }\n }\n widgetMap.set(key, newElement);\n },\n\n /**\n * 渲染图片widget\n */\n WIDGET_PIC(data: IWidgetPic, instance?: any): HTMLDivElement {\n const div = this._el(data);\n const img = document.createElement('img');\n img.crossOrigin = 'anonymous';\n img.setAttribute('style', 'width:100%;height:100%;');\n img.src = data.image;\n div.appendChild(img);\n \n this._replaceWidget('WIDGET_PIC', data.axis_id, div, instance);\n return div;\n },\n\n /**\n * 渲染幻灯片widget\n */\n // WIDGET_SLIDESHOW(data: IWidgetSlideshow): HTMLDivElement {\n // const div = this._el(data.axis_id);\n // const img = document.createElement('img');\n // img.src = data.images[0];\n // div.appendChild(img);\n \n // this._replaceWidget('WIDGET_SLIDESHOW', data.axis_id, div);\n // return div;\n // },\n\n /**\n * 渲染字幕widget\n */\n WIDGET_SUBTITLE(data: IWidgetSubtitle, instance?: any): HTMLDivElement | null {\n const { type, text, axis_id } = data;\n const actualInstance = instance || this._currentInstance;\n const container = getContainerElement(actualInstance);\n if(type === 'subtitle_off') {\n // 移除对应的div\n if (container) {\n const widgetMap = getContainerWidgetMap(container);\n const key = this._getWidgetKey('WIDGET_SUBTITLE', axis_id);\n if(widgetMap.has(key)) {\n const oldElement = widgetMap.get(key);\n if (oldElement && oldElement.parentNode) {\n oldElement.remove();\n }\n widgetMap.delete(key);\n }\n }\n return null;\n }\n const div = this._el(data);\n div.innerHTML = text;\n div.setAttribute('style', div.style.cssText + subtitleStyle);\n this._replaceWidget('WIDGET_SUBTITLE', axis_id, div, instance);\n return div;\n },\n\n /**\n * 渲染文本widget\n */\n // WIDGET_TEXT(data: IWidgetText): HTMLDivElement {\n // const div = this._el(data.axis_id);\n // div.innerHTML = data.text_content;\n \n // this._replaceWidget('WIDGET_TEXT', data.axis_id, div);\n // return div;\n // },\n\n /**\n * 渲染视频widget\n */\n // WIDGET_VIDEO(data: IWidgetVideo): HTMLDivElement {\n // const div = this._el(data.axis_id);\n // const video = document.createElement('video');\n // video.setAttribute('style', 'width:100%;height:100%;object-fit:cover;');\n // video.src = data.video;\n // video.autoplay = true;\n // video.loop = true;\n // video.muted = true;\n // div.appendChild(video);\n \n // this._replaceWidget('WIDGET_VIDEO', data.axis_id, div);\n // return div;\n // },\n\n /**\n * 销毁指定实例的widget\n * @param instance 实例引用(用于区分不同数字人实例)\n */\n destroy(instance?: any) {\n // 使用与 _replaceWidget 相同的逻辑,通过容器元素来查找和清理\n const actualInstance = instance || this._currentInstance;\n const container = getContainerElement(actualInstance);\n \n if (container) {\n const containerId = getContainerId(container);\n \n // 检查 Map 中是否存在该容器\n if (containerWidgetMaps.has(containerId)) {\n // 从容器对应的 widgetMap 中清理\n const widgetMap = containerWidgetMaps.get(containerId)!;\n widgetMap.forEach((element, key) => {\n if(key.startsWith('WIDGET_SUBTITLE') || key.startsWith('WIDGET_PIC')) {\n // 使用 remove() 方法更可靠,会自动检查元素是否在 DOM 中\n if (element && element.parentNode) {\n element.remove();\n }\n }\n });\n widgetMap.clear();\n containerWidgetMaps.delete(containerId);\n } else {\n // 备用清理方法:从容器 DOM 中查找并删除所有 widget 元素\n const widgets = container.querySelectorAll('.avatar-sdk-widget-container');\n widgets.forEach((widget) => {\n widget.remove();\n });\n }\n }\n }\n}\n\nexport default WidgetDefaultRenderer;\n","// @ts-nocheck\nimport * as GLMath from \"./Math\"\n\nconst __version__ = \"3.0.0\"\n\nexport interface DataViewWithCustomOffset {\n offset: number,\n dataview: DataView // DataView is a generic type after TypeScript 5.7. We do not derive from it for the sake of compatibility.\n}\n\nfunction checkVersion(buffer: ArrayBuffer | DataViewWithCustomOffset, version: string): [number, number, number] {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n const dataver: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; i++) {\n dataver[i] = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n }\n\n const refver = version.split(\".\").map(x => parseInt(x))\n if (refver[0] < dataver[0]) throw new Error(`Data version (${dataver[0]}.${dataver[1]}.${dataver[2]}) is incompatible with the version of current data interface (${refver[0]}.${refver[1]}.${refver[2]}).`)\n return dataver;\n}\n\nfunction decodeStr(buffer: ArrayBuffer | DataViewWithCustomOffset): string {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n const charView = new Uint8Array(buffer.dataview.buffer, buffer.offset, buffer.dataview.byteLength - buffer.offset);\n let strlen = 0;\n while (strlen < charView.byteLength && charView[strlen] > 0) strlen++;\n buffer.offset += strlen + 1;\n const stringBytes = charView.slice(0, strlen);\n const decoder = new TextDecoder('utf-8');\n return decoder.decode(stringBytes);\n}\n\nfunction decodeLongInt(buffer: ArrayBuffer | DataViewWithCustomOffset): number {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n let result = 0, shift = 0;\n while (true) {\n let byte_val = buffer.dataview.getUint8(buffer.offset);\n buffer.offset++;\n let data_bits = byte_val & 0x7F;\n let new_result = result | (data_bits << shift);\n if (new_result < result) throw new Error(\"Integer too large to decode.\");\n result = new_result;\n if (0 === (byte_val & 0x80)) break;\n shift += 7;\n }\n return result;\n}\n\nconst TensorDataTypeMap = {\n \"B\": Uint8Array,\n \"b\": Int8Array,\n \"H\": Uint16Array,\n \"h\": Int16Array,\n \"I\": Uint32Array,\n \"i\": Int32Array,\n \"L\": BigUint64Array,\n \"l\": BigInt64Array,\n \"f\": Float32Array,\n \"d\": Float64Array\n};\n// @ts-ignore\nif (\"undefined\" !== typeof Float16Array) TensorDataTypeMap[\"e\"] = Float16Array;\n\ntype ValueOf<T> = T[keyof T];\nexport type TensorDataConstructorType = ValueOf<typeof TensorDataTypeMap>;\nexport type TensorDataType = InstanceType<TensorDataConstructorType>;\n\nexport class Tensor {\n public size: number[];\n public data: TensorDataType;\n constructor(size: number[], data: TensorDataType) {\n this.size = size;\n this.data = data;\n }\n itemSize(): number {\n let size = 1;\n for (let dim of this.size) size *= dim;\n return size;\n }\n byteSize(): number { return this.itemSize() * this.data.BYTES_PER_ELEMENT; }\n\n static zeros(size: number[], dataType: TensorDataConstructorType = Float32Array): Tensor {\n let itemSize = 1;\n for (let i = 0; i < size.length; i++)itemSize *= size[i];\n const data = new dataType(itemSize);\n for (let i = 0; i < itemSize; i++)data[i] = 0;\n return new Tensor(size, data);\n }\n // extract subtensors\n part(...index: number[]): Tensor {\n if (index.length > this.size.length) throw new Error(\"Subtensor index length larger than tensor dimension.\");\n let size: number[] = [];\n let newLength = 1;\n for (let i = index.length; i < this.size.length; i++) {\n size.push(this.size[i]);\n newLength *= this.size[i];\n }\n\n let newStart = 0;\n if (index.length > 0) newStart += index[0];\n for (let i = 1; i < index.length; i++) {\n newStart *= this.size[i];\n newStart += index[i];\n }\n newStart *= newLength;\n return new Tensor(size, this.data.slice(newStart, newStart + newLength));\n }\n\n static deserialize(buffer: ArrayBuffer | DataViewWithCustomOffset) {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n const dimCount = buffer.dataview.getUint8(buffer.offset);\n buffer.offset++;\n const size = new Array<number>(dimCount);\n let dataSize = 1;\n for (let i = 0; i < dimCount; i++) {\n size[i] = decodeLongInt(buffer);\n dataSize *= size[i];\n }\n const dataTypeSymbol = String.fromCodePoint(buffer.dataview.getUint8(buffer.offset)) as keyof typeof TensorDataTypeMap;\n buffer.offset++;\n const dataType = TensorDataTypeMap[dataTypeSymbol];\n if (undefined === dataType) throw new Error(`Unsupported tensor element type \"${dataTypeSymbol}\".`);\n const dataByteSize = dataSize * dataType.BYTES_PER_ELEMENT;\n const dataView = buffer.dataview.buffer.slice(buffer.offset, buffer.offset + dataByteSize);\n const data = new dataType(dataView as ArrayBuffer);\n buffer.offset += dataByteSize;\n\n return new Tensor(size, data);\n }\n}\n\nfunction loadArchives(buffer: ArrayBuffer | DataViewWithCustomOffset): unknown[] {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n let result: unknown[] = [null];\n while (true) {\n const mimeType = decodeStr(buffer);\n if ('' == mimeType) break;\n else {\n let item: unknown = null;\n if (\"text/plain;charset=UTF-8\" === mimeType) {\n const dataLen = decodeLongInt(buffer);\n const charView = new Uint8Array(buffer.dataview.buffer, buffer.offset, dataLen);\n buffer.offset += dataLen;\n const decoder = new TextDecoder('utf-8');\n item = decoder.decode(charView);\n }\n else if (\"application/json;charset=UTF-8\" == mimeType) {\n const dataLen = decodeLongInt(buffer);\n const charView = new Uint8Array(buffer.dataview.buffer, buffer.offset, dataLen);\n buffer.offset += dataLen;\n const decoder = new TextDecoder('utf-8');\n item = JSON.parse(decoder.decode(charView));\n }\n else if (\"application/octet-stream\" === mimeType) item = Tensor.deserialize(buffer);\n else {\n const dataLen = decodeLongInt(buffer);\n const dataSlice = buffer.dataview.buffer.slice(buffer.offset, buffer.offset + dataLen);\n buffer.offset += dataLen;\n item = new Blob([dataSlice as ArrayBuffer], { type: mimeType });\n }\n result.push(item);\n }\n }\n return result;\n}\n\nexport class CameraConfig {\n focalLength: number = 75.0;\n filmAperture: [number, number] = [1.0, 1.0]; // horizontal, vertical\n translation: GLMath.vec3 = [0.0, 0.0, 0.0]; // X, Y, Z\n rotation: GLMath.vec3 = [0.0, 0.0, 0.0]; // X, Y, Z\n\n // methods\n getIntrinsicMatrix(resolution: [number, number]): GLMath.mat3 {\n const [size_X, size_Y] = resolution;\n\n // 摄影机光圈是指多少英寸,25.4mm,胶片大小\n let camera_aperture_in_mm_x = this.filmAperture[0] * 25.4\n // 纵向的根据横向的来计算,而不是直接读取,可能和渲染分辨率、镜头挤压比有关系\n // 在maya里面修改纵向光圈值完全没反应的,是根据渲染分辨率和横向光圈值来计算的\n // 胶片纵横比理论上需要等于渲染分辨率的纵横比\n // camera_aperture_in_mm_ = this.filmAperture[1] * 25.4\n let camera_aperture_in_mm_y = camera_aperture_in_mm_x * resolution[1] / resolution[0];\n\n // convert from maya camera to OpenCV camera\n let px = resolution[0] / 2.0;\n let py = resolution[1] / 2.0;\n // 胶片尺寸/像素,代表1个像素多少mm,然后可以得到内参矩阵\n let fx = this.focalLength / (camera_aperture_in_mm_x / size_X);\n let fy = this.focalLength / (camera_aperture_in_mm_y / size_Y);\n\n return [\n [fx, 0, px],\n [0, fy, py],\n [0, 0, 1]\n ];\n }\n getProjMatrix(resolution: [number, number], near: number = 0.01, far: number = Infinity): GLMath.mat4 {\n const [size_X, size_Y] = resolution;\n const intrinsic_mat = this.getIntrinsicMatrix(resolution);\n\n let proj22: number;\n let proj23: number;\n\n if (Infinity === far) {\n proj22 = -1.0;\n proj23 = -2.0 * near;\n }\n else {\n proj22 = -(far + near) / (far - near);\n proj23 = -(2.0 * far * near) / (far - near);\n }\n\n return [\n [2.0 * intrinsic_mat[0][0] / size_X, 0.0, (size_X - 2 * intrinsic_mat[0][2]) / size_X, 0.0],\n [0.0, 2.0 * intrinsic_mat[1][1] / size_Y, (size_Y - 2 * intrinsic_mat[1][2]) / size_Y, 0.0],\n [0.0, 0.0, proj22, proj23],\n [0.0, 0.0, -1.0, 0.0]\n ];\n }\n getExtrinsicMatrix(): GLMath.mat4 {\n // 相机的世界坐标轴\n const deg2rad = Math.PI / 180.0;\n const R = GLMath.Euler_to_mat(this.rotation.map(x => x * deg2rad) as GLMath.vec3, \"xyz\");\n // 反算物体的view matrix, 将相机坐标系转成世界坐标系, 相机朝向-z轴\n const R_inv = GLMath.inv3(R);\n const R_inv_neg_t = GLMath.mvmul(R_inv, this.translation.map(x => -x) as GLMath.vec3) as GLMath.vec3;\n return GLMath.make_homogeneous(R_inv, R_inv_neg_t);\n }\n static deserialize(buffer: ArrayBuffer | DataViewWithCustomOffset) {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n let result = new CameraConfig();\n result.focalLength = buffer.dataview.getFloat32(buffer.offset, true);\n for (let i = 0; i < 2; i++)result.filmAperture[i] = buffer.dataview.getFloat32(buffer.offset + (i + 1) * 4, true);\n for (let i = 0; i < 3; i++)result.translation[i] = buffer.dataview.getFloat32(buffer.offset + (i + 3) * 4, true);\n for (let i = 0; i < 3; i++)result.rotation[i] = buffer.dataview.getFloat32(buffer.offset + (i + 6) * 4, true);\n buffer.offset += 9 * 4;\n\n return result;\n }\n}\n\nexport class RigidTransform {\n translation: GLMath.vec3; // X, Y, Z\n rotQuaternion: GLMath.vec4; // 1, i, j, k\n\n // methods\n constructor(translation: GLMath.vec3 = [0.0, 0.0, 0.0], rotQuaternion: GLMath.vec4 = [1.0, 0.0, 0.0, 0.0]) {\n this.translation = translation;\n this.rotQuaternion = rotQuaternion;\n }\n apply(x: GLMath.vec3 | RigidTransform): GLMath.vec3 | RigidTransform {\n if (x instanceof RigidTransform) {\n let result_quaternion = GLMath.quaternion_mul(this.rotQuaternion, x.rotQuaternion);\n result_quaternion = GLMath.normalize(result_quaternion) as GLMath.vec4; // reduce floating point error\n let result_translation = GLMath.mvmul(GLMath.quaternion_to_mat(this.rotQuaternion), x.translation) as GLMath.vec3;\n for (let i = 0; i < 3; i++)result_translation[i] += this.translation[i];\n return new RigidTransform(result_translation, result_quaternion);\n }\n else {\n let result = GLMath.mvmul(this.matrix(), x) as GLMath.vec3;\n for (let i = 0; i < 3; i++)result[i] += this.translation[i];\n return result;\n }\n }\n inv() {\n let newRotQuaternion = GLMath.quaternion_conj(this.rotQuaternion);\n let R_inv_neg_x = GLMath.mvmul(GLMath.quaternion_to_mat(newRotQuaternion), this.translation.map(x => -x) as GLMath.vec3) as GLMath.vec3;\n return new RigidTransform(R_inv_neg_x, newRotQuaternion);\n }\n matrix() { return GLMath.quaternion_to_mat(this.rotQuaternion); }\n homogeneous_matrix(): GLMath.mat4 { return GLMath.make_homogeneous(this.matrix(), this.translation); }\n static deserialize(buffer: ArrayBuffer | DataViewWithCustomOffset) {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n let translation: GLMath.vec3 = [0.0, 0.0, 0.0];\n let rotQuaternion: GLMath.vec4 = [1.0, 0.0, 0.0, 0.0];\n for (let i = 0; i < 3; i++)translation[i] = buffer.dataview.getFloat32(buffer.offset + i * 4, true);\n let sum_sqr = 0.0;\n for (let i = 0; i < 3; i++) {\n rotQuaternion[i + 1] = buffer.dataview.getFloat32(buffer.offset + (i + 3) * 4, true);\n sum_sqr += rotQuaternion[i + 1] * rotQuaternion[i + 1];\n }\n rotQuaternion[0] = Math.sqrt(Math.max(1.0 - sum_sqr, 0.0));\n buffer.offset += 6 * 4;\n\n return new RigidTransform(translation, rotQuaternion);\n }\n}\n\nexport interface JointInfo {\n parent: number | null,\n local_transform: RigidTransform\n}\n\nexport interface IBRMeshInfoSpec {\n version: [number, number, number],\n maxJointsPerVertex: number,\n blendshapeIndices?: number[], // for v2.0 only\n archivedItems?: unknown[]\n}\n\nexport class IBRMeshInfo {\n genMask: boolean;\n vertices: Tensor; // neutral vertices\n opacity?: Tensor;\n triangles: Tensor;\n UVCoord: Tensor;\n blendshapeIndices: number[];\n blendshapes: Tensor; // Dim 2 is the number of blendshapes\n jointIndex: Uint8Array; // vertexCount * skeletonJointCount\n jointWeight: Float32Array; // vertexCount * skeletonJointCount\n textureModels: {\n data: Tensor,\n scalingFactor?: Tensor\n }[];\n\n constructor(buffer: ArrayBuffer | DataViewWithCustomOffset, spec: IBRMeshInfoSpec) {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n if (spec.version[0] > 2) {\n // v3.0\n let meshFlag = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n this.genMask = (meshFlag & 1) > 0;\n\n let bs_indices: number[] = [];\n let bs_element_indices: number[][] = [];\n let first_bs = true;\n while (true) {\n let bs_index = decodeLongInt(buffer);\n if (0 === bs_index) {\n if (!first_bs) break;\n }\n else bs_indices.push(bs_index - 1);\n first_bs = false;\n\n let cur_bs_element_indices: number[] = [];\n let segment_stat = true, segment_ptr = 0;\n while (true) {\n let segment_len = decodeLongInt(buffer);\n if (segment_stat) {\n for (let i = 0; i < segment_len; i++)cur_bs_element_indices.push(segment_ptr + i);\n }\n segment_stat = !segment_stat;\n segment_ptr += segment_len;\n if (0 === segment_len && segment_ptr > 0) break;\n }\n bs_element_indices.push(cur_bs_element_indices);\n }\n\n let vertexCount = bs_element_indices[0].length;\n\n this.blendshapeIndices = bs_indices;\n let rawBlendshapeData: Tensor = spec.archivedItems![decodeLongInt(buffer)] as Tensor;\n let vertices = Tensor.zeros([vertexCount, rawBlendshapeData.size[1]], rawBlendshapeData.data.constructor as TensorDataConstructorType);\n let blendshapes = Tensor.zeros([vertexCount, rawBlendshapeData.size[1], this.blendshapeIndices.length], rawBlendshapeData.data.constructor as TensorDataConstructorType);\n let bs_data_index = 0;\n const elementIndexList = bs_element_indices[0];\n for (let element_index of elementIndexList) {\n for (let i = 0; i < rawBlendshapeData.size[1]; i++)vertices.data[element_index * rawBlendshapeData.size[1] + i] = rawBlendshapeData.data[bs_data_index * rawBlendshapeData.size[1] + i];\n bs_data_index++;\n }\n const bs_stride = this.blendshapeIndices.length;\n for (let bs_index = 1; bs_index < bs_element_indices.length; bs_index++) {\n const elementIndexList = bs_element_indices[bs_index];\n for (let element_index of elementIndexList) {\n for (let i = 0; i < rawBlendshapeData.size[1]; i++)blendshapes.data[(element_index * rawBlendshapeData.size[1] + i) * bs_stride + bs_index - 1] = rawBlendshapeData.data[bs_data_index * rawBlendshapeData.size[1] + i];\n bs_data_index++;\n }\n }\n this.vertices = vertices;\n this.blendshapes = blendshapes;\n this.triangles = spec.archivedItems![decodeLongInt(buffer)] as Tensor;\n this.opacity = spec.archivedItems![decodeLongInt(buffer)] as Tensor;\n this.UVCoord = spec.archivedItems![decodeLongInt(buffer)] as Tensor;\n\n this.jointIndex = new Uint8Array(vertexCount * spec.maxJointsPerVertex);\n this.jointWeight = new Float32Array(vertexCount * spec.maxJointsPerVertex);\n for (let i = 0; i < vertexCount; i++) {\n for (let j = 0; j < spec.maxJointsPerVertex; j++) {\n this.jointIndex[i * spec.maxJointsPerVertex + j] = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n }\n for (let j = 0; j < spec.maxJointsPerVertex; j++) {\n this.jointWeight[i * spec.maxJointsPerVertex + j] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n }\n\n const textureModelCount = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n this.textureModels = new Array(textureModelCount);\n for (let i = 0; i < textureModelCount; i++) {\n this.textureModels[i] = {\n data: spec.archivedItems![decodeLongInt(buffer)] as Tensor,\n scalingFactor: spec.archivedItems![decodeLongInt(buffer)] as Tensor\n };\n }\n }\n else {\n // v2.0\n this.genMask = true;\n\n let vertexCount = buffer.dataview.getUint16(buffer.offset, true);\n buffer.offset += 2;\n\n const opacity = new Float32Array(vertexCount);\n for (let i = 0; i < vertexCount; i++) {\n opacity[i] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n this.opacity = new Tensor([vertexCount], opacity);\n\n let triangleCount = buffer.dataview.getUint16(buffer.offset, true);\n buffer.offset += 2;\n\n const triangles = new Uint16Array(triangleCount * 3);\n for (let i = 0; i < triangleCount; i++) {\n for (let j = 0; j < 3; j++) {\n triangles[i * 3 + j] = buffer.dataview.getUint16(buffer.offset, true);\n buffer.offset += 2;\n }\n }\n this.triangles = new Tensor([triangleCount, 3], triangles);\n\n const UVCoord = new Float32Array(vertexCount * 2);\n for (let i = 0; i < vertexCount; i++) {\n for (let j = 0; j < 2; j++) {\n UVCoord[i * 2 + j] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n }\n this.UVCoord = new Tensor([vertexCount, 2], UVCoord);\n\n const blendshapeCount = buffer.dataview.getUint16(buffer.offset, true);\n buffer.offset += 2;\n const vertices = new Float32Array(vertexCount * 3);\n for (let i = 0; i < vertexCount * 3; i++) {\n vertices[i] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n const blendshapes = new Float32Array((blendshapeCount - 1) * vertexCount * 3);\n // blendshape need transposition\n for (let j = 0; j < blendshapeCount - 1; j++) {\n for (let i = 0; i < vertexCount * 3; i++) {\n blendshapes[i * (blendshapeCount - 1) + j] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n }\n this.vertices = new Tensor([vertexCount, 3], vertices);\n this.blendshapes = new Tensor([vertexCount, 3, blendshapeCount - 1], blendshapes);\n this.blendshapeIndices = [];\n for (let index of spec.blendshapeIndices!) this.blendshapeIndices.push(index);\n\n this.jointIndex = new Uint8Array(vertexCount * spec.maxJointsPerVertex);\n this.jointWeight = new Float32Array(vertexCount * spec.maxJointsPerVertex);\n for (let i = 0; i < vertexCount; i++) {\n for (let j = 0; j < spec.maxJointsPerVertex; j++) {\n this.jointIndex[i * spec.maxJointsPerVertex + j] = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n }\n for (let j = 0; j < spec.maxJointsPerVertex; j++) {\n this.jointWeight[i * spec.maxJointsPerVertex + j] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n }\n\n const textureModelCount = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n this.textureModels = new Array(textureModelCount);\n for (let i = 0; i < textureModelCount; i++) {\n const PCASize = [0, 0, 0, 3];\n for (let j = 0; j < 3; j++) {\n PCASize[j] = buffer.dataview.getUint16(buffer.offset, true);\n buffer.offset += 2;\n }\n const PCAComponents = new Float32Array(PCASize[0] * PCASize[1] * PCASize[2] * 3);\n for (let j = 0; j < PCAComponents.length; j++) {\n PCAComponents[j] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n this.textureModels[i] = { data: new Tensor(PCASize, PCAComponents) };\n }\n }\n }\n}\n\nexport class IBRMeshFrameInfo {\n textureModelIndex: number;\n texturePCAWeights: Float32Array;\n\n constructor(textureModelIndex: number, texturePCAWeights: Float32Array) {\n this.textureModelIndex = textureModelIndex;\n this.texturePCAWeights = texturePCAWeights;\n }\n static deserialize(buffer: ArrayBuffer | DataViewWithCustomOffset, char_data: IBRMeshInfo) {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n let textureModelIndex = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n let texturePCAWeights = new Float32Array(char_data.textureModels[textureModelIndex].data.size[0] - 1);\n for (let i = 0; i < texturePCAWeights.length; i++) {\n texturePCAWeights[i] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n\n return new IBRMeshFrameInfo(textureModelIndex, texturePCAWeights);\n }\n}\n\nexport class IBRAnimationGeneratorCharInfo_NN {\n cameraConfig: CameraConfig;\n blendshapeCount: number;\n mesh: IBRMeshInfo[];\n\n skeleton: JointInfo[];\n jointEvalOrder: number[];\n movableJoints: number[];\n maxJointsPerVertex: number;\n\n constructor(buffer: ArrayBuffer | DataViewWithCustomOffset, spec: { blendshapeMap?: number[][] } = {}) {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n const version = checkVersion(buffer, __version__);\n\n let archivedItems: unknown[] = [];\n if (version[0] > 2) archivedItems = loadArchives(buffer);\n\n this.cameraConfig = CameraConfig.deserialize(buffer);\n if (version[0] > 2) this.blendshapeCount = decodeLongInt(buffer);\n else {\n if (!spec.blendshapeMap) throw new Error(`A blendshape map is required to load the character information of v2.0 format.`);\n let bsIndexSet = new Set();\n for (const map of spec.blendshapeMap) {\n for (const index of map) bsIndexSet.add(index);\n }\n this.blendshapeCount = bsIndexSet.size;\n }\n\n let skeletonJointCount = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n this.maxJointsPerVertex = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n let movableJointCount = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n let movableJoints = new Array(movableJointCount);\n for (let i = 0; i < movableJointCount; i++) {\n movableJoints[i] = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n }\n this.movableJoints = movableJoints;\n this.skeleton = new Array(skeletonJointCount);\n for (let i = 0; i < skeletonJointCount; i++) {\n let parent: number | null = buffer.dataview.getUint8(buffer.offset);\n if (parent >= this.skeleton.length) parent = null;\n buffer.offset += 1;\n let local_transform = RigidTransform.deserialize(buffer);\n this.skeleton[i] = { parent: parent, local_transform: local_transform };\n }\n this.jointEvalOrder = new Array(skeletonJointCount);\n for (let i = 0; i < skeletonJointCount; i++) {\n this.jointEvalOrder[i] = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n }\n\n let meshInfoSpec: IBRMeshInfoSpec = {\n version: version,\n maxJointsPerVertex: this.maxJointsPerVertex\n }\n if (version[0] > 2) meshInfoSpec.archivedItems = archivedItems;\n\n let meshCount = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n this.mesh = new Array(meshCount);\n for (let i = 0; i < meshCount; i++) {\n if (version[0] <= 2) meshInfoSpec.blendshapeIndices = spec.blendshapeMap![i];\n this.mesh[i] = new IBRMeshInfo(buffer, meshInfoSpec);\n }\n }\n evalSkeleton(): RigidTransform[] {\n let result = Array(this.skeleton.length);\n for (let i of this.jointEvalOrder) {\n if (null == this.skeleton[i].parent) result[i] = this.skeleton[i].local_transform;\n else result[i] = result[this.skeleton[i].parent].apply(this.skeleton[i].local_transform);\n }\n return result;\n }\n evalSkeletonFromMovable(movableJointTransforms: RigidTransform[]): RigidTransform[] {\n let result = Array(this.skeleton.length);\n for (let i = 0; i < movableJointTransforms.length; i++)result[this.movableJoints[i]] = movableJointTransforms[i];\n for (let i of this.jointEvalOrder) {\n if (null != this.skeleton[i].parent) result[i] = result[this.skeleton[i].parent].apply(this.skeleton[i].local_transform);\n }\n return result;\n }\n}\n\nexport class IBRAnimationFrameData_NN {\n mesh: IBRMeshFrameInfo[];\n blendshapeWeights: Float32Array;\n movableJointTransforms: RigidTransform[];\n\n constructor() {\n this.mesh = [];\n this.blendshapeWeights = new Float32Array();\n this.movableJointTransforms = [];\n }\n static deserialize(buffer: ArrayBuffer | DataViewWithCustomOffset, char_data: IBRAnimationGeneratorCharInfo_NN, version: [number, number, number]): IBRAnimationFrameData_NN {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n let result = new IBRAnimationFrameData_NN();\n\n const meshCount = char_data.mesh.length;\n result.mesh = new Array(meshCount);\n\n result.blendshapeWeights = new Float32Array(char_data.blendshapeCount);\n if (version[0] > 2) {\n // v3.0\n for (let i = 0; i < meshCount; i++)result.mesh[i] = IBRMeshFrameInfo.deserialize(buffer, char_data.mesh[i]);\n for (let i = 0; i < result.blendshapeWeights.length; i++) {\n result.blendshapeWeights[i] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n }\n else {\n // v2.0\n for (let i = 0; i < meshCount; i++) {\n const blendshapeIndices = char_data.mesh[i].blendshapeIndices;\n for (let j = 0; j + 1 < blendshapeIndices.length; j++) {\n result.blendshapeWeights[blendshapeIndices[j + 1] - 1] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n\n }\n\n let textureModelIndex = buffer.dataview.getUint8(buffer.offset);\n buffer.offset += 1;\n let texturePCAWeights = new Float32Array(char_data.mesh[i].textureModels[textureModelIndex].data.size[0] - 1);\n for (let j = 0; j < texturePCAWeights.length; j++) {\n texturePCAWeights[j] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n\n result.mesh[i] = new IBRMeshFrameInfo(textureModelIndex, texturePCAWeights);\n }\n }\n\n result.movableJointTransforms = new Array(char_data.movableJoints.length);\n for (let i = 0; i < char_data.movableJoints.length; i++)result.movableJointTransforms[i] = RigidTransform.deserialize(buffer);\n\n return result;\n }\n static interp(frame1: IBRAnimationFrameData_NN, frame2: IBRAnimationFrameData_NN, frameJointRef: IBRAnimationFrameData_NN, t: number, jointEvalOrder: [number, number][]): IBRAnimationFrameData_NN {\n // return linear interpolated result between frame data.\n let result = new IBRAnimationFrameData_NN();\n\n result.blendshapeWeights = new Float32Array(frame1.blendshapeWeights.length);\n for (let i = 0; i < result.blendshapeWeights.length; i++)result.blendshapeWeights[i] = t * frame2.blendshapeWeights[i] + (1.0 - t) * frame1.blendshapeWeights[i];\n result.mesh = [];\n for (let i = 0; i < frame1.mesh.length; i++) {\n let new_mesh_pca_info = new IBRMeshFrameInfo(frame1.mesh[i].textureModelIndex, new Float32Array(frame1.mesh[i].texturePCAWeights.length));\n for (let j = 0; j < frame1.mesh[i].texturePCAWeights.length; j++)new_mesh_pca_info.texturePCAWeights[j] = t * frame2.mesh[i].texturePCAWeights[j] + (1.0 - t) * frame1.mesh[i].texturePCAWeights[j];\n result.mesh.push(new_mesh_pca_info);\n }\n\n // joints\n result.movableJointTransforms = new Array(frameJointRef.movableJointTransforms.length);\n for (let i = 0; i < frameJointRef.movableJointTransforms.length; i++) {\n let preserved = true;\n for (let [index_child, _] of jointEvalOrder) {\n if (index_child === i) {\n preserved = false;\n break;\n }\n }\n if (preserved) result.movableJointTransforms[i] = frameJointRef.movableJointTransforms[i];\n }\n for (let [index_child, index_parent] of jointEvalOrder) {\n let T1 = frame1.movableJointTransforms[index_parent].inv().apply(frame1.movableJointTransforms[index_child]) as RigidTransform;\n let T2 = frame2.movableJointTransforms[index_parent].inv().apply(frame2.movableJointTransforms[index_child]) as RigidTransform;\n let translation = [], rotQuaternion = [];\n for (let j = 0; j < 3; j++)translation.push(t * T2.translation[j] + (1.0 - t) * T1.translation[j]);\n for (let j = 0; j < 4; j++)rotQuaternion.push(t * T2.rotQuaternion[j] + (1.0 - t) * T1.rotQuaternion[j]);\n rotQuaternion = GLMath.normalize(rotQuaternion);\n let blended_transform = new RigidTransform(translation as GLMath.vec3, rotQuaternion as GLMath.vec4);\n blended_transform = frameJointRef.movableJointTransforms[index_parent].apply(blended_transform) as RigidTransform;\n result.movableJointTransforms[index_child] = blended_transform;\n }\n return result;\n }\n}\n\nexport function unpackIBRAnimation(buffer: ArrayBuffer | DataViewWithCustomOffset, char_data: IBRAnimationGeneratorCharInfo_NN): IBRAnimationFrameData_NN[] {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n const version = checkVersion(buffer, __version__);\n\n const frameCount = buffer.dataview.getUint32(buffer.offset, true);\n buffer.offset += 4;\n\n let result = Array(frameCount);\n for (let i = 0; i < frameCount; i++)result[i] = IBRAnimationFrameData_NN.deserialize(buffer, char_data, version);\n return result;\n}\n\nexport class TextureFloat_3D {\n size: [number, number, number, number]; // dim0, dim1, dim2, component\n data: Float32Array; // first component is mean\n constructor(buffer: ArrayBuffer | DataViewWithCustomOffset) {\n if (buffer instanceof ArrayBuffer) buffer = { offset: 0, dataview: new DataView(buffer) } as DataViewWithCustomOffset;\n\n this.size = [0, 0, 0, 0];\n for (let i = 0; i < 4; i++) {\n this.size[i] = buffer.dataview.getUint16(buffer.offset, true);\n buffer.offset += 2;\n }\n this.data = new Float32Array(this.size[0] * this.size[1] * this.size[2] * this.size[3]);\n for (let i = 0; i < this.data.length; i++) {\n this.data[i] = buffer.dataview.getFloat32(buffer.offset, true);\n buffer.offset += 4;\n }\n }\n}\n\nexport function transformMJT(mjt: number[][]): RigidTransform[] {\n let result = Array(mjt.length);\n for (let i = 0; i < mjt.length; i++) {\n result[i] = new RigidTransform(\n mjt[i].slice(0, 3) as [number, number, number],\n mjt[i].slice(3) as [number, number, number, number]\n );\n }\n return result;\n}\n\nexport function formatMJT(a1: number[], a2: number[]) {\n return new RigidTransform(\n a1 as [number, number, number],\n a2 as [number, number, number, number]\n );\n}","// @ts-ignore\nconst DefineENV = ENV\nexport function isDEV() {\n return DefineENV === \"development\";\n}\nexport function isSupportMES() {\n const ua = navigator.userAgent;\n const vendor = navigator.vendor;\n\n // 检查 userAgent 中是否包含 Chrome\n const hasChrome = /Chrome/.test(ua);\n\n // 检查 vendor 是否为 Google Inc.\n const isGoogleVendor = /Google Inc/.test(vendor);\n\n // Edge(基于 Chromium 的新版 Edge 也包含 Chrome 标识)\n const isEdge = /Edg/.test(ua);\n\n // MediaSource 支持性检查(可选)\n const hasMediaSource = typeof (window as any).MediaSource !== \"undefined\";\n\n return hasChrome && (isGoogleVendor || isEdge) && hasMediaSource;\n}\n\nexport function getStyleStr(styles: Record<string, any>) {\n return Object.entries(styles).map(([key, value]) => {\n // 处理zIndex等数字属性转字符串\n const val = typeof value === 'number' ? value.toString() : value;\n // 驼峰转短横线(如zIndex → z-index)\n const cssKey = key.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n return `${cssKey}:${val};`;\n }).join('');\n}\n\nexport function updateCanvasXOffset(canvas, offset_PX) {\n // 1. 获取当前 transform 样式\n const currentTransform = canvas.style.transform || '';\n \n // 2. 正则匹配现有 translateX 的值(提取数字)\n const translateXRegex = /translateX\\((-?\\d+(\\.\\d+)?)px\\)/;\n \n // 3. 计算新的偏移量(初始为0,匹配到则取原有值)\n \n // 4. 移除原有 translateX,拼接新值(保留其他 transform 效果)\n const newTransform = currentTransform\n .replace(translateXRegex, '') // 移除旧的 translateX\n .trim() + ` translateX(${offset_PX}px)`; // 添加新的 translateX\n \n // 5. 应用新样式(去除多余空格)\n canvas.style.transform = newTransform.replace(/\\s+/g, ' ').trim();\n}\n\n// 生成设备指纹\nexport function generateFingerprint() {\n const screenSize = `${screen.width}x${screen.height}`;\n const userAgent = navigator.userAgent;\n const language = navigator.language;\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const fingerprint = encodeURIComponent(`${screenSize}|${userAgent}|${language}|${timezone}`); \n return btoa(fingerprint);\n}\n\n// 获取设备品牌及型号及版本号\nexport function getDeviceInfo() {\n const ua = navigator.userAgent;\n let deviceBrand = 'Unknown Brand';\n let deviceModel = 'Unknown Model';\n let deviceVersion = 'Unknown Version';\n let browserType = 'Unknown Browser';\n let browserVersion = 'Unknown Version';\n \n // 获取操作系统版本\n const windowsMatch = ua.match(/Windows NT (\\d+\\.\\d+)/);\n const androidMatch = ua.match(/Android (\\d+\\.\\d+(\\.\\d+)?)/);\n const iosMatch = ua.match(/OS (\\d+_\\d+(\\._\\d+)?) like Mac OS X/);\n \n if (windowsMatch) {\n deviceVersion = `Windows NT ${windowsMatch[1]}`;\n } else if (androidMatch) {\n deviceVersion = `Android ${androidMatch[1]}`;\n } else if (iosMatch) {\n deviceVersion = `iOS ${iosMatch[1].replace(/_/g, '.')}`;\n } else if (ua.includes('Macintosh')) {\n deviceVersion = 'Macintosh';\n } else if (ua.includes('Linux')) {\n deviceVersion = 'Linux';\n }\n \n // 匹配品牌 - 更准确的匹配逻辑\n // 首先检查苹果设备\n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iPod')) {\n deviceBrand = 'Apple';\n if (ua.includes('iPhone')) deviceModel = 'iPhone';\n else if (ua.includes('iPad')) deviceModel = 'iPad';\n else if (ua.includes('iPod')) deviceModel = 'iPod';\n }\n // 检查 Android 设备\n else if (ua.includes('Android')) {\n deviceBrand = 'Android';\n deviceModel = 'Android';\n }\n // 检查 Windows 设备\n else if (ua.includes('Windows')) {\n deviceBrand = 'Windows';\n if (ua.includes('Windows Phone')) deviceModel = 'Windows Phone';\n else deviceModel = 'Windows Desktop';\n }\n // 检查 Linux 设备\n else if (ua.includes('Linux')) {\n deviceBrand = 'Linux';\n deviceModel = 'Linux';\n }\n \n // 匹配浏览器类型和版本\n const chromeMatch = ua.match(/Chrome\\/(\\d+\\.\\d+\\.\\d+\\.\\d+)/);\n const safariMatch = ua.match(/Version\\/(\\d+\\.\\d+(\\.\\d+)?) Safari/);\n const firefoxMatch = ua.match(/Firefox\\/(\\d+\\.\\d+(\\.\\d+)?)\\b/);\n const edgeMatch = ua.match(/Edg\\/(\\d+\\.\\d+\\.\\d+\\.\\d+)/);\n const operaMatch = ua.match(/Opera\\/(\\d+\\.\\d+)/);\n const ieMatch = ua.match(/MSIE (\\d+\\.\\d+)/);\n \n if (chromeMatch) {\n browserType = 'Chrome';\n browserVersion = chromeMatch[1];\n } else if (safariMatch) {\n browserType = 'Safari';\n browserVersion = safariMatch[1];\n } else if (firefoxMatch) {\n browserType = 'Firefox';\n browserVersion = firefoxMatch[1];\n } else if (edgeMatch) {\n browserType = 'Edge';\n browserVersion = edgeMatch[1];\n } else if (operaMatch) {\n browserType = 'Opera';\n browserVersion = operaMatch[1];\n } else if (ieMatch) {\n browserType = 'IE';\n browserVersion = ieMatch[1];\n }\n \n return {\n device_id: generateFingerprint(),\n device_brand: deviceBrand,\n device_model: deviceModel,\n os_version: deviceVersion,\n browser: browserType,\n browser_version: browserVersion,\n browser_ua: ua,\n };\n}\n\n// ---------------------- 扩展:支持小数的版本(可选) ----------------------\n/**\n * 校验scale格式(支持小数)并返回合法值\n * @param {unknown} scale - 待校验的scale值\n * @param {string} tag - 日志标签\n * @returns {number | string} 合法值,非法返回1\n */\nexport function validateScaleWithDecimal(scale: unknown, tag: string): number | string {\n const validVhRegex = /^\\d+(\\.\\d+)?vh$/; // 支持 \"1.5vh\"、\"10vh\"\n const validNumberStrRegex = /^\\d+(\\.\\d+)?$/; // 支持 \"2.8\"、\"5\"\n\n if (typeof scale === 'number') {\n return scale;\n }\n\n if (typeof scale === 'string' && (validVhRegex.test(scale) || validNumberStrRegex.test(scale))) {\n return scale;\n }\n\n (window as any).avatarSDKLogger?.warn(\n tag,\n 'scale 必须是数字、带小数的数字字符串或者\"xxxvh\"格式(xxx为数字/小数)'\n );\n return 1;\n}\n\nexport function isharmony() {\n const userAgent = (navigator.userAgent || \"\").toLowerCase();\n return /openharmony|arkweb/.test(userAgent);\n}","/**\n * 3D 渲染(身体+表情)\n */\nimport ResourceManager from \"../modules/ResourceManager\";\nimport { DataCacheQueue, IBodyFrame } from \"../control/DataCacheQueue\";\nimport { GLDevice } from \"../utils/GLDevice\";\nimport { GLPipeline, GLPipelineCharData } from \"../utils/GLPipeline\";\nimport { performanceConstant } from \"../utils/perfermance\";\nimport { EErrorCode } from \"../types/error\";\nimport DefaultWidgetRenderer from \"../modules/TrackRenderer/render-implements\";\nimport { Layout, RenderState, WalkConfig } from \"../types\";\nimport { IBRAnimationFrameData_NN } from \"../utils/DataInterface\";\nimport SaveAndDownload from \"../control/SaveAndDownload\";\nimport { getStyleStr, updateCanvasXOffset, isharmony } from \"../utils\";\nimport { IRawFaceFrameData } from \"types/frame-data\";\n\ntype Option = {\n dataCacheQueue: DataCacheQueue;\n resourceManager: ResourceManager;\n saveAndDownload: SaveAndDownload;\n forceSyncDecoder: () => void;\n reportMessage: (message: {\n code: EErrorCode;\n message: string;\n e?: object;\n }) => void;\n onDownloadProgress: (progress: number) => void;\n onStateChange: (state: string) => void;\n onRenderChange: (state: RenderState) => void;\n sendVideoInfo: (info: { name: string; body_id: number; id: number }) => void;\n onError: (error: any) => void;\n sendSdkPoint: (point: string, data: any) => void;\n};\nexport default class AvatarRender {\n private TAG = \"[AvatarRender]\";\n options: Option;\n canvas = document.createElement(\"canvas\");\n device: GLDevice | null;\n pipeline: GLPipeline | null;\n currentBodyFrame: IBodyFrame | null = null;\n lastFaceFrame: IRawFaceFrameData | null = null;\n private isInit = false;\n private isFirstRender = true;\n private lastFrameState: string = \"\";\n private lastRenderState: RenderState = RenderState.init;\n private onDownloadProgress: (progress: number) => void;\n private onStateChange?: (state: string) => void = () => {};\n private onRenderChange?: (state: RenderState) => void = () => {};\n private sendVideoInfo: (info: {\n name: string;\n body_id: number;\n id: number;\n }) => void = () => {};\n private lostHandler: (event: Event) => void = () => {};\n private restoreHandler: (event: Event) => void = () => {};\n private avatarCanvasVisible: boolean = true;\n private lastRealFaceFrameData: any = null; // 上一帧渲染的实时数据\n private lastRealFaceFrame: number = -1; // 上一次实时表情数据帧号\n private lastWeight: number = 0.0;\n\n private lastFrameIndex = -1;\n private saveAndDownload: SaveAndDownload;\n private canvasOffsetX = -1;\n private baseWalkOffset = 0; // 行走偏移基准值,setWalkConfig 时记录,用于差值补偿\n private lastBodyOffset = 0; // 最近一次 body 帧的世界坐标偏移\n private pendingCharData: GLPipelineCharData | null = null; // 待设置的字符数据\n private interrupt: boolean = false; // 是否中断speak\n private walkConfig: WalkConfig | null = null;\n layout: Layout | null = null;\n private allLostFrameCount = 0; // 累计丢失的帧数\n private allLostFaceFrameCount = 0; // 累计丢失的表情帧数\n private maxLostFrameCount = 300; // 最大允许丢失帧数\n private forceSyncDecoder: () => void = () => {}; // 强制同步解码器到最新一帧\n private createPipelineLock = false; // 创建 pipeline 锁\n private restoreTimeout: any = null; // 恢复超时定时器\n private isRecovering: boolean = false; // 是否正在恢复中\n private recoverStartTime: number = 0; // 恢复开始时间\n\n // ── 分阶段恢复配置(指数退避)─────────────────────────────────────\n // light:复用现有 canvas,仅重建 GLDevice + GLPipeline(代价最小)\n // medium:创建新 canvas 替换 DOM 节点,重建 GLDevice + GLPipeline\n // full :在全量重建基础上降低渲染分辨率,作为最后手段\n private recoveryStage: 'light' | 'medium' | 'full' = 'light';\n // 各阶段最大尝试次数\n // light 减为 2 次:同一 canvas 上 getContext 返回死 context,多次重试无意义\n // 适用于 exit_on_context_lost(GPU 进程崩溃)场景,快速升级到 medium\n private readonly recoveryMaxAttempts: Record<string, number> = { light: 2, medium: 3, full: 2 };\n // 各阶段指数退避基础延迟(ms):实际延迟 = baseDelay * 2^attempt\n // light 缩短到 300ms:快速失败,尽早升级\n // medium 增加到 4000ms:GPU 进程重启后 D3D11 设备初始化需要更长时间\n private readonly recoveryBaseDelays: Record<string, number> = { light: 300, medium: 4000, full: 5000 };\n // 最大延迟上限(ms),防止退避时间过长\n private readonly recoveryMaxDelay: number = 30000;\n // 当前阶段内已尝试次数\n private currentStageAttempts: number = 0;\n // 是否正在使用降级分辨率(full 阶段恢复后)\n private isUsingReducedResolution: boolean = false;\n // 恢复分辨率定时器\n private resolutionRestoreTimer: any = null;\n // 降级分辨率稳定运行时长要求(ms),超过此时间后才尝试恢复原始分辨率\n private readonly RESOLUTION_RESTORE_DELAY: number = 30000; // 30 秒\n private scale = 1.0; // 缩放比例\n private sendSdkPoint: (point: string, data: any) => void = () => {};\n private copyCanvas: HTMLCanvasElement;\n private copyCtx: CanvasRenderingContext2D | null;\n constructor(options: Option) {\n this.options = options;\n this.onDownloadProgress = options.onDownloadProgress;\n this.onStateChange = options.onStateChange;\n this.onRenderChange = options.onRenderChange;\n this.sendVideoInfo = options.sendVideoInfo;\n this.saveAndDownload = options.saveAndDownload;\n this.forceSyncDecoder = options.forceSyncDecoder;\n this.lostHandler = this._lostHandler.bind(this);\n this.restoreHandler = this._restoreHandler.bind(this);\n this.setCanvasVisibility(this.avatarCanvasVisible);\n this.sendSdkPoint = options.sendSdkPoint;\n // 延迟创建 GLDevice 和 GLPipeline,避免与视频解码器竞争 GPU 资源\n // 将在 init 方法中首次创建\n this.device = null;\n this.pipeline = null;\n this.copyCanvas = document.createElement('canvas');\n this.copyCtx = this.copyCanvas.getContext('2d');\n }\n\n /**\n * 重置表情相关状态(用于从隐身模式恢复渲染时)\n */\n resetFaceFrameState() {\n this.lastRealFaceFrame = -1;\n this.lastRealFaceFrameData = null;\n this.lastWeight = 0.0;\n (window as any).avatarSDKLogger?.log(\n this.TAG,\n \"重置表情状态(从隐身模式恢复)\"\n );\n }\n\n /**\n * 创建 pipeline 并设置字符数据\n */\n public createPipeline() {\n if (this.pipeline || !this.device || this.createPipelineLock) {\n return;\n }\n this.createPipelineLock = true;\n this.pipeline = new GLPipeline(this.device, this.sendSdkPoint);\n this.createPipelineLock = false;\n // 如果有待设置的字符数据,立即设置\n if (this.pendingCharData) {\n this.pipeline.setCharData(this.pendingCharData);\n this.pipeline.setSyncMedia();\n }\n }\n\n // ── WebGL 上下文丢失 / 恢复 ──────────────────────────────────────\n\n _lostHandler(event: Event) {\n event.preventDefault();\n (window as any).avatarSDKLogger.error(\"Context lost.\", event);\n\n // 先移除事件监听器,避免旧 device 的匿名监听器残留\n if (this.device) {\n try {\n this.device.canvas.removeEventListener(\"webglcontextlost\", this.lostHandler);\n this.device.canvas.removeEventListener(\"webglcontextrestored\", this.restoreHandler);\n } catch (_) { /* ignore */ }\n }\n\n // 销毁旧 device 释放 GPU 资源(关键:不调用 destroy 会导致资源泄漏,\n // 后续恢复阶段在新 canvas 上也可能因 GPU 内存耗尽而失败)\n if (this.device) {\n try { this.device.destroy(); } catch (_) { /* ignore */ }\n }\n if (this.pipeline) {\n try { this.pipeline.destroy(); } catch (_) { /* ignore */ }\n }\n this.device = null;\n this.pipeline = null;\n\n this.options.reportMessage({\n code: EErrorCode.WEBGL_CONTEXT_LOST,\n message: \"Context lost.\",\n e: {\n event,\n timestamp: Date.now(),\n },\n });\n\n // 如果已经在恢复中,不重复启动恢复流程\n if (this.isRecovering) {\n (window as any).avatarSDKLogger.warn(\"Context recovery already in progress, skipping.\");\n return;\n }\n\n // 取消分辨率恢复计划(上下文再次丢失)\n if (this.resolutionRestoreTimer) {\n clearTimeout(this.resolutionRestoreTimer);\n this.resolutionRestoreTimer = null;\n (window as any).avatarSDKLogger.log(\"[Recovery] Cancelled resolution restore due to context loss\");\n }\n\n // 初始化分阶段恢复状态\n this.isRecovering = true;\n this.recoverStartTime = Date.now();\n this.recoveryStage = 'light';\n this.currentStageAttempts = 0;\n\n // 启动第一次恢复尝试\n this._scheduleNextAttempt();\n }\n\n _restoreHandler(event: Event) {\n // 清除定时器,因为 restored 事件已经触发\n if (this.restoreTimeout) {\n clearTimeout(this.restoreTimeout);\n this.restoreTimeout = null;\n }\n\n if (this.isRecovering) {\n (window as any).avatarSDKLogger.warn(\"Context restore event received during recovery, skipping duplicate recovery.\");\n return;\n }\n\n this.options.reportMessage({\n code: EErrorCode.WEBGL_CONTEXT_RESTORED,\n message: \"Context restored event received.\",\n e: {\n event,\n timestamp: Date.now(),\n },\n });\n\n this.isRecovering = true;\n // 浏览器已主动恢复,优先使用 light 阶段\n this.recoveryStage = 'light';\n this.currentStageAttempts = 0;\n this._recoverContext();\n }\n\n // ── 分阶段恢复核心 ──────────────────────────────────────────────\n\n /**\n * 根据当前阶段分发到对应的恢复方法\n */\n private _recoverContext(): void {\n // 防止竞态条件:如果恢复已完成(device/pipeline 已存在且 context 正常),跳过\n if (this.device && this.pipeline && this.device.gl && !this.device.gl.isContextLost()) {\n (window as any).avatarSDKLogger.log(\"[Recovery] Already recovered, skipping.\");\n this.isRecovering = false;\n return;\n }\n\n (window as any).avatarSDKLogger.log(\n `[Recovery] stage=${this.recoveryStage}, attempt=${this.currentStageAttempts + 1}/${this.recoveryMaxAttempts[this.recoveryStage]}`\n );\n\n if (this.restoreTimeout) {\n clearTimeout(this.restoreTimeout);\n this.restoreTimeout = null;\n }\n\n let success = false;\n try {\n switch (this.recoveryStage) {\n case 'light':\n success = this._tryLightRecovery();\n break;\n case 'medium':\n success = this._tryMediumRecovery();\n break;\n case 'full':\n success = this._tryFullRecovery();\n break;\n }\n } catch (error) {\n (window as any).avatarSDKLogger.error(`[Recovery] stage=${this.recoveryStage} threw:`, error);\n }\n\n if (success) {\n this._onRecoverySuccess();\n return;\n }\n\n // 本阶段失败,判断是否还有本阶段的重试机会\n this.currentStageAttempts++;\n this.isRecovering = false;\n\n const maxAttempts = this.recoveryMaxAttempts[this.recoveryStage];\n if (this.currentStageAttempts < maxAttempts) {\n // 本阶段还可以重试\n this._scheduleNextAttempt();\n } else {\n // 本阶段用尽,升级到下一阶段\n this._advanceStage();\n }\n }\n\n /**\n * 阶段 1 — 轻量恢复\n * 复用现有 canvas,仅重建 GLDevice + GLPipeline\n * 适用于:上下文偶发丢失、浏览器后台恢复\n */\n private _tryLightRecovery(): boolean {\n try {\n (window as any).avatarSDKLogger.log(\"[Recovery] Trying light recovery (reuse canvas)...\");\n\n // 清理残留的 device(如果有)\n if (this.device) {\n try {\n this.device.canvas.removeEventListener(\"webglcontextlost\", this.lostHandler);\n this.device.canvas.removeEventListener(\"webglcontextrestored\", this.restoreHandler);\n this.device.destroy();\n } catch (_) { /* ignore */ }\n this.device = null;\n }\n\n // 在现有 canvas 上重建 GLDevice\n this.device = new GLDevice(this.canvas);\n this.device.canvas.addEventListener(\"webglcontextlost\", this.lostHandler, false);\n this.device.canvas.addEventListener(\"webglcontextrestored\", this.restoreHandler, false);\n\n // 验证上下文可用\n if (!this.device.gl || this.device.gl.isContextLost()) {\n throw new Error(\"WebGL context still lost after light recovery\");\n }\n\n // 重建 pipeline\n this.createPipelineLock = true;\n this.pipeline = new GLPipeline(this.device, this.sendSdkPoint);\n this.createPipelineLock = false;\n\n if (this.pendingCharData) {\n this.pipeline.setCharData(this.pendingCharData);\n this.pipeline.setSyncMedia();\n }\n this.pipeline.reinitialize();\n this.pipeline.setSyncMedia();\n this.isInit = true;\n\n return true;\n } catch (error) {\n (window as any).avatarSDKLogger.warn(\"[Recovery] Light recovery failed:\", error);\n this._reportRecoveryFailure('light', error);\n return false;\n }\n }\n\n /**\n * 阶段 2 — 中等恢复\n * 创建新 canvas 替换 DOM 节点,重建 GLDevice + GLPipeline\n * 适用于:canvas 节点本身出现异常(如全屏切换导致的 DOM 重建)\n */\n private _tryMediumRecovery(): boolean {\n try {\n (window as any).avatarSDKLogger.log(\"[Recovery] Trying medium recovery (replace canvas)...\");\n\n // 销毁旧 device\n if (this.device) {\n try {\n this.device.canvas.removeEventListener(\"webglcontextlost\", this.lostHandler);\n this.device.canvas.removeEventListener(\"webglcontextrestored\", this.restoreHandler);\n this.device.destroy();\n } catch (_) { /* ignore */ }\n this.device = null;\n }\n\n // 销毁旧 pipeline\n if (this.pipeline) {\n try { this.pipeline.destroy(); } catch (_) { /* ignore */ }\n this.pipeline = null;\n }\n\n // 创建新 canvas 并替换 DOM 节点\n const oldCanvas = this.canvas;\n const oldCanvasStyle = oldCanvas.style.cssText;\n const oldCanvasParent = oldCanvas.parentNode;\n\n const newCanvas = document.createElement(\"canvas\");\n const resolution = this.options.resourceManager.getConfig()?.resolution;\n if (resolution) {\n newCanvas.width = resolution.width ?? 1080;\n newCanvas.height = resolution.height ?? 1920;\n }\n newCanvas.setAttribute(\"style\", oldCanvasStyle);\n\n if (oldCanvasParent) {\n oldCanvasParent.replaceChild(newCanvas, oldCanvas);\n }\n this.canvas = newCanvas;\n\n // 在新 canvas 上初始化 GLDevice\n this.device = new GLDevice(this.canvas);\n this.device.canvas.addEventListener(\"webglcontextlost\", this.lostHandler, false);\n this.device.canvas.addEventListener(\"webglcontextrestored\", this.restoreHandler, false);\n\n if (!this.device.gl || this.device.gl.isContextLost()) {\n throw new Error(\"WebGL context lost after medium recovery\");\n }\n\n // 重建 pipeline\n this.createPipelineLock = true;\n this.pipeline = new GLPipeline(this.device, this.sendSdkPoint);\n this.createPipelineLock = false;\n\n if (this.pendingCharData) {\n this.pipeline.setCharData(this.pendingCharData);\n this.pipeline.setSyncMedia();\n }\n this.pipeline.reinitialize();\n this.pipeline.setSyncMedia();\n this.isInit = true;\n\n return true;\n } catch (error) {\n (window as any).avatarSDKLogger.warn(\"[Recovery] Medium recovery failed:\", error);\n this._reportRecoveryFailure('medium', error);\n return false;\n }\n }\n\n /**\n * 阶段 3 — 完全恢复(降级分辨率)\n * 在全量重建基础上降低渲染分辨率,减少 GPU 压力\n * 适用于:GPU 资源受限设备(笔记本集成显卡)连续上下文丢失\n */\n private _tryFullRecovery(): boolean {\n try {\n (window as any).avatarSDKLogger.log(\"[Recovery] Trying full recovery (reduced resolution)...\");\n\n // 销毁旧 device\n if (this.device) {\n try {\n this.device.canvas.removeEventListener(\"webglcontextlost\", this.lostHandler);\n this.device.canvas.removeEventListener(\"webglcontextrestored\", this.restoreHandler);\n this.device.destroy();\n } catch (_) { /* ignore */ }\n this.device = null;\n }\n\n // 销毁旧 pipeline\n if (this.pipeline) {\n try { this.pipeline.destroy(); } catch (_) { /* ignore */ }\n this.pipeline = null;\n }\n\n // 创建新 canvas,降低分辨率至原始的 75%\n const oldCanvas = this.canvas;\n const oldCanvasStyle = oldCanvas.style.cssText;\n const oldCanvasParent = oldCanvas.parentNode;\n\n const newCanvas = document.createElement(\"canvas\");\n const resolution = this.options.resourceManager.getConfig()?.resolution;\n const scaleFactor = 0.75;\n const targetWidth = Math.round((resolution?.width ?? 1080) * scaleFactor);\n const targetHeight = Math.round((resolution?.height ?? 1920) * scaleFactor);\n newCanvas.width = targetWidth;\n newCanvas.height = targetHeight;\n newCanvas.setAttribute(\"style\", oldCanvasStyle);\n\n if (oldCanvasParent) {\n oldCanvasParent.replaceChild(newCanvas, oldCanvas);\n }\n this.canvas = newCanvas;\n\n (window as any).avatarSDKLogger.log(\n `[Recovery] Using reduced resolution: ${targetWidth}x${targetHeight} (scale=${scaleFactor})`\n );\n\n // 初始化 GLDevice\n this.device = new GLDevice(this.canvas);\n this.device.canvas.addEventListener(\"webglcontextlost\", this.lostHandler, false);\n this.device.canvas.addEventListener(\"webglcontextrestored\", this.restoreHandler, false);\n\n if (!this.device.gl || this.device.gl.isContextLost()) {\n throw new Error(\"WebGL context lost after full recovery\");\n }\n\n // 重建 pipeline\n this.createPipelineLock = true;\n this.pipeline = new GLPipeline(this.device, this.sendSdkPoint);\n this.createPipelineLock = false;\n\n if (this.pendingCharData) {\n this.pipeline.setCharData(this.pendingCharData);\n this.pipeline.setSyncMedia();\n }\n this.pipeline.reinitialize();\n this.pipeline.setSyncMedia();\n this.isInit = true;\n\n return true;\n } catch (error) {\n (window as any).avatarSDKLogger.warn(\"[Recovery] Full recovery failed:\", error);\n this._reportRecoveryFailure('full', error);\n return false;\n }\n }\n\n // ── 恢复辅助方法 ────────────────────────────────────────────────\n\n /**\n * 恢复成功后的统一收尾处理\n */\n private _onRecoverySuccess(): void {\n const recoveryTime = Date.now() - this.recoverStartTime;\n const wasFullRecovery = this.recoveryStage === 'full';\n\n (window as any).avatarSDKLogger.log(\n `[Recovery] Success! stage=${this.recoveryStage}, time=${recoveryTime}ms${wasFullRecovery ? ' (reduced resolution)' : ''}`\n );\n this.options.reportMessage({\n code: EErrorCode.WEBGL_CONTEXT_RECOVERED,\n message: `Context recovered via ${this.recoveryStage} recovery in ${recoveryTime}ms.`,\n e: {\n timestamp: Date.now(),\n recoveryTime,\n stage: this.recoveryStage,\n attempts: this.currentStageAttempts + 1,\n reducedResolution: wasFullRecovery,\n },\n });\n\n // 如果是 full 阶段恢复,标记降级分辨率并安排恢复\n if (wasFullRecovery) {\n this.isUsingReducedResolution = true;\n this._scheduleResolutionRestore();\n }\n\n // 重置所有恢复状态\n this.isRecovering = false;\n this.recoveryStage = 'light';\n this.currentStageAttempts = 0;\n }\n\n /**\n * 安排恢复原始分辨率\n * 在降级分辨率稳定运行一段时间后尝试恢复\n */\n private _scheduleResolutionRestore(): void {\n // 清除之前的定时器(如果有)\n if (this.resolutionRestoreTimer) {\n clearTimeout(this.resolutionRestoreTimer);\n }\n\n (window as any).avatarSDKLogger.log(\n `[Recovery] Scheduling resolution restore in ${this.RESOLUTION_RESTORE_DELAY}ms`\n );\n\n this.resolutionRestoreTimer = setTimeout(() => {\n this._restoreOriginalResolution();\n }, this.RESOLUTION_RESTORE_DELAY);\n }\n\n /**\n * 恢复原始分辨率\n * 尝试将 canvas 恢复到原始分辨率,如果再次丢失上下文则保持降级\n */\n private _restoreOriginalResolution(): void {\n if (!this.isUsingReducedResolution || !this.device || this.device.gl.isContextLost()) {\n (window as any).avatarSDKLogger.warn(\"[Recovery] Cannot restore resolution: not in reduced mode or context lost\");\n return;\n }\n\n try {\n (window as any).avatarSDKLogger.log(\"[Recovery] Attempting to restore original resolution...\");\n\n // 获取原始分辨率配置\n const resolution = this.options.resourceManager.getConfig()?.resolution;\n const originalWidth = resolution?.width ?? 1080;\n const originalHeight = resolution?.height ?? 1920;\n\n // 保存当前 canvas 的样式\n const currentStyle = this.canvas.style.cssText;\n const parent = this.canvas.parentNode;\n\n // 创建新 canvas 使用原始分辨率\n const newCanvas = document.createElement(\"canvas\");\n newCanvas.width = originalWidth;\n newCanvas.height = originalHeight;\n newCanvas.setAttribute(\"style\", currentStyle);\n\n // 替换 DOM 中的 canvas\n if (parent) {\n parent.replaceChild(newCanvas, this.canvas);\n }\n this.canvas = newCanvas;\n\n // 销毁旧的 device 和 pipeline\n if (this.device) {\n try {\n this.device.canvas.removeEventListener(\"webglcontextlost\", this.lostHandler);\n this.device.canvas.removeEventListener(\"webglcontextrestored\", this.restoreHandler);\n this.device.destroy();\n } catch (_) { /* ignore */ }\n this.device = null;\n }\n if (this.pipeline) {\n try { this.pipeline.destroy(); } catch (_) { /* ignore */ }\n this.pipeline = null;\n }\n\n // 重新初始化 GLDevice\n this.device = new GLDevice(this.canvas);\n this.device.canvas.addEventListener(\"webglcontextlost\", this.lostHandler, false);\n this.device.canvas.addEventListener(\"webglcontextrestored\", this.restoreHandler, false);\n\n if (!this.device.gl || this.device.gl.isContextLost()) {\n throw new Error(\"Context lost after resolution restore\");\n }\n\n // 重建 pipeline\n this.createPipelineLock = true;\n this.pipeline = new GLPipeline(this.device, this.sendSdkPoint);\n this.createPipelineLock = false;\n\n if (this.pendingCharData) {\n this.pipeline.setCharData(this.pendingCharData);\n this.pipeline.setSyncMedia();\n }\n this.pipeline.reinitialize();\n this.pipeline.setSyncMedia();\n\n // 恢复成功\n this.isUsingReducedResolution = false;\n (window as any).avatarSDKLogger.log(\n `[Recovery] Resolution restored to ${originalWidth}x${originalHeight}`\n );\n this.options.reportMessage({\n code: EErrorCode.WEBGL_RESOLUTION_RESTORED,\n message: `Resolution restored to ${originalWidth}x${originalHeight}.`,\n e: {\n timestamp: Date.now(),\n resolution: { width: originalWidth, height: originalHeight },\n },\n });\n } catch (error) {\n (window as any).avatarSDKLogger.warn(\"[Recovery] Failed to restore resolution, keeping reduced:\", error);\n // 恢复失败,保持降级状态,不再重试\n } finally {\n this.resolutionRestoreTimer = null;\n }\n }\n\n /**\n * 升级恢复阶段:light → medium → full → 放弃\n */\n private _advanceStage(): void {\n const stages: Array<'light' | 'medium' | 'full'> = ['light', 'medium', 'full'];\n const currentIndex = stages.indexOf(this.recoveryStage);\n\n if (currentIndex < stages.length - 1) {\n const nextStage = stages[currentIndex + 1];\n (window as any).avatarSDKLogger.log(\n `[Recovery] Stage \"${this.recoveryStage}\" exhausted, upgrading to \"${nextStage}\"`\n );\n this.recoveryStage = nextStage;\n this.currentStageAttempts = 0;\n // 立即启动下一阶段第一次尝试\n this._scheduleNextAttempt();\n } else {\n // 所有阶段全部失败,通知业务层\n (window as any).avatarSDKLogger.error(\"[Recovery] All recovery stages exhausted. Giving up.\");\n this.options.reportMessage({\n code: EErrorCode.WEBGL_CONTEXT_RECOVERY_MAX_ATTEMPTS,\n message: \"All WebGL recovery stages exhausted. SDK restart required.\",\n e: {\n timestamp: Date.now(),\n elapsedTime: Date.now() - this.recoverStartTime,\n stagesAttempted: {\n light: this.recoveryMaxAttempts.light,\n medium: this.recoveryMaxAttempts.medium,\n full: this.recoveryMaxAttempts.full,\n },\n },\n });\n this.isRecovering = false;\n }\n }\n\n /**\n * 按指数退避延迟安排下一次恢复尝试\n * 延迟计算:baseDelay * 2^attempt,受 maxDelay 上限约束\n */\n private _scheduleNextAttempt(): void {\n const baseDelay = this.recoveryBaseDelays[this.recoveryStage];\n const maxAttempts = this.recoveryMaxAttempts[this.recoveryStage];\n // 指数退避:baseDelay * 2^attempt\n const calculatedDelay = baseDelay * Math.pow(2, this.currentStageAttempts);\n const delay = Math.min(calculatedDelay, this.recoveryMaxDelay);\n\n (window as any).avatarSDKLogger.log(\n `[Recovery] Scheduling ${this.recoveryStage} attempt ${this.currentStageAttempts + 1}/${maxAttempts} in ${delay}ms (base=${baseDelay}ms, exp=${calculatedDelay}ms)`\n );\n\n this.restoreTimeout = setTimeout(() => {\n this.isRecovering = true;\n this._recoverContext();\n }, delay);\n }\n\n /**\n * 上报单次恢复失败事件\n */\n private _reportRecoveryFailure(stage: string, error: unknown): void {\n this.options.reportMessage({\n code: EErrorCode.WEBGL_CONTEXT_RECOVERY_FAILED,\n message: `[${stage}] recovery attempt ${this.currentStageAttempts + 1}/${this.recoveryMaxAttempts[stage]} failed.`,\n e: {\n error,\n stage,\n attempt: this.currentStageAttempts + 1,\n timestamp: Date.now(),\n },\n });\n }\n\n init(data: GLPipelineCharData | null) {\n // this.style(this.options.resourceManager.getConfig()?.resolution?.width ?? 1080, this.options.resourceManager.getConfig()?.resolution?.height ?? 1920)\n let charInitData = data;\n // if (!this.device) {\n // return;\n // }\n this.style(this.options.resourceManager.getConfig()?.resolution?.width ?? 1080, this.options.resourceManager.getConfig()?.resolution?.height ?? 1920)\n this.setCharacterCanvasAnchor();\n if(!charInitData?.char) {\n const charInfo = this.options.resourceManager.getMouthShapeLib().char_info;\n charInitData = {\n char: charInfo,\n LUT: null,\n transform: {\n offsetX: 0.0,\n offsetY: 0.0,\n scaleX: 1.0,\n scaleY: 1.0\n },\n multisample: 4\n }\n }\n \n // 保存字符数据,但不创建 pipeline\n // pipeline 将在切换到在线模式时(resumeRender)才创建,避免在隐身模式时创建 pipeline 导致的 GPU 资源竞争\n this.pendingCharData = charInitData;\n this.isInit = true;\n\n this.device = new GLDevice(this.canvas);\n this.device.canvas.addEventListener(\"webglcontextlost\", this.lostHandler, false);\n this.device.canvas.addEventListener(\"webglcontextrestored\", this.restoreHandler, false);\n this.createPipeline();\n }\n\n private style(width = 0, height = 0) {\n if (width > 0 && height > 0) {\n // 设置canvas宽度为输入图片宽度的一半,因为输入的是左右两张图片合并的\n this.canvas.width = width;\n this.canvas.height = height;\n }\n }\n\n /**\n * 设置画布样式(修复transform失效 + 优化对齐逻辑 + 优雅拼接样式)\n * @param avatar 布局配置\n */\n setCanvasStyle(layout: Layout) {\n this.layout = layout;\n // 重置偏移缓存,使下一渲染帧强制重新计算\n this.canvasOffsetX = -1; \n const initPoint = this.walkConfig?.init_point ?? this.options.resourceManager.getConfig()?.walk_config?.init_point ?? null;\n const {width = 1080, height = 1920} = this.options.resourceManager.getConfig()?.resolution ?? {width: 1080, height: 1920};\n const [containerWidth, containerHeight] = layout.container?.size ?? [width, height];\n // 解构并设置默认值\n let {\n v_align = 'center', // 垂直对齐:top/middle/bottom(修正命名逻辑)\n h_align = 'center', // 水平对齐:left/center/right\n scale = 1.0,\n offset_x = 0.0,\n offset_y = 0.0\n } = layout.avatar || {};\n\n // [【LiteSDK】行走2期](https://rsjqcmnt5p.feishu.cn/wiki/U2Waw2SDZikg7UkyVgxcorh7nne)\n if(initPoint !== null && initPoint !== undefined) {\n h_align = 'left';\n offset_x = 0;\n }\n\n // 判断如果非数字,且包含vh时,根据vh计算scale 计算公式是 vh值 / 100 * 容器高度 / 分辨率高度 = scale\n if (typeof scale === 'string' && scale.includes('vh')) {\n const vhValue = parseFloat(scale.replace('vh', ''));\n if (!isNaN(vhValue)) {\n scale = (vhValue / 100 * containerHeight) / height;\n } else {\n scale = 1;\n }\n }\n this.scale = Number(scale);\n const avatarHeight = height * Number(scale);\n const avatarWidth = width * Number(scale);\n const marginX = avatarWidth / 2;\n const marginY = avatarHeight / 2;\n\n // 基础样式(提取固定项,避免重复拼接)\n const baseStyles = {\n position: 'absolute',\n zIndex: 100,\n height: `${avatarHeight}px`,\n width: `${avatarWidth}px`,\n objectFit: 'contain',\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto',\n marginLeft: '0',\n marginTop: '0',\n willChange: 'transform',\n transform: 'translateZ(0)',\n };\n\n // 1. 处理水平对齐(h_align):left/center/right\n switch (h_align) {\n case 'left':\n baseStyles.left = initPoint !== null && initPoint !== undefined ? `${initPoint - marginX}px` : '0';\n baseStyles.marginLeft = `${offset_x}px`;\n break;\n case 'right':\n baseStyles.right = `-${marginX}px`;\n baseStyles.marginLeft = `${offset_x}px`;\n break;\n default: // center\n baseStyles.position = 'absolute';\n baseStyles.left = '50%';\n baseStyles.marginLeft = `${-marginX + offset_x}px`;\n break;\n }\n\n // 2. 处理垂直对齐(v_align):top/middle/bottom\n switch (v_align) {\n case 'top':\n baseStyles.top = '0';\n baseStyles.marginTop = `${offset_y}px`;\n break;\n case 'bottom':\n baseStyles.bottom = '0';\n baseStyles.marginTop = `${offset_y}px`;\n break;\n default: // middle\n baseStyles.position = 'absolute';\n baseStyles.top = '50%';\n baseStyles.marginTop = `${-marginY + offset_y}px`;\n break;\n }\n\n // 3. 合并transform(核心:只定义一次,避免覆盖)\n // 4. 拼接样式字符串(优雅转换为css样式)\n const styleStr = getStyleStr(baseStyles);\n\n // 应用样式\n this.canvas.setAttribute('style', styleStr);\n }\n\n setWalkConfig(walkConfig: WalkConfig) {\n this.walkConfig = walkConfig;\n // 记录当前偏移作为基准,后续渲染用差值补偿,避免后端累计偏移导致闪烁\n this.baseWalkOffset = this.lastBodyOffset;\n if(walkConfig.init_point != null && this.layout) {\n this.setCanvasStyle(this.layout);\n }\n }\n\n setCharacterCanvasAnchor(layout?: Layout) {\n if(layout?.avatar) {\n this.setCanvasStyle(layout);\n } else if(this.options.resourceManager.getConfig()?.layout) {\n const layout =this.options.resourceManager.getConfig()?.layout || {\n avatar: {\n v_align: \"default\",\n h_align: \"default\",\n scale: 1.0,\n offset_x: 0.0,\n offset_y: 0.0,\n },\n };\n this.setCanvasStyle(layout);\n } else {\n const baseStyles = {\n position: 'absolute',\n zIndex: 100,\n height: `100%`,\n objectFit: 'contain',\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto',\n marginLeft: '0',\n marginTop: '0'\n };\n const styleStr = getStyleStr(baseStyles);\n this.canvas.setAttribute('style', styleStr);\n const auchor = this.options.resourceManager.getConfig()?.init_events?.find((item) => item.type === 'SetCharacterCanvasAnchor') || {\n type: 'SetCharacterCanvasAnchor',\n x_location: 0.0,\n y_location: 0.0,\n width: 1.0,\n height: 1.0,\n };\n const {x_location, y_location, width, height} = auchor;\n const style = this.canvas.style.cssText + `left: calc(${x_location} * 100%); top: calc(${y_location} * 100%); transform: scale(${width}, ${height}); transform-origin: top left;`\n this.canvas.setAttribute(\"style\", style);\n }\n }\n\n // 获取权重\n // this.lastWeight应初始化为0\n computeWeight(frameIndex) {\n const maxTweenStep = 12;\n\n const frameDiff = frameIndex - this.lastFrameIndex;\n const isLost: boolean = frameIndex > this.lastRealFaceFrame;\n\n if (isLost) {\n // 丢帧:权重累加步长,最大不超过1.0\n this.lastWeight = Math.min(this.lastWeight + frameDiff, maxTweenStep);\n } else {\n // 未丢帧:权重递减步长,最小不低于0.0\n this.lastWeight = Math.max(this.lastWeight - frameDiff, 0);\n }\n return this.lastWeight / maxTweenStep;\n }\n\n render(frameIndex: number): { canvas: HTMLCanvasElement; rendered: boolean } {\n // 每次渲染时,清理过期的表情数据\n this.options.dataCacheQueue.clearOldFaceData(frameIndex);\n if (!this.isInit) {\n return { canvas: this.canvas, rendered: false };\n }\n // 确保 device 已创建\n // if (!this.device) {\n // this.device = new GLDevice(this.canvas);\n // this.device.canvas.addEventListener(\"webglcontextlost\", this.lostHandler, false);\n // this.device.canvas.addEventListener(\"webglcontextrestored\", this.restoreHandler, false);\n // }\n // 如果还没有创建,这里作为兜底方案创建(防止遗漏)\n // if (!this.pipeline) {\n // this.createPipeline();\n // // 如果创建失败,返回 canvas\n // if (!this.pipeline) {\n // return this.canvas;\n // }\n // }\n const bodyFrame =\n this.options.dataCacheQueue._getBodyImageBitmap(frameIndex);\n let faceFrame = this.options.dataCacheQueue._getFaceImageBitmap(\n frameIndex,\n bodyFrame?.body_id ?? bodyFrame?.id ?? 0\n );\n let curRealFaceData = this.options.dataCacheQueue._getRealFaceImageBitmap(frameIndex, bodyFrame?.body_id ?? bodyFrame?.id ?? 0);\n if (this.lastFrameState === \"speak\" && bodyFrame?.frameState !== \"speak\") {\n // 从speak切出,重置表情权重相关状态\n this.lastRealFaceFrame = -1;\n this.lastRealFaceFrameData = null;\n this.lastWeight = 0.0;\n }\n if(this.interrupt) {\n faceFrame = curRealFaceData;\n } else if(faceFrame?.FaceFrameData && faceFrame?.face_frame_type) {\n // 在当前第 i 帧时,如果有实时表情数据real_face_data_i,则用其来渲染,同时更新last_real_face_data和last_real_face_data_frame\n this.lastRealFaceFrameData = faceFrame.FaceFrameData;\n this.lastRealFaceFrame = frameIndex;\n // 实时数据帧连续时,权重递减\n if (this.lastRealFaceFrame !== -1 && this.lastWeight > 0 && curRealFaceData) {\n const lastWeight = this.computeWeight(frameIndex)\n faceFrame = {\n frameIndex,\n state: bodyFrame?.frameState || 'idle',\n body_id: bodyFrame?.body_id || -1,\n sf: frameIndex,\n ef: frameIndex,\n cs: faceFrame?.cs || \"\",\n face_frame_type: 0,\n id: bodyFrame?.body_id || -1,\n FaceFrameData: IBRAnimationFrameData_NN.interp(\n this.lastRealFaceFrameData,\n curRealFaceData.FaceFrameData,\n curRealFaceData.FaceFrameData,\n lastWeight,\n this.options.resourceManager.resource_pack?.interpolate_joints || []\n )\n }\n }\n } else {\n if(this.lastRealFaceFrame === -1) {\n faceFrame = curRealFaceData;\n // this.options.onError({\n // code: EErrorCode.RENDER_FACE_ERROR,\n // message: `第${frameIndex}帧 实时面部数据为空,原始数据渲染`,\n // e: JSON.stringify({ bodyFrame, faceFrame }),\n // });\n } else {\n // this.options.onError({\n // code: EErrorCode.RENDER_FACE_ERROR,\n // message: `第${frameIndex}帧 实时面部数据为空,插值渲染`,\n // e: JSON.stringify({ bodyFrame, faceFrame }),\n // });\n if(curRealFaceData?.FaceFrameData) {\n if(this.lastRealFaceFrameData === null) {\n // 如果只有原始表情数据idle_face_data_i,若last_real_face_data为空,直接用idle_face_data_i渲染\n faceFrame = curRealFaceData;\n } else {\n // 若last_real_face_data非空,则使用last_real_face_data和idle_face_data_i的插值结果来渲染\n const lastWeight = this.computeWeight(frameIndex)\n faceFrame = {\n frameIndex,\n state: bodyFrame?.frameState || 'idle',\n body_id: bodyFrame?.body_id || -1,\n sf: frameIndex,\n ef: frameIndex,\n cs: faceFrame?.cs || \"\",\n face_frame_type: 0,\n id: bodyFrame?.body_id || -1,\n FaceFrameData: IBRAnimationFrameData_NN.interp(\n this.lastRealFaceFrameData,\n curRealFaceData.FaceFrameData,\n curRealFaceData.FaceFrameData,\n lastWeight,\n this.options.resourceManager.resource_pack?.interpolate_joints || []\n )\n }\n }\n }\n }\n }\n this._setCurrentBodyFrame(bodyFrame);\n if (\n ((!bodyFrame || !faceFrame) && bodyFrame?.hfd) ||\n (!bodyFrame?.hfd && !bodyFrame?.frame)\n ) {\n // 判断bodyFrame和faceFrame是否为空\n if (!bodyFrame) {\n this.allLostFrameCount++;\n this.options.onError({\n code: EErrorCode.RENDER_BODY_ERROR,\n message: `Error: 第${frameIndex}帧 bodyFrame为空`,\n e: JSON.stringify({ bodyFrame, faceFrame }),\n });\n } else if (!faceFrame) {\n this.allLostFaceFrameCount++;\n this.options.onError({\n code: EErrorCode.RENDER_FACE_ERROR,\n message: `Error: 第${frameIndex}帧 faceFrame为空`,\n e: JSON.stringify({ bodyFrame, faceFrame }),\n });\n }\n if(this.allLostFrameCount === this.maxLostFrameCount) {\n this.options.reportMessage({\n code: EErrorCode.RENDER_DATA_MISSING,\n message: `连续${this.maxLostFrameCount}帧 身体渲染数据缺失.`,\n });\n // 丢失过多帧,达到最大允许丢失帧数后,触发解码器对齐到最新的一帧\n this.options.onError({\n code: EErrorCode.RENDER_DATA_MISSING,\n message: `Error: 连续${this.maxLostFrameCount}帧 身体渲染数据缺失`,\n e: JSON.stringify({ bodyFrame, faceFrame }),\n });\n this.forceSyncDecoder();\n this.allLostFrameCount = 0;\n }\n if(this.allLostFaceFrameCount === this.maxLostFrameCount) {\n this.options.reportMessage({\n code: EErrorCode.RENDER_FACE_DATA_MISSING,\n message: `连续${this.maxLostFrameCount}帧 渲染表情数据缺失.`,\n e: { bodyFrame, frameIndex },\n });\n }\n (window as any).avatarSDKLogger.log(\n this.TAG,\n \"render第\",\n frameIndex,\n \"丢帧,bodyFrame\",\n bodyFrame,\n \"faceFrame\",\n faceFrame\n );\n return { canvas: this.canvas, rendered: false };\n } else {\n // this.onRenderChange?.(RenderState.rendering);\n this.allLostFrameCount = 0;\n this.allLostFaceFrameCount = 0;\n }\n\n if (\n ((bodyFrame && faceFrame?.FaceFrameData && bodyFrame?.hfd) ||\n (!bodyFrame?.hfd && bodyFrame?.frame)) &&\n this.device\n ) {\n this.sendVideoInfo({\n name: bodyFrame.name,\n body_id: bodyFrame.body_id,\n id: bodyFrame.id,\n });\n if (bodyFrame?.frameState !== this.lastFrameState) {\n this.onStateChange?.(bodyFrame?.frameState);\n if (bodyFrame.frameState !== \"speak\") {\n (window as any).performanceTracker.markEnd(\n performanceConstant.start_action_render,\n bodyFrame.frameState\n );\n }\n this.lastFrameState = bodyFrame?.frameState;\n }\n if (this.isFirstRender) {\n (window as any).performanceTracker.markEnd(\n performanceConstant.first_avatar_render\n );\n this.isFirstRender = false; \n this.renderBackground();\n (window as any).performanceTracker.markStart(\n performanceConstant.first_render\n );\n this.onDownloadProgress?.(100);\n }\n // this.style(bodyFrame.frame.displayWidth, bodyFrame.frame.displayHeight);\n let rendered = false;\n if (this.pipeline) {\n try {\n const isEnableRobotExpression = this.options.resourceManager.getIsEnableRobotExpression()\n const faceData = isEnableRobotExpression ? (faceFrame?.FaceFrameData ?? null) : bodyFrame?.hfd ? (faceFrame?.FaceFrameData ?? null) : null;\n if (faceData) {\n this.saveAndDownload.appendMultipleToArray(\"render_faceData\", [faceFrame]);\n }\n this.lastFaceFrame = faceFrame;\n let renderBodyFrame = bodyFrame.frame;\n if(isharmony()) {\n this.copyCanvas.width = bodyFrame.frame.displayWidth;\n this.copyCanvas.height = bodyFrame.frame.displayHeight;\n this.copyCtx?.drawImage(bodyFrame.frame, 0, 0);\n renderBodyFrame = this.copyCanvas;\n }\n // (window as any).avatarSDKLogger.log(\n // this.TAG,\n // \"render第\",\n // frameIndex,\n // \"帧,bodyFrame\",\n // bodyFrame,\n // \"faceFrame\",\n // faceFrame\n // );\n this.pipeline.renderFrame({\n charBodyTexture: renderBodyFrame,\n data: faceData,\n backgroundTexture: null,\n // 临时方案,后续需要根据实际情况调整\n fx: this.options.resourceManager.getConfig()?.fx ?? {},\n onPostRender: () => null\n });\n let pos_orig = [0, 0, 0]; //随便取了一个参考点。这里取了0号关节的位置\n let pos_new = [...pos_orig];\n const bodyOffset = bodyFrame?.offset ?? 0;\n this.lastBodyOffset = bodyOffset;\n pos_new[0] += bodyOffset - this.baseWalkOffset;\n const transformX = this.pipeline.getBillboardTransform2D(\n [pos_orig[0], pos_orig[1], pos_orig[2]],\n [pos_new[0], pos_new[1], pos_new[2]]\n ).offsetX;\n const offset_PX = transformX * this.canvas.width * this.scale;\n \n if(offset_PX !== this.canvasOffsetX) {\n this.canvasOffsetX = offset_PX;\n if (DefaultWidgetRenderer.CUSTOM_WIDGET) {\n DefaultWidgetRenderer.CUSTOM_WIDGET({\n type: \"set_character_canvas_offset\",\n data: offset_PX\n });\n } else if (DefaultWidgetRenderer.PROXY_WIDGET && DefaultWidgetRenderer.PROXY_WIDGET[\"set_character_canvas_offset\"]) {\n // 如果有代理的渲染器,则根据类型执行代理的渲染器\n DefaultWidgetRenderer.PROXY_WIDGET[\"set_character_canvas_offset\"](offset_PX);\n } else {\n updateCanvasXOffset(this.canvas, offset_PX);\n }\n }\n this.lastFrameIndex = frameIndex;\n rendered = true;\n } catch (error) {\n (window as any).avatarSDKLogger.error(this.TAG, \"渲染帧失败:\", error);\n this.options.onError({\n code: EErrorCode.WebGL_RENDER_ERROR,\n message: `Error: 第${frameIndex}帧 webgl渲染异常`,\n e: JSON.stringify({ bodyFrame, faceFrame, error }),\n });\n } finally {\n // 渲染完成后再关闭VideoFrame\n if (bodyFrame.frame && typeof bodyFrame.frame.close === \"function\") {\n bodyFrame.frame.close();\n }\n }\n this.onRenderChange?.(RenderState.rendering);\n } else {\n // 如果没有渲染,也要关闭VideoFrame\n if (bodyFrame?.frame && typeof bodyFrame.frame.close === \"function\") {\n bodyFrame.frame.close();\n }\n }\n return { canvas: this.canvas, rendered };\n }\n return { canvas: this.canvas, rendered: false };\n }\n\n renderBackground() {\n const background = this.options.resourceManager.getBackgroundImageElement();\n if (!background) return;\n const bgContainer = document.getElementById(\"avatar-bg-container\");\n if (!bgContainer) return;\n // 设置背景图样式\n bgContainer.style.backgroundImage = `url(${background.src})`;\n // 可添加其他背景样式(如覆盖方式、定位等)\n bgContainer.style.backgroundSize = \"cover\";\n bgContainer.style.backgroundPosition = \"center\";\n }\n\n _setCurrentBodyFrame(bodyFrame?: IBodyFrame) {\n if (bodyFrame) {\n this.currentBodyFrame = bodyFrame;\n }\n }\n _getCurrentBodyFrameInfo(frameIndex: number) {\n if (this.currentBodyFrame && frameIndex > 0) {\n return {\n client_frame: frameIndex,\n current_ani: this.currentBodyFrame.name,\n current_ani_frame:\n this.currentBodyFrame.frameIndex - this.currentBodyFrame.sf,\n next_state: this.lastFrameState || \"idle\",\n };\n }\n return {\n client_frame: 0,\n current_ani: \"\",\n current_ani_frame: 0,\n next_state: \"idle\",\n };\n }\n\n /**\n * 获取当前帧的 body 和 face 原始数据(用于回调)\n * 不包含渲染数据,只返回帧号、body_id 等元数据\n */\n _getCurrentFrameData(frameIndex: number): {\n body: { body_id: number; name: string; video_frame: number; sf: number; state: string } | null;\n face: { body_id: number; sf: number; ef: number; state: string; face_frame_type: number } | null;\n } {\n const bodyFrame = this.currentBodyFrame;\n const faceFrame = this.lastFaceFrame;\n\n return {\n body: bodyFrame ? {\n body_id: bodyFrame.body_id ?? bodyFrame.id ?? 0,\n name: bodyFrame.name,\n video_frame: bodyFrame.frameIndex - bodyFrame.sf,\n sf: bodyFrame.sf,\n state: bodyFrame.frameState,\n } : null,\n face: faceFrame ? {\n body_id: faceFrame.body_id ?? faceFrame.id ?? 0,\n sf: faceFrame.sf,\n ef: faceFrame.ef,\n state: faceFrame.state,\n face_frame_type: faceFrame.face_frame_type ?? 0,\n } : null,\n };\n }\n /**\n * 设置canvas的显隐状态\n * @param visible 是否可见\n */\n setCanvasVisibility(visible: boolean) {\n this.avatarCanvasVisible = visible;\n if (this.canvas) {\n this.canvas.style.display = visible ? \"\" : \"none\";\n }\n }\n\n /**\n * 获取canvas的显隐状态\n */\n getCanvasVisibility(): boolean {\n return this.avatarCanvasVisible;\n }\n\n destroy() {\n this.allLostFrameCount = 0;\n this.allLostFaceFrameCount = 0;\n \n // 清理恢复定时器\n if (this.restoreTimeout) {\n clearTimeout(this.restoreTimeout);\n this.restoreTimeout = null;\n }\n this.isRecovering = false;\n this.recoveryStage = 'light';\n this.currentStageAttempts = 0;\n \n // 先移除事件监听器,避免在销毁过程中触发\n if (this.device) {\n this.device.canvas.removeEventListener(\n \"webglcontextlost\",\n this.lostHandler\n );\n this.device.canvas.removeEventListener(\n \"webglcontextrestored\",\n this.restoreHandler\n );\n \n // 如果 pipeline 存在,先销毁 pipeline(释放 WebGL 资源)\n if (this.pipeline) {\n this.pipeline.destroy();\n this.pipeline = null;\n }\n \n // 最后销毁 device(会释放 WebGL context)\n // 对于隐身的数字人,如果没有 pipeline,说明没有真正使用 WebGL\n // 使用延迟销毁,避免在渲染关键帧时释放 GPU 资源导致其他数字人渲染异常\n if (this.device.gl) {\n // 保存 device 引用,延迟销毁\n const deviceToDestroy = this.device;\n this.device = null; // 先清除引用,避免后续操作使用\n \n // 延迟到下一帧销毁,给其他数字人留出完成当前渲染的时间\n // 这样可以避免在销毁隐身数字人时影响正在说话的数字人的面部渲染\n requestAnimationFrame(() => {\n try {\n if (deviceToDestroy) {\n deviceToDestroy.destroy();\n }\n } catch (error) {\n // 忽略销毁错误,避免影响其他数字人\n (window as any).avatarSDKLogger?.warn?.('[AvatarRenderer] 销毁 device 时出错:', error);\n }\n });\n } else {\n // 如果 gl 为 null,直接清理引用\n this.device = null;\n }\n }\n \n // 清理状态\n this.isInit = false;\n this.isFirstRender = true;\n this.lastRealFaceFrame = -1;\n this.lastRealFaceFrameData = null;\n this.lastWeight = 0.0;\n this.onStateChange = undefined;\n this.lastFrameState = \"\";\n this.pipeline = null;\n this.pendingCharData = null;\n this.scale = 1.0;\n\n const bgContainer = document.getElementById(\"avatar-bg-container\");\n if (bgContainer && bgContainer.parentNode) {\n bgContainer.parentNode.removeChild(bgContainer);\n }\n\n\n // 移除 canvas\n if (this.canvas && this.canvas.parentNode) {\n this.canvas.remove();\n }\n }\n setInterrupt(interrupt: boolean) {\n if(this.lastFaceFrame?.state !== 'speak' && interrupt) return\n this.interrupt = interrupt;\n }\n\n /**\n * [测试用] 模拟 WebGL 上下文丢失\n * 用于测试分阶段恢复策略是否正常工作\n * @param restoreAfterMs 自动恢复上下文的延迟时间(毫秒),设置为 0 则不自动恢复\n * @param forceFail 强制恢复失败(用于测试 medium/full 阶段的升级逻辑)\n */\n public simulateContextLoss(restoreAfterMs: number = 5000, forceFail: boolean = false): void {\n if (!this.device || !this.device.gl) {\n (window as any).avatarSDKLogger.warn(\"[Test] No WebGL device available for testing\");\n return;\n }\n\n const gl = this.device.gl;\n const loseExtension = gl.getExtension(\"WEBGL_lose_context\");\n \n if (!loseExtension) {\n (window as any).avatarSDKLogger.error(\"[Test] WEBGL_lose_context extension not available\");\n return;\n }\n\n (window as any).avatarSDKLogger.log(\"[Test] Simulating WebGL context loss...\");\n \n // 如果设置了 forceFail,临时禁用恢复\n if (forceFail) {\n (window as any).avatarSDKLogger.warn(\"[Test] Force fail mode enabled - will not auto-restore\");\n }\n\n // 触发上下文丢失\n loseExtension.loseContext();\n\n // 如果设置了自动恢复,则在指定时间后恢复上下文\n if (restoreAfterMs > 0 && !forceFail) {\n setTimeout(() => {\n (window as any).avatarSDKLogger.log(`[Test] Auto-restoring context after ${restoreAfterMs}ms...`);\n loseExtension.restoreContext();\n }, restoreAfterMs);\n }\n }\n\n /**\n * [测试用] 获取当前恢复状态信息\n */\n public getRecoveryStatus(): {\n isRecovering: boolean;\n stage: string;\n attempts: number;\n maxAttempts: number;\n isUsingReducedResolution: boolean;\n } {\n return {\n isRecovering: this.isRecovering,\n stage: this.recoveryStage,\n attempts: this.currentStageAttempts,\n maxAttempts: this.recoveryMaxAttempts[this.recoveryStage] || 0,\n isUsingReducedResolution: this.isUsingReducedResolution,\n };\n }\n\n /**\n * [测试用] 批量测试分阶段恢复\n * 依次触发多次上下文丢失,观察各阶段的恢复情况\n */\n public async testStagedRecovery(): Promise<void> {\n (window as any).avatarSDKLogger.log(\"[Test] Starting staged recovery test...\");\n \n const testCases = [\n { desc: \"Light recovery (should succeed)\", delay: 1000, forceFail: false },\n { desc: \"Context loss again (may upgrade to medium)\", delay: 8000, forceFail: false },\n ];\n\n for (let i = 0; i < testCases.length; i++) {\n const tc = testCases[i];\n (window as any).avatarSDKLogger.log(`[Test] Step ${i + 1}: ${tc.desc}`);\n \n await new Promise<void>((resolve) => {\n setTimeout(() => {\n this.simulateContextLoss(tc.delay, tc.forceFail);\n resolve();\n }, tc.delay);\n });\n\n // 等待恢复完成\n await new Promise<void>((resolve) => setTimeout(resolve, tc.delay + 2000));\n \n const status = this.getRecoveryStatus();\n (window as any).avatarSDKLogger.log(`[Test] After step ${i + 1}:`, status);\n }\n\n (window as any).avatarSDKLogger.log(\"[Test] Staged recovery test completed!\");\n }\n\n /**\n * 手动重启 WebGL:创建新 canvas + 新 GLDevice + 新 GLPipeline\n * 用于分阶段恢复全部失败后的手动恢复\n * @returns 是否成功\n */\n public restartWebGL(): boolean {\n (window as any).avatarSDKLogger.log(\"[restartWebGL] Starting manual WebGL restart...\");\n\n // 取消所有恢复定时器\n if (this.restoreTimeout) {\n clearTimeout(this.restoreTimeout);\n this.restoreTimeout = null;\n }\n if (this.resolutionRestoreTimer) {\n clearTimeout(this.resolutionRestoreTimer);\n this.resolutionRestoreTimer = null;\n }\n this.isRecovering = false;\n this.recoveryStage = 'light';\n this.currentStageAttempts = 0;\n\n try {\n // 销毁旧 device\n if (this.device) {\n try {\n this.device.canvas.removeEventListener(\"webglcontextlost\", this.lostHandler);\n this.device.canvas.removeEventListener(\"webglcontextrestored\", this.restoreHandler);\n this.device.destroy();\n } catch (_) { /* ignore */ }\n this.device = null;\n }\n\n // 销毁旧 pipeline\n if (this.pipeline) {\n try { this.pipeline.destroy(); } catch (_) { /* ignore */ }\n this.pipeline = null;\n }\n\n // 创建新 canvas 并替换 DOM 节点\n const oldCanvas = this.canvas;\n const oldCanvasStyle = oldCanvas.style.cssText;\n const oldCanvasParent = oldCanvas.parentNode;\n\n const newCanvas = document.createElement(\"canvas\");\n const resolution = this.options.resourceManager.getConfig()?.resolution;\n if (resolution) {\n newCanvas.width = resolution.width ?? 1080;\n newCanvas.height = resolution.height ?? 1920;\n }\n newCanvas.setAttribute(\"style\", oldCanvasStyle);\n\n if (oldCanvasParent) {\n oldCanvasParent.replaceChild(newCanvas, oldCanvas);\n }\n this.canvas = newCanvas;\n\n // 在新 canvas 上初始化 GLDevice\n this.device = new GLDevice(this.canvas);\n this.device.canvas.addEventListener(\"webglcontextlost\", this.lostHandler, false);\n this.device.canvas.addEventListener(\"webglcontextrestored\", this.restoreHandler, false);\n\n // 检查 context 是否可用\n if (!this.device.gl || this.device.gl.isContextLost()) {\n throw new Error(\"WebGL context still lost after creating new canvas\");\n }\n\n // 重建 pipeline\n this.createPipelineLock = true;\n this.pipeline = new GLPipeline(this.device, this.sendSdkPoint);\n this.createPipelineLock = false;\n\n if (this.pendingCharData) {\n this.pipeline.setCharData(this.pendingCharData);\n this.pipeline.setSyncMedia();\n }\n this.pipeline.reinitialize();\n this.pipeline.setSyncMedia();\n this.isInit = true;\n\n (window as any).avatarSDKLogger.log(\"[restartWebGL] WebGL restart successful!\");\n\n this.options.reportMessage({\n code: EErrorCode.WEBGL_CONTEXT_MANUAL_RESTARTED,\n message: \"WebGL context recovered via manual restart.\",\n e: {\n timestamp: Date.now(),\n method: \"manual_restart\",\n },\n });\n\n return true;\n } catch (error) {\n (window as any).avatarSDKLogger.error(\"[restartWebGL] Failed:\", error);\n this._reportRecoveryFailure('manual', error);\n return false;\n }\n }\n}\n","export default class BaseTrack {\n render() {\n }\n\n stop() {\n }\n}","import { IWidgetPic } from \"../../types/event\";\nimport BaseTrack from \"./base-track\";\nimport DefaultRender from './render-implements';\n\nexport default class ImageTrack extends BaseTrack {\n data: IWidgetPic;\n private instance?: any; // 实例引用,用于区分不同数字人实例\n\n constructor(data: IWidgetPic, instance?: any) {\n super();\n this.data = data;\n this.instance = instance;\n }\n\n render() {\n if(!this.data?.image) return null;\n return DefaultRender.WIDGET_PIC(this.data, this.instance);\n }\n}\n","import { IWidgetSubtitle } from \"../../types/event\";\nimport BaseTrack from \"./base-track\";\nimport DefaultRender from './render-implements';\n\nexport default class SubtitleTrack extends BaseTrack {\n data: IWidgetSubtitle;\n private instance?: any; // 实例引用,用于区分不同数字人实例\n constructor(data: IWidgetSubtitle, instance?: any) {\n super();\n this.data = data;\n this.instance = instance;\n }\n render() {\n return DefaultRender.WIDGET_SUBTITLE(this.data, this.instance);\n }\n}\n","/**\n * 具体的 track 内容渲染\n */\nimport {\n IWidgetPic,\n IWidgetSubtitle,\n} from '../../types/event';\nimport { IRawWidgetData } from '../../types/frame-data';\nimport TrackPic from './track-pic';\nimport TrackSubtitle from './track-subtitle';\nimport DefaultRender from './render-implements';\n\nexport default class TrackRenderer {\n private TAG = '[TrackRenderer]';\n tracker!: TrackPic | TrackSubtitle;\n private instance?: any; // 实例引用,用于区分不同数字人实例\n\n constructor(event: IRawWidgetData, instance?: any) {\n this.instance = instance;\n const { type, data, text = '' } = event\n if (type === 'widget_pic') {\n this.tracker = new TrackPic(data as IWidgetPic, instance);\n }\n if (type === 'subtitle_on' || type === 'subtitle_off') {\n this.tracker = new TrackSubtitle({type, text, axis_id: data?.axis_id ?? 1000} as IWidgetSubtitle, instance);\n }\n }\n\n render() {\n return this.tracker?.render()\n }\n\n stop() {\n this.tracker.stop()\n }\n\n destroy() {\n DefaultRender.destroy(this.instance);\n }\n}","/**\n * UI 控件渲染,所有轨道的元素\n */\nimport { DataCacheQueue } from \"../control/DataCacheQueue\";\nimport DefaultWidgetRenderer from \"../modules/TrackRenderer/render-implements\";\nimport TrackerRenderer from \"../modules/TrackRenderer/index\";\nimport ResourceManager from \"../modules/ResourceManager\";\nimport { performanceConstant } from \"../utils/perfermance\";\nimport XmovAvatar from \"../index\";\nimport { EErrorCode } from \"../types/error\";\n\ntype Option = {\n sdk: XmovAvatar;\n dataCacheQueue: DataCacheQueue;\n resourceManager: ResourceManager;\n enableClientInterrupt: boolean;\n onVoiceEnd: (client_speak_id: number | string, speech_id: number) => void;\n onVoiceStart: (duration: number, client_speak_id: number | string) => void;\n onWalkStateChange: (state: string) => void;\n sendSdkPoint: (type: string, data: any, extra?: any) => void;\n onSpeakStateChange: (state: string, client_speak_id: number | string, speech_id: number) => void;\n};\nexport default class UIRenderer {\n private TAG = \"[UIRenderer]\";\n options: Option;\n trackerRenderer: TrackerRenderer[] = [];\n root = document.createElement(\"div\");\n lastFrameIndex: number = -1;\n onVoiceEnd: (client_speak_id: number | string, speech_id: number) => void;\n onVoiceStart: (duration: number, client_speak_id: number | string) => void;\n onWalkStateChange: (state: string) => void;\n initEventsRendered: boolean = false; \n lastSpeechId: number = -1; \n interruptSpeechId: number = -1;\n enableClientInterrupt: boolean = false;\n onSpeakStateChange: (state: string, client_speak_id: number | string, speech_id: number) => void;\n constructor(options: Option) {\n this.options = options;\n this.root.setAttribute(\"style\", \"position:absolute;\");\n this.onVoiceStart = options.onVoiceStart;\n this.onVoiceEnd = options.onVoiceEnd;\n this.initEventsRendered = false; \n this.onWalkStateChange = options.onWalkStateChange;\n this.enableClientInterrupt = options.enableClientInterrupt;\n this.onSpeakStateChange = options.onSpeakStateChange;\n }\n\n render(frame: number) {\n // if(this.options.sdk.getStatus() === AvatarStatus.offline) return;\n let initEvents: any[] = [];\n if (this.lastFrameIndex === -1) {\n const config = this.options.resourceManager.getConfig();\n if(config.init_events && config.init_events.length > 0){\n initEvents = config.init_events.map(item => ({...item, speech_id:0}));\n }\n }\n let event: any = null;\n if (frame - this.lastFrameIndex > 1) {\n event = this.options.dataCacheQueue._getEventInterval(\n this.lastFrameIndex,\n frame\n );\n } else {\n event = this.options.dataCacheQueue._getEvent(frame);\n }\n this.lastFrameIndex = frame;\n // 仅执行一次\n if(!this.initEventsRendered){\n this.initEventsRendered = true;\n if(event){\n event.e = event.e.concat(initEvents);\n } else {\n event = {\n e: initEvents,\n };\n }\n }\n if (!event?.e) {\n return;\n }\n (window as any).avatarSDKLogger.log(\"当前帧\", frame, \"获取到的事件\", JSON.stringify(event));\n // 过滤出不包含speechId的事件list\n const noSpeechIdEvents = event.e?.filter(item => item?.speech_id === undefined || item?.speech_id === null);\n if(noSpeechIdEvents?.length) {\n const typesStr = noSpeechIdEvents.map(item => item.type).join(',');\n this.options.sdk.onMessage({\n code: EErrorCode.EVENT_WITHOUT_SPEECH_ID,\n message: `Error: 事件中存在不包含speech_id的事件${typesStr}`,\n e: noSpeechIdEvents\n })\n }\n if(this.enableClientInterrupt) {\n // 根据interruptSpeechId过滤旧的数据,加入前端interrupt事件后,可能在前端打断后,服务仍下发数据 如果type是以_end结尾的,不过滤\n event.e = event.e?.filter(item => (item.speech_id > this.interruptSpeechId || item.speech_id === undefined || item.speech_id === null) || item.type.endsWith('_end') || item.type === 'subtitle_off');\n }\n // 过滤出当前语音的事件\n if(this.lastSpeechId !== -1 && this.lastSpeechId) {\n event.e = event.e?.filter(item => item?.speech_id >= this.lastSpeechId);\n }\n \n // 1. 处理 speak_start\n if (event.e?.some(item => item.type === \"speak_start\")) {\n const speakStart = event.e.find(item => item.type === \"speak_start\");\n this.lastSpeechId = speakStart?.speech_id;\n this.onSpeakStateChange(\"speak_start\", speakStart.client_speak_id, speakStart?.speech_id || 0);\n }\n // 2. 处理 walk_start / voice_start / speak_walk_start\n if (event.e?.some(item => item.type === \"walk_start\") || event.e?.some(item => item.type === \"speak_walk_start\")) {\n this.onWalkStateChange(\"walk_start\");\n }\n if(event.e?.some(item => item.type === \"voice_start\")) {\n const voiceStart = event.e.find(item => item.type === \"voice_start\");\n const duration = (window as any).performanceTracker.markEnd(performanceConstant.voice_response_play, 'speak');\n this.options.sendSdkPoint('rendering_display', {multi_turn_conversation_id: voiceStart?.multi_turn_conversation_id});\n this.onVoiceStart(duration, voiceStart?.client_speak_id);\n }\n // 3. 处理 walk_end / speak_walk_end / voice_end\n if (event.e?.some(item => item.type === \"walk_end\") || event.e?.some(item => item.type === \"speak_walk_end\")) {\n this.onWalkStateChange(\"walk_end\");\n }\n if (event.e?.some(item => item.type === \"voice_end\")) {\n const voiceEnd = event.e.find(item => item.type === \"voice_end\");\n this.onVoiceEnd(voiceEnd?.client_speak_id || '', voiceEnd?.speech_id || 0);\n }\n // 4. 处理 speak_end / speak_error\n const speakEndEventTypes = [\"speak_end\", \"speak_error\"];\n speakEndEventTypes.forEach(eventType => {\n const speakEvent = event.e.find(item => item.type === eventType);\n if (speakEvent) {\n this.onSpeakStateChange(eventType, speakEvent.client_speak_id, speakEvent?.speech_id || 0);\n }\n });\n\n\n const remainingWidgets = [...event.e];\n\n // 循环遍历 event.e 数组中的所有元素\n for (let i = 0; i < event.e.length; i++) {\n const widgetData = event.e[i];\n if (Object.prototype.hasOwnProperty.call(widgetData, \"event_type\")) {\n // 先不处理 ka/ka_intent\n continue;\n }\n // 如果有自定义的渲染器,则所有事件都交给自定义的渲染器处理\n if (DefaultWidgetRenderer.CUSTOM_WIDGET) {\n DefaultWidgetRenderer.CUSTOM_WIDGET(widgetData);\n // 从剩余元素中删除已处理的元素\n const index = remainingWidgets.indexOf(widgetData);\n if (index > -1) {\n remainingWidgets.splice(index, 1);\n }\n continue;\n }\n // 如果有代理的渲染器,则根据类型执行代理的渲染器\n if (DefaultWidgetRenderer.PROXY_WIDGET && DefaultWidgetRenderer.PROXY_WIDGET[widgetData.type]) {\n DefaultWidgetRenderer.PROXY_WIDGET[widgetData.type](widgetData);\n \n // 从剩余元素中删除已处理的元素\n const index = remainingWidgets.indexOf(widgetData);\n if (index > -1) {\n remainingWidgets.splice(index, 1);\n }\n continue;\n }\n }\n // 对剩余未自定义的元素执行 TrackerRenderer\n if (remainingWidgets.length > 0) {\n // 遍历剩余的元素,每个单独执行 TrackerRenderer\n // 传递 SDK 实例引用,用于区分不同数字人实例的 widget\n for (const widgetData of remainingWidgets) {\n const tracker = new TrackerRenderer(widgetData, this.options.sdk);\n this.trackerRenderer.push(tracker);\n }\n }\n return this.trackerRenderer;\n }\n\n clearTrackerRenderer() {\n this.trackerRenderer = [];\n }\n\n setInterrupt(speech_id: number) {\n this.interruptSpeechId = speech_id;\n }\n\n destroy() {\n this.lastSpeechId = -1;\n this.interruptSpeechId = -1;\n this.lastFrameIndex = -1;\n this.initEventsRendered = false;\n // 传递 SDK 实例引用,只清除当前实例的 widget\n DefaultWidgetRenderer.destroy(this.options.sdk);\n this.trackerRenderer.forEach((tracker) => tracker.destroy());\n }\n}\n","export interface FPSStats {\n current: number;\n average: number;\n min: number;\n max: number;\n droppedFrames: number;\n totalFrames: number;\n}\n\nexport class FPSTracker {\n private frameTimestamps: number[] = [];\n private maxSamples: number;\n private lastFrameTime: number = 0;\n private frameCount: number = 0;\n private lastUpdateTime: number = 0;\n private currentFPS: number = 0;\n private totalFrames: number = 0;\n private totalTime: number = 0;\n private droppedFrames: number = 0;\n private totalRenderedFrames: number = 0;\n\n constructor(maxSamples: number = 60) {\n this.maxSamples = maxSamples;\n }\n\n tick(rendered: boolean = true): void {\n const now = performance.now();\n \n if (this.lastFrameTime > 0) {\n const delta = now - this.lastFrameTime;\n this.frameTimestamps.push(delta);\n \n if (this.frameTimestamps.length > this.maxSamples) {\n this.frameTimestamps.shift();\n }\n \n this.totalFrames++;\n this.totalTime += delta;\n \n if (rendered) {\n this.frameCount++;\n this.totalRenderedFrames++;\n } else {\n this.droppedFrames++;\n }\n \n if (now - this.lastUpdateTime >= 1000) {\n this.currentFPS = Math.round(this.frameCount * 1000 / (now - this.lastUpdateTime));\n this.frameCount = 0;\n this.lastUpdateTime = now;\n }\n }\n \n this.lastFrameTime = now;\n }\n\n getStats(): FPSStats {\n if (this.frameTimestamps.length === 0) {\n return { current: 0, average: 0, min: 0, max: 0, droppedFrames: 0, totalFrames: 0 };\n }\n \n const avgDelta = this.frameTimestamps.reduce((a, b) => a + b, 0) / this.frameTimestamps.length;\n const minDelta = Math.min(...this.frameTimestamps);\n const maxDelta = Math.max(...this.frameTimestamps);\n \n return {\n current: this.currentFPS,\n average: this.frameTimestamps.length > 0 ? Math.round(1000 / avgDelta) : 0,\n min: minDelta > 0 ? Math.round(1000 / maxDelta) : 0,\n max: maxDelta > 0 ? Math.round(1000 / minDelta) : 0,\n droppedFrames: this.droppedFrames,\n totalFrames: this.totalFrames,\n };\n }\n\n getCurrentFPS(): number {\n return this.currentFPS;\n }\n\n getAverageFPS(): number {\n if (this.totalTime === 0) return 0;\n return Math.round(this.totalFrames * 1000 / this.totalTime);\n }\n\n reset(): void {\n this.frameTimestamps = [];\n this.lastFrameTime = 0;\n this.frameCount = 0;\n this.lastUpdateTime = 0;\n this.currentFPS = 0;\n this.totalFrames = 0;\n this.totalTime = 0;\n this.droppedFrames = 0;\n this.totalRenderedFrames = 0;\n }\n\n getDroppedFrames(): number {\n return this.droppedFrames;\n }\n}","import AvatarRender from \"../baseRender/AvatarRenderer\";\nimport UIRenderer from \"../baseRender/UIRenderer\";\nimport AudioRenderer from \"../baseRender/AudioRenderer\";\nimport { FPSTracker, FPSStats } from \"../utils/fpsTracker\";\ntype TRenderer = UIRenderer;\nexport default class Composition {\n TAG = \"[Composition]\";\n container: Element;\n avatarRenderer: AvatarRender;\n audioRenderer: AudioRenderer;\n restRenderers: TRenderer[];\n private fpsTracker: FPSTracker;\n private onFPSUpdate?: (stats: FPSStats) => void;\n audioOnlyMode: boolean;\n\n constructor(options: {\n container: Element;\n avatarRenderer: AvatarRender;\n restRenderers: TRenderer[];\n audioRenderer: AudioRenderer;\n audioOnlyMode?: boolean;\n onFPSUpdate?: (stats: FPSStats) => void;\n }) {\n this.container = options.container;\n this.avatarRenderer = options.avatarRenderer;\n this.restRenderers = options.restRenderers;\n this.audioRenderer = options.audioRenderer;\n this.onFPSUpdate = options.onFPSUpdate;\n this.audioOnlyMode = options.audioOnlyMode || false;\n this.fpsTracker = new FPSTracker();\n if (!this.audioOnlyMode) {\n this.container.appendChild(options.avatarRenderer.canvas);\n }\n }\n\n compose(frameIndex: number) {\n if (!this.audioOnlyMode) {\n const avatarResult = this.avatarRenderer.render(frameIndex);\n const rendered = avatarResult.rendered;\n\n this.fpsTracker.tick(rendered);\n\n const stats = this.fpsTracker.getStats();\n if (this.onFPSUpdate && stats.current > 0) {\n this.onFPSUpdate(stats);\n }\n }\n\n // Audio rendering always executes\n this.audioRenderer.render(frameIndex);\n // UI event rendering always executes\n for (const r of this.restRenderers) {\n const layer = r.render(frameIndex);\n r.clearTrackerRenderer();\n if (layer) {\n for (const l of layer) {\n const ele = l?.render();\n if (ele) {\n this.container.appendChild(ele as Node);\n }\n }\n }\n }\n }\n\n getFPSStats(): FPSStats {\n return this.fpsTracker.getStats();\n }\n\n stop() {\n this.audioRenderer.stop(-1);\n }\n\n destroy() {\n this.avatarRenderer.destroy();\n this.audioRenderer.destroy();\n this.restRenderers.forEach((r) => r.destroy());\n }\n}\n","const mp4boxSource = `\nvar Log = function() {\n\tvar i = new Date,\n\tr = 4;\n\treturn {\n\t\tsetLogLevel: function(t) {\n\t\t\tr = t == this.debug ? 1 : t == this.info ? 2 : t == this.warn ? 3 : (this.error, 4)\n\t\t},\n\t\tdebug: function(t, e) {\n\t\t\tvoid 0 === console.debug && (console.debug = console.log),\n\t\t\tr <= 1 && console.debug(\"[\" + Log.getDurationString(new Date - i, 1e3) + \"]\", \"[\" + t + \"]\", e)\n\t\t},\n\t\tlog: function(t, e) {\n\t\t\tthis.debug(t.msg)\n\t\t},\n\t\tinfo: function(t, e) {\n\t\t\tr <= 2 && console.info(\"[\" + Log.getDurationString(new Date - i, 1e3) + \"]\", \"[\" + t + \"]\", e)\n\t\t},\n\t\twarn: function(t, e) {\n\t\t\tr <= 3 && console.warn(\"[\" + Log.getDurationString(new Date - i, 1e3) + \"]\", \"[\" + t + \"]\", e)\n\t\t},\n\t\terror: function(t, e) {\n\t\t\tr <= 4 && console.error(\"[\" + Log.getDurationString(new Date - i, 1e3) + \"]\", \"[\" + t + \"]\", e)\n\t\t}\n\t}\n} ();\nLog.getDurationString = function(t, e) {\n\tvar i;\n\tfunction r(t, e) {\n\t\tfor (var i = (\"\" + t).split(\".\"); i[0].length < e;) i[0] = \"0\" + i[0];\n\t\treturn i.join(\".\")\n\t}\n\tt < 0 ? (i = !0, t = -t) : i = !1;\n\tvar s = t / (e || 1),\n\ta = Math.floor(s / 3600);\n\ts -= 3600 * a;\n\tt = Math.floor(s / 60),\n\te = 1e3 * (s -= 60 * t);\n\treturn e -= 1e3 * (s = Math.floor(s)),\n\te = Math.floor(e),\n\t(i ? \"-\": \"\") + a + \":\" + r(t, 2) + \":\" + r(s, 2) + \".\" + r(e, 3)\n},\nLog.printRanges = function(t) {\n\tvar e = t.length;\n\tif (0 < e) {\n\t\tfor (var i = \"\",\n\t\tr = 0; r < e; r++) 0 < r && (i += \",\"),\n\t\ti += \"[\" + Log.getDurationString(t.start(r)) + \",\" + Log.getDurationString(t.end(r)) + \"]\";\n\t\treturn i\n\t}\n\treturn \"(empty)\"\n},\n\"undefined\" != typeof exports && (exports.Log = Log);\nvar MP4BoxStream = function(t) {\n\tif (! (t instanceof ArrayBuffer)) throw \"Needs an array buffer\";\n\tthis.buffer = t,\n\tthis.dataview = new DataView(t),\n\tthis.position = 0\n};\nMP4BoxStream.prototype.getPosition = function() {\n\treturn this.position\n},\nMP4BoxStream.prototype.getEndPosition = function() {\n\treturn this.buffer.byteLength\n},\nMP4BoxStream.prototype.getLength = function() {\n\treturn this.buffer.byteLength\n},\nMP4BoxStream.prototype.seek = function(t) {\n\tt = Math.max(0, Math.min(this.buffer.byteLength, t));\n\treturn this.position = isNaN(t) || !isFinite(t) ? 0 : t,\n\t!0\n},\nMP4BoxStream.prototype.isEos = function() {\n\treturn this.getPosition() >= this.getEndPosition()\n},\nMP4BoxStream.prototype.readAnyInt = function(t, e) {\n\tvar i = 0;\n\tif (this.position + t <= this.buffer.byteLength) {\n\t\tswitch (t) {\n\t\tcase 1:\n\t\t\ti = e ? this.dataview.getInt8(this.position) : this.dataview.getUint8(this.position);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\ti = e ? this.dataview.getInt16(this.position) : this.dataview.getUint16(this.position);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tif (e) throw \"No method for reading signed 24 bits values\";\n\t\t\ti = this.dataview.getUint8(this.position) << 16,\n\t\t\ti |= this.dataview.getUint8(this.position + 1) << 8,\n\t\t\ti |= this.dataview.getUint8(this.position + 2);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\ti = e ? this.dataview.getInt32(this.position) : this.dataview.getUint32(this.position);\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tif (e) throw \"No method for reading signed 64 bits values\";\n\t\t\ti = this.dataview.getUint32(this.position) << 32,\n\t\t\ti |= this.dataview.getUint32(this.position + 4);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow \"readInt method not implemented for size: \" + t\n\t\t}\n\t\treturn this.position += t,\n\t\ti\n\t}\n\tthrow \"Not enough bytes in buffer\"\n},\nMP4BoxStream.prototype.readUint8 = function() {\n\treturn this.readAnyInt(1, !1)\n},\nMP4BoxStream.prototype.readUint16 = function() {\n\treturn this.readAnyInt(2, !1)\n},\nMP4BoxStream.prototype.readUint24 = function() {\n\treturn this.readAnyInt(3, !1)\n},\nMP4BoxStream.prototype.readUint32 = function() {\n\treturn this.readAnyInt(4, !1)\n},\nMP4BoxStream.prototype.readUint64 = function() {\n\treturn this.readAnyInt(8, !1)\n},\nMP4BoxStream.prototype.readString = function(t) {\n\tif (this.position + t <= this.buffer.byteLength) {\n\t\tfor (var e = \"\",\n\t\ti = 0; i < t; i++) e += String.fromCharCode(this.readUint8());\n\t\treturn e\n\t}\n\tthrow \"Not enough bytes in buffer\"\n},\nMP4BoxStream.prototype.readCString = function() {\n\tfor (var t = [];;) {\n\t\tvar e = this.readUint8();\n\t\tif (0 === e) break;\n\t\tt.push(e)\n\t}\n\treturn String.fromCharCode.apply(null, t)\n},\nMP4BoxStream.prototype.readInt8 = function() {\n\treturn this.readAnyInt(1, !0)\n},\nMP4BoxStream.prototype.readInt16 = function() {\n\treturn this.readAnyInt(2, !0)\n},\nMP4BoxStream.prototype.readInt32 = function() {\n\treturn this.readAnyInt(4, !0)\n},\nMP4BoxStream.prototype.readInt64 = function() {\n\treturn this.readAnyInt(8, !1)\n},\nMP4BoxStream.prototype.readUint8Array = function(t) {\n\tfor (var e = new Uint8Array(t), i = 0; i < t; i++) e[i] = this.readUint8();\n\treturn e\n},\nMP4BoxStream.prototype.readInt16Array = function(t) {\n\tfor (var e = new Int16Array(t), i = 0; i < t; i++) e[i] = this.readInt16();\n\treturn e\n},\nMP4BoxStream.prototype.readUint16Array = function(t) {\n\tfor (var e = new Int16Array(t), i = 0; i < t; i++) e[i] = this.readUint16();\n\treturn e\n},\nMP4BoxStream.prototype.readUint32Array = function(t) {\n\tfor (var e = new Uint32Array(t), i = 0; i < t; i++) e[i] = this.readUint32();\n\treturn e\n},\nMP4BoxStream.prototype.readInt32Array = function(t) {\n\tfor (var e = new Int32Array(t), i = 0; i < t; i++) e[i] = this.readInt32();\n\treturn e\n},\n\"undefined\" != typeof exports && (exports.MP4BoxStream = MP4BoxStream);\nvar DataStream = function(t, e, i) {\n\tthis._byteOffset = e || 0,\n\tt instanceof ArrayBuffer ? this.buffer = t: \"object\" == typeof t ? (this.dataView = t, e && (this._byteOffset += e)) : this.buffer = new ArrayBuffer(t || 0),\n\tthis.position = 0,\n\tthis.endianness = null == i ? DataStream.LITTLE_ENDIAN: i\n};\nDataStream.prototype = {},\nDataStream.prototype.getPosition = function() {\n\treturn this.position\n},\nDataStream.prototype._realloc = function(t) {\n\tif (this._dynamicSize) {\n\t\tvar e = this._byteOffset + this.position + t,\n\t\ti = this._buffer.byteLength;\n\t\tif (e <= i) e > this._byteLength && (this._byteLength = e);\n\t\telse {\n\t\t\tfor (i < 1 && (i = 1); i < e;) i *= 2;\n\t\t\tvar r = new ArrayBuffer(i),\n\t\t\tt = new Uint8Array(this._buffer);\n\t\t\tnew Uint8Array(r, 0, t.length).set(t),\n\t\t\tthis.buffer = r,\n\t\t\tthis._byteLength = e\n\t\t}\n\t}\n},\nDataStream.prototype._trimAlloc = function() {\n\tvar t, e, i;\n\tthis._byteLength != this._buffer.byteLength && (t = new ArrayBuffer(this._byteLength), e = new Uint8Array(t), i = new Uint8Array(this._buffer, 0, e.length), e.set(i), this.buffer = t)\n},\nDataStream.BIG_ENDIAN = !1,\nDataStream.LITTLE_ENDIAN = !0,\nDataStream.prototype._byteLength = 0,\nObject.defineProperty(DataStream.prototype, \"byteLength\", {\n\tget: function() {\n\t\treturn this._byteLength - this._byteOffset\n\t}\n}),\nObject.defineProperty(DataStream.prototype, \"buffer\", {\n\tget: function() {\n\t\treturn this._trimAlloc(),\n\t\tthis._buffer\n\t},\n\tset: function(t) {\n\t\tthis._buffer = t,\n\t\tthis._dataView = new DataView(this._buffer, this._byteOffset),\n\t\tthis._byteLength = this._buffer.byteLength\n\t}\n}),\nObject.defineProperty(DataStream.prototype, \"byteOffset\", {\n\tget: function() {\n\t\treturn this._byteOffset\n\t},\n\tset: function(t) {\n\t\tthis._byteOffset = t,\n\t\tthis._dataView = new DataView(this._buffer, this._byteOffset),\n\t\tthis._byteLength = this._buffer.byteLength\n\t}\n}),\nObject.defineProperty(DataStream.prototype, \"dataView\", {\n\tget: function() {\n\t\treturn this._dataView\n\t},\n\tset: function(t) {\n\t\tthis._byteOffset = t.byteOffset,\n\t\tthis._buffer = t.buffer,\n\t\tthis._dataView = new DataView(this._buffer, this._byteOffset),\n\t\tthis._byteLength = this._byteOffset + t.byteLength\n\t}\n}),\nDataStream.prototype.seek = function(t) {\n\tt = Math.max(0, Math.min(this.byteLength, t));\n\tthis.position = isNaN(t) || !isFinite(t) ? 0 : t\n},\nDataStream.prototype.isEof = function() {\n\treturn this.position >= this._byteLength\n},\nDataStream.prototype.mapUint8Array = function(t) {\n\tthis._realloc( + t);\n\tvar e = new Uint8Array(this._buffer, this.byteOffset + this.position, t);\n\treturn this.position += +t,\n\te\n},\nDataStream.prototype.readInt32Array = function(t, e) {\n\tt = null == t ? this.byteLength - this.position / 4 : t;\n\tvar i = new Int32Array(t);\n\treturn DataStream.memcpy(i.buffer, 0, this.buffer, this.byteOffset + this.position, t * i.BYTES_PER_ELEMENT),\n\tDataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += i.byteLength,\n\ti\n},\nDataStream.prototype.readInt16Array = function(t, e) {\n\tt = null == t ? this.byteLength - this.position / 2 : t;\n\tvar i = new Int16Array(t);\n\treturn DataStream.memcpy(i.buffer, 0, this.buffer, this.byteOffset + this.position, t * i.BYTES_PER_ELEMENT),\n\tDataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += i.byteLength,\n\ti\n},\nDataStream.prototype.readInt8Array = function(t) {\n\tt = null == t ? this.byteLength - this.position: t;\n\tvar e = new Int8Array(t);\n\treturn DataStream.memcpy(e.buffer, 0, this.buffer, this.byteOffset + this.position, t * e.BYTES_PER_ELEMENT),\n\tthis.position += e.byteLength,\n\te\n},\nDataStream.prototype.readUint32Array = function(t, e) {\n\tt = null == t ? this.byteLength - this.position / 4 : t;\n\tvar i = new Uint32Array(t);\n\treturn DataStream.memcpy(i.buffer, 0, this.buffer, this.byteOffset + this.position, t * i.BYTES_PER_ELEMENT),\n\tDataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += i.byteLength,\n\ti\n},\nDataStream.prototype.readUint16Array = function(t, e) {\n\tt = null == t ? this.byteLength - this.position / 2 : t;\n\tvar i = new Uint16Array(t);\n\treturn DataStream.memcpy(i.buffer, 0, this.buffer, this.byteOffset + this.position, t * i.BYTES_PER_ELEMENT),\n\tDataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += i.byteLength,\n\ti\n},\nDataStream.prototype.readUint8Array = function(t) {\n\tt = null == t ? this.byteLength - this.position: t;\n\tvar e = new Uint8Array(t);\n\treturn DataStream.memcpy(e.buffer, 0, this.buffer, this.byteOffset + this.position, t * e.BYTES_PER_ELEMENT),\n\tthis.position += e.byteLength,\n\te\n},\nDataStream.prototype.readFloat64Array = function(t, e) {\n\tt = null == t ? this.byteLength - this.position / 8 : t;\n\tvar i = new Float64Array(t);\n\treturn DataStream.memcpy(i.buffer, 0, this.buffer, this.byteOffset + this.position, t * i.BYTES_PER_ELEMENT),\n\tDataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += i.byteLength,\n\ti\n},\nDataStream.prototype.readFloat32Array = function(t, e) {\n\tt = null == t ? this.byteLength - this.position / 4 : t;\n\tvar i = new Float32Array(t);\n\treturn DataStream.memcpy(i.buffer, 0, this.buffer, this.byteOffset + this.position, t * i.BYTES_PER_ELEMENT),\n\tDataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += i.byteLength,\n\ti\n},\nDataStream.prototype.readInt32 = function(t) {\n\tt = this._dataView.getInt32(this.position, null == t ? this.endianness: t);\n\treturn this.position += 4,\n\tt\n},\nDataStream.prototype.readInt16 = function(t) {\n\tt = this._dataView.getInt16(this.position, null == t ? this.endianness: t);\n\treturn this.position += 2,\n\tt\n},\nDataStream.prototype.readInt8 = function() {\n\tvar t = this._dataView.getInt8(this.position);\n\treturn this.position += 1,\n\tt\n},\nDataStream.prototype.readUint32 = function(t) {\n\tt = this._dataView.getUint32(this.position, null == t ? this.endianness: t);\n\treturn this.position += 4,\n\tt\n},\nDataStream.prototype.readUint16 = function(t) {\n\tt = this._dataView.getUint16(this.position, null == t ? this.endianness: t);\n\treturn this.position += 2,\n\tt\n},\nDataStream.prototype.readUint8 = function() {\n\tvar t = this._dataView.getUint8(this.position);\n\treturn this.position += 1,\n\tt\n},\nDataStream.prototype.readFloat32 = function(t) {\n\tt = this._dataView.getFloat32(this.position, null == t ? this.endianness: t);\n\treturn this.position += 4,\n\tt\n},\nDataStream.prototype.readFloat64 = function(t) {\n\tt = this._dataView.getFloat64(this.position, null == t ? this.endianness: t);\n\treturn this.position += 8,\n\tt\n},\nDataStream.endianness = 0 < new Int8Array(new Int16Array([1]).buffer)[0],\nDataStream.memcpy = function(t, e, i, r, s) {\n\te = new Uint8Array(t, e, s),\n\ts = new Uint8Array(i, r, s);\n\te.set(s)\n},\nDataStream.arrayToNative = function(t, e) {\n\treturn e == this.endianness ? t: this.flipArrayEndianness(t)\n},\nDataStream.nativeToEndian = function(t, e) {\n\treturn this.endianness == e ? t: this.flipArrayEndianness(t)\n},\nDataStream.flipArrayEndianness = function(t) {\n\tfor (var e = new Uint8Array(t.buffer, t.byteOffset, t.byteLength), i = 0; i < t.byteLength; i += t.BYTES_PER_ELEMENT) for (var r = i + t.BYTES_PER_ELEMENT - 1,\n\ts = i; s < r; r--, s++) {\n\t\tvar a = e[s];\n\t\te[s] = e[r],\n\t\te[r] = a\n\t}\n\treturn t\n},\nDataStream.prototype.failurePosition = 0,\nString.fromCharCodeUint8 = function(t) {\n\tfor (var e = [], i = 0; i < t.length; i++) e[i] = t[i];\n\treturn String.fromCharCode.apply(null, e)\n},\nDataStream.prototype.readString = function(t, e) {\n\treturn null == e || \"ASCII\" == e ? String.fromCharCodeUint8.apply(null, [this.mapUint8Array(null == t ? this.byteLength - this.position: t)]) : new TextDecoder(e).decode(this.mapUint8Array(t))\n},\nDataStream.prototype.readCString = function(t) {\n\tvar e = this.byteLength - this.position,\n\ti = new Uint8Array(this._buffer, this._byteOffset + this.position),\n\tr = e;\n\tnull != t && (r = Math.min(t, e));\n\tfor (var s = 0; s < r && 0 !== i[s]; s++);\n\tvar a = String.fromCharCodeUint8.apply(null, [this.mapUint8Array(s)]);\n\treturn null != t ? this.position += r - s: s != e && (this.position += 1),\n\ta\n};\nvar MAX_SIZE = Math.pow(2, 32);\nDataStream.prototype.readInt64 = function() {\n\treturn this.readInt32() * MAX_SIZE + this.readUint32()\n},\nDataStream.prototype.readUint64 = function() {\n\treturn this.readUint32() * MAX_SIZE + this.readUint32()\n},\nDataStream.prototype.readInt64 = function() {\n\treturn this.readUint32() * MAX_SIZE + this.readUint32()\n},\nDataStream.prototype.readUint24 = function() {\n\treturn (this.readUint8() << 16) + (this.readUint8() << 8) + this.readUint8()\n},\n\"undefined\" != typeof exports && (exports.DataStream = DataStream),\nDataStream.prototype.save = function(t) {\n\tvar e = new Blob([this.buffer]);\n\tif (!window.URL || !URL.createObjectURL) throw \"DataStream.save: Can't create object URL.\";\n\tvar i = window.URL.createObjectURL(e),\n\te = document.createElement(\"a\");\n\tdocument.body.appendChild(e),\n\te.setAttribute(\"href\", i),\n\te.setAttribute(\"download\", t),\n\te.setAttribute(\"target\", \"_self\"),\n\te.click(),\n\twindow.URL.revokeObjectURL(i)\n},\nDataStream.prototype._dynamicSize = !0,\nObject.defineProperty(DataStream.prototype, \"dynamicSize\", {\n\tget: function() {\n\t\treturn this._dynamicSize\n\t},\n\tset: function(t) {\n\t\tt || this._trimAlloc(),\n\t\tthis._dynamicSize = t\n\t}\n}),\nDataStream.prototype.shift = function(t) {\n\tvar e = new ArrayBuffer(this._byteLength - t),\n\ti = new Uint8Array(e),\n\tr = new Uint8Array(this._buffer, t, i.length);\n\ti.set(r),\n\tthis.buffer = e,\n\tthis.position -= t\n},\nDataStream.prototype.writeInt32Array = function(t, e) {\n\tif (this._realloc(4 * t.length), t instanceof Int32Array && this.byteOffset + this.position % t.BYTES_PER_ELEMENT === 0) DataStream.memcpy(this._buffer, this.byteOffset + this.position, t.buffer, 0, t.byteLength),\n\tthis.mapInt32Array(t.length, e);\n\telse for (var i = 0; i < t.length; i++) this.writeInt32(t[i], e)\n},\nDataStream.prototype.writeInt16Array = function(t, e) {\n\tif (this._realloc(2 * t.length), t instanceof Int16Array && this.byteOffset + this.position % t.BYTES_PER_ELEMENT === 0) DataStream.memcpy(this._buffer, this.byteOffset + this.position, t.buffer, 0, t.byteLength),\n\tthis.mapInt16Array(t.length, e);\n\telse for (var i = 0; i < t.length; i++) this.writeInt16(t[i], e)\n},\nDataStream.prototype.writeInt8Array = function(t) {\n\tif (this._realloc( + t.length), t instanceof Int8Array && this.byteOffset + this.position % t.BYTES_PER_ELEMENT === 0) DataStream.memcpy(this._buffer, this.byteOffset + this.position, t.buffer, 0, t.byteLength),\n\tthis.mapInt8Array(t.length);\n\telse for (var e = 0; e < t.length; e++) this.writeInt8(t[e])\n},\nDataStream.prototype.writeUint32Array = function(t, e) {\n\tif (this._realloc(4 * t.length), t instanceof Uint32Array && this.byteOffset + this.position % t.BYTES_PER_ELEMENT === 0) DataStream.memcpy(this._buffer, this.byteOffset + this.position, t.buffer, 0, t.byteLength),\n\tthis.mapUint32Array(t.length, e);\n\telse for (var i = 0; i < t.length; i++) this.writeUint32(t[i], e)\n},\nDataStream.prototype.writeUint16Array = function(t, e) {\n\tif (this._realloc(2 * t.length), t instanceof Uint16Array && this.byteOffset + this.position % t.BYTES_PER_ELEMENT === 0) DataStream.memcpy(this._buffer, this.byteOffset + this.position, t.buffer, 0, t.byteLength),\n\tthis.mapUint16Array(t.length, e);\n\telse for (var i = 0; i < t.length; i++) this.writeUint16(t[i], e)\n},\nDataStream.prototype.writeUint8Array = function(t) {\n\tif (this._realloc( + t.length), t instanceof Uint8Array && this.byteOffset + this.position % t.BYTES_PER_ELEMENT === 0) DataStream.memcpy(this._buffer, this.byteOffset + this.position, t.buffer, 0, t.byteLength),\n\tthis.mapUint8Array(t.length);\n\telse for (var e = 0; e < t.length; e++) this.writeUint8(t[e])\n},\nDataStream.prototype.writeFloat64Array = function(t, e) {\n\tif (this._realloc(8 * t.length), t instanceof Float64Array && this.byteOffset + this.position % t.BYTES_PER_ELEMENT === 0) DataStream.memcpy(this._buffer, this.byteOffset + this.position, t.buffer, 0, t.byteLength),\n\tthis.mapFloat64Array(t.length, e);\n\telse for (var i = 0; i < t.length; i++) this.writeFloat64(t[i], e)\n},\nDataStream.prototype.writeFloat32Array = function(t, e) {\n\tif (this._realloc(4 * t.length), t instanceof Float32Array && this.byteOffset + this.position % t.BYTES_PER_ELEMENT === 0) DataStream.memcpy(this._buffer, this.byteOffset + this.position, t.buffer, 0, t.byteLength),\n\tthis.mapFloat32Array(t.length, e);\n\telse for (var i = 0; i < t.length; i++) this.writeFloat32(t[i], e)\n},\nDataStream.prototype.writeInt32 = function(t, e) {\n\tthis._realloc(4),\n\tthis._dataView.setInt32(this.position, t, null == e ? this.endianness: e),\n\tthis.position += 4\n},\nDataStream.prototype.writeInt16 = function(t, e) {\n\tthis._realloc(2),\n\tthis._dataView.setInt16(this.position, t, null == e ? this.endianness: e),\n\tthis.position += 2\n},\nDataStream.prototype.writeInt8 = function(t) {\n\tthis._realloc(1),\n\tthis._dataView.setInt8(this.position, t),\n\tthis.position += 1\n},\nDataStream.prototype.writeUint32 = function(t, e) {\n\tthis._realloc(4),\n\tthis._dataView.setUint32(this.position, t, null == e ? this.endianness: e),\n\tthis.position += 4\n},\nDataStream.prototype.writeUint16 = function(t, e) {\n\tthis._realloc(2),\n\tthis._dataView.setUint16(this.position, t, null == e ? this.endianness: e),\n\tthis.position += 2\n},\nDataStream.prototype.writeUint8 = function(t) {\n\tthis._realloc(1),\n\tthis._dataView.setUint8(this.position, t),\n\tthis.position += 1\n},\nDataStream.prototype.writeFloat32 = function(t, e) {\n\tthis._realloc(4),\n\tthis._dataView.setFloat32(this.position, t, null == e ? this.endianness: e),\n\tthis.position += 4\n},\nDataStream.prototype.writeFloat64 = function(t, e) {\n\tthis._realloc(8),\n\tthis._dataView.setFloat64(this.position, t, null == e ? this.endianness: e),\n\tthis.position += 8\n},\nDataStream.prototype.writeUCS2String = function(t, e, i) {\n\tnull == i && (i = t.length);\n\tfor (var r = 0; r < t.length && r < i; r++) this.writeUint16(t.charCodeAt(r), e);\n\tfor (; r < i; r++) this.writeUint16(0)\n},\nDataStream.prototype.writeString = function(t, e, i) {\n\tvar r = 0;\n\tif (null == e || \"ASCII\" == e) if (null != i) {\n\t\tfor (var s = Math.min(t.length, i), r = 0; r < s; r++) this.writeUint8(t.charCodeAt(r));\n\t\tfor (; r < i; r++) this.writeUint8(0)\n\t} else for (r = 0; r < t.length; r++) this.writeUint8(t.charCodeAt(r));\n\telse this.writeUint8Array(new TextEncoder(e).encode(t.substring(0, i)))\n},\nDataStream.prototype.writeCString = function(t, e) {\n\tvar i = 0;\n\tif (null != e) {\n\t\tfor (var r = Math.min(t.length, e), i = 0; i < r; i++) this.writeUint8(t.charCodeAt(i));\n\t\tfor (; i < e; i++) this.writeUint8(0)\n\t} else {\n\t\tfor (i = 0; i < t.length; i++) this.writeUint8(t.charCodeAt(i));\n\t\tthis.writeUint8(0)\n\t}\n},\nDataStream.prototype.writeStruct = function(t, e) {\n\tfor (var i = 0; i < t.length; i += 2) {\n\t\tvar r = t[i + 1];\n\t\tthis.writeType(r, e[t[i]], e)\n\t}\n},\nDataStream.prototype.writeType = function(t, e, i) {\n\tvar r;\n\tif (\"function\" == typeof t) return t(this, e);\n\tif (\"object\" == typeof t && !(t instanceof Array)) return t.set(this, e, i);\n\tvar s = null,\n\ta = \"ASCII\",\n\ti = this.position;\n\tswitch (\"string\" == typeof t && /:/.test(t) && (t = (r = t.split(\":\"))[0], s = parseInt(r[1])), \"string\" == typeof t && /,/.test(t) && (t = (r = t.split(\",\"))[0], a = parseInt(r[1])), t) {\n\tcase \"uint8\":\n\t\tthis.writeUint8(e);\n\t\tbreak;\n\tcase \"int8\":\n\t\tthis.writeInt8(e);\n\t\tbreak;\n\tcase \"uint16\":\n\t\tthis.writeUint16(e, this.endianness);\n\t\tbreak;\n\tcase \"int16\":\n\t\tthis.writeInt16(e, this.endianness);\n\t\tbreak;\n\tcase \"uint32\":\n\t\tthis.writeUint32(e, this.endianness);\n\t\tbreak;\n\tcase \"int32\":\n\t\tthis.writeInt32(e, this.endianness);\n\t\tbreak;\n\tcase \"float32\":\n\t\tthis.writeFloat32(e, this.endianness);\n\t\tbreak;\n\tcase \"float64\":\n\t\tthis.writeFloat64(e, this.endianness);\n\t\tbreak;\n\tcase \"uint16be\":\n\t\tthis.writeUint16(e, DataStream.BIG_ENDIAN);\n\t\tbreak;\n\tcase \"int16be\":\n\t\tthis.writeInt16(e, DataStream.BIG_ENDIAN);\n\t\tbreak;\n\tcase \"uint32be\":\n\t\tthis.writeUint32(e, DataStream.BIG_ENDIAN);\n\t\tbreak;\n\tcase \"int32be\":\n\t\tthis.writeInt32(e, DataStream.BIG_ENDIAN);\n\t\tbreak;\n\tcase \"float32be\":\n\t\tthis.writeFloat32(e, DataStream.BIG_ENDIAN);\n\t\tbreak;\n\tcase \"float64be\":\n\t\tthis.writeFloat64(e, DataStream.BIG_ENDIAN);\n\t\tbreak;\n\tcase \"uint16le\":\n\t\tthis.writeUint16(e, DataStream.LITTLE_ENDIAN);\n\t\tbreak;\n\tcase \"int16le\":\n\t\tthis.writeInt16(e, DataStream.LITTLE_ENDIAN);\n\t\tbreak;\n\tcase \"uint32le\":\n\t\tthis.writeUint32(e, DataStream.LITTLE_ENDIAN);\n\t\tbreak;\n\tcase \"int32le\":\n\t\tthis.writeInt32(e, DataStream.LITTLE_ENDIAN);\n\t\tbreak;\n\tcase \"float32le\":\n\t\tthis.writeFloat32(e, DataStream.LITTLE_ENDIAN);\n\t\tbreak;\n\tcase \"float64le\":\n\t\tthis.writeFloat64(e, DataStream.LITTLE_ENDIAN);\n\t\tbreak;\n\tcase \"cstring\":\n\t\tthis.writeCString(e, s);\n\t\tbreak;\n\tcase \"string\":\n\t\tthis.writeString(e, a, s);\n\t\tbreak;\n\tcase \"u16string\":\n\t\tthis.writeUCS2String(e, this.endianness, s);\n\t\tbreak;\n\tcase \"u16stringle\":\n\t\tthis.writeUCS2String(e, DataStream.LITTLE_ENDIAN, s);\n\t\tbreak;\n\tcase \"u16stringbe\":\n\t\tthis.writeUCS2String(e, DataStream.BIG_ENDIAN, s);\n\t\tbreak;\n\tdefault:\n\t\tif (3 == t.length) {\n\t\t\tfor (var n = t[1], o = 0; o < e.length; o++) this.writeType(n, e[o]);\n\t\t\tbreak\n\t\t}\n\t\tthis.writeStruct(t, e)\n\t}\n\tnull != s && (this.position = i, this._realloc(s), this.position = i + s)\n},\nDataStream.prototype.writeUint64 = function(t) {\n\tvar e = Math.floor(t / MAX_SIZE);\n\tthis.writeUint32(e),\n\tthis.writeUint32(4294967295 & t)\n},\nDataStream.prototype.writeUint24 = function(t) {\n\tthis.writeUint8((16711680 & t) >> 16),\n\tthis.writeUint8((65280 & t) >> 8),\n\tthis.writeUint8(255 & t)\n},\nDataStream.prototype.adjustUint32 = function(t, e) {\n\tvar i = this.position;\n\tthis.seek(t),\n\tthis.writeUint32(e),\n\tthis.seek(i)\n},\nDataStream.prototype.mapInt32Array = function(t, e) {\n\tthis._realloc(4 * t);\n\tvar i = new Int32Array(this._buffer, this.byteOffset + this.position, t);\n\treturn DataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += 4 * t,\n\ti\n},\nDataStream.prototype.mapInt16Array = function(t, e) {\n\tthis._realloc(2 * t);\n\tvar i = new Int16Array(this._buffer, this.byteOffset + this.position, t);\n\treturn DataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += 2 * t,\n\ti\n},\nDataStream.prototype.mapInt8Array = function(t) {\n\tthis._realloc( + t);\n\tvar e = new Int8Array(this._buffer, this.byteOffset + this.position, t);\n\treturn this.position += +t,\n\te\n},\nDataStream.prototype.mapUint32Array = function(t, e) {\n\tthis._realloc(4 * t);\n\tvar i = new Uint32Array(this._buffer, this.byteOffset + this.position, t);\n\treturn DataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += 4 * t,\n\ti\n},\nDataStream.prototype.mapUint16Array = function(t, e) {\n\tthis._realloc(2 * t);\n\tvar i = new Uint16Array(this._buffer, this.byteOffset + this.position, t);\n\treturn DataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += 2 * t,\n\ti\n},\nDataStream.prototype.mapFloat64Array = function(t, e) {\n\tthis._realloc(8 * t);\n\tvar i = new Float64Array(this._buffer, this.byteOffset + this.position, t);\n\treturn DataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += 8 * t,\n\ti\n},\nDataStream.prototype.mapFloat32Array = function(t, e) {\n\tthis._realloc(4 * t);\n\tvar i = new Float32Array(this._buffer, this.byteOffset + this.position, t);\n\treturn DataStream.arrayToNative(i, null == e ? this.endianness: e),\n\tthis.position += 4 * t,\n\ti\n};\nvar MultiBufferStream = function(t) {\n\tthis.buffers = [],\n\tthis.bufferIndex = -1,\n\tt && (this.insertBuffer(t), this.bufferIndex = 0)\n};\nMultiBufferStream.prototype = new DataStream(new ArrayBuffer, 0, DataStream.BIG_ENDIAN),\nMultiBufferStream.prototype.initialized = function() {\n\tvar t;\n\treturn - 1 < this.bufferIndex || (0 < this.buffers.length ? 0 === (t = this.buffers[0]).fileStart ? (this.buffer = t, this.bufferIndex = 0, Log.debug(\"MultiBufferStream\", \"Stream ready for parsing\"), !0) : (Log.warn(\"MultiBufferStream\", \"The first buffer should have a fileStart of 0\"), this.logBufferLevel(), !1) : (Log.warn(\"MultiBufferStream\", \"No buffer to start parsing from\"), this.logBufferLevel(), !1))\n},\nArrayBuffer.concat = function(t, e) {\n\tLog.debug(\"ArrayBuffer\", \"Trying to create a new buffer of size: \" + (t.byteLength + e.byteLength));\n\tvar i = new Uint8Array(t.byteLength + e.byteLength);\n\treturn i.set(new Uint8Array(t), 0),\n\ti.set(new Uint8Array(e), t.byteLength),\n\ti.buffer\n},\nMultiBufferStream.prototype.reduceBuffer = function(t, e, i) {\n\tvar r = new Uint8Array(i);\n\treturn r.set(new Uint8Array(t, e, i)),\n\tr.buffer.fileStart = t.fileStart + e,\n\tr.buffer.usedBytes = 0,\n\tr.buffer\n},\nMultiBufferStream.prototype.insertBuffer = function(t) {\n\tfor (var e = !0,\n\ti = 0; i < this.buffers.length; i++) {\n\t\tvar r = this.buffers[i];\n\t\tif (t.fileStart <= r.fileStart) {\n\t\t\tif (t.fileStart === r.fileStart) {\n\t\t\t\tif (t.byteLength > r.byteLength) {\n\t\t\t\t\tthis.buffers.splice(i, 1),\n\t\t\t\t\ti--;\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tLog.warn(\"MultiBufferStream\", \"Buffer (fileStart: \" + t.fileStart + \" - Length: \" + t.byteLength + \") already appended, ignoring\")\n\t\t\t} else t.fileStart + t.byteLength <= r.fileStart || (t = this.reduceBuffer(t, 0, r.fileStart - t.fileStart)),\n\t\t\tLog.debug(\"MultiBufferStream\", \"Appending new buffer (fileStart: \" + t.fileStart + \" - Length: \" + t.byteLength + \")\"),\n\t\t\tthis.buffers.splice(i, 0, t),\n\t\t\t0 === i && (this.buffer = t);\n\t\t\te = !1;\n\t\t\tbreak\n\t\t}\n\t\tif (t.fileStart < r.fileStart + r.byteLength) {\n\t\t\tvar s = r.fileStart + r.byteLength - t.fileStart,\n\t\t\tr = t.byteLength - s;\n\t\t\tif (! (0 < r)) {\n\t\t\t\te = !1;\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tt = this.reduceBuffer(t, s, r)\n\t\t}\n\t}\n\te && (Log.debug(\"MultiBufferStream\", \"Appending new buffer (fileStart: \" + t.fileStart + \" - Length: \" + t.byteLength + \")\"), this.buffers.push(t), 0 === i && (this.buffer = t))\n},\nMultiBufferStream.prototype.logBufferLevel = function(t) {\n\tfor (var e, i, r = [], s = \"\", a = 0, n = 0, o = 0; o < this.buffers.length; o++) e = this.buffers[o],\n\t0 === o ? (i = {},\n\tr.push(i), i.start = e.fileStart, i.end = e.fileStart + e.byteLength, s += \"[\" + i.start + \"-\") : i.end === e.fileStart ? i.end = e.fileStart + e.byteLength: ((i = {}).start = e.fileStart, s += r[r.length - 1].end - 1 + \"], [\" + i.start + \"-\", i.end = e.fileStart + e.byteLength, r.push(i)),\n\ta += e.usedBytes,\n\tn += e.byteLength;\n\t0 < r.length && (s += i.end - 1 + \"]\");\n\tt = t ? Log.info: Log.debug;\n\t0 === this.buffers.length ? t(\"MultiBufferStream\", \"No more buffer in memory\") : t(\"MultiBufferStream\", this.buffers.length + \" stored buffer(s) (\" + a + \"/\" + n + \" bytes), continuous ranges: \" + s)\n},\nMultiBufferStream.prototype.cleanBuffers = function() {\n\tfor (var t, e = 0; e < this.buffers.length; e++)(t = this.buffers[e]).usedBytes === t.byteLength && (Log.debug(\"MultiBufferStream\", \"Removing buffer #\" + e), this.buffers.splice(e, 1), e--)\n},\nMultiBufferStream.prototype.mergeNextBuffer = function() {\n\tvar t;\n\tif (this.bufferIndex + 1 < this.buffers.length) {\n\t\tif ((t = this.buffers[this.bufferIndex + 1]).fileStart !== this.buffer.fileStart + this.buffer.byteLength) return ! 1;\n\t\tvar e = this.buffer.byteLength,\n\t\ti = this.buffer.usedBytes,\n\t\tr = this.buffer.fileStart;\n\t\treturn this.buffers[this.bufferIndex] = ArrayBuffer.concat(this.buffer, t),\n\t\tthis.buffer = this.buffers[this.bufferIndex],\n\t\tthis.buffers.splice(this.bufferIndex + 1, 1),\n\t\tthis.buffer.usedBytes = i,\n\t\tthis.buffer.fileStart = r,\n\t\tLog.debug(\"ISOFile\", \"Concatenating buffer for box parsing (length: \" + e + \"->\" + this.buffer.byteLength + \")\"),\n\t\t!0\n\t}\n\treturn ! 1\n},\nMultiBufferStream.prototype.findPosition = function(t, e, i) {\n\tfor (var r = null,\n\ts = -1,\n\ta = !0 === t ? 0 : this.bufferIndex; a < this.buffers.length && (r = this.buffers[a]).fileStart <= e;) s = a,\n\ti && (r.fileStart + r.byteLength <= e ? r.usedBytes = r.byteLength: r.usedBytes = e - r.fileStart, this.logBufferLevel()),\n\ta++;\n\treturn - 1 !== s && (r = this.buffers[s]).fileStart + r.byteLength >= e ? (Log.debug(\"MultiBufferStream\", \"Found position in existing buffer #\" + s), s) : -1\n},\nMultiBufferStream.prototype.findEndContiguousBuf = function(t) {\n\tvar e, i, t = void 0 !== t ? t: this.bufferIndex,\n\tr = this.buffers[t];\n\tif (this.buffers.length > t + 1) for (e = t + 1; e < this.buffers.length && (i = this.buffers[e]).fileStart === r.fileStart + r.byteLength; e++) r = i;\n\treturn r.fileStart + r.byteLength\n},\nMultiBufferStream.prototype.getEndFilePositionAfter = function(t) {\n\tvar e = this.findPosition(!0, t, !1);\n\treturn - 1 !== e ? this.findEndContiguousBuf(e) : t\n},\nMultiBufferStream.prototype.addUsedBytes = function(t) {\n\tthis.buffer.usedBytes += t,\n\tthis.logBufferLevel()\n},\nMultiBufferStream.prototype.setAllUsedBytes = function() {\n\tthis.buffer.usedBytes = this.buffer.byteLength,\n\tthis.logBufferLevel()\n},\nMultiBufferStream.prototype.seek = function(t, e, i) {\n\ti = this.findPosition(e, t, i);\n\treturn - 1 !== i ? (this.buffer = this.buffers[i], this.bufferIndex = i, this.position = t - this.buffer.fileStart, Log.debug(\"MultiBufferStream\", \"Repositioning parser at buffer position: \" + this.position), !0) : (Log.debug(\"MultiBufferStream\", \"Position \" + t + \" not found in buffered data\"), !1)\n},\nMultiBufferStream.prototype.getPosition = function() {\n\tif (-1 === this.bufferIndex || null === this.buffers[this.bufferIndex]) throw \"Error accessing position in the MultiBufferStream\";\n\treturn this.buffers[this.bufferIndex].fileStart + this.position\n},\nMultiBufferStream.prototype.getLength = function() {\n\treturn this.byteLength\n},\nMultiBufferStream.prototype.getEndPosition = function() {\n\tif (-1 === this.bufferIndex || null === this.buffers[this.bufferIndex]) throw \"Error accessing position in the MultiBufferStream\";\n\treturn this.buffers[this.bufferIndex].fileStart + this.byteLength\n},\n\"undefined\" != typeof exports && (exports.MultiBufferStream = MultiBufferStream);\nvar MPEG4DescriptorParser = function() {\n\tvar s = [];\n\ts[3] = \"ES_Descriptor\",\n\ts[4] = \"DecoderConfigDescriptor\",\n\ts[5] = \"DecoderSpecificInfo\",\n\ts[6] = \"SLConfigDescriptor\",\n\tthis.getDescriptorName = function(t) {\n\t\treturn s[t]\n\t};\n\tvar r = this,\n\ta = {};\n\treturn this.parseOneDescriptor = function(t) {\n\t\tvar e, i = 0,\n\t\tr = t.readUint8();\n\t\tfor (e = t.readUint8(), 0; 128 & e;) i = (i << 7) + (127 & e),\n\t\te = t.readUint8(),\n\t\t0;\n\t\treturn i = (i << 7) + (127 & e),\n\t\tLog.debug(\"MPEG4DescriptorParser\", \"Found \" + (s[r] || \"Descriptor \" + r) + \", size \" + i + \" at position \" + t.getPosition()),\n\t\t(r = new(s[r] ? a[s[r]] : a.Descriptor)(i)).parse(t),\n\t\tr\n\t},\n\ta.Descriptor = function(t, e) {\n\t\tthis.tag = t,\n\t\tthis.size = e,\n\t\tthis.descs = []\n\t},\n\ta.Descriptor.prototype.parse = function(t) {\n\t\tthis.data = t.readUint8Array(this.size)\n\t},\n\ta.Descriptor.prototype.findDescriptor = function(t) {\n\t\tfor (var e = 0; e < this.descs.length; e++) if (this.descs[e].tag == t) return this.descs[e];\n\t\treturn null\n\t},\n\ta.Descriptor.prototype.parseRemainingDescriptors = function(t) {\n\t\tfor (var e = t.position; t.position < e + this.size;) {\n\t\t\tvar i = r.parseOneDescriptor(t);\n\t\t\tthis.descs.push(i)\n\t\t}\n\t},\n\ta.ES_Descriptor = function(t) {\n\t\ta.Descriptor.call(this, 3, t)\n\t},\n\ta.ES_Descriptor.prototype = new a.Descriptor,\n\ta.ES_Descriptor.prototype.parse = function(t) {\n\t\tvar e;\n\t\tthis.ES_ID = t.readUint16(),\n\t\tthis.flags = t.readUint8(),\n\t\tthis.size -= 3,\n\t\t128 & this.flags ? (this.dependsOn_ES_ID = t.readUint16(), this.size -= 2) : this.dependsOn_ES_ID = 0,\n\t\t64 & this.flags ? (e = t.readUint8(), this.URL = t.readString(e), this.size -= e + 1) : this.URL = \"\",\n\t\t32 & this.flags ? (this.OCR_ES_ID = t.readUint16(), this.size -= 2) : this.OCR_ES_ID = 0,\n\t\tthis.parseRemainingDescriptors(t)\n\t},\n\ta.ES_Descriptor.prototype.getOTI = function(t) {\n\t\tvar e = this.findDescriptor(4);\n\t\treturn e ? e.oti: 0\n\t},\n\ta.ES_Descriptor.prototype.getAudioConfig = function(t) {\n\t\tvar e = this.findDescriptor(4);\n\t\tif (!e) return null;\n\t\tvar i = e.findDescriptor(5);\n\t\tif (i && i.data) {\n\t\t\te = (248 & i.data[0]) >> 3;\n\t\t\treturn 31 === e && 2 <= i.data.length && (e = 32 + ((7 & i.data[0]) << 3) + ((224 & i.data[1]) >> 5)),\n\t\t\te\n\t\t}\n\t\treturn null\n\t},\n\ta.DecoderConfigDescriptor = function(t) {\n\t\ta.Descriptor.call(this, 4, t)\n\t},\n\ta.DecoderConfigDescriptor.prototype = new a.Descriptor,\n\ta.DecoderConfigDescriptor.prototype.parse = function(t) {\n\t\tthis.oti = t.readUint8(),\n\t\tthis.streamType = t.readUint8(),\n\t\tthis.upStream = 0 != (this.streamType >> 1 & 1),\n\t\tthis.streamType = this.streamType >>> 2,\n\t\tthis.bufferSize = t.readUint24(),\n\t\tthis.maxBitrate = t.readUint32(),\n\t\tthis.avgBitrate = t.readUint32(),\n\t\tthis.size -= 13,\n\t\tthis.parseRemainingDescriptors(t)\n\t},\n\ta.DecoderSpecificInfo = function(t) {\n\t\ta.Descriptor.call(this, 5, t)\n\t},\n\ta.DecoderSpecificInfo.prototype = new a.Descriptor,\n\ta.SLConfigDescriptor = function(t) {\n\t\ta.Descriptor.call(this, 6, t)\n\t},\n\ta.SLConfigDescriptor.prototype = new a.Descriptor,\n\tthis\n};\n\"undefined\" != typeof exports && (exports.MPEG4DescriptorParser = MPEG4DescriptorParser);\nvar BoxParser = {\n\tERR_INVALID_DATA: -1,\n\tERR_NOT_ENOUGH_DATA: 0,\n\tOK: 1,\n\tBASIC_BOXES: [{\n\t\ttype: \"mdat\",\n\t\tname: \"MediaDataBox\"\n\t},\n\t{\n\t\ttype: \"idat\",\n\t\tname: \"ItemDataBox\"\n\t},\n\t{\n\t\ttype: \"free\",\n\t\tname: \"FreeSpaceBox\"\n\t},\n\t{\n\t\ttype: \"skip\",\n\t\tname: \"FreeSpaceBox\"\n\t},\n\t{\n\t\ttype: \"meco\",\n\t\tname: \"AdditionalMetadataContainerBox\"\n\t},\n\t{\n\t\ttype: \"strk\",\n\t\tname: \"SubTrackBox\"\n\t}],\n\tFULL_BOXES: [{\n\t\ttype: \"hmhd\",\n\t\tname: \"HintMediaHeaderBox\"\n\t},\n\t{\n\t\ttype: \"nmhd\",\n\t\tname: \"NullMediaHeaderBox\"\n\t},\n\t{\n\t\ttype: \"iods\",\n\t\tname: \"ObjectDescriptorBox\"\n\t},\n\t{\n\t\ttype: \"xml \",\n\t\tname: \"XMLBox\"\n\t},\n\t{\n\t\ttype: \"bxml\",\n\t\tname: \"BinaryXMLBox\"\n\t},\n\t{\n\t\ttype: \"ipro\",\n\t\tname: \"ItemProtectionBox\"\n\t},\n\t{\n\t\ttype: \"mere\",\n\t\tname: \"MetaboxRelationBox\"\n\t}],\n\tCONTAINER_BOXES: [[{\n\t\ttype: \"moov\",\n\t\tname: \"CompressedMovieBox\"\n\t},\n\t[\"trak\", \"pssh\"]], [{\n\t\ttype: \"trak\",\n\t\tname: \"TrackBox\"\n\t}], [{\n\t\ttype: \"edts\",\n\t\tname: \"EditBox\"\n\t}], [{\n\t\ttype: \"mdia\",\n\t\tname: \"MediaBox\"\n\t}], [{\n\t\ttype: \"minf\",\n\t\tname: \"MediaInformationBox\"\n\t}], [{\n\t\ttype: \"dinf\",\n\t\tname: \"DataInformationBox\"\n\t}], [{\n\t\ttype: \"stbl\",\n\t\tname: \"SampleTableBox\"\n\t},\n\t[\"sgpd\", \"sbgp\"]], [{\n\t\ttype: \"mvex\",\n\t\tname: \"MovieExtendsBox\"\n\t},\n\t[\"trex\"]], [{\n\t\ttype: \"moof\",\n\t\tname: \"CompressedMovieFragmentBox\"\n\t},\n\t[\"traf\"]], [{\n\t\ttype: \"traf\",\n\t\tname: \"TrackFragmentBox\"\n\t},\n\t[\"trun\", \"sgpd\", \"sbgp\"]], [{\n\t\ttype: \"vttc\",\n\t\tname: \"VTTCueBox\"\n\t}], [{\n\t\ttype: \"tref\",\n\t\tname: \"TrackReferenceBox\"\n\t}], [{\n\t\ttype: \"iref\",\n\t\tname: \"ItemReferenceBox\"\n\t}], [{\n\t\ttype: \"mfra\",\n\t\tname: \"MovieFragmentRandomAccessBox\"\n\t},\n\t[\"tfra\"]], [{\n\t\ttype: \"meco\",\n\t\tname: \"AdditionalMetadataContainerBox\"\n\t}], [{\n\t\ttype: \"hnti\",\n\t\tname: \"trackhintinformation\"\n\t}], [{\n\t\ttype: \"hinf\",\n\t\tname: \"hintstatisticsbox\"\n\t}], [{\n\t\ttype: \"strk\",\n\t\tname: \"SubTrackBox\"\n\t}], [{\n\t\ttype: \"strd\",\n\t\tname: \"SubTrackDefinitionBox\"\n\t}], [{\n\t\ttype: \"sinf\",\n\t\tname: \"ProtectionSchemeInfoBox\"\n\t}], [{\n\t\ttype: \"rinf\",\n\t\tname: \"RestrictedSchemeInfoBox\"\n\t}], [{\n\t\ttype: \"schi\",\n\t\tname: \"SchemeInformationBox\"\n\t}], [{\n\t\ttype: \"trgr\",\n\t\tname: \"TrackGroupBox\"\n\t}], [{\n\t\ttype: \"udta\",\n\t\tname: \"UserDataBox\"\n\t},\n\t[\"kind\"]], [{\n\t\ttype: \"iprp\",\n\t\tname: \"ItemPropertiesBox\"\n\t},\n\t[\"ipma\"]], [{\n\t\ttype: \"ipco\",\n\t\tname: \"ItemPropertyContainerBox\"\n\t}], [{\n\t\ttype: \"grpl\",\n\t\tname: \"GroupsListBox\"\n\t}], [{\n\t\ttype: \"j2kH\",\n\t\tname: \"J2KHeaderInfoBox\"\n\t}], [{\n\t\ttype: \"etyp\",\n\t\tname: \"ExtendedTypeBox\"\n\t},\n\t[\"tyco\"]]],\n\tboxCodes: [],\n\tfullBoxCodes: [],\n\tcontainerBoxCodes: [],\n\tsampleEntryCodes: {},\n\tsampleGroupEntryCodes: [],\n\ttrackGroupTypes: [],\n\tUUIDBoxes: {},\n\tUUIDs: [],\n\tinitialize: function() {\n\t\tBoxParser.FullBox.prototype = new BoxParser.Box,\n\t\tBoxParser.ContainerBox.prototype = new BoxParser.Box,\n\t\tBoxParser.SampleEntry.prototype = new BoxParser.Box,\n\t\tBoxParser.TrackGroupTypeBox.prototype = new BoxParser.FullBox,\n\t\tBoxParser.BASIC_BOXES.forEach(function(t) {\n\t\t\tBoxParser.createBoxCtor(t.type, t.name)\n\t\t}),\n\t\tBoxParser.FULL_BOXES.forEach(function(t) {\n\t\t\tBoxParser.createFullBoxCtor(t.type, t.name)\n\t\t}),\n\t\tBoxParser.CONTAINER_BOXES.forEach(function(t) {\n\t\t\tBoxParser.createContainerBoxCtor(t[0].type, t[0].name, null, t[1])\n\t\t})\n\t},\n\tBox: function(t, e, i, r) {\n\t\tthis.type = t,\n\t\tthis.box_name = i,\n\t\tthis.size = e,\n\t\tthis.uuid = r\n\t},\n\tFullBox: function(t, e, i, r) {\n\t\tBoxParser.Box.call(this, t, e, i, r),\n\t\tthis.flags = 0,\n\t\tthis.version = 0\n\t},\n\tContainerBox: function(t, e, i, r) {\n\t\tBoxParser.Box.call(this, t, e, i, r),\n\t\tthis.boxes = []\n\t},\n\tSampleEntry: function(t, e, i, r) {\n\t\tBoxParser.ContainerBox.call(this, t, e),\n\t\tthis.hdr_size = i,\n\t\tthis.start = r\n\t},\n\tSampleGroupEntry: function(t) {\n\t\tthis.grouping_type = t\n\t},\n\tTrackGroupTypeBox: function(t, e) {\n\t\tBoxParser.FullBox.call(this, t, e)\n\t},\n\tcreateBoxCtor: function(e, i, t) {\n\t\tBoxParser.boxCodes.push(e),\n\t\tBoxParser[e + \"Box\"] = function(t) {\n\t\t\tBoxParser.Box.call(this, e, t, i)\n\t\t},\n\t\tBoxParser[e + \"Box\"].prototype = new BoxParser.Box,\n\t\tt && (BoxParser[e + \"Box\"].prototype.parse = t)\n\t},\n\tcreateFullBoxCtor: function(e, i, r) {\n\t\tBoxParser[e + \"Box\"] = function(t) {\n\t\t\tBoxParser.FullBox.call(this, e, t, i)\n\t\t},\n\t\tBoxParser[e + \"Box\"].prototype = new BoxParser.FullBox,\n\t\tBoxParser[e + \"Box\"].prototype.parse = function(t) {\n\t\t\tthis.parseFullHeader(t),\n\t\t\tr && r.call(this, t)\n\t\t}\n\t},\n\taddSubBoxArrays: function(t) {\n\t\tif (t) for (var e = (this.subBoxNames = t).length, i = 0; i < e; i++) this[t[i] + \"s\"] = []\n\t},\n\tcreateContainerBoxCtor: function(e, i, t, r) {\n\t\tBoxParser[e + \"Box\"] = function(t) {\n\t\t\tBoxParser.ContainerBox.call(this, e, t, i),\n\t\t\tBoxParser.addSubBoxArrays.call(this, r)\n\t\t},\n\t\tBoxParser[e + \"Box\"].prototype = new BoxParser.ContainerBox,\n\t\tt && (BoxParser[e + \"Box\"].prototype.parse = t)\n\t},\n\tcreateMediaSampleEntryCtor: function(t, e, i) {\n\t\tBoxParser.sampleEntryCodes[t] = [],\n\t\tBoxParser[t + \"SampleEntry\"] = function(t, e) {\n\t\t\tBoxParser.SampleEntry.call(this, t, e),\n\t\t\tBoxParser.addSubBoxArrays.call(this, i)\n\t\t},\n\t\tBoxParser[t + \"SampleEntry\"].prototype = new BoxParser.SampleEntry,\n\t\te && (BoxParser[t + \"SampleEntry\"].prototype.parse = e)\n\t},\n\tcreateSampleEntryCtor: function(e, i, t, r) {\n\t\tBoxParser.sampleEntryCodes[e].push(i),\n\t\tBoxParser[i + \"SampleEntry\"] = function(t) {\n\t\t\tBoxParser[e + \"SampleEntry\"].call(this, i, t),\n\t\t\tBoxParser.addSubBoxArrays.call(this, r)\n\t\t},\n\t\tBoxParser[i + \"SampleEntry\"].prototype = new BoxParser[e + \"SampleEntry\"],\n\t\tt && (BoxParser[i + \"SampleEntry\"].prototype.parse = t)\n\t},\n\tcreateEncryptedSampleEntryCtor: function(t, e, i) {\n\t\tBoxParser.createSampleEntryCtor.call(this, t, e, i, [\"sinf\"])\n\t},\n\tcreateSampleGroupCtor: function(e, t) {\n\t\tBoxParser[e + \"SampleGroupEntry\"] = function(t) {\n\t\t\tBoxParser.SampleGroupEntry.call(this, e, t)\n\t\t},\n\t\tBoxParser[e + \"SampleGroupEntry\"].prototype = new BoxParser.SampleGroupEntry,\n\t\tt && (BoxParser[e + \"SampleGroupEntry\"].prototype.parse = t)\n\t},\n\tcreateTrackGroupCtor: function(e, t) {\n\t\tBoxParser[e + \"TrackGroupTypeBox\"] = function(t) {\n\t\t\tBoxParser.TrackGroupTypeBox.call(this, e, t)\n\t\t},\n\t\tBoxParser[e + \"TrackGroupTypeBox\"].prototype = new BoxParser.TrackGroupTypeBox,\n\t\tt && (BoxParser[e + \"TrackGroupTypeBox\"].prototype.parse = t)\n\t},\n\tcreateUUIDBox: function(e, i, r, s, a) {\n\t\tBoxParser.UUIDs.push(e),\n\t\tBoxParser.UUIDBoxes[e] = function(t) { (r ? BoxParser.FullBox: s ? BoxParser.ContainerBox: BoxParser.Box).call(this, \"uuid\", t, i, e)\n\t\t},\n\t\tBoxParser.UUIDBoxes[e].prototype = new(r ? BoxParser.FullBox: s ? BoxParser.ContainerBox: BoxParser.Box),\n\t\ta && (BoxParser.UUIDBoxes[e].prototype.parse = r ?\n\t\tfunction(t) {\n\t\t\tthis.parseFullHeader(t),\n\t\t\ta && a.call(this, t)\n\t\t}: a)\n\t}\n};\nfunction printPS(t) {\n\tvar e = \"<table class='inner-table'>\";\n\te += \"<thead><tr><th>length</th><th>nalu_data</th></tr></thead>\",\n\te += \"<tbody>\";\n\tfor (var i = 0; i < t.length; i++) {\n\t\tvar r = t[i];\n\t\te += \"<tr>\",\n\t\te += \"<td>\" + r.length + \"</td>\",\n\t\te += \"<td>\",\n\t\te += r.nalu.reduce(function(t, e) {\n\t\t\treturn t + e.toString(16).padStart(2, \"0\")\n\t\t},\n\t\t\"0x\"),\n\t\te += \"</td></tr>\"\n\t}\n\treturn e += \"</tbody></table>\"\n}\nfunction ColorPoint(t, e) {\n\tthis.x = t,\n\tthis.y = e\n}\nfunction Pixel(t, e) {\n\tthis.bad_pixel_row = t,\n\tthis.bad_pixel_column = e\n}\nBoxParser.initialize(),\nBoxParser.TKHD_FLAG_ENABLED = 1,\nBoxParser.TKHD_FLAG_IN_MOVIE = 2,\nBoxParser.TKHD_FLAG_IN_PREVIEW = 4,\nBoxParser.TFHD_FLAG_BASE_DATA_OFFSET = 1,\nBoxParser.TFHD_FLAG_SAMPLE_DESC = 2,\nBoxParser.TFHD_FLAG_SAMPLE_DUR = 8,\nBoxParser.TFHD_FLAG_SAMPLE_SIZE = 16,\nBoxParser.TFHD_FLAG_SAMPLE_FLAGS = 32,\nBoxParser.TFHD_FLAG_DUR_EMPTY = 65536,\nBoxParser.TFHD_FLAG_DEFAULT_BASE_IS_MOOF = 131072,\nBoxParser.TRUN_FLAGS_DATA_OFFSET = 1,\nBoxParser.TRUN_FLAGS_FIRST_FLAG = 4,\nBoxParser.TRUN_FLAGS_DURATION = 256,\nBoxParser.TRUN_FLAGS_SIZE = 512,\nBoxParser.TRUN_FLAGS_FLAGS = 1024,\nBoxParser.TRUN_FLAGS_CTS_OFFSET = 2048,\nBoxParser.Box.prototype.add = function(t) {\n\treturn this.addBox(new BoxParser[t + \"Box\"])\n},\nBoxParser.Box.prototype.addBox = function(t) {\n\treturn this.boxes.push(t),\n\tthis[t.type + \"s\"] ? this[t.type + \"s\"].push(t) : this[t.type] = t,\n\tt\n},\nBoxParser.Box.prototype.set = function(t, e) {\n\treturn this[t] = e,\n\tthis\n},\nBoxParser.Box.prototype.addEntry = function(t, e) {\n\te = e || \"entries\";\n\treturn this[e] || (this[e] = []),\n\tthis[e].push(t),\n\tthis\n},\n\"undefined\" != typeof exports && (exports.BoxParser = BoxParser),\nBoxParser.parseUUID = function(t) {\n\treturn BoxParser.parseHex16(t)\n},\nBoxParser.parseHex16 = function(t) {\n\tfor (var e = \"\",\n\ti = 0; i < 16; i++) {\n\t\tvar r = t.readUint8().toString(16);\n\t\te += 1 === r.length ? \"0\" + r: r\n\t}\n\treturn e\n},\nBoxParser.parseOneBox = function(t, e, i) {\n\tvar r, s, a = t.getPosition(),\n\tn = 0;\n\tif (t.getEndPosition() - a < 8) return Log.debug(\"BoxParser\", \"Not enough data in stream to parse the type and size of the box\"),\n\t{\n\t\tcode: BoxParser.ERR_NOT_ENOUGH_DATA\n\t};\n\tif (i && i < 8) return Log.debug(\"BoxParser\", \"Not enough bytes left in the parent box to parse a new box\"),\n\t{\n\t\tcode: BoxParser.ERR_NOT_ENOUGH_DATA\n\t};\n\tvar o = t.readUint32(),\n\th = t.readString(4),\n\td = h;\n\tif (Log.debug(\"BoxParser\", \"Found box of type '\" + h + \"' and size \" + o + \" at position \" + a), n = 8, \"uuid\" == h) {\n\t\tif (t.getEndPosition() - t.getPosition() < 16 || i - n < 16) return t.seek(a),\n\t\tLog.debug(\"BoxParser\", \"Not enough bytes left in the parent box to parse a UUID box\"),\n\t\t{\n\t\t\tcode: BoxParser.ERR_NOT_ENOUGH_DATA\n\t\t};\n\t\tn += 16,\n\t\td = s = BoxParser.parseUUID(t)\n\t}\n\tif (1 == o) {\n\t\tif (t.getEndPosition() - t.getPosition() < 8 || i && i - n < 8) return t.seek(a),\n\t\tLog.warn(\"BoxParser\", 'Not enough data in stream to parse the extended size of the \"' + h + '\" box'),\n\t\t{\n\t\t\tcode: BoxParser.ERR_NOT_ENOUGH_DATA\n\t\t};\n\t\to = t.readUint64(),\n\t\tn += 8\n\t} else if (0 === o) if (i) o = i;\n\telse if (\"mdat\" !== h) return Log.error(\"BoxParser\", \"Unlimited box size not supported for type: '\" + h + \"'\"),\n\tr = new BoxParser.Box(h, o),\n\t{\n\t\tcode: BoxParser.OK,\n\t\tbox: r,\n\t\tsize: r.size\n\t};\n\treturn 0 !== o && o < n ? (Log.error(\"BoxParser\", \"Box of type \" + h + \" has an invalid size \" + o + \" (too small to be a box)\"), {\n\t\tcode: BoxParser.ERR_NOT_ENOUGH_DATA,\n\t\ttype: h,\n\t\tsize: o,\n\t\thdr_size: n,\n\t\tstart: a\n\t}) : 0 !== o && i && i < o ? (Log.error(\"BoxParser\", \"Box of type '\" + h + \"' has a size \" + o + \" greater than its container size \" + i), {\n\t\tcode: BoxParser.ERR_NOT_ENOUGH_DATA,\n\t\ttype: h,\n\t\tsize: o,\n\t\thdr_size: n,\n\t\tstart: a\n\t}) : 0 !== o && a + o > t.getEndPosition() ? (t.seek(a), Log.info(\"BoxParser\", \"Not enough data in stream to parse the entire '\" + h + \"' box\"), {\n\t\tcode: BoxParser.ERR_NOT_ENOUGH_DATA,\n\t\ttype: h,\n\t\tsize: o,\n\t\thdr_size: n,\n\t\tstart: a\n\t}) : e ? {\n\t\tcode: BoxParser.OK,\n\t\ttype: h,\n\t\tsize: o,\n\t\thdr_size: n,\n\t\tstart: a\n\t}: (BoxParser[h + \"Box\"] ? r = new BoxParser[h + \"Box\"](o) : \"uuid\" !== h ? (Log.warn(\"BoxParser\", \"Unknown box type: '\" + h + \"'\"), (r = new BoxParser.Box(h, o)).has_unparsed_data = !0) : BoxParser.UUIDBoxes[s] ? r = new BoxParser.UUIDBoxes[s](o) : (Log.warn(\"BoxParser\", \"Unknown uuid type: '\" + s + \"'\"), (r = new BoxParser.Box(h, o)).uuid = s, r.has_unparsed_data = !0), r.hdr_size = n, r.start = a, r.write === BoxParser.Box.prototype.write && \"mdat\" !== r.type && (Log.info(\"BoxParser\", \"'\" + d + \"' box writing not yet implemented, keeping unparsed data in memory for later write\"), r.parseDataAndRewind(t)), r.parse(t), (a = t.getPosition() - (r.start + r.size)) < 0 ? (Log.warn(\"BoxParser\", \"Parsing of box '\" + d + \"' did not read the entire indicated box data size (missing \" + -a + \" bytes), seeking forward\"), t.seek(r.start + r.size)) : 0 < a && (Log.error(\"BoxParser\", \"Parsing of box '\" + d + \"' read \" + a + \" more bytes than the indicated box data size, seeking backwards\"), 0 !== r.size && t.seek(r.start + r.size)), {\n\t\tcode: BoxParser.OK,\n\t\tbox: r,\n\t\tsize: r.size\n\t})\n},\nBoxParser.Box.prototype.parse = function(t) {\n\t\"mdat\" != this.type ? this.data = t.readUint8Array(this.size - this.hdr_size) : 0 === this.size ? t.seek(t.getEndPosition()) : t.seek(this.start + this.size)\n},\nBoxParser.Box.prototype.parseDataAndRewind = function(t) {\n\tthis.data = t.readUint8Array(this.size - this.hdr_size),\n\tt.position -= this.size - this.hdr_size\n},\nBoxParser.FullBox.prototype.parseDataAndRewind = function(t) {\n\tthis.parseFullHeader(t),\n\tthis.data = t.readUint8Array(this.size - this.hdr_size),\n\tthis.hdr_size -= 4,\n\tt.position -= this.size - this.hdr_size\n},\nBoxParser.FullBox.prototype.parseFullHeader = function(t) {\n\tthis.version = t.readUint8(),\n\tthis.flags = t.readUint24(),\n\tthis.hdr_size += 4\n},\nBoxParser.FullBox.prototype.parse = function(t) {\n\tthis.parseFullHeader(t),\n\tthis.data = t.readUint8Array(this.size - this.hdr_size)\n},\nBoxParser.ContainerBox.prototype.parse = function(t) {\n\tfor (; t.getPosition() < this.start + this.size;) {\n\t\tif ((e = BoxParser.parseOneBox(t, !1, this.size - (t.getPosition() - this.start))).code !== BoxParser.OK) return;\n\t\tvar e, i = e.box;\n\t\tthis.boxes.push(i),\n\t\tthis.subBoxNames && -1 != this.subBoxNames.indexOf(i.type) ? this[this.subBoxNames[this.subBoxNames.indexOf(i.type)] + \"s\"].push(i) : this[e = \"uuid\" !== i.type ? i.type: i.uuid] ? Log.warn(\"Box of type \" + e + \" already stored in field of this type\") : this[e] = i\n\t}\n},\nBoxParser.Box.prototype.parseLanguage = function(t) {\n\tthis.language = t.readUint16();\n\tt = [];\n\tt[0] = this.language >> 10 & 31,\n\tt[1] = this.language >> 5 & 31,\n\tt[2] = 31 & this.language,\n\tthis.languageString = String.fromCharCode(t[0] + 96, t[1] + 96, t[2] + 96)\n},\nBoxParser.SAMPLE_ENTRY_TYPE_VISUAL = \"Visual\",\nBoxParser.SAMPLE_ENTRY_TYPE_AUDIO = \"Audio\",\nBoxParser.SAMPLE_ENTRY_TYPE_HINT = \"Hint\",\nBoxParser.SAMPLE_ENTRY_TYPE_METADATA = \"Metadata\",\nBoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE = \"Subtitle\",\nBoxParser.SAMPLE_ENTRY_TYPE_SYSTEM = \"System\",\nBoxParser.SAMPLE_ENTRY_TYPE_TEXT = \"Text\",\nBoxParser.SampleEntry.prototype.parseHeader = function(t) {\n\tt.readUint8Array(6),\n\tthis.data_reference_index = t.readUint16(),\n\tthis.hdr_size += 8\n},\nBoxParser.SampleEntry.prototype.parse = function(t) {\n\tthis.parseHeader(t),\n\tthis.data = t.readUint8Array(this.size - this.hdr_size)\n},\nBoxParser.SampleEntry.prototype.parseDataAndRewind = function(t) {\n\tthis.parseHeader(t),\n\tthis.data = t.readUint8Array(this.size - this.hdr_size),\n\tthis.hdr_size -= 8,\n\tt.position -= this.size - this.hdr_size\n},\nBoxParser.SampleEntry.prototype.parseFooter = function(t) {\n\tBoxParser.ContainerBox.prototype.parse.call(this, t)\n},\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_HINT),\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA),\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE),\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SYSTEM),\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_TEXT),\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL,\nfunction(t) {\n\tvar e;\n\tthis.parseHeader(t),\n\tt.readUint16(),\n\tt.readUint16(),\n\tt.readUint32Array(3),\n\tthis.width = t.readUint16(),\n\tthis.height = t.readUint16(),\n\tthis.horizresolution = t.readUint32(),\n\tthis.vertresolution = t.readUint32(),\n\tt.readUint32(),\n\tthis.frame_count = t.readUint16(),\n\te = Math.min(31, t.readUint8()),\n\tthis.compressorname = t.readString(e),\n\te < 31 && t.readString(31 - e),\n\tthis.depth = t.readUint16(),\n\tt.readUint16(),\n\tthis.parseFooter(t)\n}),\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO,\nfunction(t) {\n\tthis.parseHeader(t),\n\tt.readUint32Array(2),\n\tthis.channel_count = t.readUint16(),\n\tthis.samplesize = t.readUint16(),\n\tt.readUint16(),\n\tt.readUint16(),\n\tthis.samplerate = t.readUint32() / 65536,\n\tthis.parseFooter(t)\n}),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc2\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc3\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc4\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"av01\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"dav1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"hvc1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"hev1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"hvt1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"lhe1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"dvh1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"dvhe\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvc1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvi1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvs1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvcN\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vp08\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vp09\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avs3\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"j2ki\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"mjp2\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"mjpg\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"uncv\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"mp4a\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"ac-3\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"ac-4\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"ec-3\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"Opus\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"mha1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"mha2\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"mhm1\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"mhm2\"),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"fLaC\"),\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"encv\"),\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \"enca\"),\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"encu\"),\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SYSTEM, \"encs\"),\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_TEXT, \"enct\"),\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"encm\"),\nBoxParser.createBoxCtor(\"a1lx\", \"AV1LayeredImageIndexingProperty\",\nfunction(t) {\n\tvar e = 16 * (1 + (1 & (1 & t.readUint8())));\n\tthis.layer_size = [];\n\tfor (var i = 0; i < 3; i++) this.layer_size[i] = 16 == e ? t.readUint16() : t.readUint32()\n}),\nBoxParser.createBoxCtor(\"a1op\", \"OperatingPointSelectorProperty\",\nfunction(t) {\n\tthis.op_index = t.readUint8()\n}),\nBoxParser.createFullBoxCtor(\"auxC\", \"AuxiliaryTypeProperty\",\nfunction(t) {\n\tthis.aux_type = t.readCString();\n\tvar e = this.size - this.hdr_size - (this.aux_type.length + 1);\n\tthis.aux_subtype = t.readUint8Array(e)\n}),\nBoxParser.createBoxCtor(\"av1C\", \"AV1CodecConfigurationBox\",\nfunction(t) {\n\tvar e = t.readUint8();\n\tif (1 == (e >> 7 & 1)) if (this.version = 127 & e, 1 === this.version) if (e = t.readUint8(), this.seq_profile = e >> 5 & 7, this.seq_level_idx_0 = 31 & e, e = t.readUint8(), this.seq_tier_0 = e >> 7 & 1, this.high_bitdepth = e >> 6 & 1, this.twelve_bit = e >> 5 & 1, this.monochrome = e >> 4 & 1, this.chroma_subsampling_x = e >> 3 & 1, this.chroma_subsampling_y = e >> 2 & 1, this.chroma_sample_position = 3 & e, e = t.readUint8(), this.reserved_1 = e >> 5 & 7, 0 === this.reserved_1) {\n\t\tif (this.initial_presentation_delay_present = e >> 4 & 1, 1 === this.initial_presentation_delay_present) this.initial_presentation_delay_minus_one = 15 & e;\n\t\telse if (this.reserved_2 = 15 & e, 0 !== this.reserved_2) return void Log.error(\"av1C reserved_2 parsing problem\");\n\t\te = this.size - this.hdr_size - 4;\n\t\tthis.configOBUs = t.readUint8Array(e)\n\t} else Log.error(\"av1C reserved_1 parsing problem\");\n\telse Log.error(\"av1C version \" + this.version + \" not supported\");\n\telse Log.error(\"av1C marker problem\")\n}),\nBoxParser.createBoxCtor(\"avcC\", \"AVCConfigurationBox\",\nfunction(t) {\n\tvar e, i;\n\tfor (this.configurationVersion = t.readUint8(), this.AVCProfileIndication = t.readUint8(), this.profile_compatibility = t.readUint8(), this.AVCLevelIndication = t.readUint8(), this.lengthSizeMinusOne = 3 & t.readUint8(), this.nb_SPS_nalus = 31 & t.readUint8(), i = this.size - this.hdr_size - 6, this.SPS = [], this.SPS.toString = function() {\n\t\treturn printPS(this)\n\t},\n\te = 0; e < this.nb_SPS_nalus; e++) this.SPS[e] = {},\n\tthis.SPS[e].length = t.readUint16(),\n\tthis.SPS[e].nalu = t.readUint8Array(this.SPS[e].length),\n\ti -= 2 + this.SPS[e].length;\n\tfor (this.nb_PPS_nalus = t.readUint8(), i--, this.PPS = [], this.PPS.toString = function() {\n\t\treturn printPS(this)\n\t},\n\te = 0; e < this.nb_PPS_nalus; e++) this.PPS[e] = {},\n\tthis.PPS[e].length = t.readUint16(),\n\tthis.PPS[e].nalu = t.readUint8Array(this.PPS[e].length),\n\ti -= 2 + this.PPS[e].length;\n\t0 < i && (this.ext = t.readUint8Array(i))\n}),\nBoxParser.createBoxCtor(\"btrt\", \"BitRateBox\",\nfunction(t) {\n\tthis.bufferSizeDB = t.readUint32(),\n\tthis.maxBitrate = t.readUint32(),\n\tthis.avgBitrate = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"ccst\", \"CodingConstraintsBox\",\nfunction(t) {\n\tvar e = t.readUint8();\n\tthis.all_ref_pics_intra = 128 == (128 & e),\n\tthis.intra_pred_used = 64 == (64 & e),\n\tthis.max_ref_per_pic = (63 & e) >> 2,\n\tt.readUint24()\n}),\nBoxParser.createBoxCtor(\"cdef\", \"ComponentDefinitionBox\",\nfunction(t) {\n\tvar e;\n\tfor (this.channel_count = t.readUint16(), this.channel_indexes = [], this.channel_types = [], this.channel_associations = [], e = 0; e < this.channel_count; e++) this.channel_indexes.push(t.readUint16()),\n\tthis.channel_types.push(t.readUint16()),\n\tthis.channel_associations.push(t.readUint16())\n}),\nBoxParser.createBoxCtor(\"clap\", \"CleanApertureBox\",\nfunction(t) {\n\tthis.cleanApertureWidthN = t.readUint32(),\n\tthis.cleanApertureWidthD = t.readUint32(),\n\tthis.cleanApertureHeightN = t.readUint32(),\n\tthis.cleanApertureHeightD = t.readUint32(),\n\tthis.horizOffN = t.readUint32(),\n\tthis.horizOffD = t.readUint32(),\n\tthis.vertOffN = t.readUint32(),\n\tthis.vertOffD = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"clli\", \"ContentLightLevelBox\",\nfunction(t) {\n\tthis.max_content_light_level = t.readUint16(),\n\tthis.max_pic_average_light_level = t.readUint16()\n}),\nBoxParser.createFullBoxCtor(\"cmex\", \"CameraExtrinsicMatrixProperty\",\nfunction(t) {\n\t1 & this.flags && (this.pos_x = t.readInt32()),\n\t2 & this.flags && (this.pos_y = t.readInt32()),\n\t4 & this.flags && (this.pos_z = t.readInt32()),\n\t8 & this.flags && (0 == this.version ? 16 & this.flags ? (this.quat_x = t.readInt32(), this.quat_y = t.readInt32(), this.quat_z = t.readInt32()) : (this.quat_x = t.readInt16(), this.quat_y = t.readInt16(), this.quat_z = t.readInt16()) : this.version),\n\t32 & this.flags && (this.id = t.readUint32())\n}),\nBoxParser.createFullBoxCtor(\"cmin\", \"CameraIntrinsicMatrixProperty\",\nfunction(t) {\n\tthis.focal_length_x = t.readInt32(),\n\tthis.principal_point_x = t.readInt32(),\n\tthis.principal_point_y = t.readInt32(),\n\t1 & this.flags && (this.focal_length_y = t.readInt32(), this.skew_factor = t.readInt32())\n}),\nBoxParser.createBoxCtor(\"cmpd\", \"ComponentDefinitionBox\",\nfunction(t) {\n\tfor (this.component_count = t.readUint32(), this.component_types = [], this.component_type_urls = [], i = 0; i < this.component_count; i++) {\n\t\tvar e = t.readUint16();\n\t\tthis.component_types.push(e),\n\t\t32768 <= e && this.component_type_urls.push(t.readCString())\n\t}\n}),\nBoxParser.createFullBoxCtor(\"co64\", \"ChunkLargeOffsetBox\",\nfunction(t) {\n\tvar e, i = t.readUint32();\n\tif (this.chunk_offsets = [], 0 === this.version) for (e = 0; e < i; e++) this.chunk_offsets.push(t.readUint64())\n}),\nBoxParser.createFullBoxCtor(\"CoLL\", \"ContentLightLevelBox\",\nfunction(t) {\n\tthis.maxCLL = t.readUint16(),\n\tthis.maxFALL = t.readUint16()\n}),\nBoxParser.createBoxCtor(\"colr\", \"ColourInformationBox\",\nfunction(t) {\n\tvar e;\n\tthis.colour_type = t.readString(4),\n\t\"nclx\" === this.colour_type ? (this.colour_primaries = t.readUint16(), this.transfer_characteristics = t.readUint16(), this.matrix_coefficients = t.readUint16(), e = t.readUint8(), this.full_range_flag = e >> 7) : \"rICC\" !== this.colour_type && \"prof\" !== this.colour_type || (this.ICC_profile = t.readUint8Array(this.size - 4))\n}),\nBoxParser.createFullBoxCtor(\"cprt\", \"CopyrightBox\",\nfunction(t) {\n\tthis.parseLanguage(t),\n\tthis.notice = t.readCString()\n}),\nBoxParser.createFullBoxCtor(\"cslg\", \"CompositionToDecodeBox\",\nfunction(t) {\n\t0 === this.version && (this.compositionToDTSShift = t.readInt32(), this.leastDecodeToDisplayDelta = t.readInt32(), this.greatestDecodeToDisplayDelta = t.readInt32(), this.compositionStartTime = t.readInt32(), this.compositionEndTime = t.readInt32())\n}),\nBoxParser.createFullBoxCtor(\"ctts\", \"CompositionOffsetBox\",\nfunction(t) {\n\tvar e, i = t.readUint32();\n\tif (this.sample_counts = [], this.sample_offsets = [], 0 === this.version) for (e = 0; e < i; e++) {\n\t\tthis.sample_counts.push(t.readUint32());\n\t\tvar r = t.readInt32();\n\t\tr < 0 && Log.warn(\"BoxParser\", \"ctts box uses negative values without using version 1\"),\n\t\tthis.sample_offsets.push(r)\n\t} else if (1 == this.version) for (e = 0; e < i; e++) this.sample_counts.push(t.readUint32()),\n\tthis.sample_offsets.push(t.readInt32())\n}),\nBoxParser.createBoxCtor(\"dac3\", \"AC3SpecificBox\",\nfunction(t) {\n\tvar e = t.readUint8(),\n\ti = t.readUint8(),\n\tt = t.readUint8();\n\tthis.fscod = e >> 6,\n\tthis.bsid = e >> 1 & 31,\n\tthis.bsmod = (1 & e) << 2 | i >> 6 & 3,\n\tthis.acmod = i >> 3 & 7,\n\tthis.lfeon = i >> 2 & 1,\n\tthis.bit_rate_code = 3 & i | t >> 5 & 7\n}),\nBoxParser.createBoxCtor(\"dec3\", \"EC3SpecificBox\",\nfunction(t) {\n\tvar e = t.readUint16();\n\tthis.data_rate = e >> 3,\n\tthis.num_ind_sub = 7 & e,\n\tthis.ind_subs = [];\n\tfor (var i = 0; i < this.num_ind_sub + 1; i++) {\n\t\tvar r = {};\n\t\tthis.ind_subs.push(r);\n\t\tvar s = t.readUint8(),\n\t\ta = t.readUint8(),\n\t\tn = t.readUint8();\n\t\tr.fscod = s >> 6,\n\t\tr.bsid = s >> 1 & 31,\n\t\tr.bsmod = (1 & s) << 4 | a >> 4 & 15,\n\t\tr.acmod = a >> 1 & 7,\n\t\tr.lfeon = 1 & a,\n\t\tr.num_dep_sub = n >> 1 & 15,\n\t\t0 < r.num_dep_sub && (r.chan_loc = (1 & n) << 8 | t.readUint8())\n\t}\n}),\nBoxParser.createFullBoxCtor(\"dfLa\", \"FLACSpecificBox\",\nfunction(t) {\n\tfor (var e = [], i = [\"STREAMINFO\", \"PADDING\", \"APPLICATION\", \"SEEKTABLE\", \"VORBIS_COMMENT\", \"CUESHEET\", \"PICTURE\", \"RESERVED\"];;) {\n\t\tvar r = t.readUint8(),\n\t\ts = Math.min(127 & r, i.length - 1);\n\t\tif (s ? t.readUint8Array(t.readUint24()) : (t.readUint8Array(13), this.samplerate = t.readUint32() >> 12, t.readUint8Array(20)), e.push(i[s]), 128 & r) break\n\t}\n\tthis.numMetadataBlocks = e.length + \" (\" + e.join(\", \") + \")\"\n}),\nBoxParser.createBoxCtor(\"dimm\", \"hintimmediateBytesSent\",\nfunction(t) {\n\tthis.bytessent = t.readUint64()\n}),\nBoxParser.createBoxCtor(\"dmax\", \"hintlongestpacket\",\nfunction(t) {\n\tthis.time = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"dmed\", \"hintmediaBytesSent\",\nfunction(t) {\n\tthis.bytessent = t.readUint64()\n}),\nBoxParser.createBoxCtor(\"dOps\", \"OpusSpecificBox\",\nfunction(t) {\n\tif (this.Version = t.readUint8(), this.OutputChannelCount = t.readUint8(), this.PreSkip = t.readUint16(), this.InputSampleRate = t.readUint32(), this.OutputGain = t.readInt16(), this.ChannelMappingFamily = t.readUint8(), 0 !== this.ChannelMappingFamily) {\n\t\tthis.StreamCount = t.readUint8(),\n\t\tthis.CoupledCount = t.readUint8(),\n\t\tthis.ChannelMapping = [];\n\t\tfor (var e = 0; e < this.OutputChannelCount; e++) this.ChannelMapping[e] = t.readUint8()\n\t}\n}),\nBoxParser.createFullBoxCtor(\"dref\", \"DataReferenceBox\",\nfunction(t) {\n\tvar e;\n\tthis.entries = [];\n\tfor (var i = t.readUint32(), r = 0; r < i; r++) {\n\t\tif ((e = BoxParser.parseOneBox(t, !1, this.size - (t.getPosition() - this.start))).code !== BoxParser.OK) return;\n\t\te = e.box,\n\t\tthis.entries.push(e)\n\t}\n}),\nBoxParser.createBoxCtor(\"drep\", \"hintrepeatedBytesSent\",\nfunction(t) {\n\tthis.bytessent = t.readUint64()\n}),\nBoxParser.createFullBoxCtor(\"elng\", \"ExtendedLanguageBox\",\nfunction(t) {\n\tthis.extended_language = t.readString(this.size - this.hdr_size)\n}),\nBoxParser.createFullBoxCtor(\"elst\", \"EditListBox\",\nfunction(t) {\n\tthis.entries = [];\n\tfor (var e = t.readUint32(), i = 0; i < e; i++) {\n\t\tvar r = {};\n\t\tthis.entries.push(r),\n\t\t1 === this.version ? (r.segment_duration = t.readUint64(), r.media_time = t.readInt64()) : (r.segment_duration = t.readUint32(), r.media_time = t.readInt32()),\n\t\tr.media_rate_integer = t.readInt16(),\n\t\tr.media_rate_fraction = t.readInt16()\n\t}\n}),\nBoxParser.createFullBoxCtor(\"emsg\", \"EventMessageBox\",\nfunction(t) {\n\t1 == this.version ? (this.timescale = t.readUint32(), this.presentation_time = t.readUint64(), this.event_duration = t.readUint32(), this.id = t.readUint32(), this.scheme_id_uri = t.readCString(), this.value = t.readCString()) : (this.scheme_id_uri = t.readCString(), this.value = t.readCString(), this.timescale = t.readUint32(), this.presentation_time_delta = t.readUint32(), this.event_duration = t.readUint32(), this.id = t.readUint32());\n\tvar e = this.size - this.hdr_size - (16 + (this.scheme_id_uri.length + 1) + (this.value.length + 1));\n\t1 == this.version && (e -= 4),\n\tthis.message_data = t.readUint8Array(e)\n}),\nBoxParser.createEntityToGroupCtor = function(e, r) {\n\tBoxParser[e + \"Box\"] = function(t) {\n\t\tBoxParser.FullBox.call(this, e, t)\n\t},\n\tBoxParser[e + \"Box\"].prototype = new BoxParser.FullBox,\n\tBoxParser[e + \"Box\"].prototype.parse = function(t) {\n\t\tif (this.parseFullHeader(t), r) r.call(this, t);\n\t\telse for (this.group_id = t.readUint32(), this.num_entities_in_group = t.readUint32(), this.entity_ids = [], i = 0; i < this.num_entities_in_group; i++) {\n\t\t\tvar e = t.readUint32();\n\t\t\tthis.entity_ids.push(e)\n\t\t}\n\t}\n},\nBoxParser.createEntityToGroupCtor(\"aebr\"),\nBoxParser.createEntityToGroupCtor(\"afbr\"),\nBoxParser.createEntityToGroupCtor(\"albc\"),\nBoxParser.createEntityToGroupCtor(\"altr\"),\nBoxParser.createEntityToGroupCtor(\"brst\"),\nBoxParser.createEntityToGroupCtor(\"dobr\"),\nBoxParser.createEntityToGroupCtor(\"eqiv\"),\nBoxParser.createEntityToGroupCtor(\"favc\"),\nBoxParser.createEntityToGroupCtor(\"fobr\"),\nBoxParser.createEntityToGroupCtor(\"iaug\"),\nBoxParser.createEntityToGroupCtor(\"pano\"),\nBoxParser.createEntityToGroupCtor(\"slid\"),\nBoxParser.createEntityToGroupCtor(\"ster\"),\nBoxParser.createEntityToGroupCtor(\"tsyn\"),\nBoxParser.createEntityToGroupCtor(\"wbbr\"),\nBoxParser.createEntityToGroupCtor(\"prgr\"),\nBoxParser.createEntityToGroupCtor(\"pymd\",\nfunction(t) {\n\tthis.group_id = t.readUint32(),\n\tthis.num_entities_in_group = t.readUint32(),\n\tthis.entity_ids = [];\n\tfor (var e = 0; e < this.num_entities_in_group; e++) {\n\t\tvar i = t.readUint32();\n\t\tthis.entity_ids.push(i)\n\t}\n\tfor (this.tile_size_x = t.readUint16(), this.tile_size_y = t.readUint16(), this.layer_binning = [], this.tiles_in_layer_column_minus1 = [], this.tiles_in_layer_row_minus1 = [], e = 0; e < this.num_entities_in_group; e++) this.layer_binning[e] = t.readUint16(),\n\tthis.tiles_in_layer_row_minus1[e] = t.readUint16(),\n\tthis.tiles_in_layer_column_minus1[e] = t.readUint16()\n}),\nBoxParser.createFullBoxCtor(\"esds\", \"ElementaryStreamDescriptorBox\",\nfunction(t) {\n\tvar e = t.readUint8Array(this.size - this.hdr_size);\n\tvoid 0 !== MPEG4DescriptorParser && (t = new MPEG4DescriptorParser, this.esd = t.parseOneDescriptor(new DataStream(e.buffer, 0, DataStream.BIG_ENDIAN)))\n}),\nBoxParser.createBoxCtor(\"fiel\", \"FieldHandlingBox\",\nfunction(t) {\n\tthis.fieldCount = t.readUint8(),\n\tthis.fieldOrdering = t.readUint8()\n}),\nBoxParser.createBoxCtor(\"frma\", \"OriginalFormatBox\",\nfunction(t) {\n\tthis.data_format = t.readString(4)\n}),\nBoxParser.createBoxCtor(\"ftyp\", \"FileTypeBox\",\nfunction(t) {\n\tvar e = this.size - this.hdr_size;\n\tthis.major_brand = t.readString(4),\n\tthis.minor_version = t.readUint32(),\n\te -= 8,\n\tthis.compatible_brands = [];\n\tfor (var i = 0; 4 <= e;) this.compatible_brands[i] = t.readString(4),\n\te -= 4,\n\ti++\n}),\nBoxParser.createFullBoxCtor(\"hdlr\", \"HandlerBox\",\nfunction(t) {\n\t0 === this.version && (t.readUint32(), this.handler = t.readString(4), t.readUint32Array(3), this.name = t.readString(this.size - this.hdr_size - 20), \"\\0\" === this.name[this.name.length - 1] && (this.name = this.name.slice(0, -1)))\n}),\nBoxParser.createBoxCtor(\"hvcC\", \"HEVCConfigurationBox\",\nfunction(t) {\n\tvar e, i;\n\tthis.configurationVersion = t.readUint8(),\n\ti = t.readUint8(),\n\tthis.general_profile_space = i >> 6,\n\tthis.general_tier_flag = (32 & i) >> 5,\n\tthis.general_profile_idc = 31 & i,\n\tthis.general_profile_compatibility = t.readUint32(),\n\tthis.general_constraint_indicator = t.readUint8Array(6),\n\tthis.general_level_idc = t.readUint8(),\n\tthis.min_spatial_segmentation_idc = 4095 & t.readUint16(),\n\tthis.parallelismType = 3 & t.readUint8(),\n\tthis.chroma_format_idc = 3 & t.readUint8(),\n\tthis.bit_depth_luma_minus8 = 7 & t.readUint8(),\n\tthis.bit_depth_chroma_minus8 = 7 & t.readUint8(),\n\tthis.avgFrameRate = t.readUint16(),\n\ti = t.readUint8(),\n\tthis.constantFrameRate = i >> 6,\n\tthis.numTemporalLayers = (13 & i) >> 3,\n\tthis.temporalIdNested = (4 & i) >> 2,\n\tthis.lengthSizeMinusOne = 3 & i,\n\tthis.nalu_arrays = [],\n\tthis.nalu_arrays.toString = function() {\n\t\tvar t = \"<table class='inner-table'>\";\n\t\tt += \"<thead><tr><th>completeness</th><th>nalu_type</th><th>nalu_data</th></tr></thead>\",\n\t\tt += \"<tbody>\";\n\t\tfor (var e = 0; e < this.length; e++) {\n\t\t\tvar i = this[e];\n\t\t\tt += \"<tr>\",\n\t\t\tt += \"<td rowspan='\" + i.length + \"'>\" + i.completeness + \"</td>\",\n\t\t\tt += \"<td rowspan='\" + i.length + \"'>\" + i.nalu_type + \"</td>\";\n\t\t\tfor (var r = 0; r < i.length; r++) 0 !== r && (t += \"<tr>\"),\n\t\t\tt += \"<td>\",\n\t\t\tt += i[r].data.reduce(function(t, e) {\n\t\t\t\treturn t + e.toString(16).padStart(2, \"0\")\n\t\t\t},\n\t\t\t\"0x\"),\n\t\t\tt += \"</td></tr>\"\n\t\t}\n\t\treturn t += \"</tbody></table>\"\n\t};\n\tfor (var r = t.readUint8(), s = 0; s < r; s++) {\n\t\tvar a = [];\n\t\tthis.nalu_arrays.push(a),\n\t\ti = t.readUint8(),\n\t\ta.completeness = (128 & i) >> 7,\n\t\ta.nalu_type = 63 & i;\n\t\tfor (var n = t.readUint16(), o = 0; o < n; o++) {\n\t\t\tvar h = {};\n\t\t\ta.push(h),\n\t\t\te = t.readUint16(),\n\t\t\th.data = t.readUint8Array(e)\n\t\t}\n\t}\n}),\nBoxParser.createFullBoxCtor(\"iinf\", \"ItemInfoBox\",\nfunction(t) {\n\tvar e;\n\t0 === this.version ? this.entry_count = t.readUint16() : this.entry_count = t.readUint32(),\n\tthis.item_infos = [];\n\tfor (var i = 0; i < this.entry_count; i++) {\n\t\tif ((e = BoxParser.parseOneBox(t, !1, this.size - (t.getPosition() - this.start))).code !== BoxParser.OK) return;\n\t\t\"infe\" !== e.box.type && Log.error(\"BoxParser\", \"Expected 'infe' box, got \" + e.box.type),\n\t\tthis.item_infos[i] = e.box\n\t}\n}),\nBoxParser.createFullBoxCtor(\"iloc\", \"ItemLocationBox\",\nfunction(t) {\n\tvar e = t.readUint8();\n\tthis.offset_size = e >> 4 & 15,\n\tthis.length_size = 15 & e,\n\te = t.readUint8(),\n\tthis.base_offset_size = e >> 4 & 15,\n\t1 === this.version || 2 === this.version ? this.index_size = 15 & e: this.index_size = 0,\n\tthis.items = [];\n\tvar i = 0;\n\tif (this.version < 2) i = t.readUint16();\n\telse {\n\t\tif (2 !== this.version) throw \"version of iloc box not supported\";\n\t\ti = t.readUint32()\n\t}\n\tfor (var r = 0; r < i; r++) {\n\t\tvar s = {};\n\t\tif (this.items.push(s), this.version < 2) s.item_ID = t.readUint16();\n\t\telse {\n\t\t\tif (2 !== this.version) throw \"version of iloc box not supported\";\n\t\t\ts.item_ID = t.readUint32()\n\t\t}\n\t\tswitch (1 === this.version || 2 === this.version ? s.construction_method = 15 & t.readUint16() : s.construction_method = 0, s.data_reference_index = t.readUint16(), this.base_offset_size) {\n\t\tcase 0:\n\t\t\ts.base_offset = 0;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\ts.base_offset = t.readUint32();\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\ts.base_offset = t.readUint64();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow \"Error reading base offset size\"\n\t\t}\n\t\tvar a = t.readUint16();\n\t\ts.extents = [];\n\t\tfor (var n = 0; n < a; n++) {\n\t\t\tvar o = {};\n\t\t\tif (s.extents.push(o), 1 === this.version || 2 === this.version) switch (this.index_size) {\n\t\t\tcase 0:\n\t\t\t\to.extent_index = 0;\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\to.extent_index = t.readUint32();\n\t\t\t\tbreak;\n\t\t\tcase 8:\n\t\t\t\to.extent_index = t.readUint64();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow \"Error reading extent index\"\n\t\t\t}\n\t\t\tswitch (this.offset_size) {\n\t\t\tcase 0:\n\t\t\t\to.extent_offset = 0;\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\to.extent_offset = t.readUint32();\n\t\t\t\tbreak;\n\t\t\tcase 8:\n\t\t\t\to.extent_offset = t.readUint64();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow \"Error reading extent index\"\n\t\t\t}\n\t\t\tswitch (this.length_size) {\n\t\t\tcase 0:\n\t\t\t\to.extent_length = 0;\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\to.extent_length = t.readUint32();\n\t\t\t\tbreak;\n\t\t\tcase 8:\n\t\t\t\to.extent_length = t.readUint64();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow \"Error reading extent index\"\n\t\t\t}\n\t\t}\n\t}\n}),\nBoxParser.createBoxCtor(\"imir\", \"ImageMirror\",\nfunction(t) {\n\tt = t.readUint8();\n\tthis.reserved = t >> 7,\n\tthis.axis = 1 & t\n}),\nBoxParser.createFullBoxCtor(\"infe\", \"ItemInfoEntry\",\nfunction(t) {\n\treturn 0 !== this.version && 1 !== this.version || (this.item_ID = t.readUint16(), this.item_protection_index = t.readUint16(), this.item_name = t.readCString(), this.content_type = t.readCString(), this.content_encoding = t.readCString()),\n\t1 === this.version ? (this.extension_type = t.readString(4), Log.warn(\"BoxParser\", \"Cannot parse extension type\"), void t.seek(this.start + this.size)) : void(2 <= this.version && (2 === this.version ? this.item_ID = t.readUint16() : 3 === this.version && (this.item_ID = t.readUint32()), this.item_protection_index = t.readUint16(), this.item_type = t.readString(4), this.item_name = t.readCString(), \"mime\" === this.item_type ? (this.content_type = t.readCString(), this.content_encoding = t.readCString()) : \"uri \" === this.item_type && (this.item_uri_type = t.readCString())))\n}),\nBoxParser.createFullBoxCtor(\"ipma\", \"ItemPropertyAssociationBox\",\nfunction(t) {\n\tvar e, i;\n\tfor (entry_count = t.readUint32(), this.associations = [], e = 0; e < entry_count; e++) {\n\t\tvar r = {};\n\t\tthis.associations.push(r),\n\t\tthis.version < 1 ? r.id = t.readUint16() : r.id = t.readUint32();\n\t\tvar s = t.readUint8();\n\t\tfor (r.props = [], i = 0; i < s; i++) {\n\t\t\tvar a = t.readUint8(),\n\t\t\tn = {};\n\t\t\tr.props.push(n),\n\t\t\tn.essential = (128 & a) >> 7 == 1,\n\t\t\t1 & this.flags ? n.property_index = (127 & a) << 8 | t.readUint8() : n.property_index = 127 & a\n\t\t}\n\t}\n}),\nBoxParser.createFullBoxCtor(\"iref\", \"ItemReferenceBox\",\nfunction(t) {\n\tvar e;\n\tfor (this.references = []; t.getPosition() < this.start + this.size;) {\n\t\tif ((e = BoxParser.parseOneBox(t, !0, this.size - (t.getPosition() - this.start))).code !== BoxParser.OK) return; (e = new(0 === this.version ? BoxParser.SingleItemTypeReferenceBox: BoxParser.SingleItemTypeReferenceBoxLarge)(e.type, e.size, e.hdr_size, e.start)).write === BoxParser.Box.prototype.write && \"mdat\" !== e.type && (Log.warn(\"BoxParser\", e.type + \" box writing not yet implemented, keeping unparsed data in memory for later write\"), e.parseDataAndRewind(t)),\n\t\te.parse(t),\n\t\tthis.references.push(e)\n\t}\n}),\nBoxParser.createBoxCtor(\"irot\", \"ImageRotation\",\nfunction(t) {\n\tthis.angle = 3 & t.readUint8()\n}),\nBoxParser.createFullBoxCtor(\"ispe\", \"ImageSpatialExtentsProperty\",\nfunction(t) {\n\tthis.image_width = t.readUint32(),\n\tthis.image_height = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"kind\", \"KindBox\",\nfunction(t) {\n\tthis.schemeURI = t.readCString(),\n\tthis.value = t.readCString()\n}),\nBoxParser.createFullBoxCtor(\"leva\", \"LevelAssignmentBox\",\nfunction(t) {\n\tvar e = t.readUint8();\n\tthis.levels = [];\n\tfor (var i = 0; i < e; i++) {\n\t\tvar r = {}; (this.levels[i] = r).track_ID = t.readUint32();\n\t\tvar s = t.readUint8();\n\t\tswitch (r.padding_flag = s >> 7, r.assignment_type = 127 & s, r.assignment_type) {\n\t\tcase 0:\n\t\t\tr.grouping_type = t.readString(4);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tr.grouping_type = t.readString(4),\n\t\t\tr.grouping_type_parameter = t.readUint32();\n\t\t\tbreak;\n\t\tcase 2:\n\t\tcase 3:\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tr.sub_track_id = t.readUint32();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tLog.warn(\"BoxParser\", \"Unknown leva assignement type\")\n\t\t}\n\t}\n}),\nBoxParser.createBoxCtor(\"lhvC\", \"LHEVCConfigurationBox\",\nfunction(t) {\n\tvar e;\n\tthis.configurationVersion = t.readUint8(),\n\tthis.min_spatial_segmentation_idc = 4095 & t.readUint16(),\n\tthis.parallelismType = 3 & t.readUint8(),\n\te = t.readUint8(),\n\tthis.numTemporalLayers = (13 & e) >> 3,\n\tthis.temporalIdNested = (4 & e) >> 2,\n\tthis.lengthSizeMinusOne = 3 & e,\n\tthis.nalu_arrays = [],\n\tthis.nalu_arrays.toString = function() {\n\t\tvar t = \"<table class='inner-table'>\";\n\t\tt += \"<thead><tr><th>completeness</th><th>nalu_type</th><th>nalu_data</th></tr></thead>\",\n\t\tt += \"<tbody>\";\n\t\tfor (var e = 0; e < this.length; e++) {\n\t\t\tvar i = this[e];\n\t\t\tt += \"<tr>\",\n\t\t\tt += \"<td rowspan='\" + i.length + \"'>\" + i.completeness + \"</td>\",\n\t\t\tt += \"<td rowspan='\" + i.length + \"'>\" + i.nalu_type + \"</td>\";\n\t\t\tfor (var r = 0; r < i.length; r++) 0 !== r && (t += \"<tr>\"),\n\t\t\tt += \"<td>\",\n\t\t\tt += i[r].data.reduce(function(t, e) {\n\t\t\t\treturn t + e.toString(16).padStart(2, \"0\")\n\t\t\t},\n\t\t\t\"0x\"),\n\t\t\tt += \"</td></tr>\"\n\t\t}\n\t\treturn t += \"</tbody></table>\"\n\t};\n\tfor (var i = t.readUint8(), r = 0; r < i; r++) {\n\t\tvar s = [];\n\t\tthis.nalu_arrays.push(s),\n\t\te = t.readUint8(),\n\t\ts.completeness = (128 & e) >> 7,\n\t\ts.nalu_type = 63 & e;\n\t\tfor (var a = t.readUint16(), n = 0; n < a; n++) {\n\t\t\tvar o = {};\n\t\t\ts.push(o);\n\t\t\tvar h = t.readUint16();\n\t\t\to.data = t.readUint8Array(h)\n\t\t}\n\t}\n}),\nBoxParser.createBoxCtor(\"lsel\", \"LayerSelectorProperty\",\nfunction(t) {\n\tthis.layer_id = t.readUint16()\n}),\nBoxParser.createBoxCtor(\"maxr\", \"hintmaxrate\",\nfunction(t) {\n\tthis.period = t.readUint32(),\n\tthis.bytes = t.readUint32()\n}),\nColorPoint.prototype.toString = function() {\n\treturn \"(\" + this.x + \",\" + this.y + \")\"\n},\nBoxParser.createBoxCtor(\"mdcv\", \"MasteringDisplayColourVolumeBox\",\nfunction(t) {\n\tthis.display_primaries = [],\n\tthis.display_primaries[0] = new ColorPoint(t.readUint16(), t.readUint16()),\n\tthis.display_primaries[1] = new ColorPoint(t.readUint16(), t.readUint16()),\n\tthis.display_primaries[2] = new ColorPoint(t.readUint16(), t.readUint16()),\n\tthis.white_point = new ColorPoint(t.readUint16(), t.readUint16()),\n\tthis.max_display_mastering_luminance = t.readUint32(),\n\tthis.min_display_mastering_luminance = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"mdhd\", \"MediaHeaderBox\",\nfunction(t) {\n\t1 == this.version ? (this.creation_time = t.readUint64(), this.modification_time = t.readUint64(), this.timescale = t.readUint32(), this.duration = t.readUint64()) : (this.creation_time = t.readUint32(), this.modification_time = t.readUint32(), this.timescale = t.readUint32(), this.duration = t.readUint32()),\n\tthis.parseLanguage(t),\n\tt.readUint16()\n}),\nBoxParser.createFullBoxCtor(\"mehd\", \"MovieExtendsHeaderBox\",\nfunction(t) {\n\t1 & this.flags && (Log.warn(\"BoxParser\", \"mehd box incorrectly uses flags set to 1, converting version to 1\"), this.version = 1),\n\t1 == this.version ? this.fragment_duration = t.readUint64() : this.fragment_duration = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"meta\", \"MetaBox\",\nfunction(t) {\n\tthis.boxes = [],\n\tBoxParser.ContainerBox.prototype.parse.call(this, t)\n}),\nBoxParser.createFullBoxCtor(\"mfhd\", \"MovieFragmentHeaderBox\",\nfunction(t) {\n\tthis.sequence_number = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"mfro\", \"MovieFragmentRandomAccessOffsetBox\",\nfunction(t) {\n\tthis._size = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"mskC\", \"MaskConfigurationProperty\",\nfunction(t) {\n\tthis.bits_per_pixel = t.readUint8()\n}),\nBoxParser.createFullBoxCtor(\"mvhd\", \"MovieHeaderBox\",\nfunction(t) {\n\t1 == this.version ? (this.creation_time = t.readUint64(), this.modification_time = t.readUint64(), this.timescale = t.readUint32(), this.duration = t.readUint64()) : (this.creation_time = t.readUint32(), this.modification_time = t.readUint32(), this.timescale = t.readUint32(), this.duration = t.readUint32()),\n\tthis.rate = t.readUint32(),\n\tthis.volume = t.readUint16() >> 8,\n\tt.readUint16(),\n\tt.readUint32Array(2),\n\tthis.matrix = t.readUint32Array(9),\n\tt.readUint32Array(6),\n\tthis.next_track_id = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"npck\", \"hintPacketsSent\",\nfunction(t) {\n\tthis.packetssent = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"nump\", \"hintPacketsSent\",\nfunction(t) {\n\tthis.packetssent = t.readUint64()\n}),\nBoxParser.createFullBoxCtor(\"padb\", \"PaddingBitsBox\",\nfunction(t) {\n\tvar e = t.readUint32();\n\tthis.padbits = [];\n\tfor (var i = 0; i < Math.floor((e + 1) / 2); i++) this.padbits = t.readUint8()\n}),\nBoxParser.createBoxCtor(\"pasp\", \"PixelAspectRatioBox\",\nfunction(t) {\n\tthis.hSpacing = t.readUint32(),\n\tthis.vSpacing = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"payl\", \"CuePayloadBox\",\nfunction(t) {\n\tthis.text = t.readString(this.size - this.hdr_size)\n}),\nBoxParser.createBoxCtor(\"payt\", \"hintpayloadID\",\nfunction(t) {\n\tthis.payloadID = t.readUint32();\n\tvar e = t.readUint8();\n\tthis.rtpmap_string = t.readString(e)\n}),\nBoxParser.createFullBoxCtor(\"pdin\", \"ProgressiveDownloadInfoBox\",\nfunction(t) {\n\tvar e = (this.size - this.hdr_size) / 8;\n\tthis.rate = [],\n\tthis.initial_delay = [];\n\tfor (var i = 0; i < e; i++) this.rate[i] = t.readUint32(),\n\tthis.initial_delay[i] = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"pitm\", \"PrimaryItemBox\",\nfunction(t) {\n\t0 === this.version ? this.item_id = t.readUint16() : this.item_id = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"pixi\", \"PixelInformationProperty\",\nfunction(t) {\n\tvar e;\n\tfor (this.num_channels = t.readUint8(), this.bits_per_channels = [], e = 0; e < this.num_channels; e++) this.bits_per_channels[e] = t.readUint8()\n}),\nBoxParser.createBoxCtor(\"pmax\", \"hintlargestpacket\",\nfunction(t) {\n\tthis.bytes = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"prdi\", \"ProgressiveDerivedImageItemInformationProperty\",\nfunction(t) {\n\tif (this.step_count = t.readUint16(), this.item_count = [], 2 & this.flags) for (var e = 0; e < this.step_count; e++) this.item_count[e] = t.readUint16()\n}),\nBoxParser.createFullBoxCtor(\"prft\", \"ProducerReferenceTimeBox\",\nfunction(t) {\n\tthis.ref_track_id = t.readUint32(),\n\tthis.ntp_timestamp = t.readUint64(),\n\t0 === this.version ? this.media_time = t.readUint32() : this.media_time = t.readUint64()\n}),\nBoxParser.createFullBoxCtor(\"pssh\", \"ProtectionSystemSpecificHeaderBox\",\nfunction(t) {\n\tif (this.system_id = BoxParser.parseHex16(t), 0 < this.version) {\n\t\tvar e = t.readUint32();\n\t\tthis.kid = [];\n\t\tfor (var i = 0; i < e; i++) this.kid[i] = BoxParser.parseHex16(t)\n\t}\n\tvar r = t.readUint32();\n\t0 < r && (this.data = t.readUint8Array(r))\n}),\nBoxParser.createFullBoxCtor(\"clef\", \"TrackCleanApertureDimensionsBox\",\nfunction(t) {\n\tthis.width = t.readUint32(),\n\tthis.height = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"enof\", \"TrackEncodedPixelsDimensionsBox\",\nfunction(t) {\n\tthis.width = t.readUint32(),\n\tthis.height = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"prof\", \"TrackProductionApertureDimensionsBox\",\nfunction(t) {\n\tthis.width = t.readUint32(),\n\tthis.height = t.readUint32()\n}),\nBoxParser.createContainerBoxCtor(\"tapt\", \"TrackApertureModeDimensionsBox\", null, [\"clef\", \"prof\", \"enof\"]),\nBoxParser.createBoxCtor(\"rtp \", \"rtpmoviehintinformation\",\nfunction(t) {\n\tthis.descriptionformat = t.readString(4),\n\tthis.sdptext = t.readString(this.size - this.hdr_size - 4)\n}),\nBoxParser.createFullBoxCtor(\"saio\", \"SampleAuxiliaryInformationOffsetsBox\",\nfunction(t) {\n\t1 & this.flags && (this.aux_info_type = t.readString(4), this.aux_info_type_parameter = t.readUint32());\n\tvar e = t.readUint32();\n\tthis.offset = [];\n\tfor (var i = 0; i < e; i++) 0 === this.version ? this.offset[i] = t.readUint32() : this.offset[i] = t.readUint64()\n}),\nBoxParser.createFullBoxCtor(\"saiz\", \"SampleAuxiliaryInformationSizesBox\",\nfunction(t) {\n\tif (1 & this.flags && (this.aux_info_type = t.readString(4), this.aux_info_type_parameter = t.readUint32()), this.default_sample_info_size = t.readUint8(), this.sample_count = t.readUint32(), this.sample_info_size = [], 0 === this.default_sample_info_size) for (var e = 0; e < this.sample_count; e++) this.sample_info_size[e] = t.readUint8()\n}),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"mett\",\nfunction(t) {\n\tthis.parseHeader(t),\n\tthis.content_encoding = t.readCString(),\n\tthis.mime_format = t.readCString(),\n\tthis.parseFooter(t)\n}),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"metx\",\nfunction(t) {\n\tthis.parseHeader(t),\n\tthis.content_encoding = t.readCString(),\n\tthis.namespace = t.readCString(),\n\tthis.schema_location = t.readCString(),\n\tthis.parseFooter(t)\n}),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"sbtt\",\nfunction(t) {\n\tthis.parseHeader(t),\n\tthis.content_encoding = t.readCString(),\n\tthis.mime_format = t.readCString(),\n\tthis.parseFooter(t)\n}),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"stpp\",\nfunction(t) {\n\tthis.parseHeader(t),\n\tthis.namespace = t.readCString(),\n\tthis.schema_location = t.readCString(),\n\tthis.auxiliary_mime_types = t.readCString(),\n\tthis.parseFooter(t)\n}),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"stxt\",\nfunction(t) {\n\tthis.parseHeader(t),\n\tthis.content_encoding = t.readCString(),\n\tthis.mime_format = t.readCString(),\n\tthis.parseFooter(t)\n}),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"tx3g\",\nfunction(t) {\n\tthis.parseHeader(t),\n\tthis.displayFlags = t.readUint32(),\n\tthis.horizontal_justification = t.readInt8(),\n\tthis.vertical_justification = t.readInt8(),\n\tthis.bg_color_rgba = t.readUint8Array(4),\n\tthis.box_record = t.readInt16Array(4),\n\tthis.style_record = t.readUint8Array(12),\n\tthis.parseFooter(t)\n}),\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"wvtt\",\nfunction(t) {\n\tthis.parseHeader(t),\n\tthis.parseFooter(t)\n}),\nBoxParser.createSampleGroupCtor(\"alst\",\nfunction(t) {\n\tvar e, i = t.readUint16();\n\tfor (this.first_output_sample = t.readUint16(), this.sample_offset = [], e = 0; e < i; e++) this.sample_offset[e] = t.readUint32();\n\tvar r = this.description_length - 4 - 4 * i;\n\tfor (this.num_output_samples = [], this.num_total_samples = [], e = 0; e < r / 4; e++) this.num_output_samples[e] = t.readUint16(),\n\tthis.num_total_samples[e] = t.readUint16()\n}),\nBoxParser.createSampleGroupCtor(\"avll\",\nfunction(t) {\n\tthis.layerNumber = t.readUint8(),\n\tthis.accurateStatisticsFlag = t.readUint8(),\n\tthis.avgBitRate = t.readUint16(),\n\tthis.avgFrameRate = t.readUint16()\n}),\nBoxParser.createSampleGroupCtor(\"avss\",\nfunction(t) {\n\tthis.subSequenceIdentifier = t.readUint16(),\n\tthis.layerNumber = t.readUint8();\n\tvar e = t.readUint8();\n\tthis.durationFlag = e >> 7,\n\tthis.avgRateFlag = e >> 6 & 1,\n\tthis.durationFlag && (this.duration = t.readUint32()),\n\tthis.avgRateFlag && (this.accurateStatisticsFlag = t.readUint8(), this.avgBitRate = t.readUint16(), this.avgFrameRate = t.readUint16()),\n\tthis.dependency = [];\n\tfor (var i = t.readUint8(), r = 0; r < i; r++) {\n\t\tvar s = {};\n\t\tthis.dependency.push(s),\n\t\ts.subSeqDirectionFlag = t.readUint8(),\n\t\ts.layerNumber = t.readUint8(),\n\t\ts.subSequenceIdentifier = t.readUint16()\n\t}\n}),\nBoxParser.createSampleGroupCtor(\"dtrt\",\nfunction(t) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \" + this.grouping_type + \" not fully parsed\")\n}),\nBoxParser.createSampleGroupCtor(\"mvif\",\nfunction(t) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \" + this.grouping_type + \" not fully parsed\")\n}),\nBoxParser.createSampleGroupCtor(\"prol\",\nfunction(t) {\n\tthis.roll_distance = t.readInt16()\n}),\nBoxParser.createSampleGroupCtor(\"rap \",\nfunction(t) {\n\tt = t.readUint8();\n\tthis.num_leading_samples_known = t >> 7,\n\tthis.num_leading_samples = 127 & t\n}),\nBoxParser.createSampleGroupCtor(\"rash\",\nfunction(t) {\n\tif (this.operation_point_count = t.readUint16(), this.description_length !== 2 + (1 === this.operation_point_count ? 2 : 6 * this.operation_point_count) + 9) Log.warn(\"BoxParser\", \"Mismatch in \" + this.grouping_type + \" sample group length\"),\n\tthis.data = t.readUint8Array(this.description_length - 2);\n\telse {\n\t\tif (1 === this.operation_point_count) this.target_rate_share = t.readUint16();\n\t\telse {\n\t\t\tthis.target_rate_share = [],\n\t\t\tthis.available_bitrate = [];\n\t\t\tfor (var e = 0; e < this.operation_point_count; e++) this.available_bitrate[e] = t.readUint32(),\n\t\t\tthis.target_rate_share[e] = t.readUint16()\n\t\t}\n\t\tthis.maximum_bitrate = t.readUint32(),\n\t\tthis.minimum_bitrate = t.readUint32(),\n\t\tthis.discard_priority = t.readUint8()\n\t}\n}),\nBoxParser.createSampleGroupCtor(\"roll\",\nfunction(t) {\n\tthis.roll_distance = t.readInt16()\n}),\nBoxParser.SampleGroupEntry.prototype.parse = function(t) {\n\tLog.warn(\"BoxParser\", \"Unknown Sample Group type: \" + this.grouping_type),\n\tthis.data = t.readUint8Array(this.description_length)\n},\nBoxParser.createSampleGroupCtor(\"scif\",\nfunction(t) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \" + this.grouping_type + \" not fully parsed\")\n}),\nBoxParser.createSampleGroupCtor(\"scnm\",\nfunction(t) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \" + this.grouping_type + \" not fully parsed\")\n}),\nBoxParser.createSampleGroupCtor(\"seig\",\nfunction(t) {\n\tthis.reserved = t.readUint8();\n\tvar e = t.readUint8();\n\tthis.crypt_byte_block = e >> 4,\n\tthis.skip_byte_block = 15 & e,\n\tthis.isProtected = t.readUint8(),\n\tthis.Per_Sample_IV_Size = t.readUint8(),\n\tthis.KID = BoxParser.parseHex16(t),\n\tthis.constant_IV_size = 0,\n\tthis.constant_IV = 0,\n\t1 === this.isProtected && 0 === this.Per_Sample_IV_Size && (this.constant_IV_size = t.readUint8(), this.constant_IV = t.readUint8Array(this.constant_IV_size))\n}),\nBoxParser.createSampleGroupCtor(\"stsa\",\nfunction(t) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \" + this.grouping_type + \" not fully parsed\")\n}),\nBoxParser.createSampleGroupCtor(\"sync\",\nfunction(t) {\n\tt = t.readUint8();\n\tthis.NAL_unit_type = 63 & t\n}),\nBoxParser.createSampleGroupCtor(\"tele\",\nfunction(t) {\n\tt = t.readUint8();\n\tthis.level_independently_decodable = t >> 7\n}),\nBoxParser.createSampleGroupCtor(\"tsas\",\nfunction(t) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \" + this.grouping_type + \" not fully parsed\")\n}),\nBoxParser.createSampleGroupCtor(\"tscl\",\nfunction(t) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \" + this.grouping_type + \" not fully parsed\")\n}),\nBoxParser.createSampleGroupCtor(\"vipr\",\nfunction(t) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \" + this.grouping_type + \" not fully parsed\")\n}),\nBoxParser.createFullBoxCtor(\"sbgp\", \"SampleToGroupBox\",\nfunction(t) {\n\tthis.grouping_type = t.readString(4),\n\t1 === this.version ? this.grouping_type_parameter = t.readUint32() : this.grouping_type_parameter = 0,\n\tthis.entries = [];\n\tfor (var e = t.readUint32(), i = 0; i < e; i++) {\n\t\tvar r = {};\n\t\tthis.entries.push(r),\n\t\tr.sample_count = t.readInt32(),\n\t\tr.group_description_index = t.readInt32()\n\t}\n}),\nPixel.prototype.toString = function() {\n\treturn \"[row: \" + this.bad_pixel_row + \", column: \" + this.bad_pixel_column + \"]\"\n},\nBoxParser.createFullBoxCtor(\"sbpm\", \"SensorBadPixelsMapBox\",\nfunction(t) {\n\tvar e;\n\tfor (this.component_count = t.readUint16(), this.component_index = [], e = 0; e < this.component_count; e++) this.component_index.push(t.readUint16());\n\tvar i = t.readUint8();\n\tfor (this.correction_applied = 128 == (128 & i), this.num_bad_rows = t.readUint32(), this.num_bad_cols = t.readUint32(), this.num_bad_pixels = t.readUint32(), this.bad_rows = [], this.bad_columns = [], this.bad_pixels = [], e = 0; e < this.num_bad_rows; e++) this.bad_rows.push(t.readUint32());\n\tfor (e = 0; e < this.num_bad_cols; e++) this.bad_columns.push(t.readUint32());\n\tfor (e = 0; e < this.num_bad_pixels; e++) {\n\t\tvar r = t.readUint32(),\n\t\ts = t.readUint32();\n\t\tthis.bad_pixels.push(new Pixel(r, s))\n\t}\n}),\nBoxParser.createFullBoxCtor(\"schm\", \"SchemeTypeBox\",\nfunction(t) {\n\tthis.scheme_type = t.readString(4),\n\tthis.scheme_version = t.readUint32(),\n\t1 & this.flags && (this.scheme_uri = t.readString(this.size - this.hdr_size - 8))\n}),\nBoxParser.createBoxCtor(\"sdp \", \"rtptracksdphintinformation\",\nfunction(t) {\n\tthis.sdptext = t.readString(this.size - this.hdr_size)\n}),\nBoxParser.createFullBoxCtor(\"sdtp\", \"SampleDependencyTypeBox\",\nfunction(t) {\n\tvar e, i = this.size - this.hdr_size;\n\tthis.is_leading = [],\n\tthis.sample_depends_on = [],\n\tthis.sample_is_depended_on = [],\n\tthis.sample_has_redundancy = [];\n\tfor (var r = 0; r < i; r++) e = t.readUint8(),\n\tthis.is_leading[r] = e >> 6,\n\tthis.sample_depends_on[r] = e >> 4 & 3,\n\tthis.sample_is_depended_on[r] = e >> 2 & 3,\n\tthis.sample_has_redundancy[r] = 3 & e\n}),\nBoxParser.createFullBoxCtor(\"senc\", \"SampleEncryptionBox\"),\nBoxParser.createFullBoxCtor(\"sgpd\", \"SampleGroupDescriptionBox\",\nfunction(t) {\n\tthis.grouping_type = t.readString(4),\n\tLog.debug(\"BoxParser\", \"Found Sample Groups of type \" + this.grouping_type),\n\t1 === this.version ? this.default_length = t.readUint32() : this.default_length = 0,\n\t2 <= this.version && (this.default_group_description_index = t.readUint32()),\n\tthis.entries = [];\n\tfor (var e = t.readUint32(), i = 0; i < e; i++) {\n\t\tvar r = new(BoxParser[this.grouping_type + \"SampleGroupEntry\"] ? BoxParser[this.grouping_type + \"SampleGroupEntry\"] : BoxParser.SampleGroupEntry)(this.grouping_type);\n\t\tthis.entries.push(r),\n\t\t1 === this.version && 0 === this.default_length ? r.description_length = t.readUint32() : r.description_length = this.default_length,\n\t\tr.write === BoxParser.SampleGroupEntry.prototype.write && (Log.info(\"BoxParser\", \"SampleGroup for type \" + this.grouping_type + \" writing not yet implemented, keeping unparsed data in memory for later write\"), r.data = t.readUint8Array(r.description_length), t.position -= r.description_length),\n\t\tr.parse(t)\n\t}\n}),\nBoxParser.createFullBoxCtor(\"sidx\", \"CompressedSegmentIndexBox\",\nfunction(t) {\n\tthis.reference_ID = t.readUint32(),\n\tthis.timescale = t.readUint32(),\n\t0 === this.version ? (this.earliest_presentation_time = t.readUint32(), this.first_offset = t.readUint32()) : (this.earliest_presentation_time = t.readUint64(), this.first_offset = t.readUint64()),\n\tt.readUint16(),\n\tthis.references = [];\n\tfor (var e = t.readUint16(), i = 0; i < e; i++) {\n\t\tvar r = {};\n\t\tthis.references.push(r);\n\t\tvar s = t.readUint32();\n\t\tr.reference_type = s >> 31 & 1,\n\t\tr.referenced_size = 2147483647 & s,\n\t\tr.subsegment_duration = t.readUint32(),\n\t\ts = t.readUint32(),\n\t\tr.starts_with_SAP = s >> 31 & 1,\n\t\tr.SAP_type = s >> 28 & 7,\n\t\tr.SAP_delta_time = 268435455 & s\n\t}\n}),\nBoxParser.SingleItemTypeReferenceBox = function(t, e, i, r) {\n\tBoxParser.Box.call(this, t, e),\n\tthis.hdr_size = i,\n\tthis.start = r\n},\nBoxParser.SingleItemTypeReferenceBox.prototype = new BoxParser.Box,\nBoxParser.SingleItemTypeReferenceBox.prototype.parse = function(t) {\n\tthis.from_item_ID = t.readUint16();\n\tvar e = t.readUint16();\n\tthis.references = [];\n\tfor (var i = 0; i < e; i++) this.references[i] = {},\n\tthis.references[i].to_item_ID = t.readUint16()\n},\nBoxParser.SingleItemTypeReferenceBoxLarge = function(t, e, i, r) {\n\tBoxParser.Box.call(this, t, e),\n\tthis.hdr_size = i,\n\tthis.start = r\n},\nBoxParser.SingleItemTypeReferenceBoxLarge.prototype = new BoxParser.Box,\nBoxParser.SingleItemTypeReferenceBoxLarge.prototype.parse = function(t) {\n\tthis.from_item_ID = t.readUint32();\n\tvar e = t.readUint16();\n\tthis.references = [];\n\tfor (var i = 0; i < e; i++) this.references[i] = {},\n\tthis.references[i].to_item_ID = t.readUint32()\n},\nBoxParser.createFullBoxCtor(\"SmDm\", \"SMPTE2086MasteringDisplayMetadataBox\",\nfunction(t) {\n\tthis.primaryRChromaticity_x = t.readUint16(),\n\tthis.primaryRChromaticity_y = t.readUint16(),\n\tthis.primaryGChromaticity_x = t.readUint16(),\n\tthis.primaryGChromaticity_y = t.readUint16(),\n\tthis.primaryBChromaticity_x = t.readUint16(),\n\tthis.primaryBChromaticity_y = t.readUint16(),\n\tthis.whitePointChromaticity_x = t.readUint16(),\n\tthis.whitePointChromaticity_y = t.readUint16(),\n\tthis.luminanceMax = t.readUint32(),\n\tthis.luminanceMin = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"smhd\", \"SoundMediaHeaderBox\",\nfunction(t) {\n\tthis.balance = t.readUint16(),\n\tt.readUint16()\n}),\nBoxParser.createFullBoxCtor(\"ssix\", \"CompressedSubsegmentIndexBox\",\nfunction(t) {\n\tthis.subsegments = [];\n\tfor (var e = t.readUint32(), i = 0; i < e; i++) {\n\t\tvar r = {};\n\t\tthis.subsegments.push(r),\n\t\tr.ranges = [];\n\t\tfor (var s = t.readUint32(), a = 0; a < s; a++) {\n\t\t\tvar n = {};\n\t\t\tr.ranges.push(n),\n\t\t\tn.level = t.readUint8(),\n\t\t\tn.range_size = t.readUint24()\n\t\t}\n\t}\n}),\nBoxParser.createFullBoxCtor(\"stco\", \"ChunkOffsetBox\",\nfunction(t) {\n\tvar e = t.readUint32();\n\tif (this.chunk_offsets = [], 0 === this.version) for (var i = 0; i < e; i++) this.chunk_offsets.push(t.readUint32())\n}),\nBoxParser.createFullBoxCtor(\"stdp\", \"DegradationPriorityBox\",\nfunction(t) {\n\tvar e = (this.size - this.hdr_size) / 2;\n\tthis.priority = [];\n\tfor (var i = 0; i < e; i++) this.priority[i] = t.readUint16()\n}),\nBoxParser.createFullBoxCtor(\"sthd\", \"SubtitleMediaHeaderBox\"),\nBoxParser.createFullBoxCtor(\"stri\", \"SubTrackInformationBox\",\nfunction(t) {\n\tthis.switch_group = t.readUint16(),\n\tthis.alternate_group = t.readUint16(),\n\tthis.sub_track_id = t.readUint32();\n\tvar e = (this.size - this.hdr_size - 8) / 4;\n\tthis.attribute_list = [];\n\tfor (var i = 0; i < e; i++) this.attribute_list[i] = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"stsc\", \"SampleToChunkBox\",\nfunction(t) {\n\tvar e, i = t.readUint32();\n\tif (this.first_chunk = [], this.samples_per_chunk = [], this.sample_description_index = [], 0 === this.version) for (e = 0; e < i; e++) this.first_chunk.push(t.readUint32()),\n\tthis.samples_per_chunk.push(t.readUint32()),\n\tthis.sample_description_index.push(t.readUint32())\n}),\nBoxParser.createFullBoxCtor(\"stsd\", \"SampleDescriptionBox\",\nfunction(t) {\n\tvar e, i, r, s;\n\tfor (this.entries = [], r = t.readUint32(), e = 1; e <= r; e++) {\n\t\tif ((i = BoxParser.parseOneBox(t, !0, this.size - (t.getPosition() - this.start))).code !== BoxParser.OK) return;\n\t\tBoxParser[i.type + \"SampleEntry\"] ? ((s = new BoxParser[i.type + \"SampleEntry\"](i.size)).hdr_size = i.hdr_size, s.start = i.start) : (Log.warn(\"BoxParser\", \"Unknown sample entry type: \" + i.type), s = new BoxParser.SampleEntry(i.type, i.size, i.hdr_size, i.start)),\n\t\ts.write === BoxParser.SampleEntry.prototype.write && (Log.info(\"BoxParser\", \"SampleEntry \" + s.type + \" box writing not yet implemented, keeping unparsed data in memory for later write\"), s.parseDataAndRewind(t)),\n\t\ts.parse(t),\n\t\tthis.entries.push(s)\n\t}\n}),\nBoxParser.createFullBoxCtor(\"stsg\", \"SubTrackSampleGroupBox\",\nfunction(t) {\n\tthis.grouping_type = t.readUint32();\n\tvar e = t.readUint16();\n\tthis.group_description_index = [];\n\tfor (var i = 0; i < e; i++) this.group_description_index[i] = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"stsh\", \"ShadowSyncSampleBox\",\nfunction(t) {\n\tvar e, i = t.readUint32();\n\tif (this.shadowed_sample_numbers = [], this.sync_sample_numbers = [], 0 === this.version) for (e = 0; e < i; e++) this.shadowed_sample_numbers.push(t.readUint32()),\n\tthis.sync_sample_numbers.push(t.readUint32())\n}),\nBoxParser.createFullBoxCtor(\"stss\", \"SyncSampleBox\",\nfunction(t) {\n\tvar e, i = t.readUint32();\n\tif (0 === this.version) for (this.sample_numbers = [], e = 0; e < i; e++) this.sample_numbers.push(t.readUint32())\n}),\nBoxParser.createFullBoxCtor(\"stsz\", \"SampleSizeBox\",\nfunction(t) {\n\tvar e;\n\tif (this.sample_sizes = [], 0 === this.version) for (this.sample_size = t.readUint32(), this.sample_count = t.readUint32(), e = 0; e < this.sample_count; e++) 0 === this.sample_size ? this.sample_sizes.push(t.readUint32()) : this.sample_sizes[e] = this.sample_size\n}),\nBoxParser.createFullBoxCtor(\"stts\", \"TimeToSampleBox\",\nfunction(t) {\n\tvar e, i, r = t.readUint32();\n\tif (this.sample_counts = [], this.sample_deltas = [], 0 === this.version) for (e = 0; e < r; e++) this.sample_counts.push(t.readUint32()),\n\t(i = t.readInt32()) < 0 && (Log.warn(\"BoxParser\", \"File uses negative stts sample delta, using value 1 instead, sync may be lost!\"), i = 1),\n\tthis.sample_deltas.push(i)\n}),\nBoxParser.createFullBoxCtor(\"stvi\", \"StereoVideoBox\",\nfunction(t) {\n\tvar e = t.readUint32();\n\tthis.single_view_allowed = 3 & e,\n\tthis.stereo_scheme = t.readUint32();\n\tvar i, e = t.readUint32();\n\tfor (this.stereo_indication_type = t.readString(e), this.boxes = []; t.getPosition() < this.start + this.size;) {\n\t\tif ((i = BoxParser.parseOneBox(t, !1, this.size - (t.getPosition() - this.start))).code !== BoxParser.OK) return;\n\t\ti = i.box,\n\t\tthis.boxes.push(i),\n\t\tthis[i.type] = i\n\t}\n}),\nBoxParser.createBoxCtor(\"styp\", \"SegmentTypeBox\",\nfunction(t) {\n\tBoxParser.ftypBox.prototype.parse.call(this, t)\n}),\nBoxParser.createFullBoxCtor(\"stz2\", \"CompactSampleSizeBox\",\nfunction(t) {\n\tvar e, i;\n\tif (this.sample_sizes = [], 0 === this.version) if (this.reserved = t.readUint24(), this.field_size = t.readUint8(), i = t.readUint32(), 4 === this.field_size) for (e = 0; e < i; e += 2) {\n\t\tvar r = t.readUint8();\n\t\tthis.sample_sizes[e] = r >> 4 & 15,\n\t\tthis.sample_sizes[e + 1] = 15 & r\n\t} else if (8 === this.field_size) for (e = 0; e < i; e++) this.sample_sizes[e] = t.readUint8();\n\telse if (16 === this.field_size) for (e = 0; e < i; e++) this.sample_sizes[e] = t.readUint16();\n\telse Log.error(\"BoxParser\", \"Error in length field in stz2 box\")\n}),\nBoxParser.createFullBoxCtor(\"subs\", \"SubSampleInformationBox\",\nfunction(t) {\n\tvar e, i, r, s = t.readUint32();\n\tfor (this.entries = [], e = 0; e < s; e++) {\n\t\tvar a = {};\n\t\tif ((this.entries[e] = a).sample_delta = t.readUint32(), a.subsamples = [], 0 < (r = t.readUint16())) for (i = 0; i < r; i++) {\n\t\t\tvar n = {};\n\t\t\ta.subsamples.push(n),\n\t\t\t1 == this.version ? n.size = t.readUint32() : n.size = t.readUint16(),\n\t\t\tn.priority = t.readUint8(),\n\t\t\tn.discardable = t.readUint8(),\n\t\t\tn.codec_specific_parameters = t.readUint32()\n\t\t}\n\t}\n}),\nBoxParser.createFullBoxCtor(\"tenc\", \"TrackEncryptionBox\",\nfunction(t) {\n\tvar e;\n\tt.readUint8(),\n\t0 === this.version ? t.readUint8() : (e = t.readUint8(), this.default_crypt_byte_block = e >> 4 & 15, this.default_skip_byte_block = 15 & e),\n\tthis.default_isProtected = t.readUint8(),\n\tthis.default_Per_Sample_IV_Size = t.readUint8(),\n\tthis.default_KID = BoxParser.parseHex16(t),\n\t1 === this.default_isProtected && 0 === this.default_Per_Sample_IV_Size && (this.default_constant_IV_size = t.readUint8(), this.default_constant_IV = t.readUint8Array(this.default_constant_IV_size))\n}),\nBoxParser.createFullBoxCtor(\"tfdt\", \"TrackFragmentBaseMediaDecodeTimeBox\",\nfunction(t) {\n\t1 == this.version ? this.baseMediaDecodeTime = t.readUint64() : this.baseMediaDecodeTime = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"tfhd\", \"TrackFragmentHeaderBox\",\nfunction(t) {\n\tvar e = 0;\n\tthis.track_id = t.readUint32(),\n\tthis.size - this.hdr_size > e && this.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET ? (this.base_data_offset = t.readUint64(), e += 8) : this.base_data_offset = 0,\n\tthis.size - this.hdr_size > e && this.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC ? (this.default_sample_description_index = t.readUint32(), e += 4) : this.default_sample_description_index = 0,\n\tthis.size - this.hdr_size > e && this.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR ? (this.default_sample_duration = t.readUint32(), e += 4) : this.default_sample_duration = 0,\n\tthis.size - this.hdr_size > e && this.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE ? (this.default_sample_size = t.readUint32(), e += 4) : this.default_sample_size = 0,\n\tthis.size - this.hdr_size > e && this.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS ? (this.default_sample_flags = t.readUint32(), e += 4) : this.default_sample_flags = 0\n}),\nBoxParser.createFullBoxCtor(\"tfra\", \"TrackFragmentRandomAccessBox\",\nfunction(t) {\n\tthis.track_ID = t.readUint32(),\n\tt.readUint24();\n\tvar e = t.readUint8();\n\tthis.length_size_of_traf_num = e >> 4 & 3,\n\tthis.length_size_of_trun_num = e >> 2 & 3,\n\tthis.length_size_of_sample_num = 3 & e,\n\tthis.entries = [];\n\tfor (var i = t.readUint32(), r = 0; r < i; r++) 1 === this.version ? (this.time = t.readUint64(), this.moof_offset = t.readUint64()) : (this.time = t.readUint32(), this.moof_offset = t.readUint32()),\n\tthis.traf_number = t[\"readUint\" + 8 * (this.length_size_of_traf_num + 1)](),\n\tthis.trun_number = t[\"readUint\" + 8 * (this.length_size_of_trun_num + 1)](),\n\tthis.sample_number = t[\"readUint\" + 8 * (this.length_size_of_sample_num + 1)]()\n}),\nBoxParser.createFullBoxCtor(\"tkhd\", \"TrackHeaderBox\",\nfunction(t) {\n\t1 == this.version ? (this.creation_time = t.readUint64(), this.modification_time = t.readUint64(), this.track_id = t.readUint32(), t.readUint32(), this.duration = t.readUint64()) : (this.creation_time = t.readUint32(), this.modification_time = t.readUint32(), this.track_id = t.readUint32(), t.readUint32(), this.duration = t.readUint32()),\n\tt.readUint32Array(2),\n\tthis.layer = t.readInt16(),\n\tthis.alternate_group = t.readInt16(),\n\tthis.volume = t.readInt16() >> 8,\n\tt.readUint16(),\n\tthis.matrix = t.readInt32Array(9),\n\tthis.width = t.readUint32(),\n\tthis.height = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"tmax\", \"hintmaxrelativetime\",\nfunction(t) {\n\tthis.time = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"tmin\", \"hintminrelativetime\",\nfunction(t) {\n\tthis.time = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"totl\", \"hintBytesSent\",\nfunction(t) {\n\tthis.bytessent = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"tpay\", \"hintBytesSent\",\nfunction(t) {\n\tthis.bytessent = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"tpyl\", \"hintBytesSent\",\nfunction(t) {\n\tthis.bytessent = t.readUint64()\n}),\nBoxParser.TrackGroupTypeBox.prototype.parse = function(t) {\n\tthis.parseFullHeader(t),\n\tthis.track_group_id = t.readUint32()\n},\nBoxParser.createTrackGroupCtor(\"msrc\"),\nBoxParser.TrackReferenceTypeBox = function(t, e, i, r) {\n\tBoxParser.Box.call(this, t, e),\n\tthis.hdr_size = i,\n\tthis.start = r\n},\nBoxParser.TrackReferenceTypeBox.prototype = new BoxParser.Box,\nBoxParser.TrackReferenceTypeBox.prototype.parse = function(t) {\n\tthis.track_ids = t.readUint32Array((this.size - this.hdr_size) / 4)\n},\nBoxParser.trefBox.prototype.parse = function(t) {\n\tfor (var e; t.getPosition() < this.start + this.size;) {\n\t\tif ((e = BoxParser.parseOneBox(t, !0, this.size - (t.getPosition() - this.start))).code !== BoxParser.OK) return; (e = new BoxParser.TrackReferenceTypeBox(e.type, e.size, e.hdr_size, e.start)).write === BoxParser.Box.prototype.write && \"mdat\" !== e.type && (Log.info(\"BoxParser\", \"TrackReference \" + e.type + \" box writing not yet implemented, keeping unparsed data in memory for later write\"), e.parseDataAndRewind(t)),\n\t\te.parse(t),\n\t\tthis.boxes.push(e)\n\t}\n},\nBoxParser.createFullBoxCtor(\"trep\", \"TrackExtensionPropertiesBox\",\nfunction(t) {\n\tfor (this.track_ID = t.readUint32(), this.boxes = []; t.getPosition() < this.start + this.size;) {\n\t\tif (ret = BoxParser.parseOneBox(t, !1, this.size - (t.getPosition() - this.start)), ret.code !== BoxParser.OK) return;\n\t\tbox = ret.box,\n\t\tthis.boxes.push(box)\n\t}\n}),\nBoxParser.createFullBoxCtor(\"trex\", \"TrackExtendsBox\",\nfunction(t) {\n\tthis.track_id = t.readUint32(),\n\tthis.default_sample_description_index = t.readUint32(),\n\tthis.default_sample_duration = t.readUint32(),\n\tthis.default_sample_size = t.readUint32(),\n\tthis.default_sample_flags = t.readUint32()\n}),\nBoxParser.createBoxCtor(\"trpy\", \"hintBytesSent\",\nfunction(t) {\n\tthis.bytessent = t.readUint64()\n}),\nBoxParser.createFullBoxCtor(\"trun\", \"TrackRunBox\",\nfunction(t) {\n\tvar e = 0;\n\tif (this.sample_count = t.readUint32(), e += 4, this.size - this.hdr_size > e && this.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET ? (this.data_offset = t.readInt32(), e += 4) : this.data_offset = 0, this.size - this.hdr_size > e && this.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG ? (this.first_sample_flags = t.readUint32(), e += 4) : this.first_sample_flags = 0, this.sample_duration = [], this.sample_size = [], this.sample_flags = [], this.sample_composition_time_offset = [], this.size - this.hdr_size > e) for (var i = 0; i < this.sample_count; i++) this.flags & BoxParser.TRUN_FLAGS_DURATION && (this.sample_duration[i] = t.readUint32()),\n\tthis.flags & BoxParser.TRUN_FLAGS_SIZE && (this.sample_size[i] = t.readUint32()),\n\tthis.flags & BoxParser.TRUN_FLAGS_FLAGS && (this.sample_flags[i] = t.readUint32()),\n\tthis.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET && (0 === this.version ? this.sample_composition_time_offset[i] = t.readUint32() : this.sample_composition_time_offset[i] = t.readInt32())\n}),\nBoxParser.createFullBoxCtor(\"tsel\", \"TrackSelectionBox\",\nfunction(t) {\n\tthis.switch_group = t.readUint32();\n\tvar e = (this.size - this.hdr_size - 4) / 4;\n\tthis.attribute_list = [];\n\tfor (var i = 0; i < e; i++) this.attribute_list[i] = t.readUint32()\n}),\nBoxParser.createFullBoxCtor(\"txtC\", \"TextConfigBox\",\nfunction(t) {\n\tthis.config = t.readCString()\n}),\nBoxParser.createBoxCtor(\"tyco\", \"TypeCombinationBox\",\nfunction(t) {\n\tvar e = (this.size - this.hdr_size) / 4;\n\tthis.compatible_brands = [];\n\tfor (var i = 0; i < e; i++) this.compatible_brands[i] = t.readString(4)\n}),\nBoxParser.createFullBoxCtor(\"udes\", \"UserDescriptionProperty\",\nfunction(t) {\n\tthis.lang = t.readCString(),\n\tthis.name = t.readCString(),\n\tthis.description = t.readCString(),\n\tthis.tags = t.readCString()\n}),\nBoxParser.createFullBoxCtor(\"uncC\", \"UncompressedFrameConfigBox\",\nfunction(t) {\n\tvar e;\n\tif (this.profile = t.readString(4), 1 != this.version && 0 == this.version) {\n\t\tfor (this.component_count = t.readUint32(), this.component_index = [], this.component_bit_depth_minus_one = [], this.component_format = [], this.component_align_size = [], e = 0; e < this.component_count; e++) this.component_index.push(t.readUint16()),\n\t\tthis.component_bit_depth_minus_one.push(t.readUint8()),\n\t\tthis.component_format.push(t.readUint8()),\n\t\tthis.component_align_size.push(t.readUint8());\n\t\tthis.sampling_type = t.readUint8(),\n\t\tthis.interleave_type = t.readUint8(),\n\t\tthis.block_size = t.readUint8();\n\t\tvar i = t.readUint8();\n\t\tthis.component_little_endian = i >> 7 & 1,\n\t\tthis.block_pad_lsb = i >> 6 & 1,\n\t\tthis.block_little_endian = i >> 5 & 1,\n\t\tthis.block_reversed = i >> 4 & 1,\n\t\tthis.pad_unknown = i >> 3 & 1,\n\t\tthis.pixel_size = t.readUint32(),\n\t\tthis.row_align_size = t.readUint32(),\n\t\tthis.tile_align_size = t.readUint32(),\n\t\tthis.num_tile_cols_minus_one = t.readUint32(),\n\t\tthis.num_tile_rows_minus_one = t.readUint32()\n\t}\n}),\nBoxParser.createFullBoxCtor(\"url \", \"DataEntryUrlBox\",\nfunction(t) {\n\t1 !== this.flags && (this.location = t.readCString())\n}),\nBoxParser.createFullBoxCtor(\"urn \", \"DataEntryUrnBox\",\nfunction(t) {\n\tthis.name = t.readCString(),\n\t0 < this.size - this.hdr_size - this.name.length - 1 && (this.location = t.readCString())\n}),\nBoxParser.createUUIDBox(\"a5d40b30e81411ddba2f0800200c9a66\", \"LiveServerManifestBox\", !0, !1,\nfunction(t) {\n\tthis.LiveServerManifest = t.readString(this.size - this.hdr_size).replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\")\n}),\nBoxParser.createUUIDBox(\"d08a4f1810f34a82b6c832d8aba183d3\", \"PiffProtectionSystemSpecificHeaderBox\", !0, !1,\nfunction(t) {\n\tthis.system_id = BoxParser.parseHex16(t);\n\tvar e = t.readUint32();\n\t0 < e && (this.data = t.readUint8Array(e))\n}),\nBoxParser.createUUIDBox(\"a2394f525a9b4f14a2446c427c648df4\", \"PiffSampleEncryptionBox\", !0, !1),\nBoxParser.createUUIDBox(\"8974dbce7be74c5184f97148f9882554\", \"PiffTrackEncryptionBox\", !0, !1,\nfunction(t) {\n\tthis.default_AlgorithmID = t.readUint24(),\n\tthis.default_IV_size = t.readUint8(),\n\tthis.default_KID = BoxParser.parseHex16(t)\n}),\nBoxParser.createUUIDBox(\"d4807ef2ca3946958e5426cb9e46a79f\", \"TfrfBox\", !0, !1,\nfunction(t) {\n\tthis.fragment_count = t.readUint8(),\n\tthis.entries = [];\n\tfor (var e = 0; e < this.fragment_count; e++) {\n\t\tvar i = {},\n\t\tr = 0,\n\t\ts = 0,\n\t\ts = 1 === this.version ? (r = t.readUint64(), t.readUint64()) : (r = t.readUint32(), t.readUint32());\n\t\ti.absolute_time = r,\n\t\ti.absolute_duration = s,\n\t\tthis.entries.push(i)\n\t}\n}),\nBoxParser.createUUIDBox(\"6d1d9b0542d544e680e2141daff757b2\", \"TfxdBox\", !0, !1,\nfunction(t) {\n\t1 === this.version ? (this.absolute_time = t.readUint64(), this.duration = t.readUint64()) : (this.absolute_time = t.readUint32(), this.duration = t.readUint32())\n}),\nBoxParser.createFullBoxCtor(\"vmhd\", \"VideoMediaHeaderBox\",\nfunction(t) {\n\tthis.graphicsmode = t.readUint16(),\n\tthis.opcolor = t.readUint16Array(3)\n}),\nBoxParser.createFullBoxCtor(\"vpcC\", \"VPCodecConfigurationRecord\",\nfunction(t) {\n\tvar e;\n\t1 === this.version ? (this.profile = t.readUint8(), this.level = t.readUint8(), e = t.readUint8(), this.bitDepth = e >> 4, this.chromaSubsampling = e >> 1 & 7, this.videoFullRangeFlag = 1 & e, this.colourPrimaries = t.readUint8(), this.transferCharacteristics = t.readUint8(), this.matrixCoefficients = t.readUint8()) : (this.profile = t.readUint8(), this.level = t.readUint8(), e = t.readUint8(), this.bitDepth = e >> 4 & 15, this.colorSpace = 15 & e, e = t.readUint8(), this.chromaSubsampling = e >> 4 & 15, this.transferFunction = e >> 1 & 7, this.videoFullRangeFlag = 1 & e),\n\tthis.codecIntializationDataSize = t.readUint16(),\n\tthis.codecIntializationData = t.readUint8Array(this.codecIntializationDataSize)\n}),\nBoxParser.createBoxCtor(\"vttC\", \"WebVTTConfigurationBox\",\nfunction(t) {\n\tthis.text = t.readString(this.size - this.hdr_size)\n}),\nBoxParser.createFullBoxCtor(\"vvcC\", \"VvcConfigurationBox\",\nfunction(t) {\n\tvar e, i = {\n\t\theld_bits: void 0,\n\t\tnum_held_bits: 0,\n\t\tstream_read_1_bytes: function(t) {\n\t\t\tthis.held_bits = t.readUint8(),\n\t\t\tthis.num_held_bits = 8\n\t\t},\n\t\tstream_read_2_bytes: function(t) {\n\t\t\tthis.held_bits = t.readUint16(),\n\t\t\tthis.num_held_bits = 16\n\t\t},\n\t\textract_bits: function(t) {\n\t\t\tvar e = this.held_bits >> this.num_held_bits - t & (1 << t) - 1;\n\t\t\treturn this.num_held_bits -= t,\n\t\t\te\n\t\t}\n\t};\n\tif (i.stream_read_1_bytes(t), i.extract_bits(5), this.lengthSizeMinusOne = i.extract_bits(2), this.ptl_present_flag = i.extract_bits(1), this.ptl_present_flag) {\n\t\tif (i.stream_read_2_bytes(t), this.ols_idx = i.extract_bits(9), this.num_sublayers = i.extract_bits(3), this.constant_frame_rate = i.extract_bits(2), this.chroma_format_idc = i.extract_bits(2), i.stream_read_1_bytes(t), this.bit_depth_minus8 = i.extract_bits(3), i.extract_bits(5), i.stream_read_2_bytes(t), i.extract_bits(2), this.num_bytes_constraint_info = i.extract_bits(6), this.general_profile_idc = i.extract_bits(7), this.general_tier_flag = i.extract_bits(1), this.general_level_idc = t.readUint8(), i.stream_read_1_bytes(t), this.ptl_frame_only_constraint_flag = i.extract_bits(1), this.ptl_multilayer_enabled_flag = i.extract_bits(1), this.general_constraint_info = new Uint8Array(this.num_bytes_constraint_info), this.num_bytes_constraint_info) {\n\t\t\tfor (o = 0; o < this.num_bytes_constraint_info - 1; o++) {\n\t\t\t\tvar r = i.extract_bits(6);\n\t\t\t\ti.stream_read_1_bytes(t);\n\t\t\t\tvar s = i.extract_bits(2);\n\t\t\t\tthis.general_constraint_info[o] = r << 2 | s\n\t\t\t}\n\t\t\tthis.general_constraint_info[this.num_bytes_constraint_info - 1] = i.extract_bits(6)\n\t\t} else i.extract_bits(6);\n\t\tif (1 < this.num_sublayers) {\n\t\t\tfor (i.stream_read_1_bytes(t), this.ptl_sublayer_present_mask = 0, e = this.num_sublayers - 2; 0 <= e; --e) {\n\t\t\t\tvar a = i.extract_bits(1);\n\t\t\t\tthis.ptl_sublayer_present_mask |= a << e\n\t\t\t}\n\t\t\tfor (e = this.num_sublayers; e <= 8 && 1 < this.num_sublayers; ++e) i.extract_bits(1);\n\t\t\tfor (this.sublayer_level_idc = [], e = this.num_sublayers - 2; 0 <= e; --e) this.ptl_sublayer_present_mask & 1 << e && (this.sublayer_level_idc[e] = t.readUint8())\n\t\t}\n\t\tif (this.ptl_num_sub_profiles = t.readUint8(), this.general_sub_profile_idc = [], this.ptl_num_sub_profiles) for (o = 0; o < this.ptl_num_sub_profiles; o++) this.general_sub_profile_idc.push(t.readUint32());\n\t\tthis.max_picture_width = t.readUint16(),\n\t\tthis.max_picture_height = t.readUint16(),\n\t\tthis.avg_frame_rate = t.readUint16()\n\t}\n\tthis.nalu_arrays = [];\n\tfor (var n = t.readUint8(), o = 0; o < n; o++) {\n\t\tvar h = [];\n\t\tthis.nalu_arrays.push(h),\n\t\ti.stream_read_1_bytes(t),\n\t\th.completeness = i.extract_bits(1),\n\t\ti.extract_bits(2),\n\t\th.nalu_type = i.extract_bits(5);\n\t\tvar d = 1;\n\t\tfor (13 != h.nalu_type && 12 != h.nalu_type && (d = t.readUint16()), e = 0; e < d; e++) {\n\t\t\tvar l = t.readUint16();\n\t\t\th.push({\n\t\t\t\tdata: t.readUint8Array(l),\n\t\t\t\tlength: l\n\t\t\t})\n\t\t}\n\t}\n}),\nBoxParser.createFullBoxCtor(\"vvnC\", \"VvcNALUConfigBox\",\nfunction(t) {\n\tvar e = strm.readUint8();\n\tthis.lengthSizeMinusOne = 3 & e\n}),\nBoxParser.SampleEntry.prototype.isVideo = function() {\n\treturn ! 1\n},\nBoxParser.SampleEntry.prototype.isAudio = function() {\n\treturn ! 1\n},\nBoxParser.SampleEntry.prototype.isSubtitle = function() {\n\treturn ! 1\n},\nBoxParser.SampleEntry.prototype.isMetadata = function() {\n\treturn ! 1\n},\nBoxParser.SampleEntry.prototype.isHint = function() {\n\treturn ! 1\n},\nBoxParser.SampleEntry.prototype.getCodec = function() {\n\treturn this.type.replace(\".\", \"\")\n},\nBoxParser.SampleEntry.prototype.getWidth = function() {\n\treturn \"\"\n},\nBoxParser.SampleEntry.prototype.getHeight = function() {\n\treturn \"\"\n},\nBoxParser.SampleEntry.prototype.getChannelCount = function() {\n\treturn \"\"\n},\nBoxParser.SampleEntry.prototype.getSampleRate = function() {\n\treturn \"\"\n},\nBoxParser.SampleEntry.prototype.getSampleSize = function() {\n\treturn \"\"\n},\nBoxParser.VisualSampleEntry.prototype.isVideo = function() {\n\treturn ! 0\n},\nBoxParser.VisualSampleEntry.prototype.getWidth = function() {\n\treturn this.width\n},\nBoxParser.VisualSampleEntry.prototype.getHeight = function() {\n\treturn this.height\n},\nBoxParser.AudioSampleEntry.prototype.isAudio = function() {\n\treturn ! 0\n},\nBoxParser.AudioSampleEntry.prototype.getChannelCount = function() {\n\treturn this.channel_count\n},\nBoxParser.AudioSampleEntry.prototype.getSampleRate = function() {\n\treturn this.samplerate\n},\nBoxParser.AudioSampleEntry.prototype.getSampleSize = function() {\n\treturn this.samplesize\n},\nBoxParser.SubtitleSampleEntry.prototype.isSubtitle = function() {\n\treturn ! 0\n},\nBoxParser.MetadataSampleEntry.prototype.isMetadata = function() {\n\treturn ! 0\n},\nBoxParser.decimalToHex = function(t, e) {\n\tvar i = Number(t).toString(16);\n\tfor (e = null == e ? e = 2 : e; i.length < e;) i = \"0\" + i;\n\treturn i\n},\nBoxParser.avc1SampleEntry.prototype.getCodec = BoxParser.avc2SampleEntry.prototype.getCodec = BoxParser.avc3SampleEntry.prototype.getCodec = BoxParser.avc4SampleEntry.prototype.getCodec = function() {\n\tvar t = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\treturn this.avcC ? t + \".\" + BoxParser.decimalToHex(this.avcC.AVCProfileIndication) + BoxParser.decimalToHex(this.avcC.profile_compatibility) + BoxParser.decimalToHex(this.avcC.AVCLevelIndication) : t\n},\nBoxParser.hev1SampleEntry.prototype.getCodec = BoxParser.hvc1SampleEntry.prototype.getCodec = function() {\n\tvar t = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.hvcC) {\n\t\tswitch (t += \".\", this.hvcC.general_profile_space) {\n\t\tcase 0:\n\t\t\tt += \"\";\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tt += \"A\";\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tt += \"B\";\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tt += \"C\"\n\t\t}\n\t\tt += this.hvcC.general_profile_idc,\n\t\tt += \".\";\n\t\tfor (var e = this.hvcC.general_profile_compatibility,\n\t\ti = 0,\n\t\tr = 0; r < 32 && (i |= 1 & e, 31 != r); r++) i <<= 1,\n\t\te >>= 1;\n\t\tt += BoxParser.decimalToHex(i, 0),\n\t\tt += \".\",\n\t\t0 === this.hvcC.general_tier_flag ? t += \"L\": t += \"H\",\n\t\tt += this.hvcC.general_level_idc;\n\t\tvar s = !1,\n\t\ta = \"\";\n\t\tfor (r = 5; 0 <= r; r--)(this.hvcC.general_constraint_indicator[r] || s) && (a = \".\" + BoxParser.decimalToHex(this.hvcC.general_constraint_indicator[r], 0) + a, s = !0);\n\t\tt += a\n\t}\n\treturn t\n},\nBoxParser.vvc1SampleEntry.prototype.getCodec = BoxParser.vvi1SampleEntry.prototype.getCodec = function() {\n\tvar t = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.vvcC) {\n\t\tt += \".\" + this.vvcC.general_profile_idc,\n\t\tthis.vvcC.general_tier_flag ? t += \".H\": t += \".L\",\n\t\tt += this.vvcC.general_level_idc;\n\t\tvar e = \"\";\n\t\tif (this.vvcC.general_constraint_info) {\n\t\t\tvar i, r = [],\n\t\t\ts = 0;\n\t\t\tfor (s |= this.vvcC.ptl_frame_only_constraint << 7, s |= this.vvcC.ptl_multilayer_enabled << 6, h = 0; h < this.vvcC.general_constraint_info.length; ++h) s |= this.vvcC.general_constraint_info[h] >> 2 & 63,\n\t\t\tr.push(s),\n\t\t\ts && (i = h),\n\t\t\ts = this.vvcC.general_constraint_info[h] >> 2 & 3;\n\t\t\tif (void 0 === i) e = \".CA\";\n\t\t\telse {\n\t\t\t\te = \".C\";\n\t\t\t\tfor (var a = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\",\n\t\t\t\tn = 0,\n\t\t\t\to = 0,\n\t\t\t\th = 0; h <= i; ++h) for (n = n << 8 | r[h], o += 8; 5 <= o;) e += a[n >> o - 5 & 31],\n\t\t\t\tn &= (1 << (o -= 5)) - 1;\n\t\t\t\to && (e += a[31 & (n <<= 5 - o)])\n\t\t\t}\n\t\t}\n\t\tt += e\n\t}\n\treturn t\n},\nBoxParser.mp4aSampleEntry.prototype.getCodec = function() {\n\tvar t = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.esds && this.esds.esd) {\n\t\tvar e = this.esds.esd.getOTI(),\n\t\ti = this.esds.esd.getAudioConfig();\n\t\treturn t + \".\" + BoxParser.decimalToHex(e) + (i ? \".\" + i: \"\")\n\t}\n\treturn t\n},\nBoxParser.stxtSampleEntry.prototype.getCodec = function() {\n\tvar t = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\treturn this.mime_format ? t + \".\" + this.mime_format: t\n},\nBoxParser.vp08SampleEntry.prototype.getCodec = BoxParser.vp09SampleEntry.prototype.getCodec = function() {\n\tvar t = BoxParser.SampleEntry.prototype.getCodec.call(this),\n\te = this.vpcC.level;\n\t0 == e && (e = \"00\");\n\tvar i = this.vpcC.bitDepth;\n\treturn 8 == i && (i = \"08\"),\n\tt + \".0\" + this.vpcC.profile + \".\" + e + \".\" + i\n},\nBoxParser.av01SampleEntry.prototype.getCodec = function() {\n\tvar t, e = BoxParser.SampleEntry.prototype.getCodec.call(this),\n\ti = this.av1C.seq_level_idx_0;\n\treturn i < 10 && (i = \"0\" + i),\n\t2 === this.av1C.seq_profile && 1 === this.av1C.high_bitdepth ? t = 1 === this.av1C.twelve_bit ? \"12\": \"10\": this.av1C.seq_profile <= 2 && (t = 1 === this.av1C.high_bitdepth ? \"10\": \"08\"),\n\te + \".\" + this.av1C.seq_profile + \".\" + i + (this.av1C.seq_tier_0 ? \"H\": \"M\") + \".\" + t\n},\nBoxParser.Box.prototype.writeHeader = function(t, e) {\n\tthis.size += 8,\n\tthis.size > MAX_SIZE && (this.size += 8),\n\t\"uuid\" === this.type && (this.size += 16),\n\tLog.debug(\"BoxWriter\", \"Writing box \" + this.type + \" of size: \" + this.size + \" at position \" + t.getPosition() + (e || \"\")),\n\tthis.size > MAX_SIZE ? t.writeUint32(1) : (this.sizePosition = t.getPosition(), t.writeUint32(this.size)),\n\tt.writeString(this.type, null, 4),\n\t\"uuid\" === this.type && t.writeUint8Array(this.uuid),\n\tthis.size > MAX_SIZE && t.writeUint64(this.size)\n},\nBoxParser.FullBox.prototype.writeHeader = function(t) {\n\tthis.size += 4,\n\tBoxParser.Box.prototype.writeHeader.call(this, t, \" v=\" + this.version + \" f=\" + this.flags),\n\tt.writeUint8(this.version),\n\tt.writeUint24(this.flags)\n},\nBoxParser.Box.prototype.write = function(t) {\n\t\"mdat\" === this.type ? this.data && (this.size = this.data.length, this.writeHeader(t), t.writeUint8Array(this.data)) : (this.size = this.data ? this.data.length: 0, this.writeHeader(t), this.data && t.writeUint8Array(this.data))\n},\nBoxParser.ContainerBox.prototype.write = function(t) {\n\tthis.size = 0,\n\tthis.writeHeader(t);\n\tfor (var e = 0; e < this.boxes.length; e++) this.boxes[e] && (this.boxes[e].write(t), this.size += this.boxes[e].size);\n\tLog.debug(\"BoxWriter\", \"Adjusting box \" + this.type + \" with new size \" + this.size),\n\tt.adjustUint32(this.sizePosition, this.size)\n},\nBoxParser.TrackReferenceTypeBox.prototype.write = function(t) {\n\tthis.size = 4 * this.track_ids.length,\n\tthis.writeHeader(t),\n\tt.writeUint32Array(this.track_ids)\n},\nBoxParser.avcCBox.prototype.write = function(t) {\n\tvar e;\n\tfor (this.size = 7, e = 0; e < this.SPS.length; e++) this.size += 2 + this.SPS[e].length;\n\tfor (e = 0; e < this.PPS.length; e++) this.size += 2 + this.PPS[e].length;\n\tfor (this.ext && (this.size += this.ext.length), this.writeHeader(t), t.writeUint8(this.configurationVersion), t.writeUint8(this.AVCProfileIndication), t.writeUint8(this.profile_compatibility), t.writeUint8(this.AVCLevelIndication), t.writeUint8(this.lengthSizeMinusOne + 252), t.writeUint8(this.SPS.length + 224), e = 0; e < this.SPS.length; e++) t.writeUint16(this.SPS[e].length),\n\tt.writeUint8Array(this.SPS[e].nalu);\n\tfor (t.writeUint8(this.PPS.length), e = 0; e < this.PPS.length; e++) t.writeUint16(this.PPS[e].length),\n\tt.writeUint8Array(this.PPS[e].nalu);\n\tthis.ext && t.writeUint8Array(this.ext)\n},\nBoxParser.co64Box.prototype.write = function(t) {\n\tvar e;\n\tfor (this.version = 0, this.flags = 0, this.size = 4 + 8 * this.chunk_offsets.length, this.writeHeader(t), t.writeUint32(this.chunk_offsets.length), e = 0; e < this.chunk_offsets.length; e++) t.writeUint64(this.chunk_offsets[e])\n},\nBoxParser.cslgBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 20,\n\tthis.writeHeader(t),\n\tt.writeInt32(this.compositionToDTSShift),\n\tt.writeInt32(this.leastDecodeToDisplayDelta),\n\tt.writeInt32(this.greatestDecodeToDisplayDelta),\n\tt.writeInt32(this.compositionStartTime),\n\tt.writeInt32(this.compositionEndTime)\n},\nBoxParser.cttsBox.prototype.write = function(t) {\n\tvar e;\n\tfor (this.version = 0, this.flags = 0, this.size = 4 + 8 * this.sample_counts.length, this.writeHeader(t), t.writeUint32(this.sample_counts.length), e = 0; e < this.sample_counts.length; e++) t.writeUint32(this.sample_counts[e]),\n\t1 === this.version ? t.writeInt32(this.sample_offsets[e]) : t.writeUint32(this.sample_offsets[e])\n},\nBoxParser.drefBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 4,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.entries.length);\n\tfor (var e = 0; e < this.entries.length; e++) this.entries[e].write(t),\n\tthis.size += this.entries[e].size;\n\tLog.debug(\"BoxWriter\", \"Adjusting box \" + this.type + \" with new size \" + this.size),\n\tt.adjustUint32(this.sizePosition, this.size)\n},\nBoxParser.elngBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = this.extended_language.length,\n\tthis.writeHeader(t),\n\tt.writeString(this.extended_language)\n},\nBoxParser.elstBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 4 + 12 * this.entries.length,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.entries.length);\n\tfor (var e = 0; e < this.entries.length; e++) {\n\t\tvar i = this.entries[e];\n\t\tt.writeUint32(i.segment_duration),\n\t\tt.writeInt32(i.media_time),\n\t\tt.writeInt16(i.media_rate_integer),\n\t\tt.writeInt16(i.media_rate_fraction)\n\t}\n},\nBoxParser.emsgBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 16 + this.message_data.length + (this.scheme_id_uri.length + 1) + (this.value.length + 1),\n\tthis.writeHeader(t),\n\tt.writeCString(this.scheme_id_uri),\n\tt.writeCString(this.value),\n\tt.writeUint32(this.timescale),\n\tt.writeUint32(this.presentation_time_delta),\n\tt.writeUint32(this.event_duration),\n\tt.writeUint32(this.id),\n\tt.writeUint8Array(this.message_data)\n},\nBoxParser.ftypBox.prototype.write = function(t) {\n\tthis.size = 8 + 4 * this.compatible_brands.length,\n\tthis.writeHeader(t),\n\tt.writeString(this.major_brand, null, 4),\n\tt.writeUint32(this.minor_version);\n\tfor (var e = 0; e < this.compatible_brands.length; e++) t.writeString(this.compatible_brands[e], null, 4)\n},\nBoxParser.hdlrBox.prototype.write = function(t) {\n\tthis.size = 20 + this.name.length + 1,\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.writeHeader(t),\n\tt.writeUint32(0),\n\tt.writeString(this.handler, null, 4),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeCString(this.name)\n},\nBoxParser.hvcCBox.prototype.write = function(t) {\n\tvar e, i;\n\tfor (this.size = 23, e = 0; e < this.nalu_arrays.length; e++) for (this.size += 3, i = 0; i < this.nalu_arrays[e].length; i++) this.size += 2 + this.nalu_arrays[e][i].data.length;\n\tfor (this.writeHeader(t), t.writeUint8(this.configurationVersion), t.writeUint8((this.general_profile_space << 6) + (this.general_tier_flag << 5) + this.general_profile_idc), t.writeUint32(this.general_profile_compatibility), t.writeUint8Array(this.general_constraint_indicator), t.writeUint8(this.general_level_idc), t.writeUint16(this.min_spatial_segmentation_idc + (15 << 24)), t.writeUint8(this.parallelismType + 252), t.writeUint8(this.chroma_format_idc + 252), t.writeUint8(this.bit_depth_luma_minus8 + 248), t.writeUint8(this.bit_depth_chroma_minus8 + 248), t.writeUint16(this.avgFrameRate), t.writeUint8((this.constantFrameRate << 6) + (this.numTemporalLayers << 3) + (this.temporalIdNested << 2) + this.lengthSizeMinusOne), t.writeUint8(this.nalu_arrays.length), e = 0; e < this.nalu_arrays.length; e++) for (t.writeUint8((this.nalu_arrays[e].completeness << 7) + this.nalu_arrays[e].nalu_type), t.writeUint16(this.nalu_arrays[e].length), i = 0; i < this.nalu_arrays[e].length; i++) t.writeUint16(this.nalu_arrays[e][i].data.length),\n\tt.writeUint8Array(this.nalu_arrays[e][i].data)\n},\nBoxParser.kindBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = this.schemeURI.length + 1 + (this.value.length + 1),\n\tthis.writeHeader(t),\n\tt.writeCString(this.schemeURI),\n\tt.writeCString(this.value)\n},\nBoxParser.mdhdBox.prototype.write = function(t) {\n\tthis.size = 20,\n\tthis.flags = 0,\n\tthis.version = 0,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.creation_time),\n\tt.writeUint32(this.modification_time),\n\tt.writeUint32(this.timescale),\n\tt.writeUint32(this.duration),\n\tt.writeUint16(this.language),\n\tt.writeUint16(0)\n},\nBoxParser.mehdBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 4,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.fragment_duration)\n},\nBoxParser.mfhdBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 4,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.sequence_number)\n},\nBoxParser.mvhdBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 96,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.creation_time),\n\tt.writeUint32(this.modification_time),\n\tt.writeUint32(this.timescale),\n\tt.writeUint32(this.duration),\n\tt.writeUint32(this.rate),\n\tt.writeUint16(this.volume << 8),\n\tt.writeUint16(0),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint32Array(this.matrix),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint32(this.next_track_id)\n},\nBoxParser.SampleEntry.prototype.writeHeader = function(t) {\n\tthis.size = 8,\n\tBoxParser.Box.prototype.writeHeader.call(this, t),\n\tt.writeUint8(0),\n\tt.writeUint8(0),\n\tt.writeUint8(0),\n\tt.writeUint8(0),\n\tt.writeUint8(0),\n\tt.writeUint8(0),\n\tt.writeUint16(this.data_reference_index)\n},\nBoxParser.SampleEntry.prototype.writeFooter = function(t) {\n\tfor (var e = 0; e < this.boxes.length; e++) this.boxes[e].write(t),\n\tthis.size += this.boxes[e].size;\n\tLog.debug(\"BoxWriter\", \"Adjusting box \" + this.type + \" with new size \" + this.size),\n\tt.adjustUint32(this.sizePosition, this.size)\n},\nBoxParser.SampleEntry.prototype.write = function(t) {\n\tthis.writeHeader(t),\n\tt.writeUint8Array(this.data),\n\tthis.size += this.data.length,\n\tLog.debug(\"BoxWriter\", \"Adjusting box \" + this.type + \" with new size \" + this.size),\n\tt.adjustUint32(this.sizePosition, this.size)\n},\nBoxParser.VisualSampleEntry.prototype.write = function(t) {\n\tthis.writeHeader(t),\n\tthis.size += 70,\n\tt.writeUint16(0),\n\tt.writeUint16(0),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint16(this.width),\n\tt.writeUint16(this.height),\n\tt.writeUint32(this.horizresolution),\n\tt.writeUint32(this.vertresolution),\n\tt.writeUint32(0),\n\tt.writeUint16(this.frame_count),\n\tt.writeUint8(Math.min(31, this.compressorname.length)),\n\tt.writeString(this.compressorname, null, 31),\n\tt.writeUint16(this.depth),\n\tt.writeInt16(-1),\n\tthis.writeFooter(t)\n},\nBoxParser.AudioSampleEntry.prototype.write = function(t) {\n\tthis.writeHeader(t),\n\tthis.size += 20,\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeUint16(this.channel_count),\n\tt.writeUint16(this.samplesize),\n\tt.writeUint16(0),\n\tt.writeUint16(0),\n\tt.writeUint32(this.samplerate << 16),\n\tthis.writeFooter(t)\n},\nBoxParser.stppSampleEntry.prototype.write = function(t) {\n\tthis.writeHeader(t),\n\tthis.size += this.namespace.length + 1 + this.schema_location.length + 1 + this.auxiliary_mime_types.length + 1,\n\tt.writeCString(this.namespace),\n\tt.writeCString(this.schema_location),\n\tt.writeCString(this.auxiliary_mime_types),\n\tthis.writeFooter(t)\n},\nBoxParser.SampleGroupEntry.prototype.write = function(t) {\n\tt.writeUint8Array(this.data)\n},\nBoxParser.sbgpBox.prototype.write = function(t) {\n\tthis.version = 1,\n\tthis.flags = 0,\n\tthis.size = 12 + 8 * this.entries.length,\n\tthis.writeHeader(t),\n\tt.writeString(this.grouping_type, null, 4),\n\tt.writeUint32(this.grouping_type_parameter),\n\tt.writeUint32(this.entries.length);\n\tfor (var e = 0; e < this.entries.length; e++) {\n\t\tvar i = this.entries[e];\n\t\tt.writeInt32(i.sample_count),\n\t\tt.writeInt32(i.group_description_index)\n\t}\n},\nBoxParser.sgpdBox.prototype.write = function(t) {\n\tvar e, i;\n\tfor (this.flags = 0, this.size = 12, e = 0; e < this.entries.length; e++) i = this.entries[e],\n\t1 === this.version && (0 === this.default_length && (this.size += 4), this.size += i.data.length);\n\tfor (this.writeHeader(t), t.writeString(this.grouping_type, null, 4), 1 === this.version && t.writeUint32(this.default_length), 2 <= this.version && t.writeUint32(this.default_sample_description_index), t.writeUint32(this.entries.length), e = 0; e < this.entries.length; e++) i = this.entries[e],\n\t1 === this.version && 0 === this.default_length && t.writeUint32(i.description_length),\n\ti.write(t)\n},\nBoxParser.sidxBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 20 + 12 * this.references.length,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.reference_ID),\n\tt.writeUint32(this.timescale),\n\tt.writeUint32(this.earliest_presentation_time),\n\tt.writeUint32(this.first_offset),\n\tt.writeUint16(0),\n\tt.writeUint16(this.references.length);\n\tfor (var e = 0; e < this.references.length; e++) {\n\t\tvar i = this.references[e];\n\t\tt.writeUint32(i.reference_type << 31 | i.referenced_size),\n\t\tt.writeUint32(i.subsegment_duration),\n\t\tt.writeUint32(i.starts_with_SAP << 31 | i.SAP_type << 28 | i.SAP_delta_time)\n\t}\n},\nBoxParser.smhdBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 1,\n\tthis.size = 4,\n\tthis.writeHeader(t),\n\tt.writeUint16(this.balance),\n\tt.writeUint16(0)\n},\nBoxParser.stcoBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 4 + 4 * this.chunk_offsets.length,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.chunk_offsets.length),\n\tt.writeUint32Array(this.chunk_offsets)\n},\nBoxParser.stscBox.prototype.write = function(t) {\n\tvar e;\n\tfor (this.version = 0, this.flags = 0, this.size = 4 + 12 * this.first_chunk.length, this.writeHeader(t), t.writeUint32(this.first_chunk.length), e = 0; e < this.first_chunk.length; e++) t.writeUint32(this.first_chunk[e]),\n\tt.writeUint32(this.samples_per_chunk[e]),\n\tt.writeUint32(this.sample_description_index[e])\n},\nBoxParser.stsdBox.prototype.write = function(t) {\n\tvar e;\n\tfor (this.version = 0, this.flags = 0, this.size = 0, this.writeHeader(t), t.writeUint32(this.entries.length), this.size += 4, e = 0; e < this.entries.length; e++) this.entries[e].write(t),\n\tthis.size += this.entries[e].size;\n\tLog.debug(\"BoxWriter\", \"Adjusting box \" + this.type + \" with new size \" + this.size),\n\tt.adjustUint32(this.sizePosition, this.size)\n},\nBoxParser.stshBox.prototype.write = function(t) {\n\tvar e;\n\tfor (this.version = 0, this.flags = 0, this.size = 4 + 8 * this.shadowed_sample_numbers.length, this.writeHeader(t), t.writeUint32(this.shadowed_sample_numbers.length), e = 0; e < this.shadowed_sample_numbers.length; e++) t.writeUint32(this.shadowed_sample_numbers[e]),\n\tt.writeUint32(this.sync_sample_numbers[e])\n},\nBoxParser.stssBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 4 + 4 * this.sample_numbers.length,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.sample_numbers.length),\n\tt.writeUint32Array(this.sample_numbers)\n},\nBoxParser.stszBox.prototype.write = function(t) {\n\tvar e, i = !0;\n\tif (this.version = 0, (this.flags = 0) < this.sample_sizes.length) for (e = 0; e + 1 < this.sample_sizes.length;) {\n\t\tif (this.sample_sizes[e + 1] !== this.sample_sizes[0]) {\n\t\t\ti = !1;\n\t\t\tbreak\n\t\t}\n\t\te++\n\t} else i = !1;\n\tthis.size = 8,\n\ti || (this.size += 4 * this.sample_sizes.length),\n\tthis.writeHeader(t),\n\ti ? t.writeUint32(this.sample_sizes[0]) : t.writeUint32(0),\n\tt.writeUint32(this.sample_sizes.length),\n\ti || t.writeUint32Array(this.sample_sizes)\n},\nBoxParser.sttsBox.prototype.write = function(t) {\n\tvar e;\n\tfor (this.version = 0, this.flags = 0, this.size = 4 + 8 * this.sample_counts.length, this.writeHeader(t), t.writeUint32(this.sample_counts.length), e = 0; e < this.sample_counts.length; e++) t.writeUint32(this.sample_counts[e]),\n\tt.writeUint32(this.sample_deltas[e])\n},\nBoxParser.tfdtBox.prototype.write = function(t) {\n\tvar e = Math.pow(2, 32) - 1;\n\tthis.version = this.baseMediaDecodeTime > e ? 1 : 0,\n\tthis.flags = 0,\n\tthis.size = 4,\n\t1 === this.version && (this.size += 4),\n\tthis.writeHeader(t),\n\t1 === this.version ? t.writeUint64(this.baseMediaDecodeTime) : t.writeUint32(this.baseMediaDecodeTime)\n},\nBoxParser.tfhdBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.size = 4,\n\tthis.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET && (this.size += 8),\n\tthis.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC && (this.size += 4),\n\tthis.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR && (this.size += 4),\n\tthis.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE && (this.size += 4),\n\tthis.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS && (this.size += 4),\n\tthis.writeHeader(t),\n\tt.writeUint32(this.track_id),\n\tthis.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET && t.writeUint64(this.base_data_offset),\n\tthis.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC && t.writeUint32(this.default_sample_description_index),\n\tthis.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR && t.writeUint32(this.default_sample_duration),\n\tthis.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE && t.writeUint32(this.default_sample_size),\n\tthis.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS && t.writeUint32(this.default_sample_flags)\n},\nBoxParser.tkhdBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.size = 80,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.creation_time),\n\tt.writeUint32(this.modification_time),\n\tt.writeUint32(this.track_id),\n\tt.writeUint32(0),\n\tt.writeUint32(this.duration),\n\tt.writeUint32(0),\n\tt.writeUint32(0),\n\tt.writeInt16(this.layer),\n\tt.writeInt16(this.alternate_group),\n\tt.writeInt16(this.volume << 8),\n\tt.writeUint16(0),\n\tt.writeInt32Array(this.matrix),\n\tt.writeUint32(this.width),\n\tt.writeUint32(this.height)\n},\nBoxParser.trexBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = 20,\n\tthis.writeHeader(t),\n\tt.writeUint32(this.track_id),\n\tt.writeUint32(this.default_sample_description_index),\n\tt.writeUint32(this.default_sample_duration),\n\tt.writeUint32(this.default_sample_size),\n\tt.writeUint32(this.default_sample_flags)\n},\nBoxParser.trunBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.size = 4,\n\tthis.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET && (this.size += 4),\n\tthis.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG && (this.size += 4),\n\tthis.flags & BoxParser.TRUN_FLAGS_DURATION && (this.size += 4 * this.sample_duration.length),\n\tthis.flags & BoxParser.TRUN_FLAGS_SIZE && (this.size += 4 * this.sample_size.length),\n\tthis.flags & BoxParser.TRUN_FLAGS_FLAGS && (this.size += 4 * this.sample_flags.length),\n\tthis.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET && (this.size += 4 * this.sample_composition_time_offset.length),\n\tthis.writeHeader(t),\n\tt.writeUint32(this.sample_count),\n\tthis.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET && (this.data_offset_position = t.getPosition(), t.writeInt32(this.data_offset)),\n\tthis.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG && t.writeUint32(this.first_sample_flags);\n\tfor (var e = 0; e < this.sample_count; e++) this.flags & BoxParser.TRUN_FLAGS_DURATION && t.writeUint32(this.sample_duration[e]),\n\tthis.flags & BoxParser.TRUN_FLAGS_SIZE && t.writeUint32(this.sample_size[e]),\n\tthis.flags & BoxParser.TRUN_FLAGS_FLAGS && t.writeUint32(this.sample_flags[e]),\n\tthis.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET && (0 === this.version ? t.writeUint32(this.sample_composition_time_offset[e]) : t.writeInt32(this.sample_composition_time_offset[e]))\n},\nBoxParser[\"url Box\"].prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.location ? (this.flags = 0, this.size = this.location.length + 1) : (this.flags = 1, this.size = 0),\n\tthis.writeHeader(t),\n\tthis.location && t.writeCString(this.location)\n},\nBoxParser[\"urn Box\"].prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 0,\n\tthis.size = this.name.length + 1 + (this.location ? this.location.length + 1 : 0),\n\tthis.writeHeader(t),\n\tt.writeCString(this.name),\n\tthis.location && t.writeCString(this.location)\n},\nBoxParser.vmhdBox.prototype.write = function(t) {\n\tthis.version = 0,\n\tthis.flags = 1,\n\tthis.size = 8,\n\tthis.writeHeader(t),\n\tt.writeUint16(this.graphicsmode),\n\tt.writeUint16Array(this.opcolor)\n},\nBoxParser.cttsBox.prototype.unpack = function(t) {\n\tfor (var e, i = 0,\n\tr = 0; r < this.sample_counts.length; r++) for (e = 0; e < this.sample_counts[r]; e++) t[i].pts = t[i].dts + this.sample_offsets[r],\n\ti++\n},\nBoxParser.sttsBox.prototype.unpack = function(t) {\n\tfor (var e, i = 0,\n\tr = 0; r < this.sample_counts.length; r++) for (e = 0; e < this.sample_counts[r]; e++) t[i].dts = 0 === i ? 0 : t[i - 1].dts + this.sample_deltas[r],\n\ti++\n},\nBoxParser.stcoBox.prototype.unpack = function(t) {\n\tfor (var e = 0; e < this.chunk_offsets.length; e++) t[e].offset = this.chunk_offsets[e]\n},\nBoxParser.stscBox.prototype.unpack = function(t) {\n\tfor (var e, i, r = 0,\n\ts = 0,\n\ta = 0; a < this.first_chunk.length; a++) for (e = 0; e < (a + 1 < this.first_chunk.length ? this.first_chunk[a + 1] : 1 / 0); e++) for (s++, i = 0; i < this.samples_per_chunk[a]; i++) {\n\t\tif (!t[r]) return;\n\t\tt[r].description_index = this.sample_description_index[a],\n\t\tt[r].chunk_index = s,\n\t\tr++\n\t}\n},\nBoxParser.stszBox.prototype.unpack = function(t) {\n\tfor (var e = 0; e < this.sample_sizes.length; e++) t[e].size = this.sample_sizes[e]\n},\nBoxParser.DIFF_BOXES_PROP_NAMES = [\"boxes\", \"entries\", \"references\", \"subsamples\", \"items\", \"item_infos\", \"extents\", \"associations\", \"subsegments\", \"ranges\", \"seekLists\", \"seekPoints\", \"esd\", \"levels\"],\nBoxParser.DIFF_PRIMITIVE_ARRAY_PROP_NAMES = [\"compatible_brands\", \"matrix\", \"opcolor\", \"sample_counts\", \"sample_deltas\", \"first_chunk\", \"samples_per_chunk\", \"sample_sizes\", \"chunk_offsets\", \"sample_offsets\", \"sample_description_index\", \"sample_duration\"],\nBoxParser.boxEqualFields = function(t, e) {\n\tif (t && !e) return ! 1;\n\tfor (var i in t) if (! (-1 < BoxParser.DIFF_BOXES_PROP_NAMES.indexOf(i) || t[i] instanceof BoxParser.Box || e[i] instanceof BoxParser.Box || void 0 === t[i] || void 0 === e[i] || \"function\" == typeof t[i] || \"function\" == typeof e[i] || t.subBoxNames && -1 < t.subBoxNames.indexOf(i.slice(0, 4)) || e.subBoxNames && -1 < e.subBoxNames.indexOf(i.slice(0, 4)) || \"data\" === i || \"start\" === i || \"size\" === i || \"creation_time\" === i || \"modification_time\" === i || -1 < BoxParser.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(i) || t[i] === e[i])) return ! 1;\n\treturn ! 0\n},\nBoxParser.boxEqual = function(t, e) {\n\tif (!BoxParser.boxEqualFields(t, e)) return ! 1;\n\tfor (var i = 0; i < BoxParser.DIFF_BOXES_PROP_NAMES.length; i++) {\n\t\tvar r = BoxParser.DIFF_BOXES_PROP_NAMES[i];\n\t\tif (t[r] && e[r] && !BoxParser.boxEqual(t[r], e[r])) return ! 1\n\t}\n\treturn ! 0\n};\nvar VTTin4Parser = function() {};\nVTTin4Parser.prototype.parseSample = function(t) {\n\tfor (var e, i = new MP4BoxStream(t.buffer), r = []; ! i.isEos();)(e = BoxParser.parseOneBox(i, !1)).code === BoxParser.OK && \"vttc\" === e.box.type && r.push(e.box);\n\treturn r\n},\nVTTin4Parser.prototype.getText = function(t, e, i) {\n\tfunction s(t, e, i) {\n\t\treturn i = i || \"0\",\n\t\t(t += \"\").length >= e ? t: new Array(e - t.length + 1).join(i) + t\n\t}\n\tfunction r(t) {\n\t\tvar e = Math.floor(t / 3600),\n\t\ti = Math.floor((t - 3600 * e) / 60),\n\t\tr = Math.floor(t - 3600 * e - 60 * i),\n\t\tt = Math.floor(1e3 * (t - 3600 * e - 60 * i - r));\n\t\treturn s(e, 2) + \":\" + s(i, 2) + \":\" + s(r, 2) + \".\" + s(t, 3)\n\t}\n\tfor (var a = this.parseSample(i), n = \"\", o = 0; o < a.length; o++) {\n\t\tvar h = a[o];\n\t\tn += r(t) + \" --\\\\x3e \" + r(e) + \"\\\\r\\\\n\",\n\t\tn += h.payl.text\n\t}\n\treturn n\n};\nvar XMLSubtitlein4Parser = function() {};\nXMLSubtitlein4Parser.prototype.parseSample = function(t) {\n\tvar e, i = {\n\t\tresources: []\n\t},\n\tr = new MP4BoxStream(t.data.buffer);\n\tif (t.subsamples && 0 !== t.subsamples.length) {\n\t\tif (i.documentString = r.readString(t.subsamples[0].size), 1 < t.subsamples.length) for (e = 1; e < t.subsamples.length; e++) i.resources[e] = r.readUint8Array(t.subsamples[e].size)\n\t} else i.documentString = r.readString(t.data.length);\n\treturn \"undefined\" != typeof DOMParser && (i.document = (new DOMParser).parseFromString(i.documentString, \"application/xml\")),\n\ti\n};\nvar Textin4Parser = function() {};\nTextin4Parser.prototype.parseSample = function(t) {\n\treturn new MP4BoxStream(t.data.buffer).readString(t.data.length)\n},\nTextin4Parser.prototype.parseConfig = function(t) {\n\tt = new MP4BoxStream(t.buffer);\n\treturn t.readUint32(),\n\tt.readCString()\n},\n\"undefined\" != typeof exports && (exports.VTTin4Parser = VTTin4Parser, exports.XMLSubtitlein4Parser = XMLSubtitlein4Parser, exports.Textin4Parser = Textin4Parser);\nvar ISOFile = function(t) {\n\tthis.stream = t || new MultiBufferStream,\n\tthis.boxes = [],\n\tthis.mdats = [],\n\tthis.moofs = [],\n\tthis.isProgressive = !1,\n\tthis.moovStartFound = !1,\n\tthis.onMoovStart = null,\n\tthis.moovStartSent = !1,\n\tthis.onReady = null,\n\tthis.readySent = !1,\n\tthis.onSegment = null,\n\tthis.onSamples = null,\n\tthis.onError = null,\n\tthis.sampleListBuilt = !1,\n\tthis.fragmentedTracks = [],\n\tthis.extractedTracks = [],\n\tthis.isFragmentationInitialized = !1,\n\tthis.sampleProcessingStarted = !1,\n\tthis.nextMoofNumber = 0,\n\tthis.itemListBuilt = !1,\n\tthis.items = [],\n\tthis.entity_groups = [],\n\tthis.onSidx = null,\n\tthis.sidxSent = !1\n};\nISOFile.prototype.setSegmentOptions = function(t, e, i) {\n\tvar r, s = this.getTrackById(t);\n\ts && (r = {},\n\tthis.fragmentedTracks.push(r), r.id = t, r.user = e, (r.trak = s).nextSample = 0, r.segmentStream = null, r.nb_samples = 1e3, r.rapAlignement = !0, i && (i.nbSamples && (r.nb_samples = i.nbSamples), i.rapAlignement && (r.rapAlignement = i.rapAlignement)))\n},\nISOFile.prototype.unsetSegmentOptions = function(t) {\n\tfor (var e = -1,\n\ti = 0; i < this.fragmentedTracks.length; i++) this.fragmentedTracks[i].id == t && (e = i); - 1 < e && this.fragmentedTracks.splice(e, 1)\n},\nISOFile.prototype.setExtractionOptions = function(t, e, i) {\n\tvar r, s = this.getTrackById(t);\n\ts && (r = {},\n\tthis.extractedTracks.push(r), r.id = t, r.user = e, (r.trak = s).nextSample = 0, r.nb_samples = 1e3, r.samples = [], i && i.nbSamples && (r.nb_samples = i.nbSamples))\n},\nISOFile.prototype.unsetExtractionOptions = function(t) {\n\tfor (var e = -1,\n\ti = 0; i < this.extractedTracks.length; i++) this.extractedTracks[i].id == t && (e = i); - 1 < e && this.extractedTracks.splice(e, 1)\n},\nISOFile.prototype.parse = function() {\n\tvar t;\n\tif (!this.restoreParsePosition || this.restoreParsePosition()) for (;;) if (this.hasIncompleteMdat && this.hasIncompleteMdat()) {\n\t\tif (!this.processIncompleteMdat()) return\n\t} else if (this.saveParsePosition && this.saveParsePosition(), (t = BoxParser.parseOneBox(this.stream, !1)).code === BoxParser.ERR_NOT_ENOUGH_DATA) {\n\t\tif (!this.processIncompleteBox) return;\n\t\tif (!this.processIncompleteBox(t)) return\n\t} else {\n\t\tvar e, i = \"uuid\" !== (e = t.box).type ? e.type: e.uuid;\n\t\tswitch (this.boxes.push(e), i) {\n\t\tcase \"mdat\":\n\t\t\tthis.mdats.push(e);\n\t\t\tbreak;\n\t\tcase \"moof\":\n\t\t\tthis.moofs.push(e);\n\t\t\tbreak;\n\t\tcase \"moov\":\n\t\t\tthis.moovStartFound = !0,\n\t\t\t0 === this.mdats.length && (this.isProgressive = !0);\n\t\tdefault:\n\t\t\tvoid 0 !== this[i] && Log.warn(\"ISOFile\", \"Duplicate Box of type: \" + i + \", overriding previous occurrence\"),\n\t\t\tthis[i] = e\n\t\t}\n\t\tthis.updateUsedBytes && this.updateUsedBytes(e, t)\n\t}\n},\nISOFile.prototype.checkBuffer = function(t) {\n\tif (null == t) throw \"Buffer must be defined and non empty\";\n\tif (void 0 === t.fileStart) throw \"Buffer must have a fileStart property\";\n\treturn 0 === t.byteLength ? (Log.warn(\"ISOFile\", \"Ignoring empty buffer (fileStart: \" + t.fileStart + \")\"), this.stream.logBufferLevel(), !1) : (Log.info(\"ISOFile\", \"Processing buffer (fileStart: \" + t.fileStart + \")\"), t.usedBytes = 0, this.stream.insertBuffer(t), this.stream.logBufferLevel(), !!this.stream.initialized() || (Log.warn(\"ISOFile\", \"Not ready to start parsing\"), !1))\n},\nISOFile.prototype.appendBuffer = function(t, e) {\n\tvar i;\n\tif (this.checkBuffer(t)) return this.parse(),\n\tthis.moovStartFound && !this.moovStartSent && (this.moovStartSent = !0, this.onMoovStart && this.onMoovStart()),\n\tthis.moov ? (this.sampleListBuilt || (this.buildSampleLists(), this.sampleListBuilt = !0), this.updateSampleLists(), this.onReady && !this.readySent && (this.readySent = !0, this.onReady(this.getInfo())), this.processSamples(e), this.nextSeekPosition ? (i = this.nextSeekPosition, this.nextSeekPosition = void 0) : i = this.nextParsePosition, this.stream.getEndFilePositionAfter && (i = this.stream.getEndFilePositionAfter(i))) : i = this.nextParsePosition || 0,\n\tthis.sidx && this.onSidx && !this.sidxSent && (this.onSidx(this.sidx), this.sidxSent = !0),\n\tthis.meta && (this.flattenItemInfo && !this.itemListBuilt && (this.flattenItemInfo(), this.itemListBuilt = !0), this.processItems && this.processItems(this.onItem)),\n\tthis.stream.cleanBuffers && (Log.info(\"ISOFile\", \"Done processing buffer (fileStart: \" + t.fileStart + \") - next buffer to fetch should have a fileStart position of \" + i), this.stream.logBufferLevel(), this.stream.cleanBuffers(), this.stream.logBufferLevel(!0), Log.info(\"ISOFile\", \"Sample data size in memory: \" + this.getAllocatedSampleDataSize())),\n\ti\n},\nISOFile.prototype.getInfo = function() {\n\tvar t, e, i, r, s, a, n = {},\n\to = new Date(\"1904-01-01T00:00:00Z\").getTime();\n\tif (this.moov) for (n.hasMoov = !0, n.duration = this.moov.mvhd.duration, n.timescale = this.moov.mvhd.timescale, n.isFragmented = null != this.moov.mvex, n.isFragmented && this.moov.mvex.mehd && (n.fragment_duration = this.moov.mvex.mehd.fragment_duration), n.isProgressive = this.isProgressive, n.hasIOD = null != this.moov.iods, n.brands = [], n.brands.push(this.ftyp.major_brand), n.brands = n.brands.concat(this.ftyp.compatible_brands), n.created = new Date(o + 1e3 * this.moov.mvhd.creation_time), n.modified = new Date(o + 1e3 * this.moov.mvhd.modification_time), n.tracks = [], n.audioTracks = [], n.videoTracks = [], n.subtitleTracks = [], n.metadataTracks = [], n.hintTracks = [], n.otherTracks = [], t = 0; t < this.moov.traks.length; t++) {\n\t\tif (a = (i = this.moov.traks[t]).mdia.minf.stbl.stsd.entries[0], r = {},\n\t\tn.tracks.push(r), r.id = i.tkhd.track_id, r.name = i.mdia.hdlr.name, r.references = [], i.tref) for (e = 0; e < i.tref.boxes.length; e++) s = {},\n\t\tr.references.push(s),\n\t\ts.type = i.tref.boxes[e].type,\n\t\ts.track_ids = i.tref.boxes[e].track_ids;\n\t\ti.edts && (r.edits = i.edts.elst.entries),\n\t\tr.created = new Date(o + 1e3 * i.tkhd.creation_time),\n\t\tr.modified = new Date(o + 1e3 * i.tkhd.modification_time),\n\t\tr.movie_duration = i.tkhd.duration,\n\t\tr.movie_timescale = n.timescale,\n\t\tr.layer = i.tkhd.layer,\n\t\tr.alternate_group = i.tkhd.alternate_group,\n\t\tr.volume = i.tkhd.volume,\n\t\tr.matrix = i.tkhd.matrix,\n\t\tr.track_width = i.tkhd.width / 65536,\n\t\tr.track_height = i.tkhd.height / 65536,\n\t\tr.timescale = i.mdia.mdhd.timescale,\n\t\tr.cts_shift = i.mdia.minf.stbl.cslg,\n\t\tr.duration = i.mdia.mdhd.duration,\n\t\tr.samples_duration = i.samples_duration,\n\t\tr.codec = a.getCodec(),\n\t\tr.kind = i.udta && i.udta.kinds.length ? i.udta.kinds[0] : {\n\t\t\tschemeURI: \"\",\n\t\t\tvalue: \"\"\n\t\t},\n\t\tr.language = i.mdia.elng ? i.mdia.elng.extended_language: i.mdia.mdhd.languageString,\n\t\tr.nb_samples = i.samples.length,\n\t\tr.size = i.samples_size,\n\t\tr.bitrate = 8 * r.size * r.timescale / r.samples_duration,\n\t\ta.isAudio() ? (r.type = \"audio\", n.audioTracks.push(r), r.audio = {},\n\t\tr.audio.sample_rate = a.getSampleRate(), r.audio.channel_count = a.getChannelCount(), r.audio.sample_size = a.getSampleSize()) : a.isVideo() ? (r.type = \"video\", n.videoTracks.push(r), r.video = {},\n\t\tr.video.width = a.getWidth(), r.video.height = a.getHeight()) : a.isSubtitle() ? (r.type = \"subtitles\", n.subtitleTracks.push(r)) : a.isHint() ? (r.type = \"metadata\", n.hintTracks.push(r)) : a.isMetadata() ? (r.type = \"metadata\", n.metadataTracks.push(r)) : (r.type = \"metadata\", n.otherTracks.push(r))\n\t} else n.hasMoov = !1;\n\tif (n.mime = \"\", n.hasMoov && n.tracks) {\n\t\tfor (n.videoTracks && 0 < n.videoTracks.length ? n.mime += 'video/mp4; codecs=\"': n.audioTracks && 0 < n.audioTracks.length ? n.mime += 'audio/mp4; codecs=\"': n.mime += 'application/mp4; codecs=\"', t = 0; t < n.tracks.length; t++) 0 !== t && (n.mime += \",\"),\n\t\tn.mime += n.tracks[t].codec;\n\t\tn.mime += '\"; profiles=\"',\n\t\tn.mime += this.ftyp.compatible_brands.join(),\n\t\tn.mime += '\"'\n\t}\n\treturn n\n},\nISOFile.prototype.setNextSeekPositionFromSample = function(t) {\n\tt && (this.nextSeekPosition ? this.nextSeekPosition = Math.min(t.offset + t.alreadyRead, this.nextSeekPosition) : this.nextSeekPosition = t.offset + t.alreadyRead)\n},\nISOFile.prototype.processSamples = function(t) {\n\tvar e;\n\tif (this.sampleProcessingStarted) {\n\t\tif (this.isFragmentationInitialized && null !== this.onSegment) for (e = 0; e < this.fragmentedTracks.length; e++) for (var i = this.fragmentedTracks[e], r = i.trak; r.nextSample < r.samples.length && this.sampleProcessingStarted;) {\n\t\t\tLog.debug(\"ISOFile\", \"Creating media fragment on track #\" + i.id + \" for sample \" + r.nextSample);\n\t\t\tvar s = this.createFragment(i.id, r.nextSample, i.segmentStream);\n\t\t\tif (!s) break;\n\t\t\tif (i.segmentStream = s, r.nextSample++, (r.nextSample % i.nb_samples == 0 || t || r.nextSample >= r.samples.length) && (Log.info(\"ISOFile\", \"Sending fragmented data on track #\" + i.id + \" for samples [\" + Math.max(0, r.nextSample - i.nb_samples) + \",\" + (r.nextSample - 1) + \"]\"), Log.info(\"ISOFile\", \"Sample data size in memory: \" + this.getAllocatedSampleDataSize()), this.onSegment && this.onSegment(i.id, i.user, i.segmentStream.buffer, r.nextSample, t || r.nextSample >= r.samples.length), i.segmentStream = null, i !== this.fragmentedTracks[e])) break\n\t\t}\n\t\tif (null !== this.onSamples) for (e = 0; e < this.extractedTracks.length; e++) {\n\t\t\tvar a = this.extractedTracks[e];\n\t\t\tfor (r = a.trak; r.nextSample < r.samples.length && this.sampleProcessingStarted;) {\n\t\t\t\tLog.debug(\"ISOFile\", \"Exporting on track #\" + a.id + \" sample #\" + r.nextSample);\n\t\t\t\tvar n = this.getSample(r, r.nextSample);\n\t\t\t\tif (!n) {\n\t\t\t\t\tthis.setNextSeekPositionFromSample(r.samples[r.nextSample]);\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif (r.nextSample++, a.samples.push(n), (r.nextSample % a.nb_samples == 0 || r.nextSample >= r.samples.length) && (Log.debug(\"ISOFile\", \"Sending samples on track #\" + a.id + \" for sample \" + r.nextSample), this.onSamples && this.onSamples(a.id, a.user, a.samples), a.samples = [], a !== this.extractedTracks[e])) break\n\t\t\t}\n\t\t}\n\t}\n},\nISOFile.prototype.getBox = function(t) {\n\tt = this.getBoxes(t, !0);\n\treturn t.length ? t[0] : null\n},\nISOFile.prototype.getBoxes = function(t, e) {\n\tvar i = [];\n\treturn ISOFile._sweep.call(this, t, i, e),\n\ti\n},\nISOFile._sweep = function(t, e, i) {\n\tfor (var r in this.type && this.type == t && e.push(this), this.boxes) {\n\t\tif (e.length && i) return;\n\t\tISOFile._sweep.call(this.boxes[r], t, e, i)\n\t}\n},\nISOFile.prototype.getTrackSamplesInfo = function(t) {\n\tt = this.getTrackById(t);\n\tif (t) return t.samples\n},\nISOFile.prototype.getTrackSample = function(t, e) {\n\tt = this.getTrackById(t);\n\treturn this.getSample(t, e)\n},\nISOFile.prototype.releaseUsedSamples = function(t, e) {\n\tvar i = 0,\n\tr = this.getTrackById(t);\n\tr.lastValidSample || (r.lastValidSample = 0);\n\tfor (var s = r.lastValidSample; s < e; s++) i += this.releaseSample(r, s);\n\tLog.info(\"ISOFile\", \"Track #\" + t + \" released samples up to \" + e + \" (released size: \" + i + \", remaining: \" + this.samplesDataSize + \")\"),\n\tr.lastValidSample = e\n},\nISOFile.prototype.start = function() {\n\tthis.sampleProcessingStarted = !0,\n\tthis.processSamples(!1)\n},\nISOFile.prototype.stop = function() {\n\tthis.sampleProcessingStarted = !1\n},\nISOFile.prototype.flush = function() {\n\tLog.info(\"ISOFile\", \"Flushing remaining samples\"),\n\tthis.updateSampleLists(),\n\tthis.processSamples(!0),\n\tthis.stream.cleanBuffers(),\n\tthis.stream.logBufferLevel(!0)\n},\nISOFile.prototype.seekTrack = function(t, e, i) {\n\tvar r, s, a, n, o = 0,\n\th = 0;\n\tif (0 === i.samples.length) return Log.info(\"ISOFile\", \"No sample in track, cannot seek! Using time \" + Log.getDurationString(0, 1) + \" and offset: 0\"),\n\t{\n\t\toffset: 0,\n\t\ttime: 0\n\t};\n\tfor (r = 0; r < i.samples.length; r++) {\n\t\tif (s = i.samples[r], 0 === r) h = 0,\n\t\tn = s.timescale;\n\t\telse if (s.cts > t * s.timescale) {\n\t\t\th = r - 1;\n\t\t\tbreak\n\t\t}\n\t\te && s.is_sync && (o = r)\n\t}\n\tfor (e && (h = o), t = i.samples[h].cts, i.nextSample = h; i.samples[h].alreadyRead === i.samples[h].size && i.samples[h + 1];) h++;\n\treturn a = i.samples[h].offset + i.samples[h].alreadyRead,\n\tLog.info(\"ISOFile\", \"Seeking to \" + (e ? \"RAP\": \"\") + \" sample #\" + i.nextSample + \" on track \" + i.tkhd.track_id + \", time \" + Log.getDurationString(t, n) + \" and offset: \" + a),\n\t{\n\t\toffset: a,\n\t\ttime: t / n\n\t}\n},\nISOFile.prototype.getTrackDuration = function(t) {\n\treturn t.samples ? ((t = t.samples[t.samples.length - 1]).cts + t.duration) / t.timescale: 1 / 0\n},\nISOFile.prototype.seek = function(t, e) {\n\tvar i, r, s = this.moov,\n\ta = {\n\t\toffset: 1 / 0,\n\t\ttime: 1 / 0\n\t};\n\tif (this.moov) {\n\t\tfor (r = 0; r < s.traks.length; r++) i = s.traks[r],\n\t\tt > this.getTrackDuration(i) || ((i = this.seekTrack(t, e, i)).offset < a.offset && (a.offset = i.offset), i.time < a.time && (a.time = i.time));\n\t\treturn Log.info(\"ISOFile\", \"Seeking at time \" + Log.getDurationString(a.time, 1) + \" needs a buffer with a fileStart position of \" + a.offset),\n\t\ta.offset === 1 / 0 ? a = {\n\t\t\toffset: this.nextParsePosition,\n\t\t\ttime: 0\n\t\t}: a.offset = this.stream.getEndFilePositionAfter(a.offset),\n\t\tLog.info(\"ISOFile\", \"Adjusted seek position (after checking data already in buffer): \" + a.offset),\n\t\ta\n\t}\n\tthrow \"Cannot seek: moov not received!\"\n},\nISOFile.prototype.equal = function(t) {\n\tfor (var e = 0; e < this.boxes.length && e < t.boxes.length;) {\n\t\tvar i = this.boxes[e],\n\t\tr = t.boxes[e];\n\t\tif (!BoxParser.boxEqual(i, r)) return ! 1;\n\t\te++\n\t}\n\treturn ! 0\n},\n\"undefined\" != typeof exports && (exports.ISOFile = ISOFile),\nISOFile.prototype.lastBoxStartPosition = 0,\nISOFile.prototype.parsingMdat = null,\nISOFile.prototype.nextParsePosition = 0,\nISOFile.prototype.discardMdatData = !1,\nISOFile.prototype.processIncompleteBox = function(t) {\n\tvar e;\n\treturn \"mdat\" === t.type ? (e = new BoxParser[t.type + \"Box\"](t.size), this.parsingMdat = e, this.boxes.push(e), this.mdats.push(e), e.start = t.start, e.hdr_size = t.hdr_size, this.stream.addUsedBytes(e.hdr_size), this.lastBoxStartPosition = e.start + e.size, this.stream.seek(e.start + e.size, !1, this.discardMdatData) ? !(this.parsingMdat = null) : (this.moovStartFound ? this.nextParsePosition = this.stream.findEndContiguousBuf() : this.nextParsePosition = e.start + e.size, !1)) : (\"moov\" === t.type && (this.moovStartFound = !0, 0 === this.mdats.length && (this.isProgressive = !0)), !!this.stream.mergeNextBuffer && this.stream.mergeNextBuffer() ? (this.nextParsePosition = this.stream.getEndPosition(), !0) : (!t.type || this.moovStartFound ? this.nextParsePosition = this.stream.getEndPosition() : this.nextParsePosition = this.stream.getPosition() + t.size, !1))\n},\nISOFile.prototype.hasIncompleteMdat = function() {\n\treturn null !== this.parsingMdat\n},\nISOFile.prototype.processIncompleteMdat = function() {\n\tvar t = this.parsingMdat;\n\treturn this.stream.seek(t.start + t.size, !1, this.discardMdatData) ? (Log.debug(\"ISOFile\", \"Found 'mdat' end in buffered data\"), !(this.parsingMdat = null)) : (this.nextParsePosition = this.stream.findEndContiguousBuf(), !1)\n},\nISOFile.prototype.restoreParsePosition = function() {\n\treturn this.stream.seek(this.lastBoxStartPosition, !0, this.discardMdatData)\n},\nISOFile.prototype.saveParsePosition = function() {\n\tthis.lastBoxStartPosition = this.stream.getPosition()\n},\nISOFile.prototype.updateUsedBytes = function(t, e) {\n\tthis.stream.addUsedBytes && (\"mdat\" === t.type ? (this.stream.addUsedBytes(t.hdr_size), this.discardMdatData && this.stream.addUsedBytes(t.size - t.hdr_size)) : this.stream.addUsedBytes(t.size))\n},\nISOFile.prototype.add = BoxParser.Box.prototype.add,\nISOFile.prototype.addBox = BoxParser.Box.prototype.addBox,\nISOFile.prototype.init = function(t) {\n\tvar e = t || {},\n\tt = (this.add(\"ftyp\").set(\"major_brand\", e.brands && e.brands[0] || \"iso4\").set(\"minor_version\", 0).set(\"compatible_brands\", e.brands || [\"iso4\"]), this.add(\"moov\"));\n\treturn t.add(\"mvhd\").set(\"timescale\", e.timescale || 600).set(\"rate\", e.rate || 65536).set(\"creation_time\", 0).set(\"modification_time\", 0).set(\"duration\", e.duration || 0).set(\"volume\", e.width ? 0 : 256).set(\"matrix\", [65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824]).set(\"next_track_id\", 1),\n\tt.add(\"mvex\"),\n\tthis\n},\nISOFile.prototype.addTrack = function(t) {\n\tthis.moov || this.init(t);\n\tvar e = t || {};\n\te.width = e.width || 320,\n\te.height = e.height || 320,\n\te.id = e.id || this.moov.mvhd.next_track_id,\n\te.type = e.type || \"avc1\";\n\tvar i = this.moov.add(\"trak\");\n\tthis.moov.mvhd.next_track_id = e.id + 1,\n\ti.add(\"tkhd\").set(\"flags\", BoxParser.TKHD_FLAG_ENABLED | BoxParser.TKHD_FLAG_IN_MOVIE | BoxParser.TKHD_FLAG_IN_PREVIEW).set(\"creation_time\", 0).set(\"modification_time\", 0).set(\"track_id\", e.id).set(\"duration\", e.duration || 0).set(\"layer\", e.layer || 0).set(\"alternate_group\", 0).set(\"volume\", 1).set(\"matrix\", [65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824]).set(\"width\", e.width << 16).set(\"height\", e.height << 16);\n\tt = i.add(\"mdia\");\n\tt.add(\"mdhd\").set(\"creation_time\", 0).set(\"modification_time\", 0).set(\"timescale\", e.timescale || 1).set(\"duration\", e.media_duration || 0).set(\"language\", e.language || \"und\"),\n\tt.add(\"hdlr\").set(\"handler\", e.hdlr || \"vide\").set(\"name\", e.name || \"Track created with MP4Box.js\"),\n\tt.add(\"elng\").set(\"extended_language\", e.language || \"fr-FR\");\n\tvar r = t.add(\"minf\");\n\tif (void 0 !== BoxParser[e.type + \"SampleEntry\"]) {\n\t\tvar s = new BoxParser[e.type + \"SampleEntry\"];\n\t\ts.data_reference_index = 1;\n\t\tvar a, n, o = \"\";\n\t\tfor (a in BoxParser.sampleEntryCodes) for (var h = BoxParser.sampleEntryCodes[a], d = 0; d < h.length; d++) if (-1 < h.indexOf(e.type)) {\n\t\t\to = a;\n\t\t\tbreak\n\t\t}\n\t\tswitch (o) {\n\t\tcase \"Visual\":\n\t\t\tr.add(\"vmhd\").set(\"graphicsmode\", 0).set(\"opcolor\", [0, 0, 0]),\n\t\t\ts.set(\"width\", e.width).set(\"height\", e.height).set(\"horizresolution\", 72 << 16).set(\"vertresolution\", 72 << 16).set(\"frame_count\", 1).set(\"compressorname\", e.type + \" Compressor\").set(\"depth\", 24),\n\t\t\te.avcDecoderConfigRecord ? ((n = new BoxParser.avcCBox).parse(new MP4BoxStream(e.avcDecoderConfigRecord)), s.addBox(n)) : e.hevcDecoderConfigRecord && ((n = new BoxParser.hvcCBox).parse(new MP4BoxStream(e.hevcDecoderConfigRecord)), s.addBox(n));\n\t\t\tbreak;\n\t\tcase \"Audio\":\n\t\t\tr.add(\"smhd\").set(\"balance\", e.balance || 0),\n\t\t\ts.set(\"channel_count\", e.channel_count || 2).set(\"samplesize\", e.samplesize || 16).set(\"samplerate\", e.samplerate || 65536);\n\t\t\tbreak;\n\t\tcase \"Hint\":\n\t\t\tr.add(\"hmhd\");\n\t\t\tbreak;\n\t\tcase \"Subtitle\":\n\t\t\tr.add(\"sthd\"),\n\t\t\t\"stpp\" === e.type && s.set(\"namespace\", e.namespace || \"nonamespace\").set(\"schema_location\", e.schema_location || \"\").set(\"auxiliary_mime_types\", e.auxiliary_mime_types || \"\");\n\t\t\tbreak;\n\t\tcase \"Metadata\":\n\t\tcase \"System\":\n\t\tdefault:\n\t\t\tr.add(\"nmhd\")\n\t\t}\n\t\te.description && s.addBox(e.description),\n\t\te.description_boxes && e.description_boxes.forEach(function(t) {\n\t\t\ts.addBox(t)\n\t\t}),\n\t\tr.add(\"dinf\").add(\"dref\").addEntry((new BoxParser[\"url Box\"]).set(\"flags\", 1));\n\t\tt = r.add(\"stbl\");\n\t\treturn t.add(\"stsd\").addEntry(s),\n\t\tt.add(\"stts\").set(\"sample_counts\", []).set(\"sample_deltas\", []),\n\t\tt.add(\"stsc\").set(\"first_chunk\", []).set(\"samples_per_chunk\", []).set(\"sample_description_index\", []),\n\t\tt.add(\"stco\").set(\"chunk_offsets\", []),\n\t\tt.add(\"stsz\").set(\"sample_sizes\", []),\n\t\tthis.moov.mvex.add(\"trex\").set(\"track_id\", e.id).set(\"default_sample_description_index\", e.default_sample_description_index || 1).set(\"default_sample_duration\", e.default_sample_duration || 0).set(\"default_sample_size\", e.default_sample_size || 0).set(\"default_sample_flags\", e.default_sample_flags || 0),\n\t\tthis.buildTrakSampleLists(i),\n\t\te.id\n\t}\n},\nBoxParser.Box.prototype.computeSize = function(t) {\n\tt = t || new DataStream;\n\tt.endianness = DataStream.BIG_ENDIAN,\n\tthis.write(t)\n},\nISOFile.prototype.addSample = function(t, e, i) {\n\tvar r = i || {},\n\ti = {},\n\tt = this.getTrackById(t);\n\tif (null !== t) {\n\t\ti.number = t.samples.length,\n\t\ti.track_id = t.tkhd.track_id,\n\t\ti.timescale = t.mdia.mdhd.timescale,\n\t\ti.description_index = r.sample_description_index ? r.sample_description_index - 1 : 0,\n\t\ti.description = t.mdia.minf.stbl.stsd.entries[i.description_index],\n\t\ti.data = e,\n\t\ti.size = e.byteLength,\n\t\ti.alreadyRead = i.size,\n\t\ti.duration = r.duration || 1,\n\t\ti.cts = r.cts || 0,\n\t\ti.dts = r.dts || 0,\n\t\ti.is_sync = r.is_sync || !1,\n\t\ti.is_leading = r.is_leading || 0,\n\t\ti.depends_on = r.depends_on || 0,\n\t\ti.is_depended_on = r.is_depended_on || 0,\n\t\ti.has_redundancy = r.has_redundancy || 0,\n\t\ti.degradation_priority = r.degradation_priority || 0,\n\t\ti.offset = 0,\n\t\ti.subsamples = r.subsamples,\n\t\tt.samples.push(i),\n\t\tt.samples_size += i.size,\n\t\tt.samples_duration += i.duration,\n\t\tvoid 0 === t.first_dts && (t.first_dts = r.dts),\n\t\tthis.processSamples();\n\t\tr = this.createSingleSampleMoof(i);\n\t\treturn this.addBox(r),\n\t\tr.computeSize(),\n\t\tr.trafs[0].truns[0].data_offset = r.size + 8,\n\t\tthis.add(\"mdat\").data = new Uint8Array(e),\n\t\ti\n\t}\n},\nISOFile.prototype.createSingleSampleMoof = function(t) {\n\tvar e = 0,\n\te = t.is_sync ? 1 << 25 : 65536,\n\ti = new BoxParser.moofBox;\n\ti.add(\"mfhd\").set(\"sequence_number\", this.nextMoofNumber),\n\tthis.nextMoofNumber++;\n\tvar r = i.add(\"traf\"),\n\ts = this.getTrackById(t.track_id);\n\treturn r.add(\"tfhd\").set(\"track_id\", t.track_id).set(\"flags\", BoxParser.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),\n\tr.add(\"tfdt\").set(\"baseMediaDecodeTime\", t.dts - (s.first_dts || 0)),\n\tr.add(\"trun\").set(\"flags\", BoxParser.TRUN_FLAGS_DATA_OFFSET | BoxParser.TRUN_FLAGS_DURATION | BoxParser.TRUN_FLAGS_SIZE | BoxParser.TRUN_FLAGS_FLAGS | BoxParser.TRUN_FLAGS_CTS_OFFSET).set(\"data_offset\", 0).set(\"first_sample_flags\", 0).set(\"sample_count\", 1).set(\"sample_duration\", [t.duration]).set(\"sample_size\", [t.size]).set(\"sample_flags\", [e]).set(\"sample_composition_time_offset\", [t.cts - t.dts]),\n\ti\n},\nISOFile.prototype.lastMoofIndex = 0,\nISOFile.prototype.samplesDataSize = 0,\nISOFile.prototype.resetTables = function() {\n\tvar t, e;\n\tfor (this.initial_duration = this.moov.mvhd.duration, t = this.moov.mvhd.duration = 0; t < this.moov.traks.length; t++) { (e = this.moov.traks[t]).tkhd.duration = 0,\n\t\te.mdia.mdhd.duration = 0,\n\t\t(e.mdia.minf.stbl.stco || e.mdia.minf.stbl.co64).chunk_offsets = [],\n\t\t(i = e.mdia.minf.stbl.stsc).first_chunk = [],\n\t\ti.samples_per_chunk = [],\n\t\ti.sample_description_index = [],\n\t\t(e.mdia.minf.stbl.stsz || e.mdia.minf.stbl.stz2).sample_sizes = [],\n\t\t(i = e.mdia.minf.stbl.stts).sample_counts = [],\n\t\ti.sample_deltas = [],\n\t\t(i = e.mdia.minf.stbl.ctts) && (i.sample_counts = [], i.sample_offsets = []),\n\t\ti = e.mdia.minf.stbl.stss;\n\t\tvar i = e.mdia.minf.stbl.boxes.indexOf(i); - 1 != i && (e.mdia.minf.stbl.boxes[i] = null)\n\t}\n},\nISOFile.initSampleGroups = function(t, e, i, r, s) {\n\tvar a, n, o, h;\n\tfunction d(t, e, i) {\n\t\tthis.grouping_type = t,\n\t\tthis.grouping_type_parameter = e,\n\t\tthis.sbgp = i,\n\t\tthis.last_sample_in_run = -1,\n\t\tthis.entry_index = -1\n\t}\n\tfor (e && (e.sample_groups_info = []), t.sample_groups_info || (t.sample_groups_info = []), n = 0; n < i.length; n++) {\n\t\tfor (h = i[n].grouping_type + \"/\" + i[n].grouping_type_parameter, o = new d(i[n].grouping_type, i[n].grouping_type_parameter, i[n]), e && (e.sample_groups_info[h] = o), t.sample_groups_info[h] || (t.sample_groups_info[h] = o), a = 0; a < r.length; a++) r[a].grouping_type === i[n].grouping_type && (o.description = r[a], o.description.used = !0);\n\t\tif (s) for (a = 0; a < s.length; a++) s[a].grouping_type === i[n].grouping_type && (o.fragment_description = s[a], o.fragment_description.used = !0, o.is_fragment = !0)\n\t}\n\tif (e) {\n\t\tif (s) for (n = 0; n < s.length; n++) ! s[n].used && 2 <= s[n].version && (h = s[n].grouping_type + \"/0\", (o = new d(s[n].grouping_type, 0)).is_fragment = !0, e.sample_groups_info[h] || (e.sample_groups_info[h] = o))\n\t} else for (n = 0; n < r.length; n++) ! r[n].used && 2 <= r[n].version && (h = r[n].grouping_type + \"/0\", o = new d(r[n].grouping_type, 0), t.sample_groups_info[h] || (t.sample_groups_info[h] = o))\n},\nISOFile.setSampleGroupProperties = function(t, e, i, r) {\n\tvar s, a, n;\n\tfor (s in e.sample_groups = [], r) e.sample_groups[s] = {},\n\te.sample_groups[s].grouping_type = r[s].grouping_type,\n\te.sample_groups[s].grouping_type_parameter = r[s].grouping_type_parameter,\n\ti >= r[s].last_sample_in_run && (r[s].last_sample_in_run < 0 && (r[s].last_sample_in_run = 0), r[s].entry_index++, r[s].entry_index <= r[s].sbgp.entries.length - 1 && (r[s].last_sample_in_run += r[s].sbgp.entries[r[s].entry_index].sample_count)),\n\tr[s].entry_index <= r[s].sbgp.entries.length - 1 ? e.sample_groups[s].group_description_index = r[s].sbgp.entries[r[s].entry_index].group_description_index: e.sample_groups[s].group_description_index = -1,\n\t0 !== e.sample_groups[s].group_description_index && (n = r[s].fragment_description || r[s].description, 0 < e.sample_groups[s].group_description_index ? (a = 65535 < e.sample_groups[s].group_description_index ? (e.sample_groups[s].group_description_index >> 16) - 1 : e.sample_groups[s].group_description_index - 1, n && 0 <= a && (e.sample_groups[s].description = n.entries[a])) : n && 2 <= n.version && 0 < n.default_group_description_index && (e.sample_groups[s].description = n.entries[n.default_group_description_index - 1]))\n},\nISOFile.process_sdtp = function(t, e, i) {\n\te && (t ? (e.is_leading = t.is_leading[i], e.depends_on = t.sample_depends_on[i], e.is_depended_on = t.sample_is_depended_on[i], e.has_redundancy = t.sample_has_redundancy[i]) : (e.is_leading = 0, e.depends_on = 0, e.is_depended_on = 0, e.has_redundancy = 0))\n},\nISOFile.prototype.buildSampleLists = function() {\n\tfor (var t, e = 0; e < this.moov.traks.length; e++) t = this.moov.traks[e],\n\tthis.buildTrakSampleLists(t)\n},\nISOFile.prototype.buildTrakSampleLists = function(t) {\n\tvar e, i, r, s, a, n, o, h, d, l, p, f, u, _, c, m, x, g, y, B, S, P, U, b;\n\tif (t.samples = [], t.samples_duration = 0, t.samples_size = 0, i = t.mdia.minf.stbl.stco || t.mdia.minf.stbl.co64, r = t.mdia.minf.stbl.stsc, s = t.mdia.minf.stbl.stsz || t.mdia.minf.stbl.stz2, a = t.mdia.minf.stbl.stts, n = t.mdia.minf.stbl.ctts, o = t.mdia.minf.stbl.stss, h = t.mdia.minf.stbl.stsd, d = t.mdia.minf.stbl.subs, f = t.mdia.minf.stbl.stdp, l = t.mdia.minf.stbl.sbgps, p = t.mdia.minf.stbl.sgpds, S = B = y = g = -1, b = U = P = 0, ISOFile.initSampleGroups(t, null, l, p), void 0 !== s) {\n\t\tfor (e = 0; e < s.sample_sizes.length; e++) {\n\t\t\tvar v = {};\n\t\t\tv.number = e,\n\t\t\tv.track_id = t.tkhd.track_id,\n\t\t\tv.timescale = t.mdia.mdhd.timescale,\n\t\t\tv.alreadyRead = 0,\n\t\t\t(t.samples[e] = v).size = s.sample_sizes[e],\n\t\t\tt.samples_size += v.size,\n\t\t\t0 === e ? (_ = 1, u = 0, v.chunk_index = _, v.chunk_run_index = u, x = r.samples_per_chunk[u], m = 0, c = u + 1 < r.first_chunk.length ? r.first_chunk[u + 1] - 1 : 1 / 0) : e < x ? (v.chunk_index = _, v.chunk_run_index = u) : (_++, m = 0, (v.chunk_index = _) <= c || (c = ++u + 1 < r.first_chunk.length ? r.first_chunk[u + 1] - 1 : 1 / 0), v.chunk_run_index = u, x += r.samples_per_chunk[u]),\n\t\t\tv.description_index = r.sample_description_index[v.chunk_run_index] - 1,\n\t\t\tv.description = h.entries[v.description_index],\n\t\t\tv.offset = i.chunk_offsets[v.chunk_index - 1] + m,\n\t\t\tm += v.size,\n\t\t\tg < e && (y++, g < 0 && (g = 0), g += a.sample_counts[y]),\n\t\t\t0 < e ? (t.samples[e - 1].duration = a.sample_deltas[y], t.samples_duration += t.samples[e - 1].duration, v.dts = t.samples[e - 1].dts + t.samples[e - 1].duration) : v.dts = 0,\n\t\t\tn ? (B <= e && (S++, B < 0 && (B = 0), B += n.sample_counts[S]), v.cts = t.samples[e].dts + n.sample_offsets[S]) : v.cts = v.dts,\n\t\t\to ? (e == o.sample_numbers[P] - 1 ? (v.is_sync = !0, P++) : (v.is_sync = !1, v.degradation_priority = 0), d && d.entries[U].sample_delta + b == e + 1 && (v.subsamples = d.entries[U].subsamples, b += d.entries[U].sample_delta, U++)) : v.is_sync = !0,\n\t\t\tISOFile.process_sdtp(t.mdia.minf.stbl.sdtp, v, v.number),\n\t\t\tv.degradation_priority = f ? f.priority[e] : 0,\n\t\t\td && d.entries[U].sample_delta + b == e && (v.subsamples = d.entries[U].subsamples, b += d.entries[U].sample_delta),\n\t\t\t(0 < l.length || 0 < p.length) && ISOFile.setSampleGroupProperties(t, v, e, t.sample_groups_info)\n\t\t}\n\t\t0 < e && (t.samples[e - 1].duration = Math.max(t.mdia.mdhd.duration - t.samples[e - 1].dts, 0), t.samples_duration += t.samples[e - 1].duration)\n\t}\n},\nISOFile.prototype.updateSampleLists = function() {\n\tvar t, e, i, r, s, a, n, o, h, d, l, p;\n\tif (void 0 !== this.moov) for (; this.lastMoofIndex < this.moofs.length;) if (n = this.moofs[this.lastMoofIndex], this.lastMoofIndex++, \"moof\" == n.type) for (o = n, t = 0; t < o.trafs.length; t++) {\n\t\tfor (h = o.trafs[t], d = this.getTrackById(h.tfhd.track_id), l = this.getTrexById(h.tfhd.track_id), e = h.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC ? h.tfhd.default_sample_description_index: l ? l.default_sample_description_index: 1, i = h.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR ? h.tfhd.default_sample_duration: l ? l.default_sample_duration: 0, r = h.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE ? h.tfhd.default_sample_size: l ? l.default_sample_size: 0, s = h.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS ? h.tfhd.default_sample_flags: l ? l.default_sample_flags: 0, (h.sample_number = 0) < h.sbgps.length && ISOFile.initSampleGroups(d, h, h.sbgps, d.mdia.minf.stbl.sgpds, h.sgpds), y = 0; y < h.truns.length; y++) for (var f = h.truns[y], u = 0; u < f.sample_count; u++) { (p = {}).moof_number = this.lastMoofIndex,\n\t\t\tp.number_in_traf = h.sample_number,\n\t\t\th.sample_number++,\n\t\t\tp.number = d.samples.length,\n\t\t\th.first_sample_index = d.samples.length,\n\t\t\td.samples.push(p),\n\t\t\tp.track_id = d.tkhd.track_id,\n\t\t\tp.timescale = d.mdia.mdhd.timescale,\n\t\t\tp.description_index = e - 1,\n\t\t\tp.description = d.mdia.minf.stbl.stsd.entries[p.description_index],\n\t\t\tp.size = r,\n\t\t\tf.flags & BoxParser.TRUN_FLAGS_SIZE && (p.size = f.sample_size[u]),\n\t\t\td.samples_size += p.size,\n\t\t\tp.duration = i,\n\t\t\tf.flags & BoxParser.TRUN_FLAGS_DURATION && (p.duration = f.sample_duration[u]),\n\t\t\td.samples_duration += p.duration,\n\t\t\td.first_traf_merged || 0 < u ? p.dts = d.samples[d.samples.length - 2].dts + d.samples[d.samples.length - 2].duration: (h.tfdt ? p.dts = h.tfdt.baseMediaDecodeTime: p.dts = 0, d.first_traf_merged = !0),\n\t\t\tp.cts = p.dts,\n\t\t\tf.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET && (p.cts = p.dts + f.sample_composition_time_offset[u]),\n\t\t\tx = s,\n\t\t\tf.flags & BoxParser.TRUN_FLAGS_FLAGS ? x = f.sample_flags[u] : 0 === u && f.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG && (x = f.first_sample_flags),\n\t\t\tp.is_sync = !(x >> 16 & 1),\n\t\t\tp.is_leading = x >> 26 & 3,\n\t\t\tp.depends_on = x >> 24 & 3,\n\t\t\tp.is_depended_on = x >> 22 & 3,\n\t\t\tp.has_redundancy = x >> 20 & 3,\n\t\t\tp.degradation_priority = 65535 & x;\n\t\t\tvar _ = !!(h.tfhd.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET),\n\t\t\tc = !!(h.tfhd.flags & BoxParser.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),\n\t\t\tm = !!(f.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET),\n\t\t\tx = 0,\n\t\t\tx = _ ? h.tfhd.base_data_offset: c || 0 === y ? o.start: a;\n\t\t\tp.offset = 0 === y && 0 === u ? m ? x + f.data_offset: x: a,\n\t\t\ta = p.offset + p.size,\n\t\t\t(0 < h.sbgps.length || 0 < h.sgpds.length || 0 < d.mdia.minf.stbl.sbgps.length || 0 < d.mdia.minf.stbl.sgpds.length) && ISOFile.setSampleGroupProperties(d, p, p.number_in_traf, h.sample_groups_info)\n\t\t}\n\t\tif (h.subs) {\n\t\t\td.has_fragment_subsamples = !0;\n\t\t\tfor (var g = h.first_sample_index,\n\t\t\ty = 0; y < h.subs.entries.length; y++) g += h.subs.entries[y].sample_delta,\n\t\t\t(p = d.samples[g - 1]).subsamples = h.subs.entries[y].subsamples\n\t\t}\n\t}\n},\nISOFile.prototype.getSample = function(t, e) {\n\tvar i, r = t.samples[e];\n\tif (!this.moov) return null;\n\tif (r.data) {\n\t\tif (r.alreadyRead == r.size) return r\n\t} else r.data = new Uint8Array(r.size),\n\tr.alreadyRead = 0,\n\tthis.samplesDataSize += r.size,\n\tLog.debug(\"ISOFile\", \"Allocating sample #\" + e + \" on track #\" + t.tkhd.track_id + \" of size \" + r.size + \" (total: \" + this.samplesDataSize + \")\");\n\tfor (;;) {\n\t\tvar s = this.stream.findPosition(!0, r.offset + r.alreadyRead, !1);\n\t\tif (! (-1 < s)) return null;\n\t\ts = (i = this.stream.buffers[s]).byteLength - (r.offset + r.alreadyRead - i.fileStart);\n\t\tif (r.size - r.alreadyRead <= s) return Log.debug(\"ISOFile\", \"Getting sample #\" + e + \" data (alreadyRead: \" + r.alreadyRead + \" offset: \" + (r.offset + r.alreadyRead - i.fileStart) + \" read size: \" + (r.size - r.alreadyRead) + \" full size: \" + r.size + \")\"),\n\t\tDataStream.memcpy(r.data.buffer, r.alreadyRead, i, r.offset + r.alreadyRead - i.fileStart, r.size - r.alreadyRead),\n\t\ti.usedBytes += r.size - r.alreadyRead,\n\t\tthis.stream.logBufferLevel(),\n\t\tr.alreadyRead = r.size,\n\t\tr;\n\t\tif (0 == s) return null;\n\t\tLog.debug(\"ISOFile\", \"Getting sample #\" + e + \" partial data (alreadyRead: \" + r.alreadyRead + \" offset: \" + (r.offset + r.alreadyRead - i.fileStart) + \" read size: \" + s + \" full size: \" + r.size + \")\"),\n\t\tDataStream.memcpy(r.data.buffer, r.alreadyRead, i, r.offset + r.alreadyRead - i.fileStart, s),\n\t\tr.alreadyRead += s,\n\t\ti.usedBytes += s,\n\t\tthis.stream.logBufferLevel()\n\t}\n},\nISOFile.prototype.releaseSample = function(t, e) {\n\te = t.samples[e];\n\treturn e.data ? (this.samplesDataSize -= e.size, e.data = null, e.alreadyRead = 0, e.size) : 0\n},\nISOFile.prototype.getAllocatedSampleDataSize = function() {\n\treturn this.samplesDataSize\n},\nISOFile.prototype.getCodecs = function() {\n\tfor (var t = \"\",\n\te = 0; e < this.moov.traks.length; e++) 0 < e && (t += \",\"),\n\tt += this.moov.traks[e].mdia.minf.stbl.stsd.entries[0].getCodec();\n\treturn t\n},\nISOFile.prototype.getTrexById = function(t) {\n\tvar e;\n\tif (!this.moov || !this.moov.mvex) return null;\n\tfor (e = 0; e < this.moov.mvex.trexs.length; e++) {\n\t\tvar i = this.moov.mvex.trexs[e];\n\t\tif (i.track_id == t) return i\n\t}\n\treturn null\n},\nISOFile.prototype.getTrackById = function(t) {\n\tif (void 0 === this.moov) return null;\n\tfor (var e = 0; e < this.moov.traks.length; e++) {\n\t\tvar i = this.moov.traks[e];\n\t\tif (i.tkhd.track_id == t) return i\n\t}\n\treturn null\n},\nISOFile.prototype.itemsDataSize = 0,\nISOFile.prototype.flattenItemInfo = function() {\n\tvar t = this.items,\n\te = this.entity_groups,\n\ti = this.meta;\n\tif (null != i && void 0 !== i.hdlr && void 0 !== i.iinf) {\n\t\tfor (d = 0; d < i.iinf.item_infos.length; d++)(s = {}).id = i.iinf.item_infos[d].item_ID,\n\t\t(t[s.id] = s).ref_to = [],\n\t\ts.name = i.iinf.item_infos[d].item_name,\n\t\t0 < i.iinf.item_infos[d].protection_index && (s.protection = i.ipro.protections[i.iinf.item_infos[d].protection_index - 1]),\n\t\ti.iinf.item_infos[d].item_type ? s.type = i.iinf.item_infos[d].item_type: s.type = \"mime\",\n\t\ts.content_type = i.iinf.item_infos[d].content_type,\n\t\ts.content_encoding = i.iinf.item_infos[d].content_encoding,\n\t\ts.item_uri_type = i.iinf.item_infos[d].item_uri_type;\n\t\tif (i.grpl) for (d = 0; d < i.grpl.boxes.length; d++) entity_group = {},\n\t\tentity_group.id = i.grpl.boxes[d].group_id,\n\t\tentity_group.entity_ids = i.grpl.boxes[d].entity_ids,\n\t\tentity_group.type = i.grpl.boxes[d].type,\n\t\te[entity_group.id] = entity_group;\n\t\tif (i.iloc) for (d = 0; d < i.iloc.items.length; d++) {\n\t\t\tvar r = i.iloc.items[d],\n\t\t\ts = t[r.item_ID];\n\t\t\tswitch (0 !== r.data_reference_index && (Log.warn(\"Item storage with reference to other files: not supported\"), s.source = i.dinf.boxes[r.data_reference_index - 1]), r.construction_method) {\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tLog.warn(\"Item storage with construction_method : not supported\")\n\t\t\t}\n\t\t\tfor (s.extents = [], n = s.size = 0; n < r.extents.length; n++) s.extents[n] = {},\n\t\t\ts.extents[n].offset = r.extents[n].extent_offset + r.base_offset,\n\t\t\t1 == r.construction_method && (s.extents[n].offset += i.idat.start + i.idat.hdr_size),\n\t\t\ts.extents[n].length = r.extents[n].extent_length,\n\t\t\ts.extents[n].alreadyRead = 0,\n\t\t\ts.size += s.extents[n].length\n\t\t}\n\t\tif (i.pitm && (t[i.pitm.item_id].primary = !0), i.iref) for (d = 0; d < i.iref.references.length; d++) for (var a = i.iref.references[d], n = 0; n < a.references.length; n++) t[a.from_item_ID].ref_to.push({\n\t\t\ttype: a.type,\n\t\t\tid: a.references[n]\n\t\t});\n\t\tif (i.iprp) for (var o = 0; o < i.iprp.ipmas.length; o++) for (var h = i.iprp.ipmas[o], d = 0; d < h.associations.length; d++) {\n\t\t\tvar l = h.associations[d];\n\t\t\tif (s = (s = t[l.id]) || e[l.id]) for (void 0 === s.properties && (s.properties = {},\n\t\t\ts.properties.boxes = []), n = 0; n < l.props.length; n++) {\n\t\t\t\tvar p = l.props[n];\n\t\t\t\t0 < p.property_index && p.property_index - 1 < i.iprp.ipco.boxes.length && (p = i.iprp.ipco.boxes[p.property_index - 1], s.properties[p.type] = p, s.properties.boxes.push(p))\n\t\t\t}\n\t\t}\n\t}\n},\nISOFile.prototype.getItem = function(t) {\n\tvar e, i;\n\tif (!this.meta) return null;\n\tif (! (i = this.items[t]).data && i.size) i.data = new Uint8Array(i.size),\n\ti.alreadyRead = 0,\n\tthis.itemsDataSize += i.size,\n\tLog.debug(\"ISOFile\", \"Allocating item #\" + t + \" of size \" + i.size + \" (total: \" + this.itemsDataSize + \")\");\n\telse if (i.alreadyRead === i.size) return i;\n\tfor (var r = 0; r < i.extents.length; r++) {\n\t\tvar s = i.extents[r];\n\t\tif (s.alreadyRead !== s.length) {\n\t\t\tvar a = this.stream.findPosition(!0, s.offset + s.alreadyRead, !1);\n\t\t\tif (! (-1 < a)) return null;\n\t\t\ta = (e = this.stream.buffers[a]).byteLength - (s.offset + s.alreadyRead - e.fileStart);\n\t\t\tif (! (s.length - s.alreadyRead <= a)) return Log.debug(\"ISOFile\", \"Getting item #\" + t + \" extent #\" + r + \" partial data (alreadyRead: \" + s.alreadyRead + \" offset: \" + (s.offset + s.alreadyRead - e.fileStart) + \" read size: \" + a + \" full extent size: \" + s.length + \" full item size: \" + i.size + \")\"),\n\t\t\tDataStream.memcpy(i.data.buffer, i.alreadyRead, e, s.offset + s.alreadyRead - e.fileStart, a),\n\t\t\ts.alreadyRead += a,\n\t\t\ti.alreadyRead += a,\n\t\t\te.usedBytes += a,\n\t\t\tthis.stream.logBufferLevel(),\n\t\t\tnull;\n\t\t\tLog.debug(\"ISOFile\", \"Getting item #\" + t + \" extent #\" + r + \" data (alreadyRead: \" + s.alreadyRead + \" offset: \" + (s.offset + s.alreadyRead - e.fileStart) + \" read size: \" + (s.length - s.alreadyRead) + \" full extent size: \" + s.length + \" full item size: \" + i.size + \")\"),\n\t\t\tDataStream.memcpy(i.data.buffer, i.alreadyRead, e, s.offset + s.alreadyRead - e.fileStart, s.length - s.alreadyRead),\n\t\t\te.usedBytes += s.length - s.alreadyRead,\n\t\t\tthis.stream.logBufferLevel(),\n\t\t\ti.alreadyRead += s.length - s.alreadyRead,\n\t\t\ts.alreadyRead = s.length\n\t\t}\n\t}\n\treturn i.alreadyRead === i.size ? i: null\n},\nISOFile.prototype.releaseItem = function(t) {\n\tvar e = this.items[t];\n\tif (e.data) {\n\t\tthis.itemsDataSize -= e.size,\n\t\te.data = null;\n\t\tfor (var i = e.alreadyRead = 0; i < e.extents.length; i++) e.extents[i].alreadyRead = 0;\n\t\treturn e.size\n\t}\n\treturn 0\n},\nISOFile.prototype.processItems = function(t) {\n\tfor (var e in this.items) {\n\t\tvar i = this.items[e];\n\t\tthis.getItem(i.id),\n\t\tt && !i.sent && (t(i), i.sent = !0, i.data = null)\n\t}\n},\nISOFile.prototype.hasItem = function(t) {\n\tfor (var e in this.items) {\n\t\tvar i = this.items[e];\n\t\tif (i.name === t) return i.id\n\t}\n\treturn - 1\n},\nISOFile.prototype.getMetaHandler = function() {\n\treturn this.meta ? this.meta.hdlr.handler: null\n},\nISOFile.prototype.getPrimaryItem = function() {\n\treturn this.meta && this.meta.pitm ? this.getItem(this.meta.pitm.item_id) : null\n},\nISOFile.prototype.itemToFragmentedTrackFile = function(t) {\n\tvar e = t || {},\n\ti = null;\n\tif (null == (i = e.itemId ? this.getItem(e.itemId) : this.getPrimaryItem())) return null;\n\tt = new ISOFile;\n\tt.discardMdatData = !1;\n\te = {\n\t\ttype: i.type,\n\t\tdescription_boxes: i.properties.boxes\n\t};\n\ti.properties.ispe && (e.width = i.properties.ispe.image_width, e.height = i.properties.ispe.image_height);\n\te = t.addTrack(e);\n\treturn e ? (t.addSample(e, i.data), t) : null\n},\nISOFile.prototype.write = function(t) {\n\tfor (var e = 0; e < this.boxes.length; e++) this.boxes[e].write(t)\n},\nISOFile.prototype.createFragment = function(t, e, i) {\n\tvar r = this.getTrackById(t),\n\tt = this.getSample(r, e);\n\tif (null == t) return this.setNextSeekPositionFromSample(r.samples[e]),\n\tnull;\n\te = i || new DataStream;\n\te.endianness = DataStream.BIG_ENDIAN;\n\ti = this.createSingleSampleMoof(t);\n\ti.write(e),\n\ti.trafs[0].truns[0].data_offset = i.size + 8,\n\tLog.debug(\"MP4Box\", \"Adjusting data_offset with new value \" + i.trafs[0].truns[0].data_offset),\n\te.adjustUint32(i.trafs[0].truns[0].data_offset_position, i.trafs[0].truns[0].data_offset);\n\ti = new BoxParser.mdatBox;\n\treturn i.data = t.data,\n\ti.write(e),\n\te\n},\nISOFile.writeInitializationSegment = function(t, e, i, r) {\n\tvar s;\n\tLog.debug(\"ISOFile\", \"Generating initialization segment\");\n\tvar a = new DataStream;\n\ta.endianness = DataStream.BIG_ENDIAN,\n\tt.write(a);\n\tvar n = e.add(\"mvex\");\n\tfor (i && n.add(\"mehd\").set(\"fragment_duration\", i), s = 0; s < e.traks.length; s++) n.add(\"trex\").set(\"track_id\", e.traks[s].tkhd.track_id).set(\"default_sample_description_index\", 1).set(\"default_sample_duration\", r).set(\"default_sample_size\", 0).set(\"default_sample_flags\", 65536);\n\treturn e.write(a),\n\ta.buffer\n},\nISOFile.prototype.save = function(t) {\n\tvar e = new DataStream;\n\te.endianness = DataStream.BIG_ENDIAN,\n\tthis.write(e),\n\te.save(t)\n},\nISOFile.prototype.getBuffer = function() {\n\tvar t = new DataStream;\n\treturn t.endianness = DataStream.BIG_ENDIAN,\n\tthis.write(t),\n\tt.buffer\n},\nISOFile.prototype.initializeSegmentation = function() {\n\tvar t, e, i, r;\n\tfor (null === this.onSegment && Log.warn(\"MP4Box\", \"No segmentation callback set!\"), this.isFragmentationInitialized || (this.isFragmentationInitialized = !0, this.nextMoofNumber = 0, this.resetTables()), e = [], t = 0; t < this.fragmentedTracks.length; t++) {\n\t\tvar s = new BoxParser.moovBox;\n\t\ts.mvhd = this.moov.mvhd,\n\t\ts.boxes.push(s.mvhd),\n\t\ti = this.getTrackById(this.fragmentedTracks[t].id),\n\t\ts.boxes.push(i),\n\t\ts.traks.push(i),\n\t\t(r = {}).id = i.tkhd.track_id,\n\t\tr.user = this.fragmentedTracks[t].user,\n\t\tr.buffer = ISOFile.writeInitializationSegment(this.ftyp, s, this.moov.mvex && this.moov.mvex.mehd ? this.moov.mvex.mehd.fragment_duration: void 0, 0 < this.moov.traks[t].samples.length ? this.moov.traks[t].samples[0].duration: 0),\n\t\te.push(r)\n\t}\n\treturn e\n},\nBoxParser.Box.prototype.printHeader = function(t) {\n\tthis.size += 8,\n\tthis.size > MAX_SIZE && (this.size += 8),\n\t\"uuid\" === this.type && (this.size += 16),\n\tt.log(t.indent + \"size:\" + this.size),\n\tt.log(t.indent + \"type:\" + this.type)\n},\nBoxParser.FullBox.prototype.printHeader = function(t) {\n\tthis.size += 4,\n\tBoxParser.Box.prototype.printHeader.call(this, t),\n\tt.log(t.indent + \"version:\" + this.version),\n\tt.log(t.indent + \"flags:\" + this.flags)\n},\nBoxParser.Box.prototype.print = function(t) {\n\tthis.printHeader(t)\n},\nBoxParser.ContainerBox.prototype.print = function(t) {\n\tthis.printHeader(t);\n\tfor (var e, i = 0; i < this.boxes.length; i++) this.boxes[i] && (e = t.indent, t.indent += \" \", this.boxes[i].print(t), t.indent = e)\n},\nISOFile.prototype.print = function(t) {\n\tt.indent = \"\";\n\tfor (var e = 0; e < this.boxes.length; e++) this.boxes[e] && this.boxes[e].print(t)\n},\nBoxParser.mvhdBox.prototype.print = function(t) {\n\tBoxParser.FullBox.prototype.printHeader.call(this, t),\n\tt.log(t.indent + \"creation_time: \" + this.creation_time),\n\tt.log(t.indent + \"modification_time: \" + this.modification_time),\n\tt.log(t.indent + \"timescale: \" + this.timescale),\n\tt.log(t.indent + \"duration: \" + this.duration),\n\tt.log(t.indent + \"rate: \" + this.rate),\n\tt.log(t.indent + \"volume: \" + (this.volume >> 8)),\n\tt.log(t.indent + \"matrix: \" + this.matrix.join(\", \")),\n\tt.log(t.indent + \"next_track_id: \" + this.next_track_id)\n},\nBoxParser.tkhdBox.prototype.print = function(t) {\n\tBoxParser.FullBox.prototype.printHeader.call(this, t),\n\tt.log(t.indent + \"creation_time: \" + this.creation_time),\n\tt.log(t.indent + \"modification_time: \" + this.modification_time),\n\tt.log(t.indent + \"track_id: \" + this.track_id),\n\tt.log(t.indent + \"duration: \" + this.duration),\n\tt.log(t.indent + \"volume: \" + (this.volume >> 8)),\n\tt.log(t.indent + \"matrix: \" + this.matrix.join(\", \")),\n\tt.log(t.indent + \"layer: \" + this.layer),\n\tt.log(t.indent + \"alternate_group: \" + this.alternate_group),\n\tt.log(t.indent + \"width: \" + this.width),\n\tt.log(t.indent + \"height: \" + this.height)\n};\nvar MP4Box = {\n\tcreateFile: function(t, e) {\n\t\tt = void 0 === t || t,\n\t\te = new ISOFile(e);\n\t\treturn e.discardMdatData = !t,\n\t\te\n\t}\n};\n\"undefined\" != typeof exports && (exports.createFile = MP4Box.createFile);\n`\n\nconst workerLogic = `\n// 显式将变量绑定到self上,确保全局可访问\nself.abortFlag = false;\nself.mp4boxfile = null;\nself.videoDecoder = null;\nself.samplesInRange = [];\nself.videoTrack = null;\nself.arrayBuffer = null;\n\nonmessage = function(e) {\n if (e.data.type === 'decode') {\n self.abortFlag = false;\n decodeFile(e.data.file, e.data.start, e.data.end, e.data.hardwareAcceleration);\n } else if (e.data.type === 'abort') {\n self.abortFlag = true;\n // 主动销毁所有大对象和引用\n if (self.videoDecoder) {\n try {\n self.videoDecoder.flush();\n self.videoDecoder.reset();\n self.videoDecoder.close();\n } catch (err) {}\n self.videoDecoder = null;\n }\n if (self.mp4boxfile) {\n try { self.mp4boxfile.flush(); } catch (err) {}\n self.mp4boxfile = null;\n }\n self.samplesInRange = [];\n self.videoTrack = null;\n self.arrayBuffer = null;\n // 关闭worker\n self.close();\n }\n};\n\nfunction decodeFile(file, startFrame, endFrame, hardwareAcceleration) {\n self.arrayBuffer = file.data;\n self.mp4boxfile = MP4Box.createFile();\n self.videoTrack = null;\n let nbSampleTotal = 0;\n self.samplesInRange = [];\n self.videoDecoder = null;\n let frameIndex = 0;\n let totalFrames = 0;\n self.mp4boxfile.onReady = function(info) {\n self.videoTrack = info.videoTracks[0];\n nbSampleTotal = self.videoTrack.nb_samples;\n self.mp4boxfile.setExtractionOptions(self.videoTrack.id, null, {\n nbSamples: nbSampleTotal,\n rapAlignement: true\n });\n self.mp4boxfile.start();\n };\n self.mp4boxfile.onSamples = async function(trackId, ref, samples) {\n if (self.abortFlag) return; // 确保使用self访问\n // 自动对齐到区间内第一个关键帧\n let startIdx = Math.min(0, startFrame); // 修复Math.min, 因为仅有第一帧是关键帧\n let endIdx = Math.min(samples.length - 1, endFrame);\n while (startIdx <= endIdx && !samples[startIdx].is_sync) {\n startIdx++;\n }\n if (startIdx > endIdx) {\n // 区间内没有关键帧,直接done\n postMessage({ type: 'done' });\n return;\n }\n self.samplesInRange = samples.slice(0, endIdx + 1);\n totalFrames = self.samplesInRange.length;\n if (!self.videoDecoder) {\n self.videoDecoder = new VideoDecoder({\n output: handleFrame,\n error: err => {\n postMessage({ type: 'error', error: err.message })\n }\n });\n const entry = self.mp4boxfile.moov.traks[0].mdia.minf.stbl.stsd.entries[0];\n const box = entry.avcC ?? entry.hvcC ?? entry.vpcC;\n let description = undefined;\n if (box) {\n const stream = new DataStream(undefined, 0, DataStream.BIG_ENDIAN);\n box.write(stream);\n description = new Uint8Array(stream.buffer.slice(8));\n }\n\t\tconst isIOS = /(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent);\n \tconst userAgent = (navigator.userAgent || \"\").toLowerCase();\n\t const isAndroid = /android/.test(userAgent) || /openharmony|arkweb/.test(userAgent);\n\t\tconst defaultConfig = {\n\t\t\tcodec: self.videoTrack.codec,\n\t\t\tcodedWidth: self.videoTrack.track_width,\n\t\t\tcodedHeight: self.videoTrack.track_height,\n\t\t\tdescription,\n\t\t}\n\t\t// Android 系统下,默认配置为 prefer-software 以避免硬件解码问题\n\t\tlet config = isAndroid ? { ...defaultConfig, hardwareAcceleration: 'prefer-software' } : hardwareAcceleration === 'default' ? defaultConfig\t: {\n\t\t\t...defaultConfig,\n\t\t\thardwareAcceleration: hardwareAcceleration,\n\t\t}\n\t\t// let config = hardwareAcceleration === 'default' ? defaultConfig\t: {\n\t\t// \t...defaultConfig,\n\t\t// \thardwareAcceleration: hardwareAcceleration,\n\t\t// }\n\t\tconst configSupport = (await VideoDecoder.isConfigSupported(config));\n\t\tconst isConfigSupported = configSupport.supported;\n\t\tpostMessage({ type: 'configSupport', configSupport: { config, configSupport}});\n\t\tlet isDefaultConfigSupported = false;\n\t\tif(!isConfigSupported) {\n\t\t\tconst defaultConfigSupport = await VideoDecoder.isConfigSupported(defaultConfig);\n\t\t\tpostMessage({ type: 'configSupport', configSupport: { defaultConfig, configSupport: defaultConfigSupport}});\n\t\t\tisDefaultConfigSupported = defaultConfigSupport.supported;\n\t\t}\n\t\tif(isConfigSupported) {\n\t\t\tself.videoDecoder.configure(config);\n\t\t} else if(isDefaultConfigSupported) {\n\t\t\tself.videoDecoder.configure(defaultConfig);\n\t\t} else {\n\t\t\tpostMessage({ type: 'error', error: '不支持的视频解码配置' });\n\t\t}\n }\n for (let i = 0; i < self.samplesInRange.length; i++) {\n if (self.abortFlag) break; // 确保使用self访问\n \n const sample = self.samplesInRange[i];\n const chunk = new EncodedVideoChunk({\n type: sample.is_sync ? 'key' : 'delta',\n timestamp: sample.cts,\n duration: sample.duration,\n data: sample.data\n });\n self.videoDecoder.decode(chunk);\n }\n self.videoDecoder.flush().then(() => {\n postMessage({ type: 'done' });\n });\n };\n function handleFrame(videoFrame) {\n if (self.abortFlag) { // 确保使用self访问\n videoFrame.close();\n return;\n }\n postMessage({ type: 'frame', frame: videoFrame, index: frameIndex++, total: totalFrames }, [videoFrame]);\n }\n self.arrayBuffer.fileStart = 0;\n self.mp4boxfile.appendBuffer(self.arrayBuffer);\n self.mp4boxfile.flush();\n}\n`;\n\nconst fullWorkerScript = `\ntry {\n ${mp4boxSource}\n self.MP4Box = MP4Box;\n ${workerLogic}\n} catch (error) {\n console.error('Worker初始化失败:', error);\n throw error;\n}\n`\nconst blob = new Blob([fullWorkerScript], { type: \"application/javascript\" });\nexport const workerURL = URL.createObjectURL(blob);\n","/**\n * Base64 字符串 → Uint8Array 字节流(工具函数,处理 2 字节对齐)\n * @param base64Str 服务端返回的 Base64 编码字符串(int16 字节流 Base64 后)\n * @returns Uint8Array 字节流(2 字节/元素,对应 int16)\n */\nfunction base64ToUint8Array(base64Str) {\n if (!base64Str || base64Str.trim() === '') {\n return new Uint8Array(0);\n }\n\n const binaryStr = atob(base64Str);\n const uint8Array = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) {\n uint8Array[i] = binaryStr.charCodeAt(i);\n }\n return uint8Array;\n}\n\n/**\n * 2 字节小端序 → int16 数值(兼容服务端 np.clip 范围:-32767~32767)\n * @param byte0 小端序低位字节\n * @param byte1 小端序高位字节\n * @returns 有符号 int16 数值(严格限制在 -32767~32767,与服务端一致)\n */\nfunction twoByteToInt16(byte0, byte1) {\n // 小端序合并为无符号 16 位整数\n const uint16 = (byte0 << 0) | (byte1 << 8);\n // 无符号 → 有符号 int16(自动处理负数)\n let int16Value = uint16 > 32767 ? uint16 - 65536 : uint16;\n // 兼容服务端 np.clip:强制限制范围(防止异常数据超出)\n return Math.max(-32767, Math.min(32767, int16Value));\n}\n\n/**\n * 服务端 floats_to_scaled_int16_bytes 反向函数:Base64 → float32 数组\n * 核心逻辑:Base64→int16字节流→int16数值(兼容round+clip)→÷0x7FFF→float32\n * @param base64Str 服务端返回的 Base64 编码字符串\n * @returns float32 精度的浮点数数组(与服务端原始 floats 一致)\n */\nexport function scaledInt16BytesToFloat32(base64Str) {\n // 步骤1:Base64 → Uint8Array 字节流\n const uint8Array = base64ToUint8Array(base64Str);\n\n // 校验:int16 占 2 字节,必须 2 字节对齐\n if (uint8Array.length === 0 || uint8Array.length % 2 !== 0) {\n return [];\n }\n\n const SCALE_FACTOR = 0x7FFF; // 与服务端一致:32767\n const length = uint8Array.length / 2; // 计算 int16 元素个数\n\n // 批量处理:用 Float32Array 确保 float32 精度(与服务端输入对齐)\n const buffer = new ArrayBuffer(4 * length);\n const float32View = new Float32Array(buffer);\n\n // 步骤2:遍历解析+反量化\n for (let i = 0; i < length; i++) {\n const byteIndex = i * 2;\n const byte0 = uint8Array[byteIndex]; // 小端序低位字节\n const byte1 = uint8Array[byteIndex + 1]; // 小端序高位字节\n\n // 步骤2.1:解析 int16(兼容服务端 round+clip)\n const int16Value = twoByteToInt16(byte0, byte1);\n\n // 步骤2.2:反量化(除以缩放因子,还原原始浮点数)\n const floatValue = int16Value / SCALE_FACTOR;\n\n // 步骤2.3:强制 float32 精度(消除 JS float64 多余精度)\n float32View[i] = floatValue;\n }\n\n // 转为普通数组返回(方便业务使用)\n return Array.from(float32View);\n}\n\n/**\n * 可选:带平滑滤波的版本(解决“脸色闪”问题,优化视觉效果)\n * @param base64Str 服务端 Base64 字符串\n * @param lastData 上一帧数据(用于平滑)\n * @param alpha 平滑系数(0~1,默认0.2,越大响应越快,越小越平滑)\n * @returns 平滑后的 float32 数组\n */\nexport function scaledInt16BytesToSmoothFloat32(base64Str, lastData = [], alpha = 0.2) {\n const rawData = scaledInt16BytesToFloat32(base64Str);\n // 首次无历史数据,直接返回原始数据\n if (lastData.length !== rawData.length) return rawData;\n\n // 一阶低通滤波:current = alpha*raw + (1-alpha)*last\n return rawData.map((val, idx) => {\n return alpha * val + (1 - alpha) * lastData[idx];\n });\n}\n\n\n/**\n * 解析后端传输的 float32 字节流为普通数组\n * @param {string|ArrayBuffer|Uint8Array} bytes - 后端传来的二进制数据(注意格式兼容)\n * @returns {number[]} 解析后的浮点数组(空数据返回空数组)\n */\n/**\n * 从 Uint8Array 解析出 float32 数组(核心修复版)\n * @param {Uint8Array} uint8Arr - 后端传来的 Uint8Array 原始字节\n * @returns {number[]} 解析后的浮点数组\n */\nexport function parseUint8ToFloat32(uint8Arr) {\n // 空值处理\n if (!uint8Arr || uint8Arr.length === 0) {\n return [];\n }\n\n\n // 步骤1:校验总字节数是否为 4 的倍数(float32 每个元素占 4 字节)\n if (uint8Arr.length % 4 !== 0) {\n window.avatarSDKLogger.error('Uint8Array长度不是4的倍数,无法解析为float32数组');\n return [];\n }\n\n // 步骤2:创建新的 ArrayBuffer 并拷贝字节(强制偏移量为 0)\n // 核心:不管原偏移量是多少,拷贝后新数组偏移量=0,必然满足 4 的倍数\n const alignedBuffer = new ArrayBuffer(uint8Arr.length);\n const alignedUint8 = new Uint8Array(alignedBuffer);\n alignedUint8.set(uint8Arr); // 把原始字节拷贝到新数组\n\n // 步骤3:基于对齐的 ArrayBuffer 创建 Float32Array\n const float32Arr = new Float32Array(alignedBuffer);\n\n // 步骤4:转普通数组返回\n const result = Array.from(float32Arr);\n return result;\n}","import { bodyFile, IRawBodyFrameData } from \"../types/frame-data\";\nimport { workerURL } from \"../worker/streaming-video\";\nimport ResourceManager, { IOfflineIdle } from \"./ResourceManager\";\nimport { performanceConstant } from \"../utils/perfermance\";\nimport SaveAndDownload from \"../control/SaveAndDownload\";\nimport { DataCacheQueue } from \"../control/DataCacheQueue\";\nimport { EErrorCode } from \"../types/error\";\nimport { parseUint8ToFloat32 } from \"../utils/float32-decoder\";\n\n\nexport default class ParallelDecoder {\n private tasks: Map<\n string,\n {\n worker: Worker;\n status: string;\n onMessage: (e: MessageEvent) => void;\n ef?: number;\n }\n >;\n private queue: Array<IRawBodyFrameData>;\n private maxParallel: number;\n private currentParallel: number;\n private _locked: boolean;\n private currentTaskId: string | null;\n private resourceManager: ResourceManager;\n private onFrame: (file: bodyFile, frame: any, index: number) => void;\n private onDone: (file: bodyFile, id: string) => void;\n private isFirstDecode: boolean;\n private pendingAbort: boolean = false;\n private abortAfterEf: number | null = null;\n private pendingNewQueue: Array<IRawBodyFrameData> | null = null;\n private currentDecodedFrameIndex: number | null = null;\n private abortAfterFrame: number | null = null;\n private cacheVideoCount: number = 5; // 缓存视频数量\n private saveAndDownload: SaveAndDownload;\n private dataCacheQueue: DataCacheQueue;\n private bodyFrameCountMap: Map<string, number>;\n private maxVideoCount: number = 2;\n private hardwareAcceleration: string = \"default\";\n private MAX_LOAD_VIDEO_TIMEOUT_MS = 2000; // 最大加载视频超时时间(毫秒)\n\n _offlineLastFrame = 0;\n _offlineIdle: IOfflineIdle[] = [];\n _offlineIdleIndex = 0;\n firstDecodeFrame: boolean = true;\n reportMessage: (message: {\n code: EErrorCode;\n message: string;\n e?: object;\n }) => void;\n\n constructor(options: {\n hardwareAcceleration: string;\n resourceManager: ResourceManager;\n saveAndDownload: SaveAndDownload;\n dataCacheQueue: DataCacheQueue;\n reportMessage: (message: {\n code: EErrorCode;\n message: string;\n e?: object;\n }) => void;\n }) {\n this.tasks = new Map();\n this.queue = [];\n this.maxParallel = 1;\n this.currentParallel = 0;\n this._locked = false; // 并发保护锁\n this.currentTaskId = null;\n this.resourceManager = options.resourceManager;\n this.onFrame = () => {};\n this.onDone = () => {};\n this.isFirstDecode = true;\n this.saveAndDownload = options.saveAndDownload;\n this.dataCacheQueue = options.dataCacheQueue;\n this.bodyFrameCountMap = new Map();\n this.hardwareAcceleration = options.hardwareAcceleration;\n this.reportMessage = options.reportMessage;\n }\n\n getRandomTaskId() {\n return Date.now() + \"_\" + Math.random().toString(36).slice(2, 10);\n }\n\n decode(\n files: Array<IRawBodyFrameData>,\n onFrame: (file: bodyFile, frame: any, index: number) => void,\n ) {\n if (this.isFirstDecode) {\n if (this._locked) return; // 并发保护\n this.abort(); // 清理所有旧任务\n this._locked = true;\n this.queue = files; // 拷贝一份队列\n this.onFrame = (file, frame, index) => {\n this.currentDecodedFrameIndex = file.startFrameIndex + index;\n this._handlePendingAbort(file, index);\n onFrame(file, frame, index);\n };\n this.currentParallel = 0;\n this.currentTaskId = this.getRandomTaskId(); // 唯一任务ID\n this.isFirstDecode = false;\n } else {\n this.updateQueue(files);\n }\n }\n\n clearOldQueue(frame: number) {\n this.queue = this.queue.filter((item) => item.sf >= frame);\n }\n\n updateQueue(files: Array<IRawBodyFrameData>) {\n this.abortAfterFrame = null;\n if (this.queue.length === 0) {\n this.queue.push(...files);\n // (window as any).avatarSDKLogger.log(\"队列为空,直接追加\", JSON.stringify(this.getQueue()));\n return;\n }\n\n const lastQueueEf = this.queue[this.queue.length - 1].ef;\n const firstQueueSf = this.queue[0].sf;\n const newSf = files[0].sf;\n // (window as any).avatarSDKLogger.log(\"开始校验视频队列,目前队列\", JSON.stringify(this.getQueue()));\n\n if (newSf >= lastQueueEf) {\n // 顺序追加\n this.queue.push(...files);\n // (window as any).avatarSDKLogger.log(\"顺序追加结果\", JSON.stringify(this.getQueue()));\n } else if (newSf < firstQueueSf) {\n // 回退/seek,判断是否需要等待\n if (\n this.currentDecodedFrameIndex !== null &&\n newSf > this.currentDecodedFrameIndex + 1\n ) {\n // 有间隔,需要等待\n this.abortAfterFrame = newSf - 1;\n // 找到数据中ef小于abortAfterFrame的帧\n const oldQueue = this.queue.filter((item) => item.ef < newSf);\n this.queue = oldQueue.concat(files);\n // (window as any).avatarSDKLogger.log(\"等待处理到abortAfterFrame后再abort\", this.abortAfterFrame, this.pendingNewQueue);\n return;\n } else {\n // 没有间隔,直接abort\n this.abort();\n this.queue = files.slice();\n this._locked = true;\n this.currentTaskId = this.getRandomTaskId();\n // (window as any).avatarSDKLogger.log(\"回退/seek,重置队列\", JSON.stringify(this.getQueue()));\n // 清除队列中sf小于newsf的帧\n const newQueueSf = this.queue[0].sf;\n this.dataCacheQueue.clearOldFrames(newQueueSf);\n }\n } else if (newSf === firstQueueSf) {\n this.queue = files.slice();\n const newQueueSf = this.queue[0].sf;\n this.dataCacheQueue.clearOldFrames(newQueueSf);\n // (window as any).avatarSDKLogger.log(\"重置队列\", JSON.stringify(this.getQueue()));\n } else {\n // 在队列中间,找到重叠点,截断再追加\n const mp4Index = this.queue.findIndex((item) => item.sf >= newSf);\n if (mp4Index !== -1) {\n this.queue.length = mp4Index;\n }\n this.abortAfterFrame = newSf-1;\n this.queue.push(...files);\n // (window as any).avatarSDKLogger.log(\"中间追加,截断后追加\", JSON.stringify(this.getQueue()));\n }\n }\n _isIOS() {\n return /iPad|iPhone|iPod|iOS/.test(navigator.userAgent);\n }\n\n getQueue() {\n return this.queue.map(item => ({\n ...item,\n x_offset: []\n }));\n }\n\n // 定义超时函数:超过指定时间后 reject\n timeoutPromise(ms: number, reason = \"请求超时\") {\n return new Promise((_, reject) => {\n setTimeout(() => {\n // (window as any).avatarSDKLogger.error(reason);\n reject();\n }, ms);\n });\n }\n\n // 加载视频并添加超时控制(800ms)\n async loadVideoWithTimeout(videoKey: string): Promise<ArrayBuffer | null> {\n try {\n // Promise.race:谁先完成就取谁的结果(加载成功 或 超时)\n const arrayBuffer = await Promise.race([\n this.resourceManager.loadVideo(videoKey), // 原加载逻辑\n this.timeoutPromise(this.MAX_LOAD_VIDEO_TIMEOUT_MS, `视频 ${videoKey} 加载超时(${this.MAX_LOAD_VIDEO_TIMEOUT_MS}ms)`) // 800ms 超时\n ]);\n return arrayBuffer as ArrayBuffer; // 加载成功,返回 ArrayBuffer\n } catch (error) {\n return null; // 超时或失败,返回 null 标识\n }\n }\n\n async _tryStartNext() {\n // 新增:判断当前队列是否包含回退视频(sf < 当前已解码帧索引)\n const hasBackwardVideo = this.queue?.some(item => \n this.currentDecodedFrameIndex !== null && item.sf < this.currentDecodedFrameIndex\n );\n // 缓存数量判断:回退场景下放宽限制(允许多1个)\n let maxAllowed: number;\n\n if (hasBackwardVideo) {\n // 回退时:iOS 保持原限制,其他平台临时+1\n maxAllowed = this._isIOS() ? this.maxVideoCount : this.maxVideoCount + 1;\n } else {\n // 非回退时:iOS 限制为1,其他平台用默认最大数量\n maxAllowed = this._isIOS() ? 1 : this.maxVideoCount;\n }\n if (this.dataCacheQueue.getBodyVideoNameListLength() >= maxAllowed) {\n return;\n }\n if (this.currentParallel < this.maxParallel && this.queue.length > 0) {\n const bodyInfo = this.queue.shift() as IRawBodyFrameData;\n this.saveAndDownload.appendMultipleToArray(\"videoData\", [{\n ...bodyInfo,\n x_offset: parseUint8ToFloat32(bodyInfo.x_offset) || []\n }]);\n this._cleanupOldWorkers(bodyInfo.body_id ?? bodyInfo.id ?? 0);\n this.currentParallel++;\n (window as any).performanceTracker.markStart(\n performanceConstant.load_video,\n bodyInfo\n );\n if(!bodyInfo.n) {\n this.currentParallel--;\n this._tryStartNext();\n this.reportMessage({\n code: EErrorCode.INVALID_BODY_NAME,\n message: `body数据无Name: ${JSON.stringify(bodyInfo)}`,\n });\n return;\n }\n // 加载视频并添加超时控制\n const arrayBuffer = (await this.loadVideoWithTimeout(\n bodyInfo.n\n )) as ArrayBuffer;\n if(!arrayBuffer) {\n this.currentParallel--;\n this._tryStartNext();\n return;\n }\n (window as any).performanceTracker.markEnd(\n performanceConstant.load_video,\n bodyInfo\n );\n (window as any).performanceTracker.markStart(\n performanceConstant.decode_video,\n bodyInfo\n );\n \n (window as any).performanceTracker.markStart(\n performanceConstant.first_decode_video,\n bodyInfo\n );\n this._startWorker({\n name: bodyInfo.n,\n id: bodyInfo.id,\n frameState: bodyInfo.s,\n start: bodyInfo.asf,\n end: bodyInfo.aef,\n hfd: bodyInfo.hfd,\n data: arrayBuffer,\n startFrameIndex: bodyInfo.sf,\n endFrameIndex: bodyInfo.ef,\n body_id: bodyInfo.body_id,\n x_offset: parseUint8ToFloat32(bodyInfo.x_offset) || []\n });\n }\n }\n\n _startWorker(file: bodyFile) {\n const taskId = this.currentTaskId;\n const worker = new Worker(workerURL);\n const id = `${file.body_id ?? file.id ?? 0}_${file.name}`;\n const data = file.data;\n const dataCopy = new ArrayBuffer(data.byteLength);\n new Uint8Array(dataCopy).set(new Uint8Array(data));\n\n const onMessage = (e: MessageEvent) => {\n if (taskId !== this.currentTaskId) return; // 只处理当前任务\n if (e.data.type === \"frame\") {\n if(this.firstDecodeFrame) {\n this.firstDecodeFrame = false;\n (window as any).performanceTracker.markEnd(\n performanceConstant.first_decode_video,\n file\n );\n }\n if(e.data.index < file.start || e.data.index > file.end) {\n e.data.frame.close();\n } else {\n this.cacheVideo();\n this.onFrame(file, e.data.frame, e.data.index);\n const bodyFrameCount = this.bodyFrameCountMap.get(file.name) ?? 0\n this.bodyFrameCountMap.set(file.name, bodyFrameCount + 1)\n if (this.abortAfterFrame && e.data.index + file.startFrameIndex >= this.abortAfterFrame) {\n (window as any).avatarSDKLogger.log(\"abortAfterFrame\", this.abortAfterFrame, file)\n this.abortOne(id);\n this.abortAfterFrame = null;\n this._tryStartNext();\n }\n }\n } else if(e.data.type === \"configSupport\") {\n (window as any).avatarSDKLogger.log(\"configSupport\", e.data);\n }else if (e.data.type === \"done\") {\n (window as any).performanceTracker.markEnd(\n performanceConstant.decode_video,\n file\n );\n const bodyFrameCount = this.bodyFrameCountMap.get(file.name) ?? 0\n if(bodyFrameCount < file.end- file.start - 1) {\n this.bodyFrameCountMap.delete(file.name)\n }\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"done\";\n task.worker.postMessage({ type: \"abort\" });\n }\n this.currentParallel--;\n this.onDone && this.onDone(file, id);\n worker.removeEventListener(\"message\", onMessage);\n worker.terminate();\n this.tasks.delete(id);\n if (this.currentParallel === 0 && this.queue.length === 0) {\n this._locked = false; // 解锁\n }\n this._tryStartNext();\n } else if (e.data.type === \"error\") {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"error\";\n task.worker.postMessage({ type: \"abort\" });\n }\n this.currentParallel--;\n this.onDone && this.onDone(file, id);\n worker.removeEventListener(\"message\", onMessage);\n worker.terminate();\n this.tasks.delete(id);\n if (this.currentParallel === 0 && this.queue.length === 0) {\n this._locked = false; // 解锁\n }\n }\n };\n worker.addEventListener(\"message\", onMessage);\n this.tasks.set(id, {\n worker,\n status: \"decoding\",\n onMessage,\n ef: file.endFrameIndex,\n });\n (window as any).avatarSDKLogger.log(\"start decode\", file.name, file.startFrameIndex, file.endFrameIndex)\n worker.postMessage(\n {\n type: \"decode\",\n file: { data: dataCopy },\n start: file.start,\n end: file.end,\n hardwareAcceleration: this.hardwareAcceleration,\n taskId,\n },\n [dataCopy]\n );\n }\n\n // 在当前视频解出第一帧后,缓存队列中的前cacheVideoCount个视频(包括当前视频)\n // 首次调用会缓存当前视频及后续cacheVideoCount-1个视频\n // 后续每次调用会重新请求前cacheVideoCount个视频(已缓存的视频会被loadVideo内部过滤)\n cacheVideo() {\n const cacheQueue = this.queue.slice(0, this.cacheVideoCount);\n for (const item of cacheQueue) {\n this.resourceManager.preloadVideo(item.n);\n }\n }\n\n abort() {\n this.tasks.forEach(({ worker, status, onMessage }) => {\n if (status === \"decoding\") {\n worker.postMessage({ type: \"abort\" });\n if (onMessage) worker.removeEventListener(\"message\", onMessage);\n worker.terminate();\n }\n });\n this.tasks.clear();\n this.queue = [];\n this.currentParallel = 0;\n this._locked = false; // 解锁\n this.currentTaskId = null;\n }\n\n abortOne(id: string) {\n const task = this.tasks.get(id);\n if (task && task.status === \"decoding\") {\n task?.worker.postMessage({ type: \"abort\" });\n if (task?.onMessage) {\n task.worker.removeEventListener(\"message\", task.onMessage);\n }\n task?.worker.terminate();\n this.tasks.delete(id);\n this.currentParallel--;\n if (this.currentParallel === 0 && this.queue.length === 0) {\n this._locked = false; // 解锁\n }\n }\n }\n\n destroy() {\n this.abort();\n this.queue = [];\n this.currentParallel = 0;\n this._locked = false;\n this.currentTaskId = null;\n this.pendingAbort = false;\n this.abortAfterEf = null;\n this.pendingNewQueue = null;\n this.abortAfterFrame = null;\n this.currentDecodedFrameIndex = null;\n this.firstDecodeFrame = true;\n }\n\n _handlePendingAbort(file: bodyFile, index: number) {\n if (this.pendingAbort && this.abortAfterEf !== null) {\n const currentFrameIndex = file.startFrameIndex + index;\n if (currentFrameIndex >= this.abortAfterEf) {\n this.abort();\n this.queue = this.pendingNewQueue!;\n this._locked = true;\n this.currentTaskId = this.getRandomTaskId();\n // 重置等待标志\n this.pendingAbort = false;\n this.abortAfterEf = null;\n this.pendingNewQueue = null;\n }\n }\n }\n\n private _cleanupOldWorkers(newBodyId: number) {\n for (const [taskId, task] of this.tasks) {\n // taskId 格式如 '143_stand_by_unface03_cut_011'\n const [bodyIdStr] = taskId.split(\"_\");\n const bodyId = parseInt(bodyIdStr, 10);\n if (!isNaN(bodyId) && bodyId < newBodyId) {\n task.worker.postMessage({ type: \"abort\" });\n if (task.onMessage)\n task.worker.removeEventListener(\"message\", task.onMessage);\n task.worker.terminate();\n this.tasks.delete(taskId);\n }\n }\n }\n syncDecode(currentFrameIndex: number) {\n // 直接打断当前解帧的视频,理论上1s,很小概率用户会切换回来。\n const mp4List = this.queue.filter((item) => item.ef > currentFrameIndex);\n if (mp4List.length === 0) {\n return\n }\n this.abort();\n // 如果上述条件不满足,则打断当前处理中的任务,根据currentFrameIndex获取queue中ef>currentFrameIndex的queue,重新装填到解帧队列,开始解帧\n this.queue = mp4List;\n this._locked = true;\n this.currentTaskId = this.getRandomTaskId();\n this._tryStartNext();\n }\n\n /** 进入正常模式 */\n _reload() {\n this._offlineLastFrame = 0\n this.queue = []\n }\n /** 进入离线,清空剩余身体数据 */\n _offLineMode(offlineIdle: IOfflineIdle[], currentFrame: number) {\n this.abort()\n this._offlineLastFrame = currentFrame\n this._offlineIdle = offlineIdle\n this.currentParallel -= 1;\n this.queue = []\n this._offlineRun()\n }\n _offlineRun() {\n const idle = this._offlineIdle[this._offlineIdleIndex]\n if (idle) {\n this._offlineIdleIndex += 1\n this._putOfflineBodyData(idle)\n } else {\n this._offlineIdleIndex = 0\n }\n }\n /** 设置 idle 视频 */\n _putOfflineBodyData(idle: IOfflineIdle) {\n const delta = idle.aef - idle.asf\n\n const bodyInfo = {\n id: -1,\n n: idle.n,\n s: 'idle',\n hfd: false,\n body_id: -1,\n asf: idle.asf,\n aef: idle.aef,\n sf: this._offlineLastFrame,\n ef: this._offlineLastFrame + delta,\n x_offset: new Uint8Array(),\n }\n this.queue.push(bodyInfo)\n this._offlineLastFrame = bodyInfo.ef\n }\n}\n","interface FrameAnimationControllerOptions {\n defaultSpeed?: number;\n frameRate?: number;\n frameCallback?: (frame: number, timeJson: any) => void;\n}\n\nexport default class FrameAnimationController {\n private startTime: number | null; // 新增:开始时间\n private currentFrame: number;\n private speed: number;\n private frameCallback: ((frame: number, timeJson: any) => void) | null;\n private isPlaying: boolean;\n private animationId: number | null;\n private frameRate: number; // 新增:帧率\n private startTimeFromDate: number | null; // 新增:开始时间日期\n private currentFrameFromDate: number | null; // 新增:当前帧日期\n\n constructor({\n defaultSpeed = 1,\n frameRate = 24,\n frameCallback,\n }: FrameAnimationControllerOptions = {}) {\n this.startTime = null; // 初始化开始时间为null\n this.currentFrame = 1;\n this.speed = defaultSpeed;\n this.frameCallback = frameCallback || null;\n this.frameRate = frameRate; // 保存帧率\n\n this.isPlaying = false;\n this.animationId = null;\n this.startTimeFromDate = null; // 初始化开始时间日期为null\n this.currentFrameFromDate = null; // 初始化开始帧日期为null\n }\n\n get playing() {\n return this.isPlaying;\n }\n\n // 启动动画\n play(): void {\n if (this.isPlaying) return;\n\n this.isPlaying = true;\n (window as any).avatarSDKLogger.log(\"开始时间\", this.startTime)\n // 记录开始时间(如果还没有开始时间)\n if (this.startTime === null) {\n (window as any).avatarSDKLogger.log(\"当前时间\", performance.now())\n this.startTime = performance.now();\n // startTimeFromDate 必须与 startTime 同步设置,\n // 否则 pause→play 后两个时间源基准不一致,导致 frame_number_error 误报\n this.startTimeFromDate = Date.now();\n }\n this.animationId = requestAnimationFrame(this._animate.bind(this));\n }\n\n // 暂停动画\n pause(): void {\n this.isPlaying = false;\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n }\n\n // 重置动画\n reset(): void {\n this.pause();\n this.startTime = null; // 重置开始时间\n this.currentFrame = 1;\n this._updateFrame();\n this.startTimeFromDate = null; // 重置开始时间日期\n this.currentFrameFromDate = null; // 重置当前帧日期\n }\n\n // 设置速度\n setSpeed(speed: number): void {\n this.speed = speed;\n }\n\n // 跳转到指定帧\n gotoFrame(frameNumber: number): void {\n if (frameNumber < 1) frameNumber = 1;\n\n this.currentFrame = frameNumber;\n this._updateFrame();\n }\n\n // 下一帧\n nextFrame(): void {\n this.currentFrame++;\n this._updateFrame();\n }\n\n // 上一帧\n prevFrame(): void {\n this.gotoFrame(this.currentFrame - 1);\n }\n\n // 清理资源,在组件销毁时调用\n destroy(): void {\n this.pause();\n this.frameCallback = null;\n this.startTime = null; // 清理开始时间\n this.startTimeFromDate = null; // 清理开始时间日期\n this.currentFrame = 1; // 清理当前帧\n this.currentFrameFromDate = null; // 清理当前帧日期\n this.speed = 1;\n }\n\n // 动画循环\n private _animate(timestamp: number): void {\n let nowTime = performance.now();\n const deltaTime = timestamp - nowTime;\n // 如果差异在100ms以内,使用timestamp作为时间戳\n // 如果差异在100ms以上,则使用performance.now()作为时间戳\n if (Math.abs(deltaTime) < 100) {\n nowTime = timestamp;\n }\n if (this.currentFrame < 50) {\n (window as any).avatarSDKLogger.log(\"animate时间\", timestamp, \"开始时间\", this.startTime, \"performance\", performance.now())\n }\n if (!this.isPlaying) return;\n\n // 基于开始时间计算当前应该显示的帧数\n if (this.startTime !== null) {\n const elapsedTime = nowTime - this.startTime;\n // 使用1/48秒的计算速率来提高准确度,然后除以2来保持1/24秒的显示速率\n const calculatedFrame =\n Math.floor(\n Math.floor(elapsedTime / (1000 / (this.frameRate * 2))) / 2\n ) + 1;\n\n // (window as any).avatarSDKLogger.log(\"计算帧号\", calculatedFrame)\n // 如果计算出的帧号与当前帧号不同,更新帧号\n if (calculatedFrame !== this.currentFrame) {\n this.currentFrame = calculatedFrame;\n this._updateFrame();\n }\n // 基于开始时间日期计算当前应该显示的帧数\n const elapsedTimeFromDate = Date.now() - this.startTimeFromDate!;\n const calculatedFrameFromDate = Math.floor(\n Math.floor(elapsedTimeFromDate / (1000 / (this.frameRate * 2))) / 2\n ) + 1;\n // (window as any).avatarSDKLogger.log(\"计算日期帧号\", calculatedFrameFromDate)\n this.currentFrameFromDate = calculatedFrameFromDate;\n }\n\n if (this.isPlaying) {\n this.animationId = requestAnimationFrame(this._animate.bind(this));\n }\n }\n\n // 更新帧 - 基于时间的帧计算\n private _updateFrame(): void {\n let timeJson:any = null\n if (this.frameCallback) {\n // 执行帧更新回调\n if (this.currentFrameFromDate !== this.currentFrame && this.currentFrameFromDate !== null) {\n timeJson = {\n \"key\": \"frame_number_error\",\n \"Date帧号\": this.currentFrameFromDate,\n \"performance帧号\": this.currentFrame,\n \"开始时间\": this.startTime,\n \"开始时间日期\": this.startTimeFromDate,\n \"当前时间\": Date.now(),\n \"performance.now()\": performance.now(),\n };\n }\n this.frameCallback(this.currentFrame, timeJson);\n }\n }\n\n // 获取当前帧\n getCurrentFrame(): number {\n // 这里不能直接返回this.currentFrame,因为存在用户将游览器置到后台,\n // 游览器会暂停requestAnimationFrame,导致this.currentFrame不更新\n // 这里需要重新计算\n if (this.startTime !== null) {\n const elapsedTime = performance.now() - this.startTime;\n const calculatedFrame =\n Math.floor(\n Math.floor(elapsedTime / (1000 / (this.frameRate * 2))) / 2\n ) + 1;\n return calculatedFrame;\n }\n return this.currentFrame;\n }\n\n // 更新开始时间\n updateStartTime(frame: number): void {\n this.startTime = performance.now() - (frame - 1) * (1000 / this.frameRate);\n // 同步 Date 时间基准,避免 performance 和 Date 双时间源脱节导致 frame_number_error 误报\n this.startTimeFromDate = Date.now() - (frame - 1) * (1000 / this.frameRate);\n }\n}\n","export type WebAudioSessionType = \"playback\" | \"play-and-record\";\n\ntype WebAudioSession = {\n type: string;\n};\n\ntype NavigatorWithAudioSession = Navigator & {\n audioSession?: WebAudioSession;\n};\n\ntype WebAudioPlaybackSessionRestoredListener = () => void;\n\nconst captureStates = new WeakMap<\n WebAudioSession,\n { count: number; previousType: string }\n>();\nconst playbackSessionRestoredListeners = new WeakMap<\n WebAudioSession,\n Set<WebAudioPlaybackSessionRestoredListener>\n>();\n\n/**\n * Keep Web Audio audible through the iOS Ring/Silent switch. Do not override\n * a play-and-record session that may belong to an active microphone track.\n */\nexport function configureWebAudioPlaybackSession(\n target: Navigator = navigator,\n): boolean {\n const audioSession = getAudioSession(target);\n if (!audioSession) {\n return false;\n }\n\n const captureState = captureStates.get(audioSession);\n if (captureState?.count || audioSession.type === \"play-and-record\") {\n return setAudioSessionType(audioSession, \"play-and-record\");\n }\n return setAudioSessionType(audioSession, \"playback\");\n}\n\nexport function beginWebAudioCaptureSession(\n target: Navigator = navigator,\n): boolean {\n const audioSession = getAudioSession(target);\n if (!audioSession) {\n return false;\n }\n\n const existingState = captureStates.get(audioSession);\n const previousType = existingState?.previousType ?? audioSession.type;\n if (!setAudioSessionType(audioSession, \"play-and-record\")) {\n return false;\n }\n\n captureStates.set(audioSession, {\n count: (existingState?.count ?? 0) + 1,\n previousType,\n });\n return true;\n}\n\nexport function subscribeWebAudioPlaybackSessionRestored(\n listener: WebAudioPlaybackSessionRestoredListener,\n target: Navigator = navigator,\n): () => void {\n const audioSession = getAudioSession(target);\n if (!audioSession) {\n return () => {};\n }\n\n let listeners = playbackSessionRestoredListeners.get(audioSession);\n if (!listeners) {\n listeners = new Set();\n playbackSessionRestoredListeners.set(audioSession, listeners);\n }\n listeners.add(listener);\n\n return () => {\n listeners?.delete(listener);\n if (listeners?.size === 0) {\n playbackSessionRestoredListeners.delete(audioSession);\n }\n };\n}\n\nexport function endWebAudioCaptureSession(\n target: Navigator = navigator,\n): boolean {\n const audioSession = getAudioSession(target);\n if (!audioSession) {\n return false;\n }\n\n const captureState = captureStates.get(audioSession);\n if (!captureState) {\n return configureWebAudioPlaybackSession(target);\n }\n\n captureState.count -= 1;\n if (captureState.count > 0) {\n return setAudioSessionType(audioSession, \"play-and-record\");\n }\n\n captureStates.delete(audioSession);\n const nextType = captureState.previousType === \"play-and-record\"\n ? \"play-and-record\"\n : \"playback\";\n const updated = setAudioSessionType(audioSession, nextType);\n if (updated && nextType === \"playback\") {\n notifyPlaybackSessionRestored(audioSession);\n }\n return updated;\n}\n\nfunction notifyPlaybackSessionRestored(audioSession: WebAudioSession): void {\n const listeners = playbackSessionRestoredListeners.get(audioSession);\n if (!listeners) {\n return;\n }\n\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // Playback recovery must never break microphone cleanup.\n }\n }\n}\n\nfunction getAudioSession(target: Navigator): WebAudioSession | undefined {\n return (target as NavigatorWithAudioSession).audioSession;\n}\n\nfunction setAudioSessionType(\n audioSession: WebAudioSession,\n type: WebAudioSessionType,\n): boolean {\n try {\n audioSession.type = type;\n return audioSession.type === type;\n } catch {\n return false;\n }\n}\n","import {\n configureWebAudioPlaybackSession,\n subscribeWebAudioPlaybackSessionRestored,\n} from \"../utils/audio-session\";\n\nconst pcm_audio_script = `// pcm-audio-processor.js - 运行在音频线程的Worklet处理器\nclass PCMAudioProcessor extends AudioWorkletProcessor {\n // 音量配置(与主线程保持一致)\n static get parameterDescriptors() {\n return [\n {\n name: 'volume',\n defaultValue: 1.0,\n minValue: 0.0,\n maxValue: 1.0,\n automationRate: 'a-rate' // 支持音频速率自动化\n }\n ];\n }\n\n constructor() {\n super();\n this.config = {\n sampleRate: 24000, // 固定24kHz采样率\n bytesPerSample: 2, // S16LE=2字节/采样点\n };\n this.pcmCache = new Uint8Array(0); // Worklet内的PCM缓存\n this.isActive = false; // 播放音频状态(控制是否生成声音)\n this.isDestroyed = false;\n this.fadeState = {\n // 淡入淡出状态(避免片段切换爆音)\n phase: 'idle', // idle/fadeIn/fadeOut/steady\n currentGain: 0,\n fadeTime: 0.01, // 淡入淡出时间(秒,建议最小0.01s避免爆音)\n fadeSamples: Math.floor(0.01 * 24000), // 淡入淡出样本数(24000Hz下为240样本)\n };\n this.currentSegment = null; // 当前处理的音频段(float32数组)\n this.segmentOffset = 0; // 当前音频段的播放偏移量\n \n // 监听主线程消息(接收PCM数据、状态控制等)\n this.port.onmessage = (e) => this.handleMainThreadMessage(e.data);\n \n // 初始化淡入淡出样本数\n this.fadeState.fadeSamples = Math.floor(this.fadeState.fadeTime * this.config.sampleRate);\n }\n\n /**\n * 处理主线程发来的消息(PCM数据/状态控制等)\n * @param {Object} data - 消息数据\n * @param {string} data.type - 消息类型:'pcm'/'start'/'pause'/'stop'/'config'/'destroy'/'volume'\n * @param {Uint8Array} [data.pcmData] - PCM数据(仅type='pcm'时存在)\n * @param {Object} [data.config] - 配置更新(仅type='config'时存在)\n * @param {number} [data.volume] - 音量值(仅type='volume'时存在)\n */\n handleMainThreadMessage(data) {\n switch (data.type) {\n // 接收主线程下发的PCM流数据\n case 'pcm':\n if (data.pcmData instanceof Uint8Array && data.pcmData.length > 0) {\n // 确保PCM数据字节数为2的整数倍(S16LE要求)\n const validLength = data.pcmData.length - (data.pcmData.length % this.config.bytesPerSample);\n if (validLength <= 0) break;\n \n // 合并到Worklet缓存\n const newCache = new Uint8Array(this.pcmCache.length + validLength);\n newCache.set(this.pcmCache, 0);\n newCache.set(data.pcmData.subarray(0, validLength), this.pcmCache.length);\n this.pcmCache = newCache;\n \n // 向主线程发送缓存状态\n this.port.postMessage({\n type: 'cacheStatus',\n size: this.pcmCache.length,\n sampleCount: this.pcmCache.length / this.config.bytesPerSample\n });\n }\n break;\n\n // 启动播放(继续音频生成)\n case 'start':\n this.isActive = true;\n break;\n\n // 暂停播放(停止音频生成,保留缓存)\n case 'pause':\n this.isActive = false;\n this.resetSegmentState();\n break;\n\n // 停止播放(清空缓存+重置状态)\n case 'stop':\n this.isActive = false;\n this.pcmCache = new Uint8Array(0);\n this.resetSegmentState();\n break;\n\n // 更新配置(如采样率/淡入淡出时间)\n case 'config':\n if (data.config.sampleRate) {\n this.config.sampleRate = data.config.sampleRate;\n // 重新计算淡入淡出样本数\n this.fadeState.fadeSamples = Math.floor(this.fadeState.fadeTime * this.config.sampleRate);\n }\n if (data.config.fadeTime) {\n this.fadeState.fadeTime = data.config.fadeTime;\n this.fadeState.fadeSamples = Math.floor(this.fadeState.fadeTime * this.config.sampleRate);\n }\n break;\n\n // 单独更新音量(可选,也可通过参数自动化控制)\n case 'volume':\n this.volume = Number(data.volume);\n // 通知主线程同步AudioWorkletNode的parameters\n this.port.postMessage({\n type: 'syncVolume',\n volume: this.volume\n });\n break;\n\n // 单独更新播放速率(可选,也可通过参数自动化控制)\n case 'speed':\n this.speed = Number(data.speed);\n // 通知主线程同步AudioWorkletNode的parameters\n this.port.postMessage({\n type: 'syncSpeed',\n speed: this.speed\n });\n break;\n\n // 销毁处理器\n case 'destroy':\n this.isDestroyed = true;\n this.isActive = false;\n this.pcmCache = new Uint8Array(0);\n this.resetSegmentState();\n this.port.postMessage({ type: 'destroyConfirmed' });\n break;\n \n default:\n console.warn('[PCMAudioProcessor] 未知消息类型:', data.type);\n }\n }\n\n /**\n * 重置当前音频段状态(暂停/停止时调用)\n */\n resetSegmentState() {\n this.currentSegment = null;\n this.segmentOffset = 0;\n this.fadeState.phase = 'idle';\n this.fadeState.currentGain = 0;\n }\n\n /**\n * S16LE Uint8Array 转 Float32Array(-1~1范围)\n * @param {Uint8Array} pcmData - PCM数据\n * @returns {Float32Array} 转换后的音频样本\n */\n pcmToFloat32(pcmData) {\n const sampleCount = pcmData.length / this.config.bytesPerSample;\n const floatData = new Float32Array(sampleCount);\n const dataView = new DataView(pcmData.buffer);\n\n for (let i = 0; i < sampleCount; i++) {\n // S16LE格式:小端序解析,范围-32768~32767 归一化到-1~1\n floatData[i] = dataView.getInt16(i * this.config.bytesPerSample, true) / 32768;\n }\n return floatData;\n }\n\n /**\n * 计算当前样本的增益(淡入淡出)\n * @param {number} segmentLength - 当前音频段的总样本数\n * @returns {number} 增益值(0~1)\n */\n calculateGain(segmentLength) {\n const { phase, fadeSamples } = this.fadeState;\n const { segmentOffset } = this;\n\n // 边界保护:防止无效值导致的NaN\n if (typeof segmentOffset !== 'number' || typeof segmentLength !== 'number' || segmentLength <= 0) {\n return 0;\n }\n\n switch (phase) {\n // 淡入阶段:从0线性增加到1\n case 'fadeIn':\n if (segmentOffset >= fadeSamples) {\n this.fadeState.phase = 'steady';\n return 1;\n }\n return segmentOffset / fadeSamples;\n\n // 稳定阶段:增益保持1\n case 'steady':\n // 检测是否进入淡出阶段(接近段尾)\n if (segmentOffset >= segmentLength - fadeSamples) {\n this.fadeState.phase = 'fadeOut';\n }\n return 1;\n\n // 淡出阶段:从1线性降低到0.0001(避免分音)\n case 'fadeOut':\n const fadeStart = Math.max(segmentLength - fadeSamples, 0);\n const fadeProgress = (segmentOffset - fadeStart) / fadeSamples;\n return Math.max(1 - fadeProgress, 0.0001);\n\n // 空闲阶段:增益0\n case 'idle':\n default:\n return 0;\n }\n }\n\n /**\n * AudioWorklet核心方法:实时生成音频样本(音频线程调用)\n * @param {Float32Array[][]} inputs - 输入样本\n * @param {Float32Array[][]} outputs - 输出样本(单声道)\n * @param {Object} parameters - 音频参数\n * @returns {boolean} 是否继续运行\n */\n process(inputs, outputs, parameters) {\n // 销毁状态:终止处理\n if (this.isDestroyed) {\n if (outputs.length > 0 && outputs[0].length > 0) {\n outputs[0][0].fill(0);\n }\n return false;\n }\n\n // 未激活或无输出:返回静音\n if (!this.isActive || outputs.length === 0 || outputs[0].length === 0) {\n outputs[0][0].fill(0);\n return true;\n }\n\n const outputBuffer = outputs[0][0];\n const bufferLength = outputBuffer.length;\n // 获取音量参数(支持自动化)\n const volume = parameters.volume.length > 1 \n ? parameters.volume // 自动化模式:每个样本点可能有不同值\n : parameters.volume[0]; // 控制模式:整个缓冲区使用相同值\n\n // 生成输出样本\n for (let i = 0; i < bufferLength; i++) {\n // 如当前无音频段且缓存有数据,创建新段\n if (!this.currentSegment && this.pcmCache.length > 0) {\n // 使用缓存中的所有数据创建新段\n this.currentSegment = this.pcmToFloat32(this.pcmCache);\n // 清空缓存(已处理)\n this.pcmCache = new Uint8Array(0);\n this.segmentOffset = 0;\n // 根据前一段状态决定是否淡入\n this.fadeState.phase = this.fadeState.phase === 'fadeOut' ? 'steady' : 'fadeIn';\n }\n\n // 生成当前样本\n let sample = 0;\n if (this.currentSegment) {\n const segmentLength = this.currentSegment.length;\n // 确保偏移量有效\n if (this.segmentOffset < segmentLength) {\n const gain = this.calculateGain(segmentLength);\n // 应用淡入淡出增益和音量控制\n sample = this.currentSegment[this.segmentOffset] * gain * volume;\n this.segmentOffset++;\n } else {\n // 当前段处理完毕,重置\n this.currentSegment = null;\n this.segmentOffset = 0;\n this.fadeState.phase = 'idle';\n }\n }\n\n outputBuffer[i] = sample;\n }\n\n return true;\n }\n}\n\n// 注册Worklet处理器\nregisterProcessor('pcm-audio-processor', PCMAudioProcessor);\n`\nconst pcm_capture_script = `// pcm-capture-processor.js - 运行在音频线程的捕获处理器\nclass PCMCaptureProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this.inputSampleRate = 24000; // PCM 播放器采样率\n this.outputSampleRate = 16000; // Opus 编码要求采样率\n this.bufferSize = 2400; // 100ms @ 24kHz\n this.buffer = new Float32Array(this.bufferSize);\n this.bufferIndex = 0;\n\n // 监听主线程的 reset 消息,清空内部缓冲区(打断/会话切换时使用)\n this.port.onmessage = (e) => {\n if (e.data && e.data.type === 'reset') {\n this.bufferIndex = 0;\n this.buffer.fill(0);\n }\n };\n }\n\n process(inputs) {\n const input = inputs[0];\n if (!input || !input[0] || input[0].length === 0) return true;\n\n const chunk = input[0];\n for (let i = 0; i < chunk.length; i++) {\n this.buffer[this.bufferIndex++] = chunk[i];\n\n if (this.bufferIndex >= this.bufferSize) {\n // 重采样 24kHz → 16kHz\n const resampled = this.resample(this.buffer);\n // Float32 → S16LE\n const pcmBuffer = this.float32ToS16LE(resampled);\n // 静音检测\n const hasAudio = this.detectAudio(this.buffer);\n // 回传主线程(Transferable,避免拷贝)\n this.port.postMessage(\n { pcmData: pcmBuffer.buffer, hasAudio: hasAudio },\n [pcmBuffer.buffer]\n );\n this.bufferIndex = 0;\n }\n }\n return true;\n }\n\n // 线性插值重采样 24kHz → 16kHz (3:2 比率)\n resample(input) {\n const ratio = this.outputSampleRate / this.inputSampleRate; // 2/3\n const outputLength = Math.floor(input.length * ratio); // 1600\n const output = new Float32Array(outputLength);\n for (let i = 0; i < outputLength; i++) {\n const srcIndex = i / ratio;\n const srcIndexFloor = Math.floor(srcIndex);\n const frac = srcIndex - srcIndexFloor;\n const s1 = input[srcIndexFloor] || 0;\n const s2 = input[srcIndexFloor + 1] || 0;\n output[i] = s1 + (s2 - s1) * frac;\n }\n return output;\n }\n\n // Float32 → S16LE Int16Array\n float32ToS16LE(float32) {\n const int16 = new Int16Array(float32.length);\n for (let i = 0; i < float32.length; i++) {\n let s = Math.max(-1, Math.min(1, float32[i]));\n int16[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;\n }\n return int16;\n }\n\n // 静音检测\n detectAudio(buffer) {\n for (let i = 0; i < buffer.length; i++) {\n if (Math.abs(buffer[i]) > 0.0001) return true;\n }\n return false;\n }\n}\nregisterProcessor('pcm-capture-processor', PCMCaptureProcessor);\n`;\nconst workletBlob = new Blob([pcm_audio_script], { type: 'application/javascript' });\nconst workletUrl = URL.createObjectURL(workletBlob);\nconst captureWorkletBlob = new Blob([pcm_capture_script], { type: 'application/javascript' });\nconst captureWorkletUrl = URL.createObjectURL(captureWorkletBlob);\n/**\n * Web Audio Worklet版PCM流式播放器(24kHz采样率、S16LE单声道)\n * 核心:无定时器,依赖AudioWorklet的process方法实时处理流式数据\n */\nexport default class PCMAudioPlayer {\n // 常量配置(与Worklet保持一致)\n readonly SAMPLE_RATE: number = 24000;\n readonly FRAME_ALIGNMENT: number = 2000; // 帧对齐字节数\n readonly WORKLET_SCRIPT_URL: string = workletUrl; // 改为本地引入,内网客户无法使用远程资源\n // readonly WORKLET_SCRIPT_URL: string = 'http://localhost:5173/pcm-audio-processor.js'; // Worklet脚本路径(需与HTML同域)\n\n // 实例状态与资源\n audioCtx: AudioContext | null = null;\n audioWorkletNode: AudioWorkletNode | null = null; // Worklet节点(主线程与Worklet通信桥梁)\n isInitialized: boolean = false; // 初始化状态(Worklet加载完成)\n isPlaying: boolean = false; // 播放状态标记\n private destroyResolve: (() => void) | null = null;\n private unsubscribePlaybackSessionRestored: (() => void) | null = null;\n\n // 音频捕获相关\n private captureWorklet: AudioWorkletNode | null = null;\n private captureCallback: ((data: { pcmData: ArrayBuffer; hasAudio: boolean }) => void) | null = null;\n\n /**\n * 初始化(加载Worklet + 创建AudioContext + 连接节点)\n * @returns {Promise<void>} 初始化结果(需用户交互中调用)\n */\n async init(): Promise<void> {\n if (this.isInitialized) return;\n\n // iOS WebKit defaults Web Audio to an ambient session, which follows the\n // Ring/Silent switch. Playback sessions remain audible in silent mode.\n configureWebAudioPlaybackSession();\n\n // 1. 浏览器兼容性处理\n const AudioContextConstructor =\n window.AudioContext || (window as any).webkitAudioContext;\n if (!AudioContextConstructor || !window.AudioWorklet) {\n throw new Error(\"当前浏览器不支持Web Audio Worklet,无法实现流式播放\");\n }\n\n // 2. 创建AudioContext(24kHz采样率)\n this.audioCtx = new AudioContextConstructor({\n sampleRate: this.SAMPLE_RATE,\n });\n const logger = (window as any).avatarSDKLogger || console;\n\n try {\n // 3. 加载Worklet脚本(必须先加载,再创建节点)\n await this.audioCtx.audioWorklet.addModule(this.WORKLET_SCRIPT_URL);\n logger.log(\n `[PCMAudioPlayer] Worklet脚本加载完成: ${this.WORKLET_SCRIPT_URL}`\n );\n\n // 4. 创建Worklet节点(指定处理器名称,与Worklet中registerProcessor一致)\n this.audioWorkletNode = new AudioWorkletNode(\n this.audioCtx,\n \"pcm-audio-processor\" // 必须与Worklet中注册的名称一致\n );\n\n // 5. 连接音频链路:WorkletNode → 扬声器(destination)\n this.audioWorkletNode.connect(this.audioCtx.destination);\n logger.log(\"[PCMAudioPlayer] Worklet节点已连接到扬声器\");\n\n // 6. 监听Worklet发来的消息(如缓存状态、错误)\n this.audioWorkletNode.port.onmessage = (e) => {\n switch (e.data.type) {\n case \"cacheStatus\":\n logger.log(`[PCMAudioPlayer] Worklet缓存状态: ${e.data.size}字节`);\n break;\n case \"error\":\n logger.error(`[PCMAudioPlayer] Worklet错误:`, e.data.detail);\n break;\n case \"destroyConfirmed\":\n logger.log(`[PCMAudioPlayer] Worklet已确认销毁`);\n this.destroyResolve?.(); // 触发销毁等待的Promise\n break;\n case \"syncVolume\":\n // 同步音量到AudioWorkletNode的parameters\n if (\n this.audioWorkletNode?.parameters?.get(\"volume\")?.value !==\n undefined\n ) {\n this.audioWorkletNode.parameters.get(\"volume\")!.value =\n e.data.volume;\n }\n break;\n case \"syncSpeed\":\n // 同步播放速率到AudioWorkletNode的parameters\n if (\n this.audioWorkletNode?.parameters?.get(\"speed\")?.value !==\n undefined\n ) {\n this.audioWorkletNode.parameters.get(\"speed\")!.value =\n e.data.speed;\n }\n break;\n default:\n logger.log(`[PCMAudioPlayer] Worklet消息:`, e.data);\n }\n };\n\n // 7. 标记初始化完成\n this.isInitialized = true;\n this.unsubscribePlaybackSessionRestored =\n subscribeWebAudioPlaybackSessionRestored(() => {\n this.refreshPlaybackRoute();\n });\n logger.log('[PCMAudioPlayer] 播放器初始化完成(Worklet就绪)');\n } catch (err) {\n logger.error(\"[PCMAudioPlayer] 初始化失败:\", err);\n throw err; // 抛出错误,让业务层处理\n }\n }\n\n private refreshPlaybackRoute(): boolean {\n if (!this.isInitialized || !this.isPlaying || !this.audioCtx || !this.audioWorkletNode) {\n return false;\n }\n\n const logger = (window as any).avatarSDKLogger || console;\n try {\n this.audioWorkletNode.disconnect();\n this.audioWorkletNode.connect(this.audioCtx.destination);\n // 重连 capture worklet(如果已挂载)\n if (this.captureWorklet) {\n this.audioWorkletNode.connect(this.captureWorklet);\n }\n if (this.audioCtx.state !== \"running\") {\n void this.audioCtx.resume().catch((error) => {\n logger.warn(\"[PCMAudioPlayer] 刷新路由后恢复 AudioContext 失败:\", error);\n });\n }\n logger.log(\"[PCMAudioPlayer] 已刷新 playback 音频路由\");\n return true;\n } catch (error) {\n logger.warn(\"[PCMAudioPlayer] 刷新 playback 音频路由失败:\", error);\n return false;\n }\n }\n\n /**\n * 接收PCM音频流(流式下发到Worklet,无本地缓存)\n * @param {Uint8Array} pcmData - 24kHz S16LE单声道PCM数据\n */\n receivePCMStream(pcmData: Uint8Array): void {\n const logger = (window as any).avatarSDKLogger || console;\n\n // 1. 前置校验\n if (!this.isInitialized || !this.audioWorkletNode) {\n logger.error(\"[PCMAudioPlayer] 播放器未初始化,无法接收PCM数据\");\n return;\n }\n if (!(pcmData instanceof Uint8Array)) {\n logger.error(\"[PCMAudioPlayer] 输入PCM数据必须是非空的Uint8Array\");\n return;\n }\n logger.log(`[PCMAudioPlayer] 已下发PCM数据: ${pcmData.length}字节`);\n\n // 2. 下发PCM数据到Worklet(通过postMessage,数据会被转移/复制到音频线程)\n try {\n this.audioWorkletNode.port.postMessage(\n {\n type: \"pcm\",\n pcmData: pcmData, // Worklet中会合并到缓存\n },\n [pcmData.buffer] // 可选:Transferable对象,避免数据复制(提升性能)\n );\n } catch (err) {\n logger.error(\"[PCMAudioPlayer] 下发PCM数据到Worklet失败:\", err);\n }\n }\n\n /**\n * 开始播放(激活Worklet的音频生成)\n * @returns {Promise<void>} 启动结果\n */\n async start(): Promise<void> {\n if (!this.isInitialized || !this.audioCtx || !this.audioWorkletNode) {\n throw new Error(\"[PCMAudioPlayer] 请先调用init()初始化播放器\");\n }\n const logger = (window as any).avatarSDKLogger || console;\n\n // 1. 恢复AudioContext(需用户交互,否则抛异常)\n if (this.audioCtx.state !== \"running\") {\n await this.audioCtx.resume();\n logger.log('[PCMAudioPlayer] AudioContext已恢复运行');\n }\n\n // 2. 发送start消息给Worklet(激活音频生成)\n this.audioWorkletNode.port.postMessage({ type: \"start\" });\n this.isPlaying = true;\n logger.log('[PCMAudioPlayer] 已启动播放(Worklet激活)');\n }\n\n /**\n * 暂停播放(停止Worklet音频生成,保留缓存)\n */\n pause(): void {\n if (!this.isInitialized || !this.audioWorkletNode) return;\n const logger = (window as any).avatarSDKLogger || console;\n\n // 发送pause消息给Worklet\n this.audioWorkletNode.port.postMessage({ type: \"pause\" });\n this.isPlaying = false;\n logger.log('[PCMAudioPlayer] 已暂停播放(Worklet暂停)');\n }\n\n /**\n * 停止播放(清空Worklet缓存,重置状态)\n */\n stop(): void {\n if (!this.isInitialized || !this.audioWorkletNode) return;\n const logger = (window as any).avatarSDKLogger || console;\n\n // 发送stop消息给Worklet\n this.audioWorkletNode.port.postMessage({ type: \"stop\" });\n this.isPlaying = false;\n logger.log('[PCMAudioPlayer] 已停止播放(Worklet缓存清空)');\n }\n\n /**\n * 销毁播放器(释放所有音频资源,不可恢复)\n * @returns {Promise<void>} 销毁结果\n */\n async destroy(): Promise<void> {\n const logger = (window as any).avatarSDKLogger || console;\n this.unsubscribePlaybackSessionRestored?.();\n this.unsubscribePlaybackSessionRestored = null;\n\n // 先卸载捕获节点\n this.detachCapture();\n\n // 1. 若未初始化/已销毁,直接返回\n if (!this.isInitialized || !this.audioCtx || !this.audioWorkletNode) {\n logger.log('[PCMAudioPlayer] 播放器未初始化或已销毁');\n return;\n }\n\n // 2. 发送销毁指令给Worklet,并等待确认\n await new Promise<void>((resolve) => {\n this.destroyResolve = resolve; // 绑定resolve函数\n // 发送销毁消息(触发Worklet内的#isDestroyed=true)\n this.audioWorkletNode?.port.postMessage({ type: \"destroy\" });\n // 超时容错:300ms未确认则强制继续(避免Worklet无响应)\n const timeout = setTimeout(() => {\n logger.warn(\"[PCMAudioPlayer] Worklet销毁超时,强制释放资源\");\n this.destroyResolve?.();\n }, 300);\n // 确认后清除超时\n if (this.audioWorkletNode) {\n this.audioWorkletNode.port.onmessage = (e) => {\n if (e.data.type === \"destroyConfirmed\") {\n clearTimeout(timeout);\n this.destroyResolve?.();\n }\n };\n }\n });\n\n // 3. 断开Worklet节点连接(此时Worklet已终止执行)\n this.audioWorkletNode.disconnect();\n this.audioWorkletNode.port.close();\n this.audioWorkletNode = null;\n\n // 4. 关闭AudioContext(确保音频线程资源释放)\n if (this.audioCtx.state !== \"closed\") {\n await this.audioCtx.close();\n }\n this.audioCtx = null;\n logger.log('[PCMAudioPlayer] AudioContext已关闭');\n\n // 5. 重置所有状态\n this.isInitialized = false;\n this.isPlaying = false;\n this.destroyResolve = null;\n logger.log(\"[PCMAudioPlayer] 播放器已完全销毁,所有资源释放完成\");\n }\n\n /**\n * 挂载音频捕获节点(用于 PCM 模式下 ASR 回声消除)\n * 将 PCM 播放器输出连接到 capture worklet,实时捕获重采样后的 16kHz S16LE 数据\n */\n async attachCapture(callback: (data: { pcmData: ArrayBuffer; hasAudio: boolean }) => void): Promise<void> {\n if (!this.isInitialized || !this.audioCtx || !this.audioWorkletNode) {\n throw new Error('[PCMAudioPlayer] 播放器未初始化,无法挂载捕获');\n }\n if (this.captureWorklet) return;\n\n this.captureCallback = callback;\n\n try {\n await this.audioCtx.audioWorklet.addModule(captureWorkletUrl);\n\n this.captureWorklet = new AudioWorkletNode(\n this.audioCtx,\n 'pcm-capture-processor'\n );\n\n // 连接:PCM AudioWorkletNode → capture Worklet\n this.audioWorkletNode.connect(this.captureWorklet);\n\n this.captureWorklet.port.onmessage = (e) => {\n if (this.captureCallback && e.data.pcmData) {\n this.captureCallback({\n pcmData: e.data.pcmData,\n hasAudio: e.data.hasAudio,\n });\n }\n };\n\n (window as any).avatarSDKLogger?.log(\n '[PCMAudioPlayer] 捕获节点已挂载'\n );\n } catch (err) {\n (window as any).avatarSDKLogger?.error(\n '[PCMAudioPlayer] 挂载捕获节点失败:',\n err\n );\n throw err;\n }\n }\n\n /**\n * 卸载音频捕获节点\n */\n detachCapture(): void {\n if (this.captureWorklet) {\n try {\n this.captureWorklet.port.onmessage = null;\n this.audioWorkletNode?.disconnect(this.captureWorklet);\n this.captureWorklet.disconnect();\n } catch {}\n this.captureWorklet = null;\n }\n this.captureCallback = null;\n }\n\n /**\n * 清空 capture worklet 内部缓冲区\n * 用于打断/会话切换时,避免旧音频数据混入新 session\n */\n resetCaptureBuffer(): void {\n if (this.captureWorklet) {\n this.captureWorklet.port.postMessage({ type: 'reset' });\n }\n }\n\n /**\n * 获取当前播放器状态\n * @returns {Object} 状态对象\n */\n getStatus(): {\n isInitialized: boolean;\n isPlaying: boolean;\n isWorkletReady: boolean;\n } {\n return {\n isInitialized: this.isInitialized,\n isPlaying: this.isPlaying,\n isWorkletReady: !!this.audioWorkletNode, // Worklet节点是否就绪\n };\n }\n\n setVolume(valume: number) {\n if (this.isInitialized && this.audioWorkletNode) {\n this.audioWorkletNode.port.postMessage({\n type: \"volume\",\n volume: valume,\n });\n }\n }\n\n setSpeed(speed: number) {\n if (this.isInitialized && this.audioWorkletNode) {\n this.audioWorkletNode.port.postMessage({\n type: \"speed\",\n speed: speed,\n });\n }\n }\n\n /**\n * @returns {Promise<void>} 恢复结果\n */\n async resume(): Promise<void> {\n const logger = (window as any).avatarSDKLogger || console;\n try {\n if (this.audioCtx?.state === \"suspended\") {\n this.audioCtx\n .resume()\n .then(() => {\n (window as any).avatarSDKLogger.info(\"worklet音频上下文恢复成功\");\n })\n .catch((error) => {\n (window as any).avatarSDKLogger.error(\n \"worklet音频上下文恢复失败:\",\n error\n );\n });\n }\n } catch (err) {\n logger.error(\"[PCMAudioPlayer] worklet恢复播放失败:\", err);\n throw err;\n }\n }\n}\n","export default class MediaSourceAudioPlayer {\n private mediaSource: MediaSource | null = null;\n private audioElement: HTMLAudioElement | null = null;\n private sourceBuffer: SourceBuffer | null = null;\n public isInitialized = false;\n public isPlaying = false;\n private volume = 1.0;\n private readonly MIME_TYPE = 'audio/webm;codecs=opus';\n private queue: Array<{ data: ArrayBuffer }> = [];\n private isUpdating = false;\n private currentObjectURL: string | null = null;\n private isDestroyed = false;\n\n // 速度同步相关(保留不动)\n private playbackRate = 1.0;\n public firstFrameIndex = -1;\n\n // 单例\n private static instance: MediaSourceAudioPlayer;\n public static getInstance(sdk): MediaSourceAudioPlayer {\n if (!MediaSourceAudioPlayer.instance) {\n MediaSourceAudioPlayer.instance = new MediaSourceAudioPlayer(sdk);\n }\n return MediaSourceAudioPlayer.instance;\n }\n\n private constructor(sdk) {\n this.createAudioElement(sdk);\n this.createNewMediaSource();\n }\n\n /**\n * 只复用 audio 标签!!!\n */\n private createAudioElement(sdk) {\n if (this.audioElement) return;\n const el = document.getElementById(\"xmov-avatar-audio\");\n if (el) {\n this.audioElement = el as HTMLAudioElement;\n return;\n }\n const audio = document.createElement(\"audio\");\n audio.id = \"xmov-avatar-audio\";\n audio.preload = \"auto\";\n audio.style.position = \"absolute\";\n audio.style.width = \"1px\";\n audio.style.height = \"1px\";\n audio.style.opacity = \"0\";\n audio.style.pointerEvents = \"none\";\n audio.style.zIndex = \"-9999\";\n sdk.el.appendChild(audio);\n this.audioElement = audio;\n }\n\n /**\n * 每次都创建 NEW MediaSource\n * 不复用!不复用!不复用!\n */\n private createNewMediaSource(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n if(!this.audioElement) return;\n this.mediaSource = new MediaSource();\n this.currentObjectURL = URL.createObjectURL(this.mediaSource);\n this.audioElement!.src = this.currentObjectURL;\n\n this.mediaSource.addEventListener(\"sourceopen\", () => {\n try {\n if (!this.mediaSource) return;\n this.sourceBuffer = this.mediaSource.addSourceBuffer(this.MIME_TYPE);\n this.sourceBuffer.mode = \"sequence\";\n\n this.sourceBuffer.addEventListener(\"updateend\", () => {\n this.isUpdating = false;\n this.processQueue();\n });\n\n this.isInitialized = true;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n\n this.mediaSource.addEventListener(\"sourceclose\", () => {\n this.isInitialized = false;\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * 销毁当前 MediaSource 所有资源\n * stop 时调用\n */\n private async destroyCurrentMediaSource(callback: () => void) {\n try {\n if (this.audioElement) {\n this.audioElement.pause();\n this.audioElement.removeAttribute(\"src\");\n this.audioElement.load();\n }\n } catch {}\n\n try {\n if (this.currentObjectURL) {\n URL.revokeObjectURL(this.currentObjectURL);\n this.currentObjectURL = null;\n }\n } catch {}\n\n this.mediaSource = null;\n this.sourceBuffer = null;\n this.isInitialized = false;\n this.isPlaying = false;\n this.queue = [];\n this.isUpdating = false;\n await this.createNewMediaSource();\n callback();\n }\n\n // ==========================\n // 核心:stop 清空一切,只留 audio\n // ==========================\n public stop(callback: () => void) {\n this.destroyCurrentMediaSource(callback);\n }\n\n // ==========================\n // 添加数据(自动初始化)\n // ==========================\n async addAudioSegment(audioData: ArrayBuffer): Promise<void> {\n if (this.isDestroyed) return;\n this.queue.push({ data: audioData });\n this.processQueue();\n }\n\n private processQueue() {\n if (this.isDestroyed) return;\n if (!this.sourceBuffer || !this.mediaSource) return;\n if (this.isUpdating || this.queue.length === 0) return;\n if (this.sourceBuffer.updating || this.mediaSource.readyState !== \"open\") return;\n\n this.isUpdating = true;\n const item = this.queue.shift()!;\n try {\n this.sourceBuffer.appendBuffer(item.data);\n } catch (e) {\n this.isUpdating = false;\n }\n }\n\n // ==========================\n // 播放\n // ==========================\n async start(): Promise<void> {\n if (this.isDestroyed || !this.audioElement || this.isPlaying) return;\n\n try {\n this.audioElement.currentTime = 0;\n this.isPlaying = true;\n await this.audioElement.play();\n (window as any).avatarSDKLogger.log(\"mseAudioPlayer开始播放\", this.getStats(), Date.now());\n } catch {}\n }\n\n getStats() {\n return {\n isPlaying: this.isPlaying,\n isInitialized: this.isInitialized,\n queueLength: this.queue.length,\n bufferedRanges: this.getBufferedRanges(),\n mediaSourceReadyState: this.mediaSource?.readyState || 'null',\n };\n }\n\n setSpeed(speed: number) {\n this.setPlaybackRate(speed);\n }\n \n /**\n * 获取缓冲范围\n */\n private getBufferedRanges(): string {\n if (this.sourceBuffer && this.sourceBuffer.buffered.length > 0) {\n const ranges: string[] = [];\n for (let i = 0; i < this.sourceBuffer.buffered.length; i++) {\n const start = this.sourceBuffer.buffered.start(i).toFixed(2);\n const end = this.sourceBuffer.buffered.end(i).toFixed(2);\n ranges.push(`[${start}-${end}]`);\n }\n return ranges.join(\", \");\n }\n return \"-\";\n }\n\n setVolume(volume: number): void {\n this.volume = Math.max(0, Math.min(1, volume));\n if (this.audioElement) this.audioElement.volume = this.volume;\n }\n\n setPlaybackRate(rate: number): void {\n this.playbackRate = Math.max(0.5, Math.min(4.0, rate));\n if (this.audioElement) this.audioElement.playbackRate = this.playbackRate;\n }\n\n destroy() {\n // 0. 标记已销毁,阻止异步操作继续执行\n this.isDestroyed = true;\n\n // 1. 停止播放并清除 audio 元素的 src(解除对 blob URL 的引用)\n if (this.audioElement) {\n this.audioElement.pause();\n this.audioElement.removeAttribute(\"src\");\n this.audioElement.load();\n }\n\n // 2. 释放 blob URL(必须在 audio 元素清除 src 之后)\n if (this.currentObjectURL) {\n try { URL.revokeObjectURL(this.currentObjectURL); } catch {}\n this.currentObjectURL = null;\n }\n\n // 3. 移除 audio 元素\n if (this.audioElement) {\n this.audioElement.remove();\n this.audioElement = null;\n }\n\n // 4. 重置所有状态\n this.mediaSource = null;\n this.sourceBuffer = null;\n this.isInitialized = false;\n this.isPlaying = false;\n this.queue = [];\n this.isUpdating = false;\n\n // 5. 重置单例,下次 getInstance() 会重新创建\n MediaSourceAudioPlayer.instance = null as any;\n }\n}","/**\n * 音频渲染\n * 使用 AudioContext 控制\n */\n\nimport ResourceManager from \"../modules/ResourceManager\";\nimport { DataCacheQueue } from \"../control/DataCacheQueue\";\n// import PCMAudioPlayer from \"./Audio\";\nimport AudioWorklet from \"./AudioWorklet\";\nimport { performanceConstant } from \"../utils/perfermance\";\nimport XmovAvatar from \"../index\";\nimport { AvatarStatus } from \"../types\";\nimport MediaSourceAudioPlayer from \"./MSEAudioPlayer\";\nimport { isSupportMES } from \"../utils\";\n\ntype Option = {\n sdk: XmovAvatar;\n dataCacheQueue: DataCacheQueue;\n resourceManager: ResourceManager;\n};\n\nexport default class AudioRender {\n private TAG = \"[AudioRenderer]\";\n private options: Option;\n isPlaying = false;\n lastFrameIndex: number = -1;\n audio: AudioWorklet | null = null;\n firstFrameIndex: number = -1;\n resourceManager: ResourceManager;\n valume: number = 1;\n speech_id: number = -1; // 当前播放的音频id\n cacheFirstFrameIndex: number = -1; // 缓存下来的第一个音频的索引\n cacheAudioData: Uint8Array[] = []; // 缓存下来的音频数据\n oldSpeechId: number = -1; // 上一个播放的音频id\n mseCacheAudioData: Array<{ data: ArrayBuffer; frameIndex?: number; speechId?: number }> = [];\n private mseAudioPlayer: MediaSourceAudioPlayer | null = null;\n \n constructor(options: Option) {\n this.options = options;\n this.resourceManager = options.resourceManager;\n if(this.resourceManager.config.raw_audio) {\n this.audio = new AudioWorklet();\n this.audio.init();\n } else {\n this.mseAudioPlayer = MediaSourceAudioPlayer.getInstance(options.sdk);\n }\n }\n updateAudioData(audioList: any) {\n if (\n !this.resourceManager.config.raw_audio ||\n audioList[0].sid === this.oldSpeechId\n )\n return;\n if (this.firstFrameIndex === -1) {\n this.firstFrameIndex = audioList[0].sf;\n }\n let totalLength = 0;\n for (const audio of audioList) {\n totalLength += audio.ad?.length || 0;\n }\n\n // 创建合并后的Uint8Array\n const mergedData = new Uint8Array(totalLength);\n let offset = 0;\n\n // 填充合并数据\n for (const audio of audioList) {\n if (audio.ad) {\n mergedData.set(new Uint8Array(audio.ad), offset);\n offset += audio.ad.length;\n }\n }\n if (this.speech_id === -1) {\n this.speech_id = audioList[0].sid;\n this.audio?.receivePCMStream(mergedData);\n } else {\n if (this.speech_id !== audioList[0].sid) {\n // 先缓存下来\n if (this.cacheFirstFrameIndex === -1) {\n this.cacheFirstFrameIndex = audioList[0].sf;\n }\n this.cacheAudioData.push(mergedData);\n } else {\n // 直接播放\n this.audio?.receivePCMStream(mergedData);\n }\n }\n }\n\n _updateAudio(audioList: any) {\n if (!this.mseAudioPlayer || audioList.length === 0) return;\n\n const firstAudio = audioList[0];\n \n // 检查是否是旧的 speech_id\n if (firstAudio.sid === this.oldSpeechId) {\n return;\n }\n\n // 如果 speech_id 变化,停止当前播放并重置\n if (this.speech_id !== -1 && firstAudio.sid !== this.speech_id) {\n (window as any).avatarSDKLogger?.log(\n this.TAG,\n `检测到新的 speech_id: ${firstAudio.sid}, 当前 WebM 播放 (旧: ${this.speech_id}), 新: ${firstAudio.sid}, 缓存数据长度: ${this.mseCacheAudioData.length}`\n );\n if(this.cacheFirstFrameIndex === -1) {\n this.cacheFirstFrameIndex = firstAudio.sf;\n }\n for(const item of audioList) {\n this.mseCacheAudioData.push({\n data: item.ad,\n frameIndex: item.sf,\n speechId: item.sid,\n })\n }\n } else {\n // 记录第一个音频段的帧索引\n if (this.firstFrameIndex === -1) {\n this.firstFrameIndex = firstAudio.sf;\n }\n\n // 更新 speech_id\n if (this.speech_id === -1) {\n this.speech_id = firstAudio.sid;\n } else if (this.speech_id !== firstAudio.sid) {\n this.speech_id = firstAudio.sid;\n }\n\n // 处理每个音频段\n for (const audio of audioList) {\n if (audio.ad) {\n // 将 Uint8Array 转换为 ArrayBuffer\n const audioData = audio.ad instanceof ArrayBuffer \n ? audio.ad \n : audio.ad.buffer.slice(audio.ad.byteOffset, audio.ad.byteOffset + audio.ad.byteLength);\n \n this.mseAudioPlayer.addAudioSegment(\n audioData,\n );\n }\n }\n }\n }\n\n async render(frameIndex: number) {\n (window as any).avatarSDKLogger.log(\"当前帧索引:\", frameIndex, \"音频开始播放帧:\", this.firstFrameIndex);\n if (this.lastFrameIndex === -1) {\n this.lastFrameIndex = frameIndex;\n }\n if (this.options.sdk.getStatus() === AvatarStatus.offline) return;\n // PCM 流式播放(raw_audio = true)\n if (\n frameIndex >= this.firstFrameIndex &&\n this.firstFrameIndex != -1 &&\n !this.isPlaying &&\n this.resourceManager.config.raw_audio\n ) {\n (window as any).performanceTracker.markEnd(\n performanceConstant.start_action_render,\n \"speak\"\n );\n this.isPlaying = true;\n this.audio?.start();\n return;\n }\n\n // WebM 流式播放(raw_audio = false)\n if (!this.resourceManager.config.raw_audio && this.mseAudioPlayer) {\n // 检查是否应该开始播放(帧对齐)\n if (\n this.firstFrameIndex !== -1 &&\n frameIndex >= this.firstFrameIndex &&\n !this.mseAudioPlayer.isPlaying &&\n !this.isPlaying\n ) {\n // 优化:确保有足够的数据缓冲再开始播放\n const stats = this.mseAudioPlayer.getStats();\n const hasEnoughData = stats.queueLength > 0 || stats.bufferedRanges !== '-';\n if (hasEnoughData) {\n try {\n (window as any).avatarSDKLogger.log(\"开始播放\", frameIndex);\n this.isPlaying = true;\n await this.mseAudioPlayer.start();\n (window as any).performanceTracker.markEnd(\n performanceConstant.start_action_render,\n \"speak\"\n );\n } catch (error) {\n (window as any).avatarSDKLogger.error(\"[AudioRenderer] WebM 音频播放失败:\", {\n error,\n frameIndex,\n firstFrameIndex: this.firstFrameIndex,\n queueLength: stats.queueLength,\n });\n }\n } else {\n // 数据不足,等待更多数据\n (window as any).avatarSDKLogger.debug?.(\n \"[AudioRenderer]\",\n `等待更多 WebM 音频数据 (frameIndex: ${frameIndex}, queueLength: ${stats.queueLength})`\n );\n }\n }\n return; // WebM 模式下不需要继续处理 PCM 播放逻辑\n }\n }\n\n resume() {\n if (this.audio && this.resourceManager.config.raw_audio) {\n this.audio?.resume();\n } else {\n // if (this.audioCtx.state === \"suspended\") {\n // this.audioCtx\n // .resume()\n // .then(() => {\n // (window as any).avatarSDKLogger.info(\"音频上下文恢复成功\");\n // })\n // .catch((error) => {\n // (window as any).avatarSDKLogger.error(\"音频上下文恢复失败:\", error);\n // });\n // }\n }\n }\n\n pause() {\n this.isPlaying = false;\n this.options.dataCacheQueue._clearAudio(this.speech_id);\n this.firstFrameIndex = -1;\n // 停止 PCM 播放\n this.audio?.stop();\n \n // 停止 WebM 播放\n this.mseAudioPlayer?.stop(this.addNewAudioSegment.bind(this));\n this.speech_id = -1;\n }\n\n stop(speech_id: number) {\n // 如果当前需要结束的是旧的语音ID,直接返回\n if(this.oldSpeechId >= speech_id) return;\n \n this.isPlaying = false;\n this.options.dataCacheQueue._clearAudio(speech_id);\n this.firstFrameIndex = -1;\n // 处理缓存的音频数据\n (window as any).avatarSDKLogger?.log(\n this.TAG,\n `清除缓存数据 (speech_id: ${this.speech_id}, PCM缓存数据长度: ${this.cacheAudioData.length}, WebM缓存数据长度: ${this.mseCacheAudioData.length})`\n );\n if (this.resourceManager.config.raw_audio) {\n // 停止 PCM 播放\n this.audio?.stop();\n } else {\n // 停止 WebM 播放\n this.mseAudioPlayer?.stop(this.addNewAudioSegment.bind(this));\n }\n this.oldSpeechId = speech_id;\n this.speech_id = -1;\n if (this.cacheAudioData.length > 0) {\n this.firstFrameIndex = this.cacheFirstFrameIndex;\n this.cacheFirstFrameIndex = -1;\n // 新的缓存下来的数据,推入音频流\n for (const data of this.cacheAudioData) {\n this.audio?.receivePCMStream(data);\n }\n this.cacheAudioData = [];\n }\n }\n\n addNewAudioSegment() {\n if(this.mseCacheAudioData.length > 0) {\n this.firstFrameIndex = this.cacheFirstFrameIndex;\n this.cacheFirstFrameIndex = -1;\n // 新的缓存下来的数据,推入音频流\n for (const audio of this.mseCacheAudioData) {\n if (audio.data) {\n this.mseAudioPlayer?.addAudioSegment(\n audio.data,\n );\n }\n }\n this.mseCacheAudioData = [];\n }\n }\n\n setVolume(valume: number) {\n this.valume = valume;\n if (this.resourceManager.config.raw_audio) {\n this.audio?.setVolume(valume);\n } else {\n // WebM 模式:使用 MSEAudioPlayer 设置音量\n this.mseAudioPlayer?.setVolume(valume);\n }\n }\n\n setSpeed(speed: number) {\n if (this.resourceManager.config.raw_audio) {\n this.audio?.setSpeed(speed);\n } else {\n // WebM 模式:使用 MSEAudioPlayer 设置播放速度\n this.mseAudioPlayer?.setSpeed(speed);\n }\n }\n\n getAudioPlayer(): AudioWorklet | null {\n return this.audio;\n }\n\n destroy() {\n this.stop(-1);\n this.cacheAudioData = [];\n this.mseCacheAudioData = [];\n this.audio?.destroy();\n // 直接调用 destroy(),不需要先 stop()(stop 会重建 MediaSource,浪费资源)\n this.mseAudioPlayer?.destroy();\n this.mseAudioPlayer = null;\n }\n}\n","\nclass SaveAndDownload {\n constructor(fileName = \"avatarData.json\", enabled = false) {\n this.fileName = fileName;\n this.enabled = enabled; // 功能开关\n this.data = {}; // 存储JSON数据\n this.downloadButton = null;\n if (enabled) {\n this.initDownloadButton();\n }\n }\n\n // 初始化下载按钮\n initDownloadButton() {\n if (!this.enabled) return;\n \n this.downloadButton = document.createElement(\"a\");\n this.downloadButton.style.position = \"absolute\";\n this.downloadButton.style.left = \"0\";\n this.downloadButton.style.bottom = \"30px\";\n this.downloadButton.style.background = \"#4CAF50\";\n this.downloadButton.style.color = \"white\";\n this.downloadButton.style.fontSize = \"12px\";\n this.downloadButton.style.padding = \"10px\";\n this.downloadButton.style.borderRadius = \"4px\";\n this.downloadButton.style.textDecoration = \"none\";\n this.downloadButton.style.zIndex = \"1000\";\n this.downloadButton.style.cursor = \"pointer\";\n this.downloadButton.innerHTML = \"下载数据提交开发回放\";\n this.downloadButton.addEventListener(\"click\", () => {\n this.download();\n });\n document.body.appendChild(this.downloadButton);\n }\n\n // 写入多个字段\n writeFields(fields) {\n if (!this.enabled) return;\n Object.assign(this.data, fields);\n }\n\n // 追加多个项目到数组字段\n appendMultipleToArray(fieldName, items) {\n if (!this.enabled) return;\n if (!this.data[fieldName]) {\n this.data[fieldName] = [];\n }\n this.data[fieldName].push(...items);\n }\n\n // 下载文件\n download() {\n if (!this.enabled) return;\n const jsonContent = this.generateJSONContent();\n this.downloadFile(jsonContent, this.fileName, \"application/json\");\n }\n\n // 生成JSON文件内容\n generateJSONContent() {\n return JSON.stringify(this.data, null, 2);\n }\n\n // 下载文件的具体实现\n downloadFile(content, fileName, contentType) {\n if (!this.enabled) return;\n const blob = new Blob([content], { type: contentType });\n const url = URL.createObjectURL(blob);\n \n this.downloadButton.href = url;\n this.downloadButton.download = fileName;\n this.downloadButton.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n \n this.downloadButton.dataset.objectUrl = url;\n }\n}\n\nexport default SaveAndDownload;\n","import { DataCacheQueue } from \"./DataCacheQueue\";\nimport AvatarRenderer from \"../baseRender/AvatarRenderer\";\nimport UIRenderer from \"../baseRender/UIRenderer\";\nimport Composition from \"../modules/Composition\";\nimport ResourceManager from \"../modules/ResourceManager\";\nimport {\n EFrameDataType,\n IRawFrameData,\n IRawBodyFrameData,\n IRawEventFrameData,\n IRawFaceFrameData,\n IRawAudioFrameData,\n ITtsFaceFrameData,\n StateChangeInfo,\n SYNC_FRAME_DATA,\n IRawWidgetData,\n FRAME_SOURCE_SOURCE,\n} from \"../types/frame-data\";\nimport ParallelDecoder from \"../modules/decoder\";\nimport AnimationController from \"../utils/requestAnimateFrames\";\nimport { EErrorCode } from \"../types/error\";\nimport { formatMJT } from \"../utils/DataInterface\";\nimport AudioRenderer from \"../baseRender/AudioRenderer\";\nimport type XmovAvatar from \"../index\";\nimport SaveAndDownload from \"./SaveAndDownload\";\nimport { RenderState, WalkConfig, IFrameDataUpdate } from \"../types/index\";\nimport { Layout } from \"../types\";\nimport WidgetDefaultRender from \"../modules/TrackRenderer/render-implements\";\nimport { performanceConstant } from \"../utils/perfermance\";\nimport { FPSStats } from \"../utils/fpsTracker\";\n\ninterface CONFIG {\n sdkInstance: XmovAvatar;\n container: Element;\n hardwareAcceleration: string;\n resourceManager: ResourceManager;\n enableDebugger?: boolean;\n enableClientInterrupt?: boolean;\n audioOnlyMode?: boolean;\n onDownloadProgress: (progress: number) => void;\n onStateChange: (state: string) => void;\n onSpeakStateChange: (state: string, client_speak_id: number | string) => void;\n onRenderChange: (state: RenderState, oldState?: RenderState) => void;\n onVoiceStateChange: (state: string, duration?: number, client_speak_id?: string | number) => void;\n onWalkStateChange: (state: string) => void;\n sendVideoInfo: (info: { name: string, body_id: number, id: number }) => void;\n sendMessage: (type: string, payload: any) => void;\n setAudioInfo: (info: {\n sf: number;\n ef: number;\n ad: Uint8Array;\n }) => void;\n setEventData: (info: {\n sf: number;\n ef: number;\n event: Array<any>;\n }) => void;\n renderFrameCallback: (frame: number) => void;\n reportMessage: (message: {\n code: EErrorCode;\n message: string;\n e?: object;\n }) => void;\n sendSdkPoint: (type: string, data: any, extra?: any) => void;\n onFPSUpdate: (stats: FPSStats) => void;\n onFrameDataUpdate?: (data: IFrameDataUpdate) => void;\n }\n\nexport default class RenderScheduler {\n private TAG = \"[RenderScheduler]\";\n private dataCacheQueue: DataCacheQueue;\n private sdk: XmovAvatar;\n private config: CONFIG;\n\n private avatarRenderer: AvatarRenderer;\n private audioRenderer: AudioRenderer;\n private uiRenderer: UIRenderer;\n private composition: Composition;\n\n private currentSpeechId: number = -1;\n\n private resourceManager: ResourceManager;\n private frameAnimationController: AnimationController | undefined;\n private isStartPlay = false;\n private renderState: RenderState = RenderState.init;\n\n private onDownloadProgress: (progress: number) => void;\n private onRenderChange: (state: RenderState) => void;\n private decoder: ParallelDecoder;\n private saveAndDownload: SaveAndDownload; \n public lastSpeechId = -1;\n private enableClientInterrupt: boolean = false;\n private audioOnlyMode: boolean = false;\n private _speedResetTimer: any = null;\n private offsetFrame:number = 0;\n private hasSendTimeJson: boolean = false;\n private onFPSUpdate: (stats: FPSStats) => void;\n\n private setAudioInfo: (info: {\n sf: number;\n ef: number;\n ad: Uint8Array;\n }) => void;\n private setEventData: (info: {\n sf: number;\n ef: number;\n event: Array<any>;\n }) => void;\n private reportMessage: (message: {\n code: EErrorCode;\n message: string;\n e?: object;\n }) => void;\n private sendSdkPoint: (type: string, data: any, extra?: any) => void;\n private sendMessage: (type: string, payload: any) => void;\n constructor(config: CONFIG) {\n this.config = config;\n this.setAudioInfo = config.setAudioInfo;\n this.setEventData = config.setEventData;\n this.reportMessage = config.reportMessage;\n this.sendSdkPoint = config.sendSdkPoint;\n this.onRenderChange = config.onRenderChange;\n this.sendMessage = config.sendMessage;\n this.enableClientInterrupt = config.enableClientInterrupt || false;\n this.audioOnlyMode = config.audioOnlyMode || false;\n this.saveAndDownload = new SaveAndDownload(\n \"avatarData.js\",\n config.enableDebugger\n );\n this.resourceManager = config.resourceManager;\n this.sdk = config.sdkInstance;\n this.onDownloadProgress = config.onDownloadProgress;\n this.onFPSUpdate = config.onFPSUpdate;\n this.dataCacheQueue = new DataCacheQueue();\n this.decoder = new ParallelDecoder({\n hardwareAcceleration: config.hardwareAcceleration,\n resourceManager: this.resourceManager,\n saveAndDownload: this.saveAndDownload,\n dataCacheQueue: this.dataCacheQueue,\n reportMessage: this.reportMessage,\n });\n\n this.avatarRenderer = new AvatarRenderer({\n dataCacheQueue: this.dataCacheQueue,\n resourceManager: this.resourceManager,\n saveAndDownload: this.saveAndDownload,\n forceSyncDecoder: this.forceSyncDecoder.bind(this),\n reportMessage: this.reportMessage,\n sendSdkPoint: this.sendSdkPoint,\n onDownloadProgress: (progress: number) => {\n this.onDownloadProgress(progress);\n },\n onStateChange: (state: string) => {\n config.onStateChange(state);\n },\n onRenderChange: (state: RenderState) => {\n config.onRenderChange(state, this.renderState);\n this.renderState = state;\n },\n sendVideoInfo: config.sendVideoInfo,\n onError: (error: any) => {\n this.sdk.onMessage(error);\n },\n });\n this.uiRenderer = new UIRenderer({\n sdk: this.sdk,\n dataCacheQueue: this.dataCacheQueue,\n resourceManager: this.resourceManager,\n enableClientInterrupt: this.enableClientInterrupt,\n onWalkStateChange: (state: string) => {\n config.onWalkStateChange(state);\n },\n onVoiceStart: (duration: number, client_speak_id: string | number) => {\n config.onVoiceStateChange(\"start\", duration, client_speak_id);\n },\n onVoiceEnd: (client_speak_id: string | number, speech_id: number) => {\n this.stopAudio(speech_id);\n config.onVoiceStateChange(\"end\", undefined, client_speak_id);\n },\n onSpeakStateChange: (state: string, client_speak_id: string | number, speech_id: number) => {\n if(state === \"speak_start\") {\n this.currentSpeechId = speech_id;\n this.avatarRenderer.setInterrupt(false);\n } else if(state === \"speak_end\") {\n this.dataCacheQueue.clearSubtitleOn(speech_id);\n // 仅当speak_end属于当前或更新的轮次时才设置interrupt,避免旧轮次覆盖新轮次的表情状态\n if (speech_id >= this.currentSpeechId) {\n this.avatarRenderer.setInterrupt(true);\n }\n }\n config.onSpeakStateChange(state, client_speak_id);\n },\n sendSdkPoint: (type: string, data: any, extra?: any) => {\n config.sendSdkPoint(type, data, extra);\n },\n });\n this.audioRenderer = new AudioRenderer({\n sdk: this.sdk,\n dataCacheQueue: this.dataCacheQueue,\n resourceManager: this.resourceManager,\n });\n\n this.composition = new Composition({\n container: config.container,\n avatarRenderer: this.avatarRenderer,\n restRenderers: [this.uiRenderer],\n audioRenderer: this.audioRenderer,\n audioOnlyMode: this.audioOnlyMode,\n onFPSUpdate: (stats: FPSStats) => {\n this.onFPSUpdate(stats);\n },\n });\n this.frameAnimationController = new AnimationController({\n defaultSpeed: 1,\n frameRate: 24,\n frameCallback: (frame, timeJson) => {\n // (window as any).avatarSDKLogger.log(\"计时器回调帧号\", frame)\n if(!this.hasSendTimeJson && timeJson) {\n (window as any).avatarSDKLogger.error(\"当前帧日期与当前帧不一致:\", timeJson)\n // console.warn(\"当前帧日期与当前帧不一致:\", timeJson)\n this.sendMessage(\"client_error\", timeJson);\n this.hasSendTimeJson = true;\n }\n frame += this.offsetFrame;\n config.renderFrameCallback(frame);\n if (this.isStartPlay) {\n this.composition.compose(frame);\n this.decoder._tryStartNext();\n // 帧数据回调\n if (config.onFrameDataUpdate) {\n const frameData = this.avatarRenderer._getCurrentFrameData(frame);\n config.onFrameDataUpdate({\n frameIndex: frame,\n body: frameData.body,\n face: frameData.face,\n });\n }\n }\n },\n });\n }\n\n init() {\n if (this.audioOnlyMode) {\n return; // Skip WebGL initialization in audioOnlyMode\n }\n const mouthShapeLib = this.resourceManager.getMouthShapeLib();\n this.saveAndDownload.writeFields({\n resource_pack: this.resourceManager.resource_pack,\n });\n this.avatarRenderer.init({\n char: mouthShapeLib.char_info,\n LUT: null,\n transform: {\n offsetX: 0.0,\n offsetY: 0.0,\n scaleX: 1.0,\n scaleY: 1.0\n },\n multisample: 4\n });\n }\n\n /**\n * 处理数据:拆解并添加到缓存队列中\n * @param data TTSA 下发的数据\n */\n async handleData(type: EFrameDataType, data: IRawFrameData[] | SYNC_FRAME_DATA) {\n if (this.audioOnlyMode) {\n if (type === EFrameDataType.BODY ||\n type === EFrameDataType.FACE ||\n type === EFrameDataType.AA_FRAME) {\n return; // Skip video data in audioOnlyMode\n }\n }\n const currentFrameIndex = this.getCurrentFrameIndex();\n switch (type) {\n case EFrameDataType.BODY: {\n this.decoder.clearOldQueue(currentFrameIndex);\n // 根据currentFrame查找sf>currentFrame的body数据\n const currentFrame = currentFrameIndex;\n let mp4List = ([...data as IRawFrameData[]] as IRawBodyFrameData[]).filter((item) => item.ef > currentFrame);\n (window as any).avatarSDKLogger.log(mp4List,\"mp4List\")\n if (mp4List.length > 0) {\n // 在暂停状态(隐身模式)下,不检查数据是否过期\n // 因为此时帧动画暂停但数据仍在接收,可能导致帧索引与数据起始帧不同步\n if (this.renderState !== RenderState.paused && currentFrameIndex && currentFrameIndex > data[0].sf && currentFrameIndex > 10) {\n // 判断非初始场景下,body数据下发过期的情况\n this.sdk.onMessage({\n code: EErrorCode.BODY_DATA_EXPIRED,\n message: `Error: 身体数据过期 cur:${currentFrameIndex}-sf:${data[0].sf}`,\n e: data\n });\n }\n // 已经插入队列的移除掉\n this.decoder.decode(\n mp4List,\n (file: any, frame: any, index: any) => {\n // createImageBitmap(frame).then((rgbBitmap) => {\n if (file.start <= index && file.end >= index) {\n this.dataCacheQueue._updateBodyImageBitmap({\n frame,\n frameIndex: file.startFrameIndex + index,\n frameState: file.frameState,\n id: file.id,\n body_id: file.body_id,\n name: file.name,\n hfd: file.hfd,\n sf: file.startFrameIndex,\n offset: file?.x_offset[index] || 0,\n });\n // 视频获取完成,防止后端下发实际帧数大于需要抽的帧数,避免多余抽帧\n if (file.endFrameIndex <= file.startFrameIndex + index) {\n this.decoder.abortOne(\n `${file.body_id ?? file.id ?? 0}_${file.name}`\n );\n }\n }\n },\n );\n }\n break;\n }\n case EFrameDataType.FACE:\n this.dataCacheQueue.clearOldFaceData(currentFrameIndex);\n const faceData = this.handleFaceData(data as ITtsFaceFrameData[]);\n if (faceData.length > 0) {\n this.saveAndDownload.appendMultipleToArray(\"faceData\", faceData);\n }\n this.dataCacheQueue.checkValidData(\n faceData,\n type\n );\n // https://rsjqcmnt5p.feishu.cn/wiki/UiTUwZRKRiRGitkqDc4c78eUnye\n // 遍历处理完成之后的faceData,根据face_frame_type区分原始数据和实时数据,保存到不同的队列内\n let realFaceData: Array<IRawFaceFrameData> = [], nowFaceData: Array<IRawFaceFrameData> = [];\n for (let i = 0; i < faceData.length; i++) {\n // face_frame_type 1 实时数据\n if (!faceData[i]?.face_frame_type) {\n realFaceData.push(faceData[i])\n } else {\n nowFaceData.push(faceData[i]);\n }\n nowFaceData.length && this.dataCacheQueue._updateFacial(nowFaceData);\n realFaceData.length && this.dataCacheQueue._updateRealFacial(realFaceData);\n }\n break;\n case EFrameDataType.AUDIO:\n const audioData = data as IRawAudioFrameData[];\n this.setAudioInfo({\n sf: audioData[0].sf,\n ef: audioData[0].ef,\n ad: audioData[0].ad,\n });\n // 在暂停状态(隐身模式)下,不检查音频数据是否过期\n // 因为此时帧动画暂停但数据仍在接收,可能导致帧索引与数据起始帧不同步\n if (this.renderState !== RenderState.paused && currentFrameIndex > data[0].sf) {\n const currentFrame = currentFrameIndex;\n const delta = currentFrame ? currentFrame - data[0].sf : 0;\n this.reportMessage({\n code: EErrorCode.AUDIO_DATA_EXPIRED,\n message: `Error: 音频数据过期 cur:${currentFrameIndex}-sf:${data[0].sf}`,\n e: {\n currentFrame: currentFrameIndex,\n sf: data[0].sf,\n ef: delta,\n timestamp: Date.now(),\n }\n })\n this.sendSdkPoint('audio_data_expired', {\n currentFrame: currentFrameIndex,\n sf: data[0].sf,\n ef: delta,\n timestamp: Date.now(),\n });\n // return;\n }\n\n // 常量定义:24帧每秒,每帧时长(ms)\n const FRAME_RATE = 24;\n const FRAME_DURATION_MS = 1000 / FRAME_RATE;\n\n // 1. 解构获取数据,避免重复 data[0] 访问\n const { sf: startFrame, ef: endFrame } = data[0];\n const audioLenFrames = endFrame - startFrame;\n\n // 2. 边界保护:音频长度无效直接返回\n if (audioLenFrames <= 0) return;\n\n // 3. 获取当前帧(仅调用一次)\n const currentFrame = currentFrameIndex || 0;\n\n // 4. 计算当前帧相对于音频起始帧的偏移\n const frameOffset = currentFrame - startFrame;\n\n // 5. 核心逻辑判断\n if (frameOffset > audioLenFrames) {\n // 超过时长,直接丢弃\n return;\n }\n\n // 6. 计算播放速度 (仅在需要加速时计算)\n let playbackSpeed = 1;\n if (frameOffset > 0) {\n // 防止除以零 (虽然前面已判断 audioLenFrames > 0,但防御性编程)\n playbackSpeed = audioLenFrames / Math.max(audioLenFrames - frameOffset, 0.1);\n }\n\n // 7. 清理旧定时器,防止多个定时器冲突\n if (this._speedResetTimer) {\n clearTimeout(this._speedResetTimer);\n }\n\n // 8. 应用速度\n this.audioRenderer.setSpeed(playbackSpeed);\n\n // 9. 计算正确的恢复时间 (原时长 / 速度),并设置新定时器\n const originalDurationMs = audioLenFrames * FRAME_DURATION_MS;\n const actualDurationMs = originalDurationMs / playbackSpeed;\n\n this._speedResetTimer = setTimeout(() => {\n this.audioRenderer.setSpeed(1);\n this._speedResetTimer = null; // 清理引用\n }, actualDurationMs);\n\n this.dataCacheQueue.checkValidData(data as IRawAudioFrameData[], type);\n\n const processedAudioData = (data as IRawAudioFrameData[]).map((item: IRawAudioFrameData) => {\n // raw_audio = true 时,PCM 音频下发,不进行转换\n if (this.resourceManager.config.raw_audio) {\n return item;\n }\n // raw_audio = false 时,PCM 编码音频下发,进行转换 ArrayBuffer\n return {\n ...item,\n ad: item.ad.buffer.slice(item.ad.byteOffset, item.ad.byteOffset + item.ad.byteLength)\n };\n });\n // 过期的音频数据,直接丢弃\n if (processedAudioData[0].sid <= this.lastSpeechId) {\n return;\n }\n if (this.resourceManager.config.raw_audio) {\n (window as any).avatarSDKLogger?.log(this.TAG, 'processedAudioData[0].sid', processedAudioData[0].sid, this.currentSpeechId, this.renderState);\n\n this.audioRenderer.updateAudioData(processedAudioData);\n } else {\n // 临时修复: 先缓存一份数据,用于保留开始播放的时间\n this.audioRenderer._updateAudio(processedAudioData);\n }\n break;\n case EFrameDataType.EVENT:\n this.dataCacheQueue.clearOldEvent(currentFrameIndex);\n const d = data as IRawEventFrameData[];\n this.setEventData({\n sf: d[0].sf,\n ef: d[0].ef,\n event: d[0].e,\n });\n\n let hasAnySpeakStart = false;\n let expiredSpeakStartEv :IRawWidgetData | null = null;\n let expiredVoiceStartEv :IRawWidgetData | null = null;\n\n // 单次遍历,同时收集标记与过期事件\n for (const item of d) {\n const events = item.e ?? [];\n // 标记队列内存在speak_start事件\n if (events.some(ev => ev.type === 'speak_start')) {\n hasAnySpeakStart = true;\n }\n\n // 帧过期判断,无需额外数字校验\n const isFrameExpired = item.sf < currentFrameIndex;\n if (!isFrameExpired) continue;\n // 最多只取一个speak_start、一个voice_start,找到就不再赋值\n if (!expiredSpeakStartEv) {\n expiredSpeakStartEv = events.find(ev => ev.type === 'speak_start') || null;\n }\n if (!expiredVoiceStartEv) {\n expiredVoiceStartEv = events.find(ev => ev.type === 'voice_start') || null;\n }\n\n // 两个事件都找到,直接跳出循环\n if (expiredSpeakStartEv && expiredVoiceStartEv) break;\n }\n // 1. 新speak_start到来且音频播放中,兜底打断上一轮\n if (hasAnySpeakStart && this.audioRenderer.isPlaying) {\n this.reportMessage({\n code: EErrorCode.EVENT_TRIGGERED,\n message: 'WARNING: 有新的speak_start事件,但是上一轮仍未结束,触发兜底结束',\n });\n this.interrupt('new_speak_start');\n }\n\n // 2. 处理过期speak_start\n if (expiredSpeakStartEv) {\n const { speech_id, client_speak_id } = expiredSpeakStartEv;\n this.reportMessage({\n code: EErrorCode.EVENT_SPEAK_START_EXPIRED,\n message: 'WARNING: 收到speak_start过期,主动重置avatarRender,调用onSpeakStateChange',\n });\n this.currentSpeechId = speech_id ?? 0;\n this.avatarRenderer.setInterrupt(false);\n this.uiRenderer.lastSpeechId = speech_id ?? 0;\n this.config.onSpeakStateChange('speak_start', client_speak_id ?? 0);\n }\n\n // 3. 处理过期voice_start\n if (expiredVoiceStartEv) {\n this.reportMessage({\n code: EErrorCode.EVENT_VOICE_START_EXPIRED,\n message: 'WARNING: 收到voice_start过期,主动调用onVoiceStateChange',\n });\n const duration = (window as any).performanceTracker.markEnd(performanceConstant.voice_response_play, 'speak');\n this.config.onVoiceStateChange('start', duration, expiredVoiceStartEv?.client_speak_id ?? '');\n }\n\n // d是一个数组,过滤出其中sf和ef为-1的事件\n const specialEvents = d.filter(item => item.sf === -1 && item.ef === -1);\n // 遍历这个事件,然后通过proxyEvent处理它\n for (const item of specialEvents) {\n for (let i = 0; i < item.e.length; i++) {\n const widgetData = item.e[i];\n if (WidgetDefaultRender.CUSTOM_WIDGET) {\n WidgetDefaultRender.CUSTOM_WIDGET(widgetData);\n } else if (WidgetDefaultRender.PROXY_WIDGET) {\n WidgetDefaultRender.PROXY_WIDGET?.[widgetData.type]?.(widgetData);\n }\n }\n }\n const normalEvents = d.filter(item => item.sf !== -1);\n this.dataCacheQueue._updateUiEvent(normalEvents);\n break;\n case EFrameDataType.SYNC_FRAME:\n const syncData = data as SYNC_FRAME_DATA;\n if(this.sdk.getOptions().config?.replay || syncData?.source !== FRAME_SOURCE_SOURCE) return;\n const nowTime = Date.now() / 1000;\n const serverTime = syncData.server_time ?? 0;\n const clientTime = syncData.client_time ?? 0;\n const serverClientFrame = syncData.server_client_frame ?? 0;\n const rtt = nowTime - clientTime;\n const correctedFrame = (serverClientFrame + (rtt / 2) * 24).toFixed(0);\n this.offsetFrame += Number(correctedFrame) - Number(currentFrameIndex??0);\n break;\n default:\n this.sdk.onMessage({\n code: EErrorCode.INVALID_DATA_STRUCTURE,\n message: `Error: 数据类型错误`,\n e: { ...data, type }\n });\n }\n }\n\n setOffsetFrame(offsetFrame: number) {\n this.offsetFrame += offsetFrame;\n }\n\n setVolume(volume: number) {\n this.audioRenderer.setVolume(volume);\n }\n\n runStartFrameIndex() {\n this.frameAnimationController?.play();\n }\n\n stateChangeHandle(e: any) {\n this.dataCacheQueue.currentPlayState = e;\n }\n\n stopAudio(speech_id: number) {\n this.audioRenderer.stop(speech_id);\n }\n\n render() {\n if (this.audioOnlyMode) {\n // audioOnlyMode 下跳过 WebGL 初始化,直接标记开始播放并触发 progress 100\n this.isStartPlay = true;\n this.renderState = RenderState.rendering;\n this.onRenderChange(this.renderState);\n this.onDownloadProgress(100);\n return;\n }\n // 如果 pipeline 还未创建,在这里初始化(普通模式初始化时会调用这个方法)\n this.avatarRenderer.createPipeline();\n this.isStartPlay = true;\n this.renderState = RenderState.rendering;\n this.onRenderChange(this.renderState);\n }\n\n stop() {\n this.isStartPlay = false;\n this.renderState = RenderState.stopped;\n this.onRenderChange(this.renderState);\n this.composition.stop();\n }\n\n /**\n * 暂停渲染(停止渲染循环和音频播放)\n * 但继续接收和处理后端推送的数据并放入缓存队列,避免切换到在线时丢失数据导致丢帧\n */\n pauseRender(): void {\n if (this.renderState === RenderState.paused) {\n return;\n }\n\n // 1. 暂停动画帧循环(保留当前帧索引)\n this.frameAnimationController?.pause();\n this.decoder.abort();\n\n // 2. 停止并清空音频播放(丢弃所有剩余的音频数据)\n this.audioRenderer.stop(-1); // 传入 -1 清空所有音频数据\n\n // 3. 清空所有表情数据,避免错误的旧脸部数据与当前身体数据一起渲染导致人脸分离\n // 恢复渲染时会使用最新的脸部数据\n this.dataCacheQueue.clearAllFaceData();\n\n this.renderState = RenderState.paused;\n this.onRenderChange(this.renderState);\n\n (window as any).avatarSDKLogger?.log(this.TAG, `渲染已暂停(已清空表情数据,等待恢复): ${this.renderState}`);\n }\n\n /**\n * 恢复渲染\n */\n resumeRender(): void {\n if (this.renderState !== RenderState.paused) {\n return;\n }\n // 在恢复渲染时初始化 pipeline(如果在隐身模式时还未创建)\n // 这样可以避免在隐身模式时创建 pipeline 导致的 GPU 资源竞争\n this.avatarRenderer.createPipeline();\n\n // 重置表情相关状态,避免从隐身模式恢复时人脸和身体不匹配\n this.avatarRenderer.resetFaceFrameState();\n\n // 3. 恢复动画帧循环(从暂停时的帧索引继续)\n // 注意:frameAnimationController 会保持暂停时的帧索引,恢复时继续\n\n this.frameAnimationController?.play();\n this.isStartPlay = true\n this.forceSyncDecoder();\n // 4. 恢复后立即进入渲染中状态\n this.renderState = RenderState.resumed;\n this.onRenderChange(this.renderState);\n (window as any).avatarSDKLogger?.log(this.TAG, ' 渲染已恢复,状态: this.currentSpeechId===');\n }\n\n /**\n * 切换隐身模式(暂停/恢复渲染)\n */\n switchInvisibleMode(): void {\n if (this.renderState === RenderState.rendering || this.renderState === RenderState.resumed) {\n (window as any).avatarSDKLogger?.log(this.TAG, 'switchInvisibleMode: rendering to paused');\n this.pauseRender();\n } else if (this.renderState === RenderState.paused) {\n (window as any).avatarSDKLogger?.log(this.TAG, 'switchInvisibleMode: paused to rendering');\n this.resumeRender();\n } else {\n // stopped 或 idle 状态不做任何操作\n (window as any).avatarSDKLogger?.warn(this.TAG, `渲染状态为 ${this.renderState},无法切换隐身模式`);\n }\n }\n\n /**\n * 获取渲染状态\n */\n public getRenderState(): RenderState {\n (window as any).avatarSDKLogger?.log(this.TAG, `getRenderState: ${this.renderState}`);\n return this.renderState;\n }\n\n destroy() {\n this.isStartPlay = false;\n this.hasSendTimeJson = false;\n this.offsetFrame = 0;\n this._speedResetTimer = null; // 清理引用\n this.frameAnimationController?.destroy();\n this.frameAnimationController = undefined;\n this.dataCacheQueue.destroy();\n this.composition.destroy();\n this.decoder.destroy();\n }\n\n handleFaceData(data: ITtsFaceFrameData[]): IRawFaceFrameData[] {\n try {\n const resourcePack = this.resourceManager.resource_pack;\n const framedata_proto_version = this.resourceManager.getConfig().framedata_proto_version;\n const blendshape_map = [...resourcePack.blendshape_map ?? []];\n const face_list: any[] = data.map((item) => {\n let bsw_list: number[][] = [];\n const { body_id, sf, ef, s: state, id, js, bsw, ms, face_frame_type, asf, aef, n, cs} = item;\n let mesh: any[] = [];\n if (blendshape_map?.length > 0) {\n for (let i = 0; i < blendshape_map.length; i++) {\n const blendshape_map_item = blendshape_map[i];\n if (blendshape_map_item?.length > 0) {\n for (let j = 0; j < blendshape_map_item.length; j++) {\n if (!bsw_list[i]) {\n bsw_list[i] = [];\n }\n bsw_list[i][j] = bsw[blendshape_map_item[j]];\n }\n }\n }\n if (!framedata_proto_version) {\n mesh = Array.from({ length: ms.length }, (_, index) => ({\n blendshapeWeights: bsw_list[index],\n textureModelIndex: ms[index]?.[0] ?? 0,\n texturePCAWeights: ms[index]?.[1] ?? [],\n }));\n } else {\n mesh = Array.from({ length: ms.length }, (_, index) => ({\n blendshapeWeights: bsw_list[index],\n textureModelIndex: ms[index]?.index ?? 0,\n texturePCAWeights: ms[index]?.weights ?? [],\n }));\n }\n } else {\n if (!framedata_proto_version) {\n mesh = Array.from({ length: ms.length }, (_, index) => ({\n // blendshape_map 内容如[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],[44,45,8,10,12],[44,45,9,11,13],[44,45]]\n // 在遍历时,需要根据 blendshape_map 的索引,将 bsw 中的值替换为 blendshape_map 中索引的值\n blendshapeWeights: index === 0 ? bsw : [],\n textureModelIndex: ms[index]?.[0] ?? 0, // 增加可选链和默认值,防止越界\n texturePCAWeights: ms[index]?.[1] ?? [],\n }));\n } else {\n mesh = Array.from({ length: ms.length }, (_, index) => ({\n // blendshape_map 内容如[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],[44,45,8,10,12],[44,45,9,11,13],[44,45]]\n // 在遍历时,需要根据 blendshape_map 的索引,将 bsw 中的值替换为 blendshape_map 中索引的值\n blendshapeWeights: index === 0 ? bsw : [],\n textureModelIndex: ms[index]?.index ?? 0, // 增加可选链和默认值,防止越界\n texturePCAWeights: ms[index]?.weights ?? [],\n }));\n\n }\n }\n let movableJointTransforms: any[] = []\n if (!framedata_proto_version) {\n movableJointTransforms = js.map((joint) =>\n formatMJT(joint[0], joint[1])\n );\n } else {\n movableJointTransforms = js.map((joint) =>\n formatMJT(joint.translate, joint.rotate)\n );\n }\n return {\n body_id,\n frameIndex: sf,\n sf,\n ef,\n asf,\n aef,\n n,\n cs,\n state,\n id,\n face_frame_type,\n FaceFrameData: {\n mesh,\n movableJointTransforms,\n blendshapeWeights: bsw,\n },\n };\n });\n return face_list;\n } catch (error) {\n this.sdk.onMessage({\n code: EErrorCode.FACE_PROCESSING_ERROR,\n message: `Error: 表情数据处理失败`,\n e: error,\n });\n return [];\n }\n }\n forceSyncDecoder() {\n const currentFrameIndex = this.getCurrentFrameIndex();\n if (currentFrameIndex) {\n this.decoder.syncDecode(currentFrameIndex);\n }\n }\n _reload() {\n this.decoder._reload()\n }\n _getResumeInfo() {\n const frame = this.getCurrentFrameIndex();\n return this.avatarRenderer._getCurrentBodyFrameInfo(frame || 0)\n }\n \n sendVoiceEnd() {\n const currentFrameIndex = (this.getCurrentFrameIndex() ?? 0) + 1;\n this.dataCacheQueue._updateUiEvent([{\n \"id\": 0,\n \"s\": \"\",\n \"sf\": currentFrameIndex,\n \"ef\": currentFrameIndex + 1,\n \"e\": [\n {\n \"type\": \"speak_end\",\n \"speech_id\": this.uiRenderer.lastSpeechId ?? -1, \n },\n {\n \"type\": \"voice_end\",\n \"speech_id\": this.uiRenderer.lastSpeechId ?? -1, \n },\n ]\n }])\n }\n\n _offlineMode() {\n this.dataCacheQueue._clearEvent();\n const currentFrame = this.getCurrentFrameIndex() ?? 0;\n this.dataCacheQueue._updateUiEvent([{\n \"id\": 0,\n \"s\": \"\",\n \"sf\": currentFrame + 1,\n \"ef\": currentFrame + 2,\n \"e\": [\n {\n \"type\": \"subtitle_off\",\n \"speech_id\": this.uiRenderer.lastSpeechId ?? -1,\n },\n ]\n }])\n this.audioRenderer.pause()\n const frame = this.getCurrentFrameIndex();\n if (frame) {\n this.decoder._offLineMode(this.resourceManager._getOfflineIdle(), frame);\n }\n }\n _offlineRun() {\n this.decoder._offlineRun()\n this.dataCacheQueue.clearAllFaceData();\n }\n\n ttsaStateChangeHandle(state: StateChangeInfo) {\n this.dataCacheQueue.currentTtsaState = state;\n }\n\n resume() {\n this.audioRenderer.resume();\n }\n\n /**\n * 设置数字人canvas的显隐状态\n * @param visible 是否可见\n */\n setAvatarCanvasVisible(visible: boolean) {\n this.avatarRenderer.setCanvasVisibility(visible);\n }\n setCharacterCanvasLayout(layout?: Layout) {\n this.avatarRenderer.setCharacterCanvasAnchor(layout);\n }\n\n setWalkConfig(walkConfig: WalkConfig) {\n this.avatarRenderer.setWalkConfig(walkConfig);\n }\n\n interrupt(type?: string): number{\n const start = Date.now();\n // 插入中断字幕和语音结束事件\n const speech_id = this.audioRenderer.speech_id;\n if(type === \"in_offline_mode\") {\n this.lastSpeechId = -1;\n } else {\n this.lastSpeechId = speech_id;\n }\n if(type !== \"in_offline_mode\") {\n this.avatarRenderer.setInterrupt(true);\n }\n this.dataCacheQueue._clearAudio(speech_id);\n this.dataCacheQueue.clearSubtitleOn(speech_id);\n const currentFrame = this.getCurrentFrameIndex() ?? 0;\n this.dataCacheQueue._updateUiEvent([{\n \"id\": 0,\n \"s\": \"\",\n \"sf\": currentFrame + 1,\n \"ef\": currentFrame + 2,\n \"e\": [\n {\n \"type\": \"subtitle_off\",\n \"speech_id\": speech_id ?? -1,\n },\n ]\n }])\n \n // 中断音频播放\n if(type !== \"in_offline_mode\") {\n this.audioRenderer.stop(speech_id);\n }\n this.uiRenderer.setInterrupt(speech_id)\n return Date.now() - start;\n }\n\n seekToFrame(frame: number) {\n this.frameAnimationController?.updateStartTime(frame);\n }\n\n getCurrentFrameIndex() {\n return (this.frameAnimationController?.getCurrentFrame()??0) + this.offsetFrame;\n }\n\n getSpeechId() {\n return this.audioRenderer.speech_id;\n }\n\n getAudioRenderer(): AudioRenderer {\n return this.audioRenderer;\n }\n\n // ── 测试用方法:模拟 WebGL 上下文丢失 ─────────────────────────────\n \n /**\n * [测试用] 模拟 WebGL 上下文丢失\n */\n public simulateContextLoss(restoreAfterMs: number = 5000, forceFail: boolean = false): void {\n this.avatarRenderer.simulateContextLoss(restoreAfterMs, forceFail);\n }\n\n /**\n * [测试用] 获取当前恢复状态信息\n */\n public getRecoveryStatus() {\n return this.avatarRenderer.getRecoveryStatus();\n }\n\n /**\n * [测试用] 批量测试分阶段恢复\n */\n public async testStagedRecovery(): Promise<void> {\n return this.avatarRenderer.testStagedRecovery();\n }\n\n /**\n * 手动重启 WebGL:创建新 canvas + 新 GLDevice + 新 GLPipeline\n * 用于分阶段恢复全部失败后的手动恢复\n * @returns 是否成功\n */\n public restartWebGL(): boolean {\n return this.avatarRenderer.restartWebGL();\n }\n}\n","\n/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED = 1;\n//const Z_HUFFMAN_ONLY = 2;\n//const Z_RLE = 3;\nconst Z_FIXED$1 = 4;\n//const Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY = 0;\nconst Z_TEXT = 1;\n//const Z_ASCII = 1; // = Z_TEXT\nconst Z_UNKNOWN$1 = 2;\n\n/*============================================================================*/\n\n\nfunction zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH$1 = 3;\nconst MAX_MATCH$1 = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES$1 = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS$1 = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES$1 = 30;\n/* number of distance codes */\n\nconst BL_CODES$1 = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE$1 = 2 * L_CODES$1 + 1;\n/* maximum heap size */\n\nconst MAX_BITS$1 = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK = 256;\n/* end of block literal code */\n\nconst REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits = /* extra bits for each length code */\n new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);\n\nconst extra_dbits = /* extra bits for each distance code */\n new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);\n\nconst extra_blbits = /* extra bits for each bit length code */\n new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree = new Array((L_CODES$1 + 2) * 2);\nzero$1(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree = new Array(D_CODES$1 * 2);\nzero$1(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code = new Array(DIST_CODE_LEN);\nzero$1(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1);\nzero$1(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length = new Array(LENGTH_CODES$1);\nzero$1(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist = new Array(D_CODES$1);\nzero$1(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n let res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nconst gen_bitlen = (s, desc) => {\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n\n const tree = desc.dyn_tree;\n const max_code = desc.max_code;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const extra = desc.stat_desc.extra_bits;\n const base = desc.stat_desc.extra_base;\n const max_length = desc.stat_desc.max_length;\n let h; /* heap index */\n let n, m; /* iterate over the tree elements */\n let bits; /* bit length */\n let xbits; /* extra bits */\n let f; /* frequency */\n let overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Tracev((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Tracev((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) => {\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n\n const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */\n let code = 0; /* running code value */\n let bits; /* bit index */\n let n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS$1; bits++) {\n code = (code + bl_count[bits - 1]) << 1;\n next_code[bits] = code;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n // \"inconsistent bit counts\");\n //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n for (n = 0; n <= max_code; n++) {\n let len = tree[n * 2 + 1]/*.Len*/;\n if (len === 0) { continue; }\n /* Now reverse the bits */\n tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n }\n};\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nconst tr_static_init = () => {\n\n let n; /* iterates over tree elements */\n let bits; /* bit counter */\n let length; /* length value */\n let code; /* code value */\n let dist; /* distance index */\n const bl_count = new Array(MAX_BITS$1 + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES$1 - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES$1; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES$1 + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES$1; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS);\n\n //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n let n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.sym_next = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n const _n2 = n * 2;\n const _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) => {\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n\n const v = s.heap[k];\n let j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) => {\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n\n let dist; /* distance of matched string */\n let lc; /* match length or unmatched char (if dist == 0) */\n let sx = 0; /* running index in sym_buf */\n let code; /* the code to send */\n let extra; /* number of extra bits to send */\n\n if (s.sym_next !== 0) {\n do {\n dist = s.pending_buf[s.sym_buf + sx++] & 0xff;\n dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8;\n lc = s.pending_buf[s.sym_buf + sx++];\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and sym_buf is ok: */\n //Assert(s->pending < s->lit_bufsize + sx, \"pendingBuf overflow\");\n\n } while (sx < s.sym_next);\n }\n\n send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) => {\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n\n const tree = desc.dyn_tree;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const elems = desc.stat_desc.elems;\n let n, m; /* iterate over heap elements */\n let max_code = -1; /* largest code with non zero frequency */\n let node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE$1;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) => {\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) => {\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n let max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) => {\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n\n let rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"block list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"allow list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n /* block_mask is the bit mask of block-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n let block_mask = 0xf3ffc07f;\n let n;\n\n /* Check for non-textual (\"block-listed\") bytes. */\n for (n = 0; n <= 31; n++, block_mask >>>= 1) {\n if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"allow-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS$1; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"block-listed\" or \"allow-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init$1 = (s) =>\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n bi_windup(s); /* align on byte boundary */\n put_short(s, stored_len);\n put_short(s, ~stored_len);\n if (stored_len) {\n s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending);\n }\n s.pending += stored_len;\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align$1 = (s) => {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and write out the encoded block.\n */\nconst _tr_flush_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n\n let opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n let max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN$1) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->sym_next / 3));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block$1(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally$1 = (s, dist, lc) => {\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n\n s.pending_buf[s.sym_buf + s.sym_next++] = dist;\n s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8;\n s.pending_buf[s.sym_buf + s.sym_next++] = lc;\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n return (s.sym_next === s.sym_end);\n};\n\nvar _tr_init_1 = _tr_init$1;\nvar _tr_stored_block_1 = _tr_stored_block$1;\nvar _tr_flush_block_1 = _tr_flush_block$1;\nvar _tr_tally_1 = _tr_tally$1;\nvar _tr_align_1 = _tr_align$1;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants$2 = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,\n Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1,\n Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n Z_UNKNOWN,\n Z_DEFLATED: Z_DEFLATED$2\n} = constants$2;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES = 30;\n/* number of distance codes */\nconst BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\nconst MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE = 42; /* zlib header -> BUSY_STATE */\n//#ifdef GZIP\nconst GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */\n//#endif\nconst EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */\nconst NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */\nconst COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */\nconst HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */\nconst BUSY_STATE = 113; /* deflate -> FINISH_STATE */\nconst FINISH_STATE = 666; /* stream complete */\n\nconst BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n strm.msg = messages[errorCode];\n return errorCode;\n};\n\nconst rank = (f) => {\n return ((f) * 2) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero = (buf) => {\n let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n/* ===========================================================================\n * Slide the hash table when sliding the window down (could be avoided with 32\n * bit values at the expense of memory usage). We slide even when level == 0 to\n * keep the hash table consistent if we switch back to level > 0 later.\n */\nconst slide_hash = (s) => {\n let n, m;\n let p;\n let wsize = s.w_size;\n\n n = s.hash_size;\n p = n;\n do {\n m = s.head[--p];\n s.head[p] = (m >= wsize ? m - wsize : 0);\n } while (--n);\n n = wsize;\n//#ifndef FASTEST\n p = n;\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= wsize ? m - wsize : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n//#endif\n};\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output, except for\n * some deflate_stored() output, goes through this function so some\n * applications may wish to modify it to avoid allocating a large\n * strm->next_out buffer and copying into it. (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n const s = strm.state;\n\n //_tr_flush_bits(s);\n let len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n};\n\n\nconst flush_block_only = (s, last) => {\n _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n // put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n let len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32_1(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32_1(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n let chain_length = s.max_chain_length; /* max hash chain length */\n let scan = s.strstart; /* current string */\n let match; /* matched string */\n let len; /* length of current match */\n let best_len = s.prev_length; /* best match length so far */\n let nice_match = s.nice_match; /* stop if match long enough */\n const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n const _win = s.window; // shortcut\n\n const wmask = s.w_mask;\n const prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n const strend = s.strstart + MAX_MATCH;\n let scan_end1 = _win[scan + best_len - 1];\n let scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nconst fill_window = (s) => {\n\n const _w_size = s.w_size;\n let n, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n slide_hash(s);\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// const curr = s.strstart + s.lookahead;\n// let init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n *\n * In case deflateParams() is used to later switch to a non-zero compression\n * level, s->matches (otherwise unused when storing) keeps track of the number\n * of hash table slides to perform. If s->matches is 1, then one hash table\n * slide will be done when switching. If s->matches is 2, the maximum value\n * allowed here, then the hash table will be cleared, since two or more slides\n * is the same as a clear.\n *\n * deflate_stored() is written to minimize the number of times an input byte is\n * copied. It is most efficient with large input and output buffers, which\n * maximizes the opportunites to have a single copy from next_in to next_out.\n */\nconst deflate_stored = (s, flush) => {\n\n /* Smallest worthy block size when not flushing or finishing. By default\n * this is 32K. This can be as small as 507 bytes for memLevel == 1. For\n * large input and output buffers, the stored block size will be larger.\n */\n let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5;\n\n /* Copy as many min_block or larger stored blocks directly to next_out as\n * possible. If flushing, copy the remaining available input to next_out as\n * stored blocks, if there is enough space.\n */\n let len, left, have, last = 0;\n let used = s.strm.avail_in;\n do {\n /* Set len to the maximum size block that we can copy directly with the\n * available input data and output space. Set left to how much of that\n * would be copied from what's left in the window.\n */\n len = 65535/* MAX_STORED */; /* maximum deflate stored block length */\n have = (s.bi_valid + 42) >> 3; /* number of header bytes */\n if (s.strm.avail_out < have) { /* need room for header */\n break;\n }\n /* maximum stored block length that will fit in avail_out: */\n have = s.strm.avail_out - have;\n left = s.strstart - s.block_start; /* bytes left in window */\n if (len > left + s.strm.avail_in) {\n len = left + s.strm.avail_in; /* limit len to the input */\n }\n if (len > have) {\n len = have; /* limit len to the output */\n }\n\n /* If the stored block would be less than min_block in length, or if\n * unable to copy all of the available input when flushing, then try\n * copying to the window and the pending buffer instead. Also don't\n * write an empty block when flushing -- deflate() does that.\n */\n if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) ||\n flush === Z_NO_FLUSH$2 ||\n len !== left + s.strm.avail_in)) {\n break;\n }\n\n /* Make a dummy stored block in pending to get the header bytes,\n * including any pending bits. This also updates the debugging counts.\n */\n last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0;\n _tr_stored_block(s, 0, 0, last);\n\n /* Replace the lengths in the dummy stored block with len. */\n s.pending_buf[s.pending - 4] = len;\n s.pending_buf[s.pending - 3] = len >> 8;\n s.pending_buf[s.pending - 2] = ~len;\n s.pending_buf[s.pending - 1] = ~len >> 8;\n\n /* Write the stored block header bytes. */\n flush_pending(s.strm);\n\n//#ifdef ZLIB_DEBUG\n// /* Update debugging counts for the data about to be copied. */\n// s->compressed_len += len << 3;\n// s->bits_sent += len << 3;\n//#endif\n\n /* Copy uncompressed bytes from the window to next_out. */\n if (left) {\n if (left > len) {\n left = len;\n }\n //zmemcpy(s->strm->next_out, s->window + s->block_start, left);\n s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out);\n s.strm.next_out += left;\n s.strm.avail_out -= left;\n s.strm.total_out += left;\n s.block_start += left;\n len -= left;\n }\n\n /* Copy uncompressed bytes directly from next_in to next_out, updating\n * the check value.\n */\n if (len) {\n read_buf(s.strm, s.strm.output, s.strm.next_out, len);\n s.strm.next_out += len;\n s.strm.avail_out -= len;\n s.strm.total_out += len;\n }\n } while (last === 0);\n\n /* Update the sliding window with the last s->w_size bytes of the copied\n * data, or append all of the copied data to the existing window if less\n * than s->w_size bytes were copied. Also update the number of bytes to\n * insert in the hash tables, in the event that deflateParams() switches to\n * a non-zero compression level.\n */\n used -= s.strm.avail_in; /* number of input bytes directly copied */\n if (used) {\n /* If any input was used, then no unused input remains in the window,\n * therefore s->block_start == s->strstart.\n */\n if (used >= s.w_size) { /* supplant the previous history */\n s.matches = 2; /* clear hash */\n //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);\n s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0);\n s.strstart = s.w_size;\n s.insert = s.strstart;\n }\n else {\n if (s.window_size - s.strstart <= used) {\n /* Slide the window down. */\n s.strstart -= s.w_size;\n //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n if (s.matches < 2) {\n s.matches++; /* add a pending slide_hash() */\n }\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n }\n //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);\n s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart);\n s.strstart += used;\n s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used;\n }\n s.block_start = s.strstart;\n }\n if (s.high_water < s.strstart) {\n s.high_water = s.strstart;\n }\n\n /* If the last block was written to next_out, then done. */\n if (last) {\n return BS_FINISH_DONE;\n }\n\n /* If flushing and all input has been consumed, then done. */\n if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 &&\n s.strm.avail_in === 0 && s.strstart === s.block_start) {\n return BS_BLOCK_DONE;\n }\n\n /* Fill the window with any remaining input. */\n have = s.window_size - s.strstart;\n if (s.strm.avail_in > have && s.block_start >= s.w_size) {\n /* Slide the window down. */\n s.block_start -= s.w_size;\n s.strstart -= s.w_size;\n //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n if (s.matches < 2) {\n s.matches++; /* add a pending slide_hash() */\n }\n have += s.w_size; /* more space now */\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n }\n if (have > s.strm.avail_in) {\n have = s.strm.avail_in;\n }\n if (have) {\n read_buf(s.strm, s.window, s.strstart, have);\n s.strstart += have;\n s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have;\n }\n if (s.high_water < s.strstart) {\n s.high_water = s.strstart;\n }\n\n /* There was not enough avail_out to write a complete worthy or flushed\n * stored block to next_out. Write a stored block to pending instead, if we\n * have enough input for a worthy block, or if flushing and there is enough\n * room for the remaining input as a stored block in the pending buffer.\n */\n have = (s.bi_valid + 42) >> 3; /* number of header bytes */\n /* maximum stored block length that will fit in pending: */\n have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have;\n min_block = have > s.w_size ? s.w_size : have;\n left = s.strstart - s.block_start;\n if (left >= min_block ||\n ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 &&\n s.strm.avail_in === 0 && left <= have)) {\n len = left > have ? have : left;\n last = flush === Z_FINISH$3 && s.strm.avail_in === 0 &&\n len === left ? 1 : 0;\n _tr_stored_block(s, s.block_start, len, last);\n s.block_start += len;\n flush_pending(s.strm);\n }\n\n /* We've done all we can with the available input and output. */\n return last ? BS_FINISH_STARTED : BS_NEED_MORE;\n};\n\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n let hash_head; /* head of the hash chain */\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n let hash_head; /* head of hash chain */\n let bflush; /* set if current block must be flushed */\n\n let max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n let prev; /* byte at distance one to match */\n let scan, strend; /* scan goes up to strend for length of run */\n\n const _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nconst configuration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED$2; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2);\n this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2);\n this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new Uint16Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.sym_buf = 0; /* buffer for distances and literals/lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.sym_next = 0; /* running index in sym_buf */\n this.sym_end = 0; /* symbol table full when sym_next reaches this */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\n/* =========================================================================\n * Check for a valid deflate stream state. Return 0 if ok, 1 if not.\n */\nconst deflateStateCheck = (strm) => {\n\n if (!strm) {\n return 1;\n }\n const s = strm.state;\n if (!s || s.strm !== strm || (s.status !== INIT_STATE &&\n//#ifdef GZIP\n s.status !== GZIP_STATE &&\n//#endif\n s.status !== EXTRA_STATE &&\n s.status !== NAME_STATE &&\n s.status !== COMMENT_STATE &&\n s.status !== HCRC_STATE &&\n s.status !== BUSY_STATE &&\n s.status !== FINISH_STATE)) {\n return 1;\n }\n return 0;\n};\n\n\nconst deflateResetKeep = (strm) => {\n\n if (deflateStateCheck(strm)) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n const s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status =\n//#ifdef GZIP\n s.wrap === 2 ? GZIP_STATE :\n//#endif\n s.wrap ? INIT_STATE : BUSY_STATE;\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = -2;\n _tr_init(s);\n return Z_OK$3;\n};\n\n\nconst deflateReset = (strm) => {\n\n const ret = deflateResetKeep(strm);\n if (ret === Z_OK$3) {\n lm_init(strm.state);\n }\n return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n if (deflateStateCheck(strm) || strm.state.wrap !== 2) {\n return Z_STREAM_ERROR$2;\n }\n strm.state.gzhead = head;\n return Z_OK$3;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR$2;\n }\n let wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION$1) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n const s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n s.status = INIT_STATE; /* to pass state test in deflateReset() */\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new Uint8Array(s.w_size * 2);\n s.head = new Uint16Array(s.hash_size);\n s.prev = new Uint16Array(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n /* We overlay pending_buf and sym_buf. This works since the average size\n * for length/distance pairs over any compressed block is assured to be 31\n * bits or less.\n *\n * Analysis: The longest fixed codes are a length code of 8 bits plus 5\n * extra bits, for lengths 131 to 257. The longest fixed distance codes are\n * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest\n * possible fixed-codes length/distance pair is then 31 bits total.\n *\n * sym_buf starts one-fourth of the way into pending_buf. So there are\n * three bytes in sym_buf for every four bytes in pending_buf. Each symbol\n * in sym_buf is three bytes -- two for the distance and one for the\n * literal/length. As each symbol is consumed, the pointer to the next\n * sym_buf value to read moves forward three bytes. From that symbol, up to\n * 31 bits are written to pending_buf. The closest the written pending_buf\n * bits gets to the next sym_buf symbol to read is just before the last\n * code is written. At that time, 31*(n-2) bits have been written, just\n * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at\n * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1\n * symbols are written.) The closest the writing gets to what is unread is\n * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and\n * can range from 128 to 32768.\n *\n * Therefore, at a minimum, there are 142 bits of space between what is\n * written and what is read in the overlain buffers, so the symbols cannot\n * be overwritten by the compressed data. That space is actually 139 bits,\n * due to the three-bit fixed-code block header.\n *\n * That covers the case where either Z_FIXED is specified, forcing fixed\n * codes, or when the use of fixed codes is chosen, because that choice\n * results in a smaller compressed block than dynamic codes. That latter\n * condition then assures that the above analysis also covers all dynamic\n * blocks. A dynamic-code block will only be chosen to be emitted if it has\n * fewer bits than a fixed-code block would for the same set of symbols.\n * Therefore its average symbol length is assured to be less than 31. So\n * the compressed data for a dynamic block also cannot overwrite the\n * symbols from which it is being constructed.\n */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->sym_buf = s->pending_buf + s->lit_bufsize;\n s.sym_buf = s.lit_bufsize;\n\n //s->sym_end = (s->lit_bufsize - 1) * 3;\n s.sym_end = (s.lit_bufsize - 1) * 3;\n /* We avoid equality with lit_bufsize*3 because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1);\n};\n\n\n/* ========================================================================= */\nconst deflate$2 = (strm, flush) => {\n\n if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n\n if (!strm.output ||\n (strm.avail_in !== 0 && !strm.input) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);\n }\n\n const old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK$3;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH$3) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* Write the header */\n if (s.status === INIT_STATE && s.wrap === 0) {\n s.status = BUSY_STATE;\n }\n if (s.status === INIT_STATE) {\n /* zlib header */\n let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8;\n let level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n//#ifdef GZIP\n if (s.status === GZIP_STATE) {\n /* gzip header */\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let left = (s.gzhead.extra.length & 0xffff) - s.gzindex;\n while (s.pending + left > s.pending_buf_size) {\n let copy = s.pending_buf_size - s.pending;\n // zmemcpy(s.pending_buf + s.pending,\n // s.gzhead.extra + s.gzindex, copy);\n s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending);\n s.pending = s.pending_buf_size;\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex += copy;\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n left -= copy;\n }\n // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility\n // TypedArray.slice and TypedArray.from don't exist in IE10-IE11\n let gzhead_extra = new Uint8Array(s.gzhead.extra);\n // zmemcpy(s->pending_buf + s->pending,\n // s->gzhead->extra + s->gzindex, left);\n s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending);\n s.pending += left;\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex = 0;\n }\n s.status = NAME_STATE;\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let val;\n do {\n if (s.pending === s.pending_buf_size) {\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex = 0;\n }\n s.status = COMMENT_STATE;\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let val;\n do {\n if (s.pending === s.pending_buf_size) {\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n }\n s.status = HCRC_STATE;\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n }\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n//#endif\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) {\n let bstate = s.level === 0 ? deflate_stored(s, flush) :\n s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :\n s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush);\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK$3;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n _tr_align(s);\n }\n else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */\n\n _tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH$1) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK$3;\n }\n }\n }\n\n if (flush !== Z_FINISH$3) { return Z_OK$3; }\n if (s.wrap <= 0) { return Z_STREAM_END$3; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3;\n};\n\n\nconst deflateEnd = (strm) => {\n\n if (deflateStateCheck(strm)) {\n return Z_STREAM_ERROR$2;\n }\n\n const status = strm.state.status;\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n let dictLength = dictionary.length;\n\n if (deflateStateCheck(strm)) {\n return Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n const wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR$2;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n let tmpDict = new Uint8Array(s.w_size);\n tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n const avail = strm.avail_in;\n const next = strm.next_in;\n const input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH) {\n let str = s.strstart;\n let n = s.lookahead - (MIN_MATCH - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK$3;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2$1 = deflate$2;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateGetDictionary = deflateGetDictionary;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1$2 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2$1,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n return new TextEncoder().encode(str);\n }\n\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n const len = max || buf.length;\n\n if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n return new TextDecoder().decode(buf.subarray(0, max));\n }\n\n let i, out;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2,\n Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2,\n Z_DEFAULT_COMPRESSION,\n Z_DEFAULT_STRATEGY,\n Z_DEFLATED: Z_DEFLATED$1\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate$1(options) {\n this.options = common.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED$1,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY\n }, options || {});\n\n let opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = deflate_1$2.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n if (opt.header) {\n deflate_1$2.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n let dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = deflate_1$2.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n let status, _flush_mode;\n\n if (this.ended) { return false; }\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1;\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString$1.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n // Make sure avail_out > 6 to avoid repeating markers\n if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n status = deflate_1$2.deflate(strm, _flush_mode);\n\n // Ended => flush and finish\n if (status === Z_STREAM_END$2) {\n if (strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n }\n status = deflate_1$2.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK$2;\n }\n\n // Flush if out buffer full\n if (strm.avail_out === 0) {\n this.onData(strm.output);\n continue;\n }\n\n // Flush if requested and has data\n if (_flush_mode > 0 && strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$2) {\n this.result = common.flattenChunks(this.chunks);\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n const deflator = new Deflate$1(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip$1(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate$1(input, options);\n}\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_2 = deflate$1;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar constants$1 = constants$2;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD$1 = 16209; /* got a data error -- remain here until reset */\nconst TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n//#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE$1;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n// let shoextra; /* extra bits table to use */\n let match; /* use base and extra for symbol >= match */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES$1 || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES$1) {\n base = extra = work; /* dummy value--not used */\n match = 20;\n\n } else if (type === LENS$1) {\n base = lbase;\n extra = lext;\n match = 257;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n match = 0;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] + 1 < match) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] >= match) {\n here_op = extra[work[sym] - match];\n here_val = base[work[sym] - match];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n Z_DEFLATED\n} = constants$2;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst HEAD = 16180; /* i: waiting for magic header */\nconst FLAGS = 16181; /* i: waiting for method and flags (gzip) */\nconst TIME = 16182; /* i: waiting for modification time (gzip) */\nconst OS = 16183; /* i: waiting for extra flags and operating system (gzip) */\nconst EXLEN = 16184; /* i: waiting for extra length (gzip) */\nconst EXTRA = 16185; /* i: waiting for extra bytes (gzip) */\nconst NAME = 16186; /* i: waiting for end of file name (gzip) */\nconst COMMENT = 16187; /* i: waiting for end of comment (gzip) */\nconst HCRC = 16188; /* i: waiting for header crc (gzip) */\nconst DICTID = 16189; /* i: waiting for dictionary check value */\nconst DICT = 16190; /* waiting for inflateSetDictionary() call */\nconst TYPE = 16191; /* i: waiting for type bits, including last-flag bit */\nconst TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */\nconst STORED = 16193; /* i: waiting for stored size (length and complement) */\nconst COPY_ = 16194; /* i/o: same as COPY below, but only first time in */\nconst COPY = 16195; /* i/o: waiting for input or output to copy stored block */\nconst TABLE = 16196; /* i: waiting for dynamic block table lengths */\nconst LENLENS = 16197; /* i: waiting for code length code lengths */\nconst CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */\nconst LEN_ = 16199; /* i: same as LEN below, but only first time in */\nconst LEN = 16200; /* i: waiting for length/lit/eob code */\nconst LENEXT = 16201; /* i: waiting for length extra bits */\nconst DIST = 16202; /* i: waiting for distance code */\nconst DISTEXT = 16203; /* i: waiting for distance extra bits */\nconst MATCH = 16204; /* o: waiting for output space to copy string */\nconst LIT = 16205; /* o: waiting for output space to write literal */\nconst CHECK = 16206; /* i: waiting for 32-bit check value */\nconst LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */\nconst DONE = 16208; /* finished check, done -- remain here until reset */\nconst BAD = 16209; /* got a data error -- remain here until reset */\nconst MEM = 16210; /* got an inflate() memory error -- remain here until reset */\nconst SYNC = 16211; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS;\n\n\nconst zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip,\n bit 2 true to validate check value */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib), or\n -1 if raw or no header yet */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\n\nconst inflateStateCheck = (strm) => {\n\n if (!strm) {\n return 1;\n }\n const state = strm.state;\n if (!state || state.strm !== strm ||\n state.mode < HEAD || state.mode > SYNC) {\n return 1;\n }\n return 0;\n};\n\n\nconst inflateResetKeep = (strm) => {\n\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.flags = -1;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$1;\n};\n\n\nconst inflateReset = (strm) => {\n\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 5;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.strm = strm;\n state.window = null/*Z_NULL*/;\n state.mode = HEAD; /* to pass state test in inflateReset2() */\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$1) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n};\n\n\nconst inflate$2 = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (inflateStateCheck(strm) || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$1;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n if (state.wbits === 0) {\n state.wbits = 15;\n }\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n if (len > 15 || len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n state.flags = 0; /* indicate zlib header */\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 4) && hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT$1;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if ((state.wrap & 4) && _out) {\n strm.adler = state.check =\n /*UPDATE_CHECK(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$1;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR$1;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH$1))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if ((state.wrap & 4) && _out) {\n strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n if (inflateStateCheck(strm)) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$1;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$1;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR$1;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$1;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2$1 = inflate$2;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCodesUsed = inflateCodesUsed;\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\nmodule.exports.inflateValidate = inflateValidate;\n*/\n\nvar inflate_1$2 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2$1,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH, Z_FINISH,\n Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate$1(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1$2.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1$2.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n // Convert data if needed\n if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1$2.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT && dictionary) {\n status = inflate_1$2.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK) {\n status = inflate_1$2.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR) {\n // Replace code with more verbose\n status = Z_NEED_DICT;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1$2.inflateReset(strm);\n status = inflate_1$2.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR:\n case Z_DATA_ERROR:\n case Z_NEED_DICT:\n case Z_MEM_ERROR:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END) {\n status = inflate_1$2.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err) {\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n const inflator = new Inflate$1(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1$1 = Inflate$1;\nvar inflate_2 = inflate$1;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip$1 = inflate$1;\nvar constants = constants$2;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1$1,\n\tinflate: inflate_2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip$1,\n\tconstants: constants\n};\n\nconst { Deflate, deflate, deflateRaw, gzip } = deflate_1$1;\n\nconst { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1;\n\n\n\nvar Deflate_1 = Deflate;\nvar deflate_1 = deflate;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar Inflate_1 = Inflate;\nvar inflate_1 = inflate;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip_1 = ungzip;\nvar constants_1 = constants$2;\n\nvar pako = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tInflate: Inflate_1,\n\tinflate: inflate_1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport { Deflate_1 as Deflate, Inflate_1 as Inflate, constants_1 as constants, pako as default, deflate_1 as deflate, deflateRaw_1 as deflateRaw, gzip_1 as gzip, inflate_1 as inflate, inflateRaw_1 as inflateRaw, ungzip_1 as ungzip };\n","type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD'\n\ninterface RequestOptions {\n method?: HttpMethod\n data?: Record<string, any>\n headers?: Record<string, string>\n}\n\ninterface ErrorResponse {\n status: number\n statusText: string\n message: string\n}\n\nconst TAG = '[REQUEST]'\nexport default async function request(\n url: string,\n options: RequestOptions = {}\n) {\n const { method = 'GET', data, headers = {} } = options\n\n const config: RequestInit = {\n method,\n // headers,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n }\n\n if (method === 'GET' && data) {\n const params = new URLSearchParams(data).toString()\n url += `${url.includes('?') ? '&' : '?'}${params}`\n }\n\n if (method !== 'GET' && data) {\n config.body = JSON.stringify(data)\n }\n\n try {\n const response = await fetch(url, config)\n\n if (!response.ok) {\n const error: ErrorResponse = {\n status: response.status,\n statusText: response.statusText,\n message: `HTTP error! status: ${response.status}`,\n }\n throw error\n }\n return response\n } catch (error) {\n if (error instanceof Error) {\n throw {\n message: error.message,\n status: 500,\n statusText: 'Client Error',\n } as ErrorResponse\n }\n throw error\n }\n}\n\n/**\n * 资源下载请求\n * @returns {Promise<[isError: boolean, data: ArrayBuffer | string]>}\n * */\nexport function XMLRequest(options: {\n url: string\n cache?: {\n enable: boolean\n }\n onProgress: (progress: number, e: ProgressEvent) => void\n}): Promise<[boolean, ArrayBuffer | string]> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', options.url);\n xhr.responseType = 'arraybuffer';\n xhr.onload = function() {\n if (xhr.readyState === 4 && xhr.status === 200) {\n const arrayBuffer = xhr.response;\n resolve([false, arrayBuffer]);\n } else if (xhr.status !== 200) {\n reject([true, xhr.statusText]);\n }\n };\n xhr.onprogress = (e) => {\n if (e.lengthComputable) {\n const percent = Math.round((e.loaded / e.total) * 100);\n options.onProgress(percent, e);\n }\n };\n xhr.send();\n });\n}","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/* global define */\n\n/* eslint-disable strict */\n\n;(function ($) {\n 'use strict'\n\n /**\n * Add integers, wrapping at 2^32.\n * This uses 16-bit operations internally to work around bugs in interpreters.\n *\n * @param {number} x First integer\n * @param {number} y Second integer\n * @returns {number} Sum\n */\n function safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff)\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xffff)\n }\n\n /**\n * Bitwise rotate a 32-bit number to the left.\n *\n * @param {number} num 32-bit number\n * @param {number} cnt Rotation count\n * @returns {number} Rotated number\n */\n function bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt))\n }\n\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} q q\n * @param {number} a a\n * @param {number} b b\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t)\n }\n\n /**\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n *\n * @param {Array} x Array of little-endian words\n * @param {number} len Bit length\n * @returns {Array<number>} MD5 Array\n */\n function binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32\n x[(((len + 64) >>> 9) << 4) + 14] = len\n\n var i\n var olda\n var oldb\n var oldc\n var oldd\n var a = 1732584193\n var b = -271733879\n var c = -1732584194\n var d = 271733878\n\n for (i = 0; i < x.length; i += 16) {\n olda = a\n oldb = b\n oldc = c\n oldd = d\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936)\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063)\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)\n b = md5gg(b, c, d, a, x[i], 20, -373897302)\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558)\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)\n d = md5hh(d, a, b, c, x[i], 11, -358537222)\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844)\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)\n\n a = safeAdd(a, olda)\n b = safeAdd(b, oldb)\n c = safeAdd(c, oldc)\n d = safeAdd(d, oldd)\n }\n return [a, b, c, d]\n }\n\n /**\n * Convert an array of little-endian words to a string\n *\n * @param {Array<number>} input MD5 Array\n * @returns {string} MD5 string\n */\n function binl2rstr(input) {\n var i\n var output = ''\n var length32 = input.length * 32\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff)\n }\n return output\n }\n\n /**\n * Convert a raw string to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n *\n * @param {string} input Raw input string\n * @returns {Array<number>} Array of little-endian words\n */\n function rstr2binl(input) {\n var i\n var output = []\n output[(input.length >> 2) - 1] = undefined\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0\n }\n var length8 = input.length * 8\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32\n }\n return output\n }\n\n /**\n * Calculate the MD5 of a raw string\n *\n * @param {string} s Input string\n * @returns {string} Raw MD5 string\n */\n function rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))\n }\n\n /**\n * Calculates the HMAC-MD5 of a key and some data (raw strings)\n *\n * @param {string} key HMAC key\n * @param {string} data Raw input string\n * @returns {string} Raw MD5 string\n */\n function rstrHMACMD5(key, data) {\n var i\n var bkey = rstr2binl(key)\n var ipad = []\n var opad = []\n var hash\n ipad[15] = opad[15] = undefined\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8)\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636\n opad[i] = bkey[i] ^ 0x5c5c5c5c\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))\n }\n\n /**\n * Convert a raw string to a hex string\n *\n * @param {string} input Raw input string\n * @returns {string} Hex encoded string\n */\n function rstr2hex(input) {\n var hexTab = '0123456789abcdef'\n var output = ''\n var x\n var i\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i)\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)\n }\n return output\n }\n\n /**\n * Encode a string as UTF-8\n *\n * @param {string} input Input string\n * @returns {string} UTF8 string\n */\n function str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input))\n }\n\n /**\n * Encodes input string as raw MD5 string\n *\n * @param {string} s Input string\n * @returns {string} Raw MD5 string\n */\n function rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s))\n }\n /**\n * Encodes input string as Hex encoded string\n *\n * @param {string} s Input string\n * @returns {string} Hex encoded string\n */\n function hexMD5(s) {\n return rstr2hex(rawMD5(s))\n }\n /**\n * Calculates the raw HMAC-MD5 for the given key and data\n *\n * @param {string} k HMAC key\n * @param {string} d Input string\n * @returns {string} Raw MD5 string\n */\n function rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))\n }\n /**\n * Calculates the Hex encoded HMAC-MD5 for the given key and data\n *\n * @param {string} k HMAC key\n * @param {string} d Input string\n * @returns {string} Raw MD5 string\n */\n function hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d))\n }\n\n /**\n * Calculates MD5 value for a given string.\n * If a key is provided, calculates the HMAC-MD5 value.\n * Returns a Hex encoded string unless the raw argument is given.\n *\n * @param {string} string Input string\n * @param {string} [key] HMAC key\n * @param {boolean} [raw] Raw output switch\n * @returns {string} MD5 output\n */\n function md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string)\n }\n return rawMD5(string)\n }\n if (!raw) {\n return hexHMACMD5(key, string)\n }\n return rawHMACMD5(key, string)\n }\n\n if (typeof define === 'function' && define.amd) {\n define(function () {\n return md5\n })\n } else if (typeof module === 'object' && module.exports) {\n module.exports = md5\n } else {\n $.md5 = md5\n }\n})(this)\n","import md5 from 'blueimp-md5';\n\nfunction encodeWithMd5(s: string): string {\n return md5(s);\n}\n\nfunction escapeNonAsciiForPythonJson(value: string): string {\n return value.replace(/[^\\u0000-\\u007E]/g, character => {\n return `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`;\n });\n}\n\nfunction compareUnicodeCodePoints(left: string, right: string): number {\n const leftPoints = Array.from(left, character => character.codePointAt(0)!);\n const rightPoints = Array.from(right, character => character.codePointAt(0)!);\n const length = Math.min(leftPoints.length, rightPoints.length);\n\n for (let index = 0; index < length; index += 1) {\n if (leftPoints[index] !== rightPoints[index]) {\n return leftPoints[index] - rightPoints[index];\n }\n }\n\n return leftPoints.length - rightPoints.length;\n}\n\nexport interface Headers {\n [key: string]: string;\n}\n\nfunction parseUrlWithoutBase(url: string): { isAbsolute: boolean; pathWithQuery: string } {\n try {\n // 尝试直接解析为绝对 URL(不含基准)\n const urlObj = new URL(url);\n // 若是绝对 URL,返回标记+完整路径+查询\n return {\n isAbsolute: true,\n pathWithQuery: urlObj.pathname + urlObj.search\n };\n } catch {\n // 解析失败,视为相对路径(path+query)\n // 处理开头可能的斜杠,确保统一格式(如 \"path\" → \"/path\")\n let path = url.trim();\n if (!path.startsWith('/')) {\n path = '/' + path;\n }\n return {\n isAbsolute: false,\n pathWithQuery: path\n };\n }\n}\n\nexport function headersNeedSign(\n ak: string,\n sk: string,\n method: string,\n url: string,\n data: Record<string, any>\n): { headers: Headers; data: Record<string, any> } {\n const headers: Headers = {};\n const t = Math.floor(Date.now() / 1000);\n const urlPathQuery = parseUrlWithoutBase(url).pathWithQuery;\n\n // 递归排序对象的所有 key(包括嵌套对象)\n function sortObjectKeys(obj: any): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(item => sortObjectKeys(item));\n }\n if (typeof obj !== 'object') {\n return obj;\n }\n const sortedKeys = Object.keys(obj).sort(compareUnicodeCodePoints);\n const sortedObj: Record<string, any> = {};\n for (const key of sortedKeys) {\n sortedObj[key] = sortObjectKeys(obj[key]);\n }\n return sortedObj;\n }\n\n // 对象按 key 排序并去除空格\n const sortedData = sortObjectKeys(data);\n\n // 对齐 Python json.dumps(..., sort_keys=True) 的默认 ensure_ascii=True 行为。\n const dataStr = escapeNonAsciiForPythonJson(JSON.stringify(sortedData)).replace(/ /g, '');\n\n const oriSign = `${urlPathQuery.toLowerCase()}${method.toLowerCase()}${dataStr}${sk}${t}`;\n const sign = encodeWithMd5(oriSign);\n\n headers['X-APP-ID'] = ak;\n headers['X-TOKEN'] = sign;\n headers['X-TIMESTAMP'] = t.toString();\n return {\n headers,\n data: sortedData,\n };\n}\n","export default class CacheManager {\n cacheServer: string;\n constructor(cacheServer: string) {\n this.cacheServer = cacheServer;\n }\n\n getVideo(url: string): string {\n return `${this.cacheServer}/get_video?url=${encodeURIComponent(url)}`\n }\n}","import Pako from 'pako'\nimport { IAvatarOptions, INetworkInfo, Layout, WalkConfig } from \"../types/index\";\nimport request, { XMLRequest } from \"../utils/request\";\nimport {\n IBRAnimationGeneratorCharInfo_NN,\n} from \"../utils/DataInterface\";\nimport XmovAvatar from \"../index\";\nimport { EErrorCode } from \"../types/error\";\nimport { headersNeedSign } from \"../utils/encodeToken\";\n// import { isDEV } from \"../utils\";\nimport CacheManager from './cache-manager';\n\n/**\n * 资源处理模块,加载并存储资源\n */\n\ntype TOptions = Pick<\n IAvatarOptions,\n \"appId\" | \"appSecret\" | \"gatewayServer\" | 'cacheServer' | \"sdkInstance\" | \"config\" | \"headers\" | \"gateway_type\" | \"tag\" |\n \"asr_id\" | \"llm_id\" | \"session_speak_req_id\"\n> & {\n sessionRequestData?: Record<string, unknown>\n onNetworkInfo(quality: INetworkInfo): void\n onStartSessionWarning?: (message: Object) => void\n};\nexport type TDownloadProgress = (progress: number) => void;\nexport interface IOfflineIdle {\n asf: number\n aef: number\n n: string\n}\nexport interface IResumeParams {\n client_frame: number\n current_ani: string\n current_ani_frame: number\n next_state: string\n}\nexport interface ISessionResponse {\n session_id: string;\n room: string;\n token: string;\n socket_io_url: string;\n e2e_resp?: {\n ws_url?: string;\n e2e_token?: string;\n monitor_ws_url?: string;\n features?: {\n speech_frontend?: {\n enable_aec?: boolean;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n };\n features?: {\n speech_frontend?: {\n enable_aec?: boolean;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n session_start_time: string;\n resource_pack: {\n enable_robot_expression: boolean;\n body_data_dir: string;\n face_ani_char_data: string;\n face_ani_preload_data: string;\n offline_idle: IOfflineIdle[],\n interpolate_joints: [number, number][]\n };\n reconnect_timeout: number;\n reconnect_client_timeout: number;\n config: {\n background_img: string;\n frame_rate: number;\n look_name: string;\n tts_vcn_id: string;\n sta_face_id: string;\n mp_service_id: string;\n raw_audio: boolean;\n resolution: {\n width: number;\n height: number;\n },\n init_events: [\n {\n type: string;\n data: {\n image: string;\n axis_id: number;\n }\n }\n ],\n fx?: {\n transform?: {\n offsetX: number;\n offsetY: number;\n scaleX: number;\n scaleY: number;\n };\n // 阴影效果\n shadow?: {\n // [x, y, z],阴影投射的基准点\n refPos: number[];\n // 光源位置 \n light: number[];\n // 光源类型:\"point\"(点光源)| \"directional\"(平行光)\n lightType: string;\n // 阴影模糊半径(越大越柔和)\n blurRadius: number;\n // 阴影颜色 \n tint: number[];\n // 阴影强度(0.0 = 无阴影,1.0 = 最深)\n intensity: number;\n };\n };\n };\n}\nexport default class ResourceManager {\n private TAG = \"[ResourceManager]\";\n options: TOptions;\n sdk: XmovAvatar;\n session_id?: string;\n mouthShapeLib: any;\n offlineIdle: IOfflineIdle[] = []\n offlineCache = new Map<string, {\n data: ArrayBuffer;\n }>();\n networkInfos: INetworkInfo[] = [];\n private bg: HTMLImageElement | null = null;\n private destroyed = false;\n public resource_pack: {\n enable_robot_expression: boolean;\n body_data_dir: string;\n face_ani_char_data: string;\n face_ani_preload_data: string;\n blendshape_map?: number[][];\n interpolate_joints: [number, number][]\n }\n progress = 0; // start session 以后之后资源下载进度\n\n config: {\n background_img: string;\n frame_rate: number;\n look_name: string;\n tts_vcn_id: string;\n sta_face_id: string;\n mp_service_id: string;\n raw_audio: boolean;\n resolution: {\n width: number;\n height: number;\n },\n init_events: [\n {\n type: string;\n \"x_location\"?: number;//控件锚点信息,控件左上角在屏幕上的横向位置。范围0-1\n \"y_location\"?: number;//控件锚点信息,控件左上角在屏幕上的纵向位置。范围0-1\n width?: number;//控件锚点信息,控件在屏幕上的宽度。范围0-1\n height: number;//控件锚点信息,控件在屏幕上的高度。范围0-1\n speech_id: number;\n data?: {\n image: string;\n axis_id: number;\n }\n }\n ],\n framedata_proto_version: number;\n layout: Layout;\n walk_config: WalkConfig;\n fx?: {\n transform?: {\n offsetX: number;\n offsetY: number;\n scaleX: number;\n scaleY: number;\n };\n // 阴影效果\n shadow?: {\n // [x, y, z],阴影投射的基准点\n refPos: number[];\n // 光源位置 \n light: number[];\n // 光源类型:\"point\"(点光源)| \"directional\"(平行光)\n lightType: string;\n // 阴影模糊半径(越大越柔和)\n blurRadius: number;\n // 阴影颜色 \n tint: number[];\n // 阴影强度(0.0 = 无阴影,1.0 = 最深)\n intensity: number;\n };\n };\n };\n\n // 视频缓存相关\n private videoCache = new Map<string, {\n data: ArrayBuffer;\n lastAccessTime: number;\n accessCount: number;\n }>();\n private maxCacheSize = 10 * 1024 * 1024; // 5MB 默认缓存大小\n private maxCacheEntries = 20; // 最大缓存条目数\n private cacheCleanupInterval: any = null;\n private isProcessingVideo = false; // 防止在视频处理过程中清理缓存\n private cacheServer?: CacheManager;\n private startSessionTimer: any = null;\n\n // 新增:正在下载的视频跟踪\n private downloadingVideos = new Map<string, Promise<ArrayBuffer | undefined>>();\n first_load = true;\n constructor(options: TOptions) {\n this.options = options;\n this.sdk = options.sdkInstance as XmovAvatar;\n this.mouthShapeLib = {\n char_info: null,\n };\n this.config = options.config || {};\n this.resource_pack = {\n enable_robot_expression: false,\n body_data_dir: \"\",\n face_ani_char_data: \"\",\n face_ani_preload_data: \"\",\n interpolate_joints: [[4, 3]]\n };\n\n if (options.cacheServer) {\n this.cacheServer = new CacheManager(options.cacheServer);\n }\n // 启动缓存清理定时器\n this.startCacheCleanup();\n }\n\n public getAppInfo() {\n return {\n appId: this.options.appId\n }\n }\n\n /**\n * 加载背景图片\n * @returns Promise<void>\n */\n getBackgroundImage(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n const img = new Image();\n // 设置跨域属性\n img.crossOrigin = \"anonymous\";\n img.src = this.config?.background_img || \"\";\n if (!this.config?.background_img) return;\n img.onload = () => {\n this.bg = img;\n resolve();\n };\n\n img.onerror = (error) => {\n this.sdk.onMessage({\n code: EErrorCode.BACKGROUND_IMAGE_LOAD_ERROR,\n message: `Error: 背景图片加载失败`,\n e: { error, img },\n });\n this.bg = null;\n resolve();\n };\n } catch (error) {\n }\n });\n }\n\n getIsEnableRobotExpression() {\n return this.resource_pack?.enable_robot_expression\n }\n\n /**\n * 获取背景图片\n * @returns HTMLImageElement | null\n */\n getBackgroundImageElement(): HTMLImageElement | null {\n return this.bg;\n }\n\n getConfig() {\n return this.config;\n }\n\n async load(onDownloadProgress?: TDownloadProgress) {\n this.destroyed = false; // 重置销毁状态,允许重新加载\n onDownloadProgress?.(this.progress);\n if (this.startSessionTimer) {\n clearInterval(this.startSessionTimer);\n this.startSessionTimer = null;\n }\n\n this.startSessionTimer = setInterval(() => {\n if (this.destroyed || this.progress >= 14) {\n clearInterval(this.startSessionTimer);\n this.startSessionTimer = null;\n return;\n }\n this.progress += 1;\n onDownloadProgress?.(this.progress);\n }, 100);\n // http 请求算 10 进度\n const result = await this.startSession();\n // 如果在 startSession 过程中被销毁了,直接返回,避免继续加载资源\n if (this.destroyed) {\n (window as any).avatarSDKLogger.warn(this.TAG, \"sdk destroyed during load, aborting after startSession\");\n return null;\n }\n if (!result) {\n clearInterval(this.startSessionTimer);\n this.startSessionTimer = null;\n return null;\n }\n\n clearInterval(this.startSessionTimer);\n this.startSessionTimer = null;\n this.progress = 15;\n onDownloadProgress?.(this.progress);\n const res = result as unknown as ISessionResponse;\n this.session_id = res?.session_id;\n this.resource_pack = res.resource_pack;\n this.config = res.config as any;\n this.offlineIdle = res.resource_pack?.offline_idle || []\n if (this.resource_pack) {\n await this.loadMouthShapeLib(onDownloadProgress);\n this.getBackgroundImage();\n if (!this.mouthShapeLib?.char_info && res?.resource_pack?.face_ani_char_data) {\n return null\n }\n }\n return res;\n }\n\n async startSession() {\n try {\n const result = await this._startSession();\n if (result?.verify_res) {\n this.options.onStartSessionWarning?.(result.verify_res);\n }\n return result;\n } catch (error) {\n return null;\n }\n }\n _startSession() {\n if (!navigator.onLine) {\n this.sdk.onMessage({\n code: EErrorCode.NETWORK_BREAK,\n message: '没有网络,请联网后重试~',\n });\n return null;\n }\n\n const url = `${this.options.gatewayServer}`;\n\n\n const data = {\n tag: this.options.tag,\n gateway_type: this.options.gateway_type,\n ...(this.options.asr_id !== undefined ? { asr_id: this.options.asr_id } : {}),\n ...(this.options.llm_id !== undefined ? { llm_id: this.options.llm_id } : {}),\n ...(this.options.session_speak_req_id !== undefined\n ? { session_speak_req_id: this.options.session_speak_req_id }\n : {}),\n ...(this.options.sessionRequestData ?? {}),\n config: {\n ...this.config,\n framedata_proto_version: 2,\n walk_version: 3,\n }\n }\n const { headers, data: signedData } = headersNeedSign(this.options.appId, this.options.appSecret, \"POST\", url, data);\n return request(url, { method: \"POST\", data: signedData, headers: { ...headers, ...this.options.headers } })\n .then(response => response.json())\n .then(res => {\n if (!res?.data?.resource_pack) {\n this.sdk.onMessage({\n code: res?.error_code,\n message: `Error: ${res?.error_code}, ${res?.error_reason}`,\n });\n return null;\n }\n return res?.data;\n }).catch(error => {\n this.sdk.onMessage({\n code: EErrorCode.START_SESSION_ERROR,\n message: `Error: 启动会话失败`,\n e: error,\n });\n return null;\n });\n }\n\n async stopSession(stop_reason: string) {\n try {\n const url = `${this.options.gatewayServer}`;\n if (!this.session_id) {\n return;\n }\n const data = {\n session_id: this.session_id,\n stop_reason,\n }\n const { headers, data: signedData } = headersNeedSign(this.options.appId, this.options.appSecret, \"DELETE\", url, data);\n const response = await request(url, { method: \"DELETE\", data: signedData, headers: { ...headers, ...this.options.headers } });\n return await response.json();\n } catch (error) {\n this.sdk.onMessage({\n code: EErrorCode.STOP_SESSION_ERROR,\n message: `Error: 停止会话失败`,\n e: error,\n });\n }\n }\n\n /**\n * 加载表情数据\n */\n async loadMouthShapeLib(onDownloadProgress?: TDownloadProgress) {\n try {\n if (!this.resource_pack.face_ani_char_data) {\n this.progress += 60;\n onDownloadProgress?.(this.progress);\n return;\n }\n // 优先加载 .gz,失败则回退 bin\n let char_data: ArrayBuffer | null = null;\n let gzError: any = null;\n let finalUrl = '';\n let fileSize = 0;\n let startTime = 0;\n let preTime = 0;\n let preLoaded = 0;\n\n const createProgressHandler = () => (progress: number, e?: ProgressEvent) => {\n if (!e) return;\n const now = performance.now();\n const deltaTime = now - preTime;\n const deltaLoaded = e.loaded - preLoaded;\n\n const speedMbps = (deltaTime > 0 && deltaLoaded > 0)\n ? (deltaLoaded * 8) / (deltaTime / 1000) / 1000000\n : 0;\n\n this.options.onNetworkInfo?.({\n rtt: deltaTime,\n downlink: speedMbps,\n networkStatus: navigator.onLine,\n });\n\n preLoaded = e.loaded;\n preTime = now;\n onDownloadProgress?.(this.progress + progress * 0.65);\n };\n\n try {\n const gzUrl = `${this.resource_pack.face_ani_char_data}.gz`;\n finalUrl = gzUrl;\n startTime = performance.now();\n preTime = startTime;\n preLoaded = 0;\n\n const [, gz_data] = await XMLRequest({\n url: gzUrl,\n onProgress: createProgressHandler(),\n });\n\n const decompressed = Pako.ungzip(new Uint8Array(gz_data as ArrayBuffer));\n const ab = new ArrayBuffer(decompressed.byteLength);\n new Uint8Array(ab).set(decompressed);\n char_data = ab;\n } catch (e) {\n gzError = e;\n char_data = null;\n }\n\n if (!char_data) {\n try {\n const binUrl = this.resource_pack.face_ani_char_data;\n finalUrl = binUrl;\n startTime = performance.now();\n preTime = startTime;\n preLoaded = 0;\n\n const [, bin_data] = await XMLRequest({\n url: binUrl,\n onProgress: createProgressHandler(),\n });\n\n char_data = bin_data as ArrayBuffer;\n } catch (e) {\n if (this.first_load) {\n this.first_load = false;\n this.stopSession(\"char_bin_load_error\");\n }\n this.sdk.onMessage?.({\n code: EErrorCode.FACE_BIN_LOAD_ERROR,\n message: \"表情数据加载失败(.gz 和 bin 均失败)\",\n e: { gzError, binError: e },\n });\n return;\n }\n }\n\n const totalCostMs = performance.now() - startTime;\n const totalSpeedMbps = fileSize > 0 && totalCostMs > 0\n ? (fileSize * 8) / (totalCostMs / 1000) / 1000000\n : 0;\n\n this.options.onNetworkInfo?.({\n rtt: totalCostMs,\n downlink: totalSpeedMbps,\n networkStatus: navigator.onLine,\n });\n\n this.mouthShapeLib = {\n char_info: new IBRAnimationGeneratorCharInfo_NN(char_data, {\n blendshapeMap: this.resource_pack.blendshape_map || [],\n }),\n };\n this.progress += 65;\n onDownloadProgress?.(this.progress);\n } catch (error) {\n if (this.first_load) {\n this.first_load = false;\n this.stopSession(\"char_bin_load_error\");\n }\n this.sdk.onMessage?.({\n code: EErrorCode.FACE_BIN_LOAD_ERROR,\n message: \"表情数据加载失败,请检查文件是否正确\",\n e: error,\n });\n }\n }\n\n getMouthShapeLib() {\n return this.mouthShapeLib;\n }\n\n getVideoUrl(name: string) {\n if (!this.resource_pack.body_data_dir) {\n return \"\";\n }\n if (!name) {\n if (this.first_load) {\n this.first_load = false;\n this.stopSession(\"no_video_name_error\");\n }\n this.sdk.onMessage({\n code: EErrorCode.INVALID_BODY_NAME,\n message: `Error: 视频地址获取失败`,\n e: name,\n });\n return \"\";\n }\n const url = `${this.resource_pack.body_data_dir}${name}.mp4`\n if (this.cacheServer) {\n return this.cacheServer?.getVideo(url);\n }\n return url\n }\n\n /**\n * 预加载视频\n * @param name 视频名称\n * @returns Promise<ArrayBuffer>\n */\n async preloadVideo(name: string) {\n if (this.videoCache.has(name)) return;\n return this.loadVideo(name);\n }\n /**\n * 加载视频\n * @param name 视频名称\n * @returns Promise<ArrayBuffer>\n */\n async loadVideo(name: string) {\n // 检查缓存\n const cacheEntry = this.videoCache.get(name) || this.offlineCache.get(name);\n if (cacheEntry) {\n if (cacheEntry.data) {\n this.updateCacheAccess(name);\n return cacheEntry.data;\n } else {\n // 缓存条目存在但数据为空,删除这个无效条目\n (window as any).avatarSDKLogger.warn(this.TAG, `发现无效缓存条目: ${name},正在删除`);\n this.videoCache.delete(name);\n }\n }\n\n // 检查是否正在下载\n if (this.downloadingVideos.has(name)) {\n try {\n const result = await this.downloadingVideos.get(name);\n return result;\n } catch (error) {\n // 如果下载失败,从下载列表中移除\n this.downloadingVideos.delete(name);\n (window as any).avatarSDKLogger.warn(this.TAG, `${name} 视频下载失败,从下载列表移除`);\n throw error;\n }\n }\n\n // 开始下载\n this.isProcessingVideo = true;\n const downloadPromise = this.downloadVideo(name);\n this.downloadingVideos.set(name, downloadPromise);\n try {\n const result = await downloadPromise;\n return result;\n } finally {\n // 下载完成后从下载列表中移除\n this.downloadingVideos.delete(name);\n this.isProcessingVideo = false;\n }\n }\n\n /**\n * 实际下载视频的方法\n * @param name 视频名称\n * @returns Promise<ArrayBuffer>\n */\n private async downloadVideo(name: string): Promise<ArrayBuffer | undefined> {\n const url = this.getVideoUrl(name);\n if (!url) {\n return;\n }\n try {\n const { response, arrayBuffer } = await this._fetchVideo(url);\n if (!response.ok) {\n if (this.first_load) {\n this.first_load = false;\n this.stopSession(\"load_video_error\");\n }\n this.sdk.onMessage({\n code: EErrorCode.VIDEO_DOWNLOAD_ERROR,\n message: `Error: ${name} 视频下载失败`,\n e: { name, url, res: response },\n });\n return;\n }\n\n // 将下载的数据添加到缓存\n this.addToCache(name, arrayBuffer);\n\n return arrayBuffer;\n } catch (error) {\n this.sdk.onMessage({\n code: EErrorCode.VIDEO_DOWNLOAD_ERROR,\n message: `Error: ${name} 视频下载失败`,\n e: { name, url, error },\n });\n return;\n }\n }\n\n private async _fetchVideo(url: string) {\n if (this.networkInfos.length >= 4) {\n const avgRtt = this.networkInfos.reduce((sum, curr) => sum + curr.rtt, 0) / this.networkInfos.length;\n const avgDownlink = this.networkInfos.reduce((sum, curr) => sum + curr.downlink, 0) / this.networkInfos.length;\n this.options.onNetworkInfo?.({\n rtt: avgRtt,\n downlink: avgDownlink,\n networkStatus: navigator.onLine,\n })\n this.networkInfos.length = 0\n }\n const startTime = performance.now();\n const response = await fetch(url)\n const totalSize = parseFloat(response.headers.get('Content-Length') || '0');\n const endTime = performance.now();\n const arrayBuffer = await response.arrayBuffer()\n const rtt = endTime - startTime; // 毫秒\n const downlink = (totalSize * 8) / (rtt / 1000 * 1000000); // Mbps\n\n const networkInfo = {\n rtt,\n downlink,\n networkStatus: navigator.onLine,\n };\n this.networkInfos.push(networkInfo)\n return {\n response,\n arrayBuffer,\n }\n }\n\n /**\n * 添加数据到缓存\n */\n private addToCache(key: string, data: ArrayBuffer) {\n const now = Date.now();\n\n // 检查缓存大小限制\n let totalSize = 0;\n for (const value of this.videoCache.values()) {\n totalSize += value.data.byteLength;\n }\n\n // 如果添加这个数据会超过限制,先清理一些缓存\n if (totalSize + data.byteLength > this.maxCacheSize || this.videoCache.size >= this.maxCacheEntries) {\n this.cleanupCache();\n\n // 重新计算大小\n totalSize = 0;\n for (const value of this.videoCache.values()) {\n totalSize += value.data.byteLength;\n }\n\n // 如果仍然超过限制,且单个文件太大,不缓存这个数据\n if (totalSize + data.byteLength > this.maxCacheSize && data.byteLength > this.maxCacheSize * 0.5) {\n (window as any).avatarSDKLogger.warn(this.TAG, `视频文件过大(${(data.byteLength / 1024 / 1024).toFixed(2)}MB),跳过缓存: ${key}`);\n return;\n }\n\n // 如果缓存空间仍然不足,清理更多缓存\n if (totalSize + data.byteLength > this.maxCacheSize) {\n // 强制清理到50%容量\n const targetSize = this.maxCacheSize * 0.5;\n const sortedEntries = Array.from(this.videoCache.entries())\n .sort((a, b) => a[1].lastAccessTime - b[1].lastAccessTime);\n\n for (const [cacheKey, cacheValue] of sortedEntries) {\n if (totalSize <= targetSize) break;\n this.videoCache.delete(cacheKey);\n totalSize -= cacheValue.data.byteLength;\n }\n }\n }\n\n // 添加到缓存\n this.videoCache.set(key, {\n data: data,\n lastAccessTime: now,\n accessCount: 1\n });\n }\n\n /**\n * 启动缓存清理定时器\n */\n private startCacheCleanup() {\n // 每5分钟清理一次缓存\n this.cacheCleanupInterval = setInterval(() => {\n this.cleanupCache();\n }, 5 * 60 * 1000);\n }\n\n /**\n * 清理缓存\n */\n private cleanupCache() {\n // 如果正在处理视频,跳过清理\n if (this.isProcessingVideo) {\n return;\n }\n\n const now = Date.now();\n const inactiveThreshold = 10 * 60 * 1000; // 10分钟不活跃的缓存将被清理\n\n // 按最后访问时间排序\n const sortedEntries = Array.from(this.videoCache.entries())\n .sort((a, b) => a[1].lastAccessTime - b[1].lastAccessTime);\n\n let totalSize = 0;\n const entriesToRemove: string[] = [];\n\n // 计算当前缓存总大小\n for (const [_, value] of this.videoCache.entries()) {\n totalSize += value.data.byteLength;\n }\n\n\n // 清理不活跃的缓存(但保留最近访问的)\n for (const [key, value] of sortedEntries) {\n if (now - value.lastAccessTime > inactiveThreshold) {\n entriesToRemove.push(key);\n totalSize -= value.data.byteLength;\n }\n }\n\n // 如果缓存仍然过大,清理最旧的条目(但至少保留2个条目)\n if (totalSize > this.maxCacheSize || this.videoCache.size > this.maxCacheEntries) {\n for (const [key, value] of sortedEntries) {\n if (!entriesToRemove.includes(key)) {\n entriesToRemove.push(key);\n totalSize -= value.data.byteLength;\n\n // 确保至少保留2个缓存条目,防止完全清空\n if ((this.videoCache.size - entriesToRemove.length <= 2) ||\n (totalSize <= this.maxCacheSize * 0.8 && this.videoCache.size - entriesToRemove.length <= this.maxCacheEntries * 0.8)) {\n break;\n }\n }\n }\n }\n\n // 执行清理\n for (const key of entriesToRemove) {\n this.videoCache.delete(key);\n }\n }\n\n /**\n * 更新缓存访问信息\n */\n private updateCacheAccess(key: string) {\n const cacheEntry = this.videoCache.get(key);\n if (cacheEntry) {\n cacheEntry.lastAccessTime = Date.now();\n cacheEntry.accessCount++;\n }\n }\n\n /**\n * 清空所有缓存\n */\n clearAllCache() {\n this.videoCache.clear();\n }\n\n /** 获取离线 idle */\n _getOfflineIdle() {\n return this.offlineIdle\n }\n /** 获取上一次 session_id */\n _getSessionId() {\n return this.session_id || ''\n }\n\n /** 离线重连 */\n async _reload() {\n const result = await this.startSession();\n if (!result) {\n return null;\n }\n const res = result as unknown as ISessionResponse;\n this.session_id = res?.session_id;\n this.resource_pack = res.resource_pack;\n this.config = res.config as any;\n this.offlineIdle = res.resource_pack?.offline_idle || []\n if (this.resource_pack) {\n this.getBackgroundImage();\n }\n return res;\n }\n\n public async _setOfflineCache() {\n if (!this.offlineIdle || this.offlineIdle.length === 0) {\n return\n }\n this.offlineCache.clear()\n const names = this.offlineIdle.map($i => $i.n)\n for (const name of names) {\n try {\n await this._runOfflineCache(name)\n } catch (error) {\n }\n }\n }\n private async _runOfflineCache(name: string) {\n const url = this.getVideoUrl(name)\n if (!url) {\n return;\n }\n return this._fetchVideo(url)\n .then(({ arrayBuffer }) => {\n this.offlineCache.set(name, {\n data: arrayBuffer,\n })\n })\n }\n\n /**\n * 销毁资源管理器\n */\n destroy() {\n this.destroyed = true;\n // 清理定时器\n if (this.cacheCleanupInterval) {\n clearInterval(this.cacheCleanupInterval);\n this.cacheCleanupInterval = null;\n }\n\n // 清理缓存\n this.clearAllCache();\n\n // 清理下载跟踪\n this.downloadingVideos.clear();\n\n // 清理背景图片\n if (this.bg) {\n this.bg = null;\n }\n this.progress = 0\n }\n}\n","const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach((key) => {\n PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\nexport { PACKET_TYPES, PACKET_TYPES_REVERSE, ERROR_PACKET };\n","import { PACKET_TYPES } from \"./commons.js\";\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = (obj) => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj && obj.buffer instanceof ArrayBuffer;\n};\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n if (withNativeBlob && data instanceof Blob) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(data, callback);\n }\n }\n else if (withNativeArrayBuffer &&\n (data instanceof ArrayBuffer || isView(data))) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(new Blob([data]), callback);\n }\n }\n // plain string\n return callback(PACKET_TYPES[type] + (data || \"\"));\n};\nconst encodeBlobAsBase64 = (data, callback) => {\n const fileReader = new FileReader();\n fileReader.onload = function () {\n const content = fileReader.result.split(\",\")[1];\n callback(\"b\" + (content || \"\"));\n };\n return fileReader.readAsDataURL(data);\n};\nfunction toArray(data) {\n if (data instanceof Uint8Array) {\n return data;\n }\n else if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n else {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n if (withNativeBlob && packet.data instanceof Blob) {\n return packet.data.arrayBuffer().then(toArray).then(callback);\n }\n else if (withNativeArrayBuffer &&\n (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n return callback(toArray(packet.data));\n }\n encodePacket(packet, false, (encoded) => {\n if (!TEXT_ENCODER) {\n TEXT_ENCODER = new TextEncoder();\n }\n callback(TEXT_ENCODER.encode(encoded));\n });\n}\nexport { encodePacket };\n","// imported from https://github.com/socketio/base64-arraybuffer\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nexport const encode = (arraybuffer) => {\n let bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nexport const decode = (base64) => {\n let bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n const arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE, } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nexport const decodePacket = (encodedPacket, binaryType) => {\n if (typeof encodedPacket !== \"string\") {\n return {\n type: \"message\",\n data: mapBinary(encodedPacket, binaryType),\n };\n }\n const type = encodedPacket.charAt(0);\n if (type === \"b\") {\n return {\n type: \"message\",\n data: decodeBase64Packet(encodedPacket.substring(1), binaryType),\n };\n }\n const packetType = PACKET_TYPES_REVERSE[type];\n if (!packetType) {\n return ERROR_PACKET;\n }\n return encodedPacket.length > 1\n ? {\n type: PACKET_TYPES_REVERSE[type],\n data: encodedPacket.substring(1),\n }\n : {\n type: PACKET_TYPES_REVERSE[type],\n };\n};\nconst decodeBase64Packet = (data, binaryType) => {\n if (withNativeArrayBuffer) {\n const decoded = decode(data);\n return mapBinary(decoded, binaryType);\n }\n else {\n return { base64: true, data }; // fallback for old browsers\n }\n};\nconst mapBinary = (data, binaryType) => {\n switch (binaryType) {\n case \"blob\":\n if (data instanceof Blob) {\n // from WebSocket + binaryType \"blob\"\n return data;\n }\n else {\n // from HTTP long-polling or WebTransport\n return new Blob([data]);\n }\n case \"arraybuffer\":\n default:\n if (data instanceof ArrayBuffer) {\n // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n return data;\n }\n else {\n // from WebTransport (Uint8Array)\n return data.buffer;\n }\n }\n};\n","import { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nimport { ERROR_PACKET, } from \"./commons.js\";\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\nconst encodePayload = (packets, callback) => {\n // some packets may be added to the array while encoding, so the initial length must be saved\n const length = packets.length;\n const encodedPackets = new Array(length);\n let count = 0;\n packets.forEach((packet, i) => {\n // force base64 encoding for binary packets\n encodePacket(packet, false, (encodedPacket) => {\n encodedPackets[i] = encodedPacket;\n if (++count === length) {\n callback(encodedPackets.join(SEPARATOR));\n }\n });\n });\n};\nconst decodePayload = (encodedPayload, binaryType) => {\n const encodedPackets = encodedPayload.split(SEPARATOR);\n const packets = [];\n for (let i = 0; i < encodedPackets.length; i++) {\n const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n packets.push(decodedPacket);\n if (decodedPacket.type === \"error\") {\n break;\n }\n }\n return packets;\n};\nexport function createPacketEncoderStream() {\n return new TransformStream({\n transform(packet, controller) {\n encodePacketToBinary(packet, (encodedPacket) => {\n const payloadLength = encodedPacket.length;\n let header;\n // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length\n if (payloadLength < 126) {\n header = new Uint8Array(1);\n new DataView(header.buffer).setUint8(0, payloadLength);\n }\n else if (payloadLength < 65536) {\n header = new Uint8Array(3);\n const view = new DataView(header.buffer);\n view.setUint8(0, 126);\n view.setUint16(1, payloadLength);\n }\n else {\n header = new Uint8Array(9);\n const view = new DataView(header.buffer);\n view.setUint8(0, 127);\n view.setBigUint64(1, BigInt(payloadLength));\n }\n // first bit indicates whether the payload is plain text (0) or binary (1)\n if (packet.data && typeof packet.data !== \"string\") {\n header[0] |= 0x80;\n }\n controller.enqueue(header);\n controller.enqueue(encodedPacket);\n });\n },\n });\n}\nlet TEXT_DECODER;\nfunction totalLength(chunks) {\n return chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n}\nfunction concatChunks(chunks, size) {\n if (chunks[0].length === size) {\n return chunks.shift();\n }\n const buffer = new Uint8Array(size);\n let j = 0;\n for (let i = 0; i < size; i++) {\n buffer[i] = chunks[0][j++];\n if (j === chunks[0].length) {\n chunks.shift();\n j = 0;\n }\n }\n if (chunks.length && j < chunks[0].length) {\n chunks[0] = chunks[0].slice(j);\n }\n return buffer;\n}\nexport function createPacketDecoderStream(maxPayload, binaryType) {\n if (!TEXT_DECODER) {\n TEXT_DECODER = new TextDecoder();\n }\n const chunks = [];\n let state = 0 /* State.READ_HEADER */;\n let expectedLength = -1;\n let isBinary = false;\n return new TransformStream({\n transform(chunk, controller) {\n chunks.push(chunk);\n while (true) {\n if (state === 0 /* State.READ_HEADER */) {\n if (totalLength(chunks) < 1) {\n break;\n }\n const header = concatChunks(chunks, 1);\n isBinary = (header[0] & 0x80) === 0x80;\n expectedLength = header[0] & 0x7f;\n if (expectedLength < 126) {\n state = 3 /* State.READ_PAYLOAD */;\n }\n else if (expectedLength === 126) {\n state = 1 /* State.READ_EXTENDED_LENGTH_16 */;\n }\n else {\n state = 2 /* State.READ_EXTENDED_LENGTH_64 */;\n }\n }\n else if (state === 1 /* State.READ_EXTENDED_LENGTH_16 */) {\n if (totalLength(chunks) < 2) {\n break;\n }\n const headerArray = concatChunks(chunks, 2);\n expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);\n state = 3 /* State.READ_PAYLOAD */;\n }\n else if (state === 2 /* State.READ_EXTENDED_LENGTH_64 */) {\n if (totalLength(chunks) < 8) {\n break;\n }\n const headerArray = concatChunks(chunks, 8);\n const view = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length);\n const n = view.getUint32(0);\n if (n > Math.pow(2, 53 - 32) - 1) {\n // the maximum safe integer in JavaScript is 2^53 - 1\n controller.enqueue(ERROR_PACKET);\n break;\n }\n expectedLength = n * Math.pow(2, 32) + view.getUint32(4);\n state = 3 /* State.READ_PAYLOAD */;\n }\n else {\n if (totalLength(chunks) < expectedLength) {\n break;\n }\n const data = concatChunks(chunks, expectedLength);\n controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));\n state = 0 /* State.READ_HEADER */;\n }\n if (expectedLength === 0 || expectedLength > maxPayload) {\n controller.enqueue(ERROR_PACKET);\n break;\n }\n }\n },\n });\n}\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload, };\n","/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nexport function Emitter(obj) {\n if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n for (var key in Emitter.prototype) {\n obj[key] = Emitter.prototype[key];\n }\n return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n .push(fn);\n return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n function on() {\n this.off(event, on);\n fn.apply(this, arguments);\n }\n\n on.fn = fn;\n this.on(event, on);\n return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n\n // all\n if (0 == arguments.length) {\n this._callbacks = {};\n return this;\n }\n\n // specific event\n var callbacks = this._callbacks['$' + event];\n if (!callbacks) return this;\n\n // remove all handlers\n if (1 == arguments.length) {\n delete this._callbacks['$' + event];\n return this;\n }\n\n // remove specific handler\n var cb;\n for (var i = 0; i < callbacks.length; i++) {\n cb = callbacks[i];\n if (cb === fn || cb.fn === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n // Remove event specific arrays for event types that no\n // one is subscribed for to avoid memory leak.\n if (callbacks.length === 0) {\n delete this._callbacks['$' + event];\n }\n\n return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n this._callbacks = this._callbacks || {};\n\n var args = new Array(arguments.length - 1)\n , callbacks = this._callbacks['$' + event];\n\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n\n if (callbacks) {\n callbacks = callbacks.slice(0);\n for (var i = 0, len = callbacks.length; i < len; ++i) {\n callbacks[i].apply(this, args);\n }\n }\n\n return this;\n};\n\n// alias used for reserved events (protected method)\nEmitter.prototype.emitReserved = Emitter.prototype.emit;\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n this._callbacks = this._callbacks || {};\n return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n return !! this.listeners(event).length;\n};\n","export const nextTick = (() => {\n const isPromiseAvailable = typeof Promise === \"function\" && typeof Promise.resolve === \"function\";\n if (isPromiseAvailable) {\n return (cb) => Promise.resolve().then(cb);\n }\n else {\n return (cb, setTimeoutFn) => setTimeoutFn(cb, 0);\n }\n})();\nexport const globalThisShim = (() => {\n if (typeof self !== \"undefined\") {\n return self;\n }\n else if (typeof window !== \"undefined\") {\n return window;\n }\n else {\n return Function(\"return this\")();\n }\n})();\nexport const defaultBinaryType = \"arraybuffer\";\nexport function createCookieJar() { }\n","import { globalThisShim as globalThis } from \"./globals.node.js\";\nexport function pick(obj, ...attr) {\n return attr.reduce((acc, k) => {\n if (obj.hasOwnProperty(k)) {\n acc[k] = obj[k];\n }\n return acc;\n }, {});\n}\n// Keep a reference to the real timeout functions so they can be used when overridden\nconst NATIVE_SET_TIMEOUT = globalThis.setTimeout;\nconst NATIVE_CLEAR_TIMEOUT = globalThis.clearTimeout;\nexport function installTimerFunctions(obj, opts) {\n if (opts.useNativeTimers) {\n obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);\n obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);\n }\n else {\n obj.setTimeoutFn = globalThis.setTimeout.bind(globalThis);\n obj.clearTimeoutFn = globalThis.clearTimeout.bind(globalThis);\n }\n}\n// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)\nconst BASE64_OVERHEAD = 1.33;\n// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9\nexport function byteLength(obj) {\n if (typeof obj === \"string\") {\n return utf8Length(obj);\n }\n // arraybuffer or blob\n return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);\n}\nfunction utf8Length(str) {\n let c = 0, length = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n }\n else if (c < 0x800) {\n length += 2;\n }\n else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n }\n else {\n i++;\n length += 4;\n }\n }\n return length;\n}\n/**\n * Generates a random 8-characters string.\n */\nexport function randomString() {\n return (Date.now().toString(36).substring(3) +\n Math.random().toString(36).substring(2, 5));\n}\n","// imported from https://github.com/galkn/querystring\n/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\nexport function encode(obj) {\n let str = '';\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n if (str.length)\n str += '&';\n str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n }\n }\n return str;\n}\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\nexport function decode(qs) {\n let qry = {};\n let pairs = qs.split('&');\n for (let i = 0, l = pairs.length; i < l; i++) {\n let pair = pairs[i].split('=');\n qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n return qry;\n}\n","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.js\";\nexport class TransportError extends Error {\n constructor(reason, description, context) {\n super(reason);\n this.description = description;\n this.context = context;\n this.type = \"TransportError\";\n }\n}\nexport class Transport extends Emitter {\n /**\n * Transport abstract constructor.\n *\n * @param {Object} opts - options\n * @protected\n */\n constructor(opts) {\n super();\n this.writable = false;\n installTimerFunctions(this, opts);\n this.opts = opts;\n this.query = opts.query;\n this.socket = opts.socket;\n this.supportsBinary = !opts.forceBase64;\n }\n /**\n * Emits an error.\n *\n * @param {String} reason\n * @param description\n * @param context - the error context\n * @return {Transport} for chaining\n * @protected\n */\n onError(reason, description, context) {\n super.emitReserved(\"error\", new TransportError(reason, description, context));\n return this;\n }\n /**\n * Opens the transport.\n */\n open() {\n this.readyState = \"opening\";\n this.doOpen();\n return this;\n }\n /**\n * Closes the transport.\n */\n close() {\n if (this.readyState === \"opening\" || this.readyState === \"open\") {\n this.doClose();\n this.onClose();\n }\n return this;\n }\n /**\n * Sends multiple packets.\n *\n * @param {Array} packets\n */\n send(packets) {\n if (this.readyState === \"open\") {\n this.write(packets);\n }\n else {\n // this might happen if the transport was silently closed in the beforeunload event handler\n }\n }\n /**\n * Called upon open\n *\n * @protected\n */\n onOpen() {\n this.readyState = \"open\";\n this.writable = true;\n super.emitReserved(\"open\");\n }\n /**\n * Called with data.\n *\n * @param {String} data\n * @protected\n */\n onData(data) {\n const packet = decodePacket(data, this.socket.binaryType);\n this.onPacket(packet);\n }\n /**\n * Called with a decoded packet.\n *\n * @protected\n */\n onPacket(packet) {\n super.emitReserved(\"packet\", packet);\n }\n /**\n * Called upon close.\n *\n * @protected\n */\n onClose(details) {\n this.readyState = \"closed\";\n super.emitReserved(\"close\", details);\n }\n /**\n * Pauses the transport, in order not to lose packets during an upgrade.\n *\n * @param onPause\n */\n pause(onPause) { }\n createUri(schema, query = {}) {\n return (schema +\n \"://\" +\n this._hostname() +\n this._port() +\n this.opts.path +\n this._query(query));\n }\n _hostname() {\n const hostname = this.opts.hostname;\n return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n }\n _port() {\n if (this.opts.port &&\n ((this.opts.secure && Number(this.opts.port !== 443)) ||\n (!this.opts.secure && Number(this.opts.port) !== 80))) {\n return \":\" + this.opts.port;\n }\n else {\n return \"\";\n }\n }\n _query(query) {\n const encodedQuery = encode(query);\n return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n }\n}\n","import { Transport } from \"../transport.js\";\nimport { randomString } from \"../util.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nexport class Polling extends Transport {\n constructor() {\n super(...arguments);\n this._polling = false;\n }\n get name() {\n return \"polling\";\n }\n /**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @protected\n */\n doOpen() {\n this._poll();\n }\n /**\n * Pauses polling.\n *\n * @param {Function} onPause - callback upon buffers are flushed and transport is paused\n * @package\n */\n pause(onPause) {\n this.readyState = \"pausing\";\n const pause = () => {\n this.readyState = \"paused\";\n onPause();\n };\n if (this._polling || !this.writable) {\n let total = 0;\n if (this._polling) {\n total++;\n this.once(\"pollComplete\", function () {\n --total || pause();\n });\n }\n if (!this.writable) {\n total++;\n this.once(\"drain\", function () {\n --total || pause();\n });\n }\n }\n else {\n pause();\n }\n }\n /**\n * Starts polling cycle.\n *\n * @private\n */\n _poll() {\n this._polling = true;\n this.doPoll();\n this.emitReserved(\"poll\");\n }\n /**\n * Overloads onData to detect payloads.\n *\n * @protected\n */\n onData(data) {\n const callback = (packet) => {\n // if its the first message we consider the transport open\n if (\"opening\" === this.readyState && packet.type === \"open\") {\n this.onOpen();\n }\n // if its a close packet, we close the ongoing requests\n if (\"close\" === packet.type) {\n this.onClose({ description: \"transport closed by the server\" });\n return false;\n }\n // otherwise bypass onData and handle the message\n this.onPacket(packet);\n };\n // decode payload\n decodePayload(data, this.socket.binaryType).forEach(callback);\n // if an event did not trigger closing\n if (\"closed\" !== this.readyState) {\n // if we got data we're not polling\n this._polling = false;\n this.emitReserved(\"pollComplete\");\n if (\"open\" === this.readyState) {\n this._poll();\n }\n else {\n }\n }\n }\n /**\n * For polling, send a close packet.\n *\n * @protected\n */\n doClose() {\n const close = () => {\n this.write([{ type: \"close\" }]);\n };\n if (\"open\" === this.readyState) {\n close();\n }\n else {\n // in case we're trying to close while\n // handshaking is in progress (GH-164)\n this.once(\"open\", close);\n }\n }\n /**\n * Writes a packets payload.\n *\n * @param {Array} packets - data packets\n * @protected\n */\n write(packets) {\n this.writable = false;\n encodePayload(packets, (data) => {\n this.doWrite(data, () => {\n this.writable = true;\n this.emitReserved(\"drain\");\n });\n });\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n const schema = this.opts.secure ? \"https\" : \"http\";\n const query = this.query || {};\n // cache busting is forced\n if (false !== this.opts.timestampRequests) {\n query[this.opts.timestampParam] = randomString();\n }\n if (!this.supportsBinary && !query.sid) {\n query.b64 = 1;\n }\n return this.createUri(schema, query);\n }\n}\n","// imported from https://github.com/component/has-cors\nlet value = false;\ntry {\n value = typeof XMLHttpRequest !== 'undefined' &&\n 'withCredentials' in new XMLHttpRequest();\n}\ncatch (err) {\n // if XMLHttp support is disabled in IE then it will throw\n // when trying to create\n}\nexport const hasCORS = value;\n","import { Polling } from \"./polling.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions, pick } from \"../util.js\";\nimport { globalThisShim as globalThis } from \"../globals.node.js\";\nimport { hasCORS } from \"../contrib/has-cors.js\";\nfunction empty() { }\nexport class BaseXHR extends Polling {\n /**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @package\n */\n constructor(opts) {\n super(opts);\n if (typeof location !== \"undefined\") {\n const isSSL = \"https:\" === location.protocol;\n let port = location.port;\n // some user agents have empty `location.port`\n if (!port) {\n port = isSSL ? \"443\" : \"80\";\n }\n this.xd =\n (typeof location !== \"undefined\" &&\n opts.hostname !== location.hostname) ||\n port !== opts.port;\n }\n }\n /**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @private\n */\n doWrite(data, fn) {\n const req = this.request({\n method: \"POST\",\n data: data,\n });\n req.on(\"success\", fn);\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr post error\", xhrStatus, context);\n });\n }\n /**\n * Starts a poll cycle.\n *\n * @private\n */\n doPoll() {\n const req = this.request();\n req.on(\"data\", this.onData.bind(this));\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr poll error\", xhrStatus, context);\n });\n this.pollXhr = req;\n }\n}\nexport class Request extends Emitter {\n /**\n * Request constructor\n *\n * @param {Object} options\n * @package\n */\n constructor(createRequest, uri, opts) {\n super();\n this.createRequest = createRequest;\n installTimerFunctions(this, opts);\n this._opts = opts;\n this._method = opts.method || \"GET\";\n this._uri = uri;\n this._data = undefined !== opts.data ? opts.data : null;\n this._create();\n }\n /**\n * Creates the XHR object and sends the request.\n *\n * @private\n */\n _create() {\n var _a;\n const opts = pick(this._opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n opts.xdomain = !!this._opts.xd;\n const xhr = (this._xhr = this.createRequest(opts));\n try {\n xhr.open(this._method, this._uri, true);\n try {\n if (this._opts.extraHeaders) {\n // @ts-ignore\n xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n for (let i in this._opts.extraHeaders) {\n if (this._opts.extraHeaders.hasOwnProperty(i)) {\n xhr.setRequestHeader(i, this._opts.extraHeaders[i]);\n }\n }\n }\n }\n catch (e) { }\n if (\"POST\" === this._method) {\n try {\n xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n }\n catch (e) { }\n }\n try {\n xhr.setRequestHeader(\"Accept\", \"*/*\");\n }\n catch (e) { }\n (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\n // ie6 check\n if (\"withCredentials\" in xhr) {\n xhr.withCredentials = this._opts.withCredentials;\n }\n if (this._opts.requestTimeout) {\n xhr.timeout = this._opts.requestTimeout;\n }\n xhr.onreadystatechange = () => {\n var _a;\n if (xhr.readyState === 3) {\n (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(\n // @ts-ignore\n xhr.getResponseHeader(\"set-cookie\"));\n }\n if (4 !== xhr.readyState)\n return;\n if (200 === xhr.status || 1223 === xhr.status) {\n this._onLoad();\n }\n else {\n // make sure the `error` event handler that's user-set\n // does not throw in the same tick and gets caught here\n this.setTimeoutFn(() => {\n this._onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n }, 0);\n }\n };\n xhr.send(this._data);\n }\n catch (e) {\n // Need to defer since .create() is called directly from the constructor\n // and thus the 'error' event can only be only bound *after* this exception\n // occurs. Therefore, also, we cannot throw here at all.\n this.setTimeoutFn(() => {\n this._onError(e);\n }, 0);\n return;\n }\n if (typeof document !== \"undefined\") {\n this._index = Request.requestsCount++;\n Request.requests[this._index] = this;\n }\n }\n /**\n * Called upon error.\n *\n * @private\n */\n _onError(err) {\n this.emitReserved(\"error\", err, this._xhr);\n this._cleanup(true);\n }\n /**\n * Cleans up house.\n *\n * @private\n */\n _cleanup(fromError) {\n if (\"undefined\" === typeof this._xhr || null === this._xhr) {\n return;\n }\n this._xhr.onreadystatechange = empty;\n if (fromError) {\n try {\n this._xhr.abort();\n }\n catch (e) { }\n }\n if (typeof document !== \"undefined\") {\n delete Request.requests[this._index];\n }\n this._xhr = null;\n }\n /**\n * Called upon load.\n *\n * @private\n */\n _onLoad() {\n const data = this._xhr.responseText;\n if (data !== null) {\n this.emitReserved(\"data\", data);\n this.emitReserved(\"success\");\n this._cleanup();\n }\n }\n /**\n * Aborts the request.\n *\n * @package\n */\n abort() {\n this._cleanup();\n }\n}\nRequest.requestsCount = 0;\nRequest.requests = {};\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\nif (typeof document !== \"undefined\") {\n // @ts-ignore\n if (typeof attachEvent === \"function\") {\n // @ts-ignore\n attachEvent(\"onunload\", unloadHandler);\n }\n else if (typeof addEventListener === \"function\") {\n const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n addEventListener(terminationEvent, unloadHandler, false);\n }\n}\nfunction unloadHandler() {\n for (let i in Request.requests) {\n if (Request.requests.hasOwnProperty(i)) {\n Request.requests[i].abort();\n }\n }\n}\nconst hasXHR2 = (function () {\n const xhr = newRequest({\n xdomain: false,\n });\n return xhr && xhr.responseType !== null;\n})();\n/**\n * HTTP long-polling based on the built-in `XMLHttpRequest` object.\n *\n * Usage: browser\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\n */\nexport class XHR extends BaseXHR {\n constructor(opts) {\n super(opts);\n const forceBase64 = opts && opts.forceBase64;\n this.supportsBinary = hasXHR2 && !forceBase64;\n }\n request(opts = {}) {\n Object.assign(opts, { xd: this.xd }, this.opts);\n return new Request(newRequest, this.uri(), opts);\n }\n}\nfunction newRequest(opts) {\n const xdomain = opts.xdomain;\n // XMLHttpRequest can be disabled on IE\n try {\n if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n return new XMLHttpRequest();\n }\n }\n catch (e) { }\n if (!xdomain) {\n try {\n return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\");\n }\n catch (e) { }\n }\n}\n","import { Transport } from \"../transport.js\";\nimport { pick, randomString } from \"../util.js\";\nimport { encodePacket } from \"engine.io-parser\";\nimport { globalThisShim as globalThis, nextTick } from \"../globals.node.js\";\n// detect ReactNative environment\nconst isReactNative = typeof navigator !== \"undefined\" &&\n typeof navigator.product === \"string\" &&\n navigator.product.toLowerCase() === \"reactnative\";\nexport class BaseWS extends Transport {\n get name() {\n return \"websocket\";\n }\n doOpen() {\n const uri = this.uri();\n const protocols = this.opts.protocols;\n // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n const opts = isReactNative\n ? {}\n : pick(this.opts, \"agent\", \"perMessageDeflate\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"localAddress\", \"protocolVersion\", \"origin\", \"maxPayload\", \"family\", \"checkServerIdentity\");\n if (this.opts.extraHeaders) {\n opts.headers = this.opts.extraHeaders;\n }\n try {\n this.ws = this.createSocket(uri, protocols, opts);\n }\n catch (err) {\n return this.emitReserved(\"error\", err);\n }\n this.ws.binaryType = this.socket.binaryType;\n this.addEventListeners();\n }\n /**\n * Adds event listeners to the socket\n *\n * @private\n */\n addEventListeners() {\n this.ws.onopen = () => {\n if (this.opts.autoUnref) {\n this.ws._socket.unref();\n }\n this.onOpen();\n };\n this.ws.onclose = (closeEvent) => this.onClose({\n description: \"websocket connection closed\",\n context: closeEvent,\n });\n this.ws.onmessage = (ev) => this.onData(ev.data);\n this.ws.onerror = (e) => this.onError(\"websocket error\", e);\n }\n write(packets) {\n this.writable = false;\n // encodePacket efficient as it uses WS framing\n // no need for encodePayload\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n encodePacket(packet, this.supportsBinary, (data) => {\n // Sometimes the websocket has already been closed but the browser didn't\n // have a chance of informing us about it yet, in that case send will\n // throw an error\n try {\n this.doWrite(packet, data);\n }\n catch (e) {\n }\n if (lastPacket) {\n // fake drain\n // defer to next tick to allow Socket to clear writeBuffer\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n if (typeof this.ws !== \"undefined\") {\n this.ws.onerror = () => { };\n this.ws.close();\n this.ws = null;\n }\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n const schema = this.opts.secure ? \"wss\" : \"ws\";\n const query = this.query || {};\n // append timestamp to URI\n if (this.opts.timestampRequests) {\n query[this.opts.timestampParam] = randomString();\n }\n // communicate binary support capabilities\n if (!this.supportsBinary) {\n query.b64 = 1;\n }\n return this.createUri(schema, query);\n }\n}\nconst WebSocketCtor = globalThis.WebSocket || globalThis.MozWebSocket;\n/**\n * WebSocket transport based on the built-in `WebSocket` object.\n *\n * Usage: browser, Node.js (since v21), Deno, Bun\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @see https://caniuse.com/mdn-api_websocket\n * @see https://nodejs.org/api/globals.html#websocket\n */\nexport class WS extends BaseWS {\n createSocket(uri, protocols, opts) {\n return !isReactNative\n ? protocols\n ? new WebSocketCtor(uri, protocols)\n : new WebSocketCtor(uri)\n : new WebSocketCtor(uri, protocols, opts);\n }\n doWrite(_packet, data) {\n this.ws.send(data);\n }\n}\n","import { Transport } from \"../transport.js\";\nimport { nextTick } from \"../globals.node.js\";\nimport { createPacketDecoderStream, createPacketEncoderStream, } from \"engine.io-parser\";\n/**\n * WebTransport transport based on the built-in `WebTransport` object.\n *\n * Usage: browser, Node.js (with the `@fails-components/webtransport` package)\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebTransport\n * @see https://caniuse.com/webtransport\n */\nexport class WT extends Transport {\n get name() {\n return \"webtransport\";\n }\n doOpen() {\n try {\n // @ts-ignore\n this._transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n }\n catch (err) {\n return this.emitReserved(\"error\", err);\n }\n this._transport.closed\n .then(() => {\n this.onClose();\n })\n .catch((err) => {\n this.onError(\"webtransport error\", err);\n });\n // note: we could have used async/await, but that would require some additional polyfills\n this._transport.ready.then(() => {\n this._transport.createBidirectionalStream().then((stream) => {\n const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);\n const reader = stream.readable.pipeThrough(decoderStream).getReader();\n const encoderStream = createPacketEncoderStream();\n encoderStream.readable.pipeTo(stream.writable);\n this._writer = encoderStream.writable.getWriter();\n const read = () => {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n return;\n }\n this.onPacket(value);\n read();\n })\n .catch((err) => {\n });\n };\n read();\n const packet = { type: \"open\" };\n if (this.query.sid) {\n packet.data = `{\"sid\":\"${this.query.sid}\"}`;\n }\n this._writer.write(packet).then(() => this.onOpen());\n });\n });\n }\n write(packets) {\n this.writable = false;\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n this._writer.write(packet).then(() => {\n if (lastPacket) {\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n var _a;\n (_a = this._transport) === null || _a === void 0 ? void 0 : _a.close();\n }\n}\n","import { XHR } from \"./polling-xhr.node.js\";\nimport { WS } from \"./websocket.node.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n websocket: WS,\n webtransport: WT,\n polling: XHR,\n};\n","// imported from https://github.com/galkn/parseuri\n/**\n * Parses a URI\n *\n * Note: we could also have used the built-in URL object, but it isn't supported on all platforms.\n *\n * See:\n * - https://developer.mozilla.org/en-US/docs/Web/API/URL\n * - https://caniuse.com/url\n * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B\n *\n * History of the parse() method:\n * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c\n * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3\n * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\nconst re = /^(?:(?![^:@\\/?#]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@\\/?#]*)(?::([^:@\\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\nconst parts = [\n 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\nexport function parse(str) {\n if (str.length > 8000) {\n throw \"URI too long\";\n }\n const src = str, b = str.indexOf('['), e = str.indexOf(']');\n if (b != -1 && e != -1) {\n str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n }\n let m = re.exec(str || ''), uri = {}, i = 14;\n while (i--) {\n uri[parts[i]] = m[i] || '';\n }\n if (b != -1 && e != -1) {\n uri.source = src;\n uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n uri.ipv6uri = true;\n }\n uri.pathNames = pathNames(uri, uri['path']);\n uri.queryKey = queryKey(uri, uri['query']);\n return uri;\n}\nfunction pathNames(obj, path) {\n const regx = /\\/{2,9}/g, names = path.replace(regx, \"/\").split(\"/\");\n if (path.slice(0, 1) == '/' || path.length === 0) {\n names.splice(0, 1);\n }\n if (path.slice(-1) == '/') {\n names.splice(names.length - 1, 1);\n }\n return names;\n}\nfunction queryKey(uri, query) {\n const data = {};\n query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n if ($1) {\n data[$1] = $2;\n }\n });\n return data;\n}\n","import { transports as DEFAULT_TRANSPORTS } from \"./transports/index.js\";\nimport { installTimerFunctions, byteLength } from \"./util.js\";\nimport { decode } from \"./contrib/parseqs.js\";\nimport { parse } from \"./contrib/parseuri.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { protocol } from \"engine.io-parser\";\nimport { createCookieJar, defaultBinaryType, nextTick, } from \"./globals.node.js\";\nconst withEventListeners = typeof addEventListener === \"function\" &&\n typeof removeEventListener === \"function\";\nconst OFFLINE_EVENT_LISTENERS = [];\nif (withEventListeners) {\n // within a ServiceWorker, any event handler for the 'offline' event must be added on the initial evaluation of the\n // script, so we create one single event listener here which will forward the event to the socket instances\n addEventListener(\"offline\", () => {\n OFFLINE_EVENT_LISTENERS.forEach((listener) => listener());\n }, false);\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes without upgrade mechanism, which means that it will keep the first low-level transport that\n * successfully establishes the connection.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithoutUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithoutUpgrade({\n * transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n * socket.send(\"hello\");\n * });\n *\n * @see SocketWithUpgrade\n * @see Socket\n */\nexport class SocketWithoutUpgrade extends Emitter {\n /**\n * Socket constructor.\n *\n * @param {String|Object} uri - uri or options\n * @param {Object} opts - options\n */\n constructor(uri, opts) {\n super();\n this.binaryType = defaultBinaryType;\n this.writeBuffer = [];\n this._prevBufferLen = 0;\n this._pingInterval = -1;\n this._pingTimeout = -1;\n this._maxPayload = -1;\n /**\n * The expiration timestamp of the {@link _pingTimeoutTimer} object is tracked, in case the timer is throttled and the\n * callback is not fired on time. This can happen for example when a laptop is suspended or when a phone is locked.\n */\n this._pingTimeoutTime = Infinity;\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = null;\n }\n if (uri) {\n const parsedUri = parse(uri);\n opts.hostname = parsedUri.host;\n opts.secure =\n parsedUri.protocol === \"https\" || parsedUri.protocol === \"wss\";\n opts.port = parsedUri.port;\n if (parsedUri.query)\n opts.query = parsedUri.query;\n }\n else if (opts.host) {\n opts.hostname = parse(opts.host).host;\n }\n installTimerFunctions(this, opts);\n this.secure =\n null != opts.secure\n ? opts.secure\n : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n if (opts.hostname && !opts.port) {\n // if no port is specified manually, use the protocol default\n opts.port = this.secure ? \"443\" : \"80\";\n }\n this.hostname =\n opts.hostname ||\n (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n this.port =\n opts.port ||\n (typeof location !== \"undefined\" && location.port\n ? location.port\n : this.secure\n ? \"443\"\n : \"80\");\n this.transports = [];\n this._transportsByName = {};\n opts.transports.forEach((t) => {\n const transportName = t.prototype.name;\n this.transports.push(transportName);\n this._transportsByName[transportName] = t;\n });\n this.opts = Object.assign({\n path: \"/engine.io\",\n agent: false,\n withCredentials: false,\n upgrade: true,\n timestampParam: \"t\",\n rememberUpgrade: false,\n addTrailingSlash: true,\n rejectUnauthorized: true,\n perMessageDeflate: {\n threshold: 1024,\n },\n transportOptions: {},\n closeOnBeforeunload: false,\n }, opts);\n this.opts.path =\n this.opts.path.replace(/\\/$/, \"\") +\n (this.opts.addTrailingSlash ? \"/\" : \"\");\n if (typeof this.opts.query === \"string\") {\n this.opts.query = decode(this.opts.query);\n }\n if (withEventListeners) {\n if (this.opts.closeOnBeforeunload) {\n // Firefox closes the connection when the \"beforeunload\" event is emitted but not Chrome. This event listener\n // ensures every browser behaves the same (no \"disconnect\" event at the Socket.IO level when the page is\n // closed/reloaded)\n this._beforeunloadEventListener = () => {\n if (this.transport) {\n // silently close the transport\n this.transport.removeAllListeners();\n this.transport.close();\n }\n };\n addEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n }\n if (this.hostname !== \"localhost\") {\n this._offlineEventListener = () => {\n this._onClose(\"transport close\", {\n description: \"network connection lost\",\n });\n };\n OFFLINE_EVENT_LISTENERS.push(this._offlineEventListener);\n }\n }\n if (this.opts.withCredentials) {\n this._cookieJar = createCookieJar();\n }\n this._open();\n }\n /**\n * Creates transport of the given type.\n *\n * @param {String} name - transport name\n * @return {Transport}\n * @private\n */\n createTransport(name) {\n const query = Object.assign({}, this.opts.query);\n // append engine.io protocol identifier\n query.EIO = protocol;\n // transport name\n query.transport = name;\n // session id if we already have one\n if (this.id)\n query.sid = this.id;\n const opts = Object.assign({}, this.opts, {\n query,\n socket: this,\n hostname: this.hostname,\n secure: this.secure,\n port: this.port,\n }, this.opts.transportOptions[name]);\n return new this._transportsByName[name](opts);\n }\n /**\n * Initializes transport to use and starts probe.\n *\n * @private\n */\n _open() {\n if (this.transports.length === 0) {\n // Emit error on next tick so it can be listened to\n this.setTimeoutFn(() => {\n this.emitReserved(\"error\", \"No transports available\");\n }, 0);\n return;\n }\n const transportName = this.opts.rememberUpgrade &&\n SocketWithoutUpgrade.priorWebsocketSuccess &&\n this.transports.indexOf(\"websocket\") !== -1\n ? \"websocket\"\n : this.transports[0];\n this.readyState = \"opening\";\n const transport = this.createTransport(transportName);\n transport.open();\n this.setTransport(transport);\n }\n /**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @private\n */\n setTransport(transport) {\n if (this.transport) {\n this.transport.removeAllListeners();\n }\n // set up transport\n this.transport = transport;\n // set up transport listeners\n transport\n .on(\"drain\", this._onDrain.bind(this))\n .on(\"packet\", this._onPacket.bind(this))\n .on(\"error\", this._onError.bind(this))\n .on(\"close\", (reason) => this._onClose(\"transport close\", reason));\n }\n /**\n * Called when connection is deemed open.\n *\n * @private\n */\n onOpen() {\n this.readyState = \"open\";\n SocketWithoutUpgrade.priorWebsocketSuccess =\n \"websocket\" === this.transport.name;\n this.emitReserved(\"open\");\n this.flush();\n }\n /**\n * Handles a packet.\n *\n * @private\n */\n _onPacket(packet) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n this.emitReserved(\"packet\", packet);\n // Socket is live - any packet counts\n this.emitReserved(\"heartbeat\");\n switch (packet.type) {\n case \"open\":\n this.onHandshake(JSON.parse(packet.data));\n break;\n case \"ping\":\n this._sendPacket(\"pong\");\n this.emitReserved(\"ping\");\n this.emitReserved(\"pong\");\n this._resetPingTimeout();\n break;\n case \"error\":\n const err = new Error(\"server error\");\n // @ts-ignore\n err.code = packet.data;\n this._onError(err);\n break;\n case \"message\":\n this.emitReserved(\"data\", packet.data);\n this.emitReserved(\"message\", packet.data);\n break;\n }\n }\n else {\n }\n }\n /**\n * Called upon handshake completion.\n *\n * @param {Object} data - handshake obj\n * @private\n */\n onHandshake(data) {\n this.emitReserved(\"handshake\", data);\n this.id = data.sid;\n this.transport.query.sid = data.sid;\n this._pingInterval = data.pingInterval;\n this._pingTimeout = data.pingTimeout;\n this._maxPayload = data.maxPayload;\n this.onOpen();\n // In case open handler closes socket\n if (\"closed\" === this.readyState)\n return;\n this._resetPingTimeout();\n }\n /**\n * Sets and resets ping timeout timer based on server pings.\n *\n * @private\n */\n _resetPingTimeout() {\n this.clearTimeoutFn(this._pingTimeoutTimer);\n const delay = this._pingInterval + this._pingTimeout;\n this._pingTimeoutTime = Date.now() + delay;\n this._pingTimeoutTimer = this.setTimeoutFn(() => {\n this._onClose(\"ping timeout\");\n }, delay);\n if (this.opts.autoUnref) {\n this._pingTimeoutTimer.unref();\n }\n }\n /**\n * Called on `drain` event\n *\n * @private\n */\n _onDrain() {\n this.writeBuffer.splice(0, this._prevBufferLen);\n // setting prevBufferLen = 0 is very important\n // for example, when upgrading, upgrade packet is sent over,\n // and a nonzero prevBufferLen could cause problems on `drain`\n this._prevBufferLen = 0;\n if (0 === this.writeBuffer.length) {\n this.emitReserved(\"drain\");\n }\n else {\n this.flush();\n }\n }\n /**\n * Flush write buffers.\n *\n * @private\n */\n flush() {\n if (\"closed\" !== this.readyState &&\n this.transport.writable &&\n !this.upgrading &&\n this.writeBuffer.length) {\n const packets = this._getWritablePackets();\n this.transport.send(packets);\n // keep track of current length of writeBuffer\n // splice writeBuffer and callbackBuffer on `drain`\n this._prevBufferLen = packets.length;\n this.emitReserved(\"flush\");\n }\n }\n /**\n * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP\n * long-polling)\n *\n * @private\n */\n _getWritablePackets() {\n const shouldCheckPayloadSize = this._maxPayload &&\n this.transport.name === \"polling\" &&\n this.writeBuffer.length > 1;\n if (!shouldCheckPayloadSize) {\n return this.writeBuffer;\n }\n let payloadSize = 1; // first packet type\n for (let i = 0; i < this.writeBuffer.length; i++) {\n const data = this.writeBuffer[i].data;\n if (data) {\n payloadSize += byteLength(data);\n }\n if (i > 0 && payloadSize > this._maxPayload) {\n return this.writeBuffer.slice(0, i);\n }\n payloadSize += 2; // separator + packet type\n }\n return this.writeBuffer;\n }\n /**\n * Checks whether the heartbeat timer has expired but the socket has not yet been notified.\n *\n * Note: this method is private for now because it does not really fit the WebSocket API, but if we put it in the\n * `write()` method then the message would not be buffered by the Socket.IO client.\n *\n * @return {boolean}\n * @private\n */\n /* private */ _hasPingExpired() {\n if (!this._pingTimeoutTime)\n return true;\n const hasExpired = Date.now() > this._pingTimeoutTime;\n if (hasExpired) {\n this._pingTimeoutTime = 0;\n nextTick(() => {\n this._onClose(\"ping timeout\");\n }, this.setTimeoutFn);\n }\n return hasExpired;\n }\n /**\n * Sends a message.\n *\n * @param {String} msg - message.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @return {Socket} for chaining.\n */\n write(msg, options, fn) {\n this._sendPacket(\"message\", msg, options, fn);\n return this;\n }\n /**\n * Sends a message. Alias of {@link Socket#write}.\n *\n * @param {String} msg - message.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @return {Socket} for chaining.\n */\n send(msg, options, fn) {\n this._sendPacket(\"message\", msg, options, fn);\n return this;\n }\n /**\n * Sends a packet.\n *\n * @param {String} type: packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @private\n */\n _sendPacket(type, data, options, fn) {\n if (\"function\" === typeof data) {\n fn = data;\n data = undefined;\n }\n if (\"function\" === typeof options) {\n fn = options;\n options = null;\n }\n if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n return;\n }\n options = options || {};\n options.compress = false !== options.compress;\n const packet = {\n type: type,\n data: data,\n options: options,\n };\n this.emitReserved(\"packetCreate\", packet);\n this.writeBuffer.push(packet);\n if (fn)\n this.once(\"flush\", fn);\n this.flush();\n }\n /**\n * Closes the connection.\n */\n close() {\n const close = () => {\n this._onClose(\"forced close\");\n this.transport.close();\n };\n const cleanupAndClose = () => {\n this.off(\"upgrade\", cleanupAndClose);\n this.off(\"upgradeError\", cleanupAndClose);\n close();\n };\n const waitForUpgrade = () => {\n // wait for upgrade to finish since we can't send packets while pausing a transport\n this.once(\"upgrade\", cleanupAndClose);\n this.once(\"upgradeError\", cleanupAndClose);\n };\n if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n this.readyState = \"closing\";\n if (this.writeBuffer.length) {\n this.once(\"drain\", () => {\n if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n });\n }\n else if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n }\n return this;\n }\n /**\n * Called upon transport error\n *\n * @private\n */\n _onError(err) {\n SocketWithoutUpgrade.priorWebsocketSuccess = false;\n if (this.opts.tryAllTransports &&\n this.transports.length > 1 &&\n this.readyState === \"opening\") {\n this.transports.shift();\n return this._open();\n }\n this.emitReserved(\"error\", err);\n this._onClose(\"transport error\", err);\n }\n /**\n * Called upon transport close.\n *\n * @private\n */\n _onClose(reason, description) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n // clear timers\n this.clearTimeoutFn(this._pingTimeoutTimer);\n // stop event from firing again for transport\n this.transport.removeAllListeners(\"close\");\n // ensure transport won't stay open\n this.transport.close();\n // ignore further transport communication\n this.transport.removeAllListeners();\n if (withEventListeners) {\n if (this._beforeunloadEventListener) {\n removeEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n }\n if (this._offlineEventListener) {\n const i = OFFLINE_EVENT_LISTENERS.indexOf(this._offlineEventListener);\n if (i !== -1) {\n OFFLINE_EVENT_LISTENERS.splice(i, 1);\n }\n }\n }\n // set ready state\n this.readyState = \"closed\";\n // clear session id\n this.id = null;\n // emit close event\n this.emitReserved(\"close\", reason, description);\n // clean buffers after, so users can still\n // grab the buffers on `close` event\n this.writeBuffer = [];\n this._prevBufferLen = 0;\n }\n }\n}\nSocketWithoutUpgrade.protocol = protocol;\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithUpgrade({\n * transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n * socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see Socket\n */\nexport class SocketWithUpgrade extends SocketWithoutUpgrade {\n constructor() {\n super(...arguments);\n this._upgrades = [];\n }\n onOpen() {\n super.onOpen();\n if (\"open\" === this.readyState && this.opts.upgrade) {\n for (let i = 0; i < this._upgrades.length; i++) {\n this._probe(this._upgrades[i]);\n }\n }\n }\n /**\n * Probes a transport.\n *\n * @param {String} name - transport name\n * @private\n */\n _probe(name) {\n let transport = this.createTransport(name);\n let failed = false;\n SocketWithoutUpgrade.priorWebsocketSuccess = false;\n const onTransportOpen = () => {\n if (failed)\n return;\n transport.send([{ type: \"ping\", data: \"probe\" }]);\n transport.once(\"packet\", (msg) => {\n if (failed)\n return;\n if (\"pong\" === msg.type && \"probe\" === msg.data) {\n this.upgrading = true;\n this.emitReserved(\"upgrading\", transport);\n if (!transport)\n return;\n SocketWithoutUpgrade.priorWebsocketSuccess =\n \"websocket\" === transport.name;\n this.transport.pause(() => {\n if (failed)\n return;\n if (\"closed\" === this.readyState)\n return;\n cleanup();\n this.setTransport(transport);\n transport.send([{ type: \"upgrade\" }]);\n this.emitReserved(\"upgrade\", transport);\n transport = null;\n this.upgrading = false;\n this.flush();\n });\n }\n else {\n const err = new Error(\"probe error\");\n // @ts-ignore\n err.transport = transport.name;\n this.emitReserved(\"upgradeError\", err);\n }\n });\n };\n function freezeTransport() {\n if (failed)\n return;\n // Any callback called by transport should be ignored since now\n failed = true;\n cleanup();\n transport.close();\n transport = null;\n }\n // Handle any error that happens while probing\n const onerror = (err) => {\n const error = new Error(\"probe error: \" + err);\n // @ts-ignore\n error.transport = transport.name;\n freezeTransport();\n this.emitReserved(\"upgradeError\", error);\n };\n function onTransportClose() {\n onerror(\"transport closed\");\n }\n // When the socket is closed while we're probing\n function onclose() {\n onerror(\"socket closed\");\n }\n // When the socket is upgraded while we're probing\n function onupgrade(to) {\n if (transport && to.name !== transport.name) {\n freezeTransport();\n }\n }\n // Remove all listeners on the transport and on self\n const cleanup = () => {\n transport.removeListener(\"open\", onTransportOpen);\n transport.removeListener(\"error\", onerror);\n transport.removeListener(\"close\", onTransportClose);\n this.off(\"close\", onclose);\n this.off(\"upgrading\", onupgrade);\n };\n transport.once(\"open\", onTransportOpen);\n transport.once(\"error\", onerror);\n transport.once(\"close\", onTransportClose);\n this.once(\"close\", onclose);\n this.once(\"upgrading\", onupgrade);\n if (this._upgrades.indexOf(\"webtransport\") !== -1 &&\n name !== \"webtransport\") {\n // favor WebTransport\n this.setTimeoutFn(() => {\n if (!failed) {\n transport.open();\n }\n }, 200);\n }\n else {\n transport.open();\n }\n }\n onHandshake(data) {\n this._upgrades = this._filterUpgrades(data.upgrades);\n super.onHandshake(data);\n }\n /**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} upgrades - server upgrades\n * @private\n */\n _filterUpgrades(upgrades) {\n const filteredUpgrades = [];\n for (let i = 0; i < upgrades.length; i++) {\n if (~this.transports.indexOf(upgrades[i]))\n filteredUpgrades.push(upgrades[i]);\n }\n return filteredUpgrades;\n }\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * @example\n * import { Socket } from \"engine.io-client\";\n *\n * const socket = new Socket();\n *\n * socket.on(\"open\", () => {\n * socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see SocketWithUpgrade\n */\nexport class Socket extends SocketWithUpgrade {\n constructor(uri, opts = {}) {\n const o = typeof uri === \"object\" ? uri : opts;\n if (!o.transports ||\n (o.transports && typeof o.transports[0] === \"string\")) {\n o.transports = (o.transports || [\"polling\", \"websocket\", \"webtransport\"])\n .map((transportName) => DEFAULT_TRANSPORTS[transportName])\n .filter((t) => !!t);\n }\n super(uri, o);\n }\n}\n","import { parse } from \"engine.io-client\";\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n * Defaults to window.location.\n * @public\n */\nexport function url(uri, path = \"\", loc) {\n let obj = uri;\n // default to window.location\n loc = loc || (typeof location !== \"undefined\" && location);\n if (null == uri)\n uri = loc.protocol + \"//\" + loc.host;\n // relative path support\n if (typeof uri === \"string\") {\n if (\"/\" === uri.charAt(0)) {\n if (\"/\" === uri.charAt(1)) {\n uri = loc.protocol + uri;\n }\n else {\n uri = loc.host + uri;\n }\n }\n if (!/^(https?|wss?):\\/\\//.test(uri)) {\n if (\"undefined\" !== typeof loc) {\n uri = loc.protocol + \"//\" + uri;\n }\n else {\n uri = \"https://\" + uri;\n }\n }\n // parse\n obj = parse(uri);\n }\n // make sure we treat `localhost:80` and `localhost` equally\n if (!obj.port) {\n if (/^(http|ws)$/.test(obj.protocol)) {\n obj.port = \"80\";\n }\n else if (/^(http|ws)s$/.test(obj.protocol)) {\n obj.port = \"443\";\n }\n }\n obj.path = obj.path || \"/\";\n const ipv6 = obj.host.indexOf(\":\") !== -1;\n const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n // define unique id\n obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n // define href\n obj.href =\n obj.protocol +\n \"://\" +\n host +\n (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n return obj;\n}\n","const withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n (typeof File !== \"undefined\" &&\n toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nexport function isBinary(obj) {\n return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n (withNativeBlob && obj instanceof Blob) ||\n (withNativeFile && obj instanceof File));\n}\nexport function hasBinary(obj, toJSON) {\n if (!obj || typeof obj !== \"object\") {\n return false;\n }\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (hasBinary(obj[i])) {\n return true;\n }\n }\n return false;\n }\n if (isBinary(obj)) {\n return true;\n }\n if (obj.toJSON &&\n typeof obj.toJSON === \"function\" &&\n arguments.length === 1) {\n return hasBinary(obj.toJSON(), true);\n }\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n return true;\n }\n }\n return false;\n}\n","import { isBinary } from \"./is-binary.js\";\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nexport function deconstructPacket(packet) {\n const buffers = [];\n const packetData = packet.data;\n const pack = packet;\n pack.data = _deconstructPacket(packetData, buffers);\n pack.attachments = buffers.length; // number of binary 'attachments'\n return { packet: pack, buffers: buffers };\n}\nfunction _deconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (isBinary(data)) {\n const placeholder = { _placeholder: true, num: buffers.length };\n buffers.push(data);\n return placeholder;\n }\n else if (Array.isArray(data)) {\n const newData = new Array(data.length);\n for (let i = 0; i < data.length; i++) {\n newData[i] = _deconstructPacket(data[i], buffers);\n }\n return newData;\n }\n else if (typeof data === \"object\" && !(data instanceof Date)) {\n const newData = {};\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n newData[key] = _deconstructPacket(data[key], buffers);\n }\n }\n return newData;\n }\n return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nexport function reconstructPacket(packet, buffers) {\n packet.data = _reconstructPacket(packet.data, buffers);\n delete packet.attachments; // no longer useful\n return packet;\n}\nfunction _reconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (data && data._placeholder === true) {\n const isIndexValid = typeof data.num === \"number\" &&\n data.num >= 0 &&\n data.num < buffers.length;\n if (isIndexValid) {\n return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n }\n else {\n throw new Error(\"illegal attachments\");\n }\n }\n else if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n data[i] = _reconstructPacket(data[i], buffers);\n }\n }\n else if (typeof data === \"object\") {\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n data[key] = _reconstructPacket(data[key], buffers);\n }\n }\n }\n return data;\n}\n","import { Emitter } from \"@socket.io/component-emitter\";\nimport { deconstructPacket, reconstructPacket } from \"./binary.js\";\nimport { isBinary, hasBinary } from \"./is-binary.js\";\n/**\n * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n \"connect\",\n \"connect_error\",\n \"disconnect\",\n \"disconnecting\",\n \"newListener\",\n \"removeListener\", // used by the Node.js EventEmitter\n];\n/**\n * Protocol version.\n *\n * @public\n */\nexport const protocol = 5;\nexport var PacketType;\n(function (PacketType) {\n PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nexport class Encoder {\n /**\n * Encoder constructor\n *\n * @param {function} replacer - custom replacer to pass down to JSON.parse\n */\n constructor(replacer) {\n this.replacer = replacer;\n }\n /**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n */\n encode(obj) {\n if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n if (hasBinary(obj)) {\n return this.encodeAsBinary({\n type: obj.type === PacketType.EVENT\n ? PacketType.BINARY_EVENT\n : PacketType.BINARY_ACK,\n nsp: obj.nsp,\n data: obj.data,\n id: obj.id,\n });\n }\n }\n return [this.encodeAsString(obj)];\n }\n /**\n * Encode packet as string.\n */\n encodeAsString(obj) {\n // first is type\n let str = \"\" + obj.type;\n // attachments if we have them\n if (obj.type === PacketType.BINARY_EVENT ||\n obj.type === PacketType.BINARY_ACK) {\n str += obj.attachments + \"-\";\n }\n // if we have a namespace other than `/`\n // we append it followed by a comma `,`\n if (obj.nsp && \"/\" !== obj.nsp) {\n str += obj.nsp + \",\";\n }\n // immediately followed by the id\n if (null != obj.id) {\n str += obj.id;\n }\n // json data\n if (null != obj.data) {\n str += JSON.stringify(obj.data, this.replacer);\n }\n return str;\n }\n /**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n */\n encodeAsBinary(obj) {\n const deconstruction = deconstructPacket(obj);\n const pack = this.encodeAsString(deconstruction.packet);\n const buffers = deconstruction.buffers;\n buffers.unshift(pack); // add packet info to beginning of data list\n return buffers; // write all the buffers\n }\n}\n// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nexport class Decoder extends Emitter {\n /**\n * Decoder constructor\n *\n * @param {function} reviver - custom reviver to pass down to JSON.stringify\n */\n constructor(reviver) {\n super();\n this.reviver = reviver;\n }\n /**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n */\n add(obj) {\n let packet;\n if (typeof obj === \"string\") {\n if (this.reconstructor) {\n throw new Error(\"got plaintext data when reconstructing a packet\");\n }\n packet = this.decodeString(obj);\n const isBinaryEvent = packet.type === PacketType.BINARY_EVENT;\n if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {\n packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;\n // binary packet's json\n this.reconstructor = new BinaryReconstructor(packet);\n // no attachments, labeled binary but no binary data to follow\n if (packet.attachments === 0) {\n super.emitReserved(\"decoded\", packet);\n }\n }\n else {\n // non-binary full packet\n super.emitReserved(\"decoded\", packet);\n }\n }\n else if (isBinary(obj) || obj.base64) {\n // raw binary data\n if (!this.reconstructor) {\n throw new Error(\"got binary data when not reconstructing a packet\");\n }\n else {\n packet = this.reconstructor.takeBinaryData(obj);\n if (packet) {\n // received final buffer\n this.reconstructor = null;\n super.emitReserved(\"decoded\", packet);\n }\n }\n }\n else {\n throw new Error(\"Unknown type: \" + obj);\n }\n }\n /**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n */\n decodeString(str) {\n let i = 0;\n // look up type\n const p = {\n type: Number(str.charAt(0)),\n };\n if (PacketType[p.type] === undefined) {\n throw new Error(\"unknown packet type \" + p.type);\n }\n // look up attachments if type binary\n if (p.type === PacketType.BINARY_EVENT ||\n p.type === PacketType.BINARY_ACK) {\n const start = i + 1;\n while (str.charAt(++i) !== \"-\" && i != str.length) { }\n const buf = str.substring(start, i);\n if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n throw new Error(\"Illegal attachments\");\n }\n p.attachments = Number(buf);\n }\n // look up namespace (if any)\n if (\"/\" === str.charAt(i + 1)) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (\",\" === c)\n break;\n if (i === str.length)\n break;\n }\n p.nsp = str.substring(start, i);\n }\n else {\n p.nsp = \"/\";\n }\n // look up id\n const next = str.charAt(i + 1);\n if (\"\" !== next && Number(next) == next) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (null == c || Number(c) != c) {\n --i;\n break;\n }\n if (i === str.length)\n break;\n }\n p.id = Number(str.substring(start, i + 1));\n }\n // look up json data\n if (str.charAt(++i)) {\n const payload = this.tryParse(str.substr(i));\n if (Decoder.isPayloadValid(p.type, payload)) {\n p.data = payload;\n }\n else {\n throw new Error(\"invalid payload\");\n }\n }\n return p;\n }\n tryParse(str) {\n try {\n return JSON.parse(str, this.reviver);\n }\n catch (e) {\n return false;\n }\n }\n static isPayloadValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n return Array.isArray(payload);\n }\n }\n /**\n * Deallocates a parser's resources\n */\n destroy() {\n if (this.reconstructor) {\n this.reconstructor.finishedReconstruction();\n this.reconstructor = null;\n }\n }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n constructor(packet) {\n this.packet = packet;\n this.buffers = [];\n this.reconPack = packet;\n }\n /**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n * a reconstructed packet object if all buffers have been received.\n */\n takeBinaryData(binData) {\n this.buffers.push(binData);\n if (this.buffers.length === this.reconPack.attachments) {\n // done with buffer list\n const packet = reconstructPacket(this.reconPack, this.buffers);\n this.finishedReconstruction();\n return packet;\n }\n return null;\n }\n /**\n * Cleans up binary packet reconstruction variables.\n */\n finishedReconstruction() {\n this.reconPack = null;\n this.buffers = [];\n }\n}\n","export function on(obj, ev, fn) {\n obj.on(ev, fn);\n return function subDestroy() {\n obj.off(ev, fn);\n };\n}\n","import { PacketType } from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n connect: 1,\n connect_error: 1,\n disconnect: 1,\n disconnecting: 1,\n // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n newListener: 1,\n removeListener: 1,\n});\n/**\n * A Socket is the fundamental class for interacting with the server.\n *\n * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(\"connected\");\n * });\n *\n * // send an event to the server\n * socket.emit(\"foo\", \"bar\");\n *\n * socket.on(\"foobar\", () => {\n * // an event was received from the server\n * });\n *\n * // upon disconnection\n * socket.on(\"disconnect\", (reason) => {\n * console.log(`disconnected due to ${reason}`);\n * });\n */\nexport class Socket extends Emitter {\n /**\n * `Socket` constructor.\n */\n constructor(io, nsp, opts) {\n super();\n /**\n * Whether the socket is currently connected to the server.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.connected); // true\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.connected); // false\n * });\n */\n this.connected = false;\n /**\n * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will\n * be transmitted by the server.\n */\n this.recovered = false;\n /**\n * Buffer for packets received before the CONNECT packet\n */\n this.receiveBuffer = [];\n /**\n * Buffer for packets that will be sent once the socket is connected\n */\n this.sendBuffer = [];\n /**\n * The queue of packets to be sent with retry in case of failure.\n *\n * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order.\n * @private\n */\n this._queue = [];\n /**\n * A sequence to generate the ID of the {@link QueuedPacket}.\n * @private\n */\n this._queueSeq = 0;\n this.ids = 0;\n /**\n * A map containing acknowledgement handlers.\n *\n * The `withError` attribute is used to differentiate handlers that accept an error as first argument:\n *\n * - `socket.emit(\"test\", (err, value) => { ... })` with `ackTimeout` option\n * - `socket.timeout(5000).emit(\"test\", (err, value) => { ... })`\n * - `const value = await socket.emitWithAck(\"test\")`\n *\n * From those that don't:\n *\n * - `socket.emit(\"test\", (value) => { ... });`\n *\n * In the first case, the handlers will be called with an error when:\n *\n * - the timeout is reached\n * - the socket gets disconnected\n *\n * In the second case, the handlers will be simply discarded upon disconnection, since the client will never receive\n * an acknowledgement from the server.\n *\n * @private\n */\n this.acks = {};\n this.flags = {};\n this.io = io;\n this.nsp = nsp;\n if (opts && opts.auth) {\n this.auth = opts.auth;\n }\n this._opts = Object.assign({}, opts);\n if (this.io._autoConnect)\n this.open();\n }\n /**\n * Whether the socket is currently disconnected\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.disconnected); // false\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.disconnected); // true\n * });\n */\n get disconnected() {\n return !this.connected;\n }\n /**\n * Subscribe to open, close and packet events\n *\n * @private\n */\n subEvents() {\n if (this.subs)\n return;\n const io = this.io;\n this.subs = [\n on(io, \"open\", this.onopen.bind(this)),\n on(io, \"packet\", this.onpacket.bind(this)),\n on(io, \"error\", this.onerror.bind(this)),\n on(io, \"close\", this.onclose.bind(this)),\n ];\n }\n /**\n * Whether the Socket will try to reconnect when its Manager connects or reconnects.\n *\n * @example\n * const socket = io();\n *\n * console.log(socket.active); // true\n *\n * socket.on(\"disconnect\", (reason) => {\n * if (reason === \"io server disconnect\") {\n * // the disconnection was initiated by the server, you need to manually reconnect\n * console.log(socket.active); // false\n * }\n * // else the socket will automatically try to reconnect\n * console.log(socket.active); // true\n * });\n */\n get active() {\n return !!this.subs;\n }\n /**\n * \"Opens\" the socket.\n *\n * @example\n * const socket = io({\n * autoConnect: false\n * });\n *\n * socket.connect();\n */\n connect() {\n if (this.connected)\n return this;\n this.subEvents();\n if (!this.io[\"_reconnecting\"])\n this.io.open(); // ensure open\n if (\"open\" === this.io._readyState)\n this.onopen();\n return this;\n }\n /**\n * Alias for {@link connect()}.\n */\n open() {\n return this.connect();\n }\n /**\n * Sends a `message` event.\n *\n * This method mimics the WebSocket.send() method.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send\n *\n * @example\n * socket.send(\"hello\");\n *\n * // this is equivalent to\n * socket.emit(\"message\", \"hello\");\n *\n * @return self\n */\n send(...args) {\n args.unshift(\"message\");\n this.emit.apply(this, args);\n return this;\n }\n /**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @example\n * socket.emit(\"hello\", \"world\");\n *\n * // all serializable datastructures are supported (no need to call JSON.stringify)\n * socket.emit(\"hello\", 1, \"2\", { 3: [\"4\"], 5: Uint8Array.from([6]) });\n *\n * // with an acknowledgement from the server\n * socket.emit(\"hello\", \"world\", (val) => {\n * // ...\n * });\n *\n * @return self\n */\n emit(ev, ...args) {\n var _a, _b, _c;\n if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n throw new Error('\"' + ev.toString() + '\" is a reserved event name');\n }\n args.unshift(ev);\n if (this._opts.retries && !this.flags.fromQueue && !this.flags.volatile) {\n this._addToQueue(args);\n return this;\n }\n const packet = {\n type: PacketType.EVENT,\n data: args,\n };\n packet.options = {};\n packet.options.compress = this.flags.compress !== false;\n // event ack callback\n if (\"function\" === typeof args[args.length - 1]) {\n const id = this.ids++;\n const ack = args.pop();\n this._registerAckCallback(id, ack);\n packet.id = id;\n }\n const isTransportWritable = (_b = (_a = this.io.engine) === null || _a === void 0 ? void 0 : _a.transport) === null || _b === void 0 ? void 0 : _b.writable;\n const isConnected = this.connected && !((_c = this.io.engine) === null || _c === void 0 ? void 0 : _c._hasPingExpired());\n const discardPacket = this.flags.volatile && !isTransportWritable;\n if (discardPacket) {\n }\n else if (isConnected) {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n }\n else {\n this.sendBuffer.push(packet);\n }\n this.flags = {};\n return this;\n }\n /**\n * @private\n */\n _registerAckCallback(id, ack) {\n var _a;\n const timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout;\n if (timeout === undefined) {\n this.acks[id] = ack;\n return;\n }\n // @ts-ignore\n const timer = this.io.setTimeoutFn(() => {\n delete this.acks[id];\n for (let i = 0; i < this.sendBuffer.length; i++) {\n if (this.sendBuffer[i].id === id) {\n this.sendBuffer.splice(i, 1);\n }\n }\n ack.call(this, new Error(\"operation has timed out\"));\n }, timeout);\n const fn = (...args) => {\n // @ts-ignore\n this.io.clearTimeoutFn(timer);\n ack.apply(this, args);\n };\n fn.withError = true;\n this.acks[id] = fn;\n }\n /**\n * Emits an event and waits for an acknowledgement\n *\n * @example\n * // without timeout\n * const response = await socket.emitWithAck(\"hello\", \"world\");\n *\n * // with a specific timeout\n * try {\n * const response = await socket.timeout(1000).emitWithAck(\"hello\", \"world\");\n * } catch (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n *\n * @return a Promise that will be fulfilled when the server acknowledges the event\n */\n emitWithAck(ev, ...args) {\n return new Promise((resolve, reject) => {\n const fn = (arg1, arg2) => {\n return arg1 ? reject(arg1) : resolve(arg2);\n };\n fn.withError = true;\n args.push(fn);\n this.emit(ev, ...args);\n });\n }\n /**\n * Add the packet to the queue.\n * @param args\n * @private\n */\n _addToQueue(args) {\n let ack;\n if (typeof args[args.length - 1] === \"function\") {\n ack = args.pop();\n }\n const packet = {\n id: this._queueSeq++,\n tryCount: 0,\n pending: false,\n args,\n flags: Object.assign({ fromQueue: true }, this.flags),\n };\n args.push((err, ...responseArgs) => {\n if (packet !== this._queue[0]) {\n // the packet has already been acknowledged\n return;\n }\n const hasError = err !== null;\n if (hasError) {\n if (packet.tryCount > this._opts.retries) {\n this._queue.shift();\n if (ack) {\n ack(err);\n }\n }\n }\n else {\n this._queue.shift();\n if (ack) {\n ack(null, ...responseArgs);\n }\n }\n packet.pending = false;\n return this._drainQueue();\n });\n this._queue.push(packet);\n this._drainQueue();\n }\n /**\n * Send the first packet of the queue, and wait for an acknowledgement from the server.\n * @param force - whether to resend a packet that has not been acknowledged yet\n *\n * @private\n */\n _drainQueue(force = false) {\n if (!this.connected || this._queue.length === 0) {\n return;\n }\n const packet = this._queue[0];\n if (packet.pending && !force) {\n return;\n }\n packet.pending = true;\n packet.tryCount++;\n this.flags = packet.flags;\n this.emit.apply(this, packet.args);\n }\n /**\n * Sends a packet.\n *\n * @param packet\n * @private\n */\n packet(packet) {\n packet.nsp = this.nsp;\n this.io._packet(packet);\n }\n /**\n * Called upon engine `open`.\n *\n * @private\n */\n onopen() {\n if (typeof this.auth == \"function\") {\n this.auth((data) => {\n this._sendConnectPacket(data);\n });\n }\n else {\n this._sendConnectPacket(this.auth);\n }\n }\n /**\n * Sends a CONNECT packet to initiate the Socket.IO session.\n *\n * @param data\n * @private\n */\n _sendConnectPacket(data) {\n this.packet({\n type: PacketType.CONNECT,\n data: this._pid\n ? Object.assign({ pid: this._pid, offset: this._lastOffset }, data)\n : data,\n });\n }\n /**\n * Called upon engine or manager `error`.\n *\n * @param err\n * @private\n */\n onerror(err) {\n if (!this.connected) {\n this.emitReserved(\"connect_error\", err);\n }\n }\n /**\n * Called upon engine `close`.\n *\n * @param reason\n * @param description\n * @private\n */\n onclose(reason, description) {\n this.connected = false;\n delete this.id;\n this.emitReserved(\"disconnect\", reason, description);\n this._clearAcks();\n }\n /**\n * Clears the acknowledgement handlers upon disconnection, since the client will never receive an acknowledgement from\n * the server.\n *\n * @private\n */\n _clearAcks() {\n Object.keys(this.acks).forEach((id) => {\n const isBuffered = this.sendBuffer.some((packet) => String(packet.id) === id);\n if (!isBuffered) {\n // note: handlers that do not accept an error as first argument are ignored here\n const ack = this.acks[id];\n delete this.acks[id];\n if (ack.withError) {\n ack.call(this, new Error(\"socket has been disconnected\"));\n }\n }\n });\n }\n /**\n * Called with socket packet.\n *\n * @param packet\n * @private\n */\n onpacket(packet) {\n const sameNamespace = packet.nsp === this.nsp;\n if (!sameNamespace)\n return;\n switch (packet.type) {\n case PacketType.CONNECT:\n if (packet.data && packet.data.sid) {\n this.onconnect(packet.data.sid, packet.data.pid);\n }\n else {\n this.emitReserved(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n }\n break;\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n this.onevent(packet);\n break;\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n this.onack(packet);\n break;\n case PacketType.DISCONNECT:\n this.ondisconnect();\n break;\n case PacketType.CONNECT_ERROR:\n this.destroy();\n const err = new Error(packet.data.message);\n // @ts-ignore\n err.data = packet.data.data;\n this.emitReserved(\"connect_error\", err);\n break;\n }\n }\n /**\n * Called upon a server event.\n *\n * @param packet\n * @private\n */\n onevent(packet) {\n const args = packet.data || [];\n if (null != packet.id) {\n args.push(this.ack(packet.id));\n }\n if (this.connected) {\n this.emitEvent(args);\n }\n else {\n this.receiveBuffer.push(Object.freeze(args));\n }\n }\n emitEvent(args) {\n if (this._anyListeners && this._anyListeners.length) {\n const listeners = this._anyListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, args);\n }\n }\n super.emit.apply(this, args);\n if (this._pid && args.length && typeof args[args.length - 1] === \"string\") {\n this._lastOffset = args[args.length - 1];\n }\n }\n /**\n * Produces an ack callback to emit with an event.\n *\n * @private\n */\n ack(id) {\n const self = this;\n let sent = false;\n return function (...args) {\n // prevent double callbacks\n if (sent)\n return;\n sent = true;\n self.packet({\n type: PacketType.ACK,\n id: id,\n data: args,\n });\n };\n }\n /**\n * Called upon a server acknowledgement.\n *\n * @param packet\n * @private\n */\n onack(packet) {\n const ack = this.acks[packet.id];\n if (typeof ack !== \"function\") {\n return;\n }\n delete this.acks[packet.id];\n // @ts-ignore FIXME ack is incorrectly inferred as 'never'\n if (ack.withError) {\n packet.data.unshift(null);\n }\n // @ts-ignore\n ack.apply(this, packet.data);\n }\n /**\n * Called upon server connect.\n *\n * @private\n */\n onconnect(id, pid) {\n this.id = id;\n this.recovered = pid && this._pid === pid;\n this._pid = pid; // defined only if connection state recovery is enabled\n this.connected = true;\n this.emitBuffered();\n this.emitReserved(\"connect\");\n this._drainQueue(true);\n }\n /**\n * Emit buffered events (received and emitted).\n *\n * @private\n */\n emitBuffered() {\n this.receiveBuffer.forEach((args) => this.emitEvent(args));\n this.receiveBuffer = [];\n this.sendBuffer.forEach((packet) => {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n });\n this.sendBuffer = [];\n }\n /**\n * Called upon server disconnect.\n *\n * @private\n */\n ondisconnect() {\n this.destroy();\n this.onclose(\"io server disconnect\");\n }\n /**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @private\n */\n destroy() {\n if (this.subs) {\n // clean subscriptions to avoid reconnections\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs = undefined;\n }\n this.io[\"_destroy\"](this);\n }\n /**\n * Disconnects the socket manually. In that case, the socket will not try to reconnect.\n *\n * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"disconnect\", (reason) => {\n * // console.log(reason); prints \"io client disconnect\"\n * });\n *\n * socket.disconnect();\n *\n * @return self\n */\n disconnect() {\n if (this.connected) {\n this.packet({ type: PacketType.DISCONNECT });\n }\n // remove socket from pool\n this.destroy();\n if (this.connected) {\n // fire events\n this.onclose(\"io client disconnect\");\n }\n return this;\n }\n /**\n * Alias for {@link disconnect()}.\n *\n * @return self\n */\n close() {\n return this.disconnect();\n }\n /**\n * Sets the compress flag.\n *\n * @example\n * socket.compress(false).emit(\"hello\");\n *\n * @param compress - if `true`, compresses the sending data\n * @return self\n */\n compress(compress) {\n this.flags.compress = compress;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n * ready to send messages.\n *\n * @example\n * socket.volatile.emit(\"hello\"); // the server may or may not receive it\n *\n * @returns self\n */\n get volatile() {\n this.flags.volatile = true;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the callback will be called with an error when the\n * given number of milliseconds have elapsed without an acknowledgement from the server:\n *\n * @example\n * socket.timeout(5000).emit(\"my-event\", (err) => {\n * if (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n * });\n *\n * @returns self\n */\n timeout(timeout) {\n this.flags.timeout = timeout;\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * @example\n * socket.onAny((event, ...args) => {\n * console.log(`got ${event}`);\n * });\n *\n * @param listener\n */\n onAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * @example\n * socket.prependAny((event, ...args) => {\n * console.log(`got event ${event}`);\n * });\n *\n * @param listener\n */\n prependAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`got event ${event}`);\n * }\n *\n * socket.onAny(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAny(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAny();\n *\n * @param listener\n */\n offAny(listener) {\n if (!this._anyListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAny() {\n return this._anyListeners || [];\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.onAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n onAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.prependAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n prependAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`sent event ${event}`);\n * }\n *\n * socket.onAnyOutgoing(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAnyOutgoing(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAnyOutgoing();\n *\n * @param [listener] - the catch-all listener (optional)\n */\n offAnyOutgoing(listener) {\n if (!this._anyOutgoingListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyOutgoingListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyOutgoingListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAnyOutgoing() {\n return this._anyOutgoingListeners || [];\n }\n /**\n * Notify the listeners for each packet sent\n *\n * @param packet\n *\n * @private\n */\n notifyOutgoingListeners(packet) {\n if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {\n const listeners = this._anyOutgoingListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, packet.data);\n }\n }\n }\n}\n","/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\nexport function Backoff(opts) {\n opts = opts || {};\n this.ms = opts.min || 100;\n this.max = opts.max || 10000;\n this.factor = opts.factor || 2;\n this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n this.attempts = 0;\n}\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\nBackoff.prototype.duration = function () {\n var ms = this.ms * Math.pow(this.factor, this.attempts++);\n if (this.jitter) {\n var rand = Math.random();\n var deviation = Math.floor(rand * this.jitter * ms);\n ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;\n }\n return Math.min(ms, this.max) | 0;\n};\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\nBackoff.prototype.reset = function () {\n this.attempts = 0;\n};\n/**\n * Set the minimum duration\n *\n * @api public\n */\nBackoff.prototype.setMin = function (min) {\n this.ms = min;\n};\n/**\n * Set the maximum duration\n *\n * @api public\n */\nBackoff.prototype.setMax = function (max) {\n this.max = max;\n};\n/**\n * Set the jitter\n *\n * @api public\n */\nBackoff.prototype.setJitter = function (jitter) {\n this.jitter = jitter;\n};\n","import { Socket as Engine, installTimerFunctions, nextTick, } from \"engine.io-client\";\nimport { Socket } from \"./socket.js\";\nimport * as parser from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Backoff } from \"./contrib/backo2.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\nexport class Manager extends Emitter {\n constructor(uri, opts) {\n var _a;\n super();\n this.nsps = {};\n this.subs = [];\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n opts.path = opts.path || \"/socket.io\";\n this.opts = opts;\n installTimerFunctions(this, opts);\n this.reconnection(opts.reconnection !== false);\n this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n this.reconnectionDelay(opts.reconnectionDelay || 1000);\n this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);\n this.backoff = new Backoff({\n min: this.reconnectionDelay(),\n max: this.reconnectionDelayMax(),\n jitter: this.randomizationFactor(),\n });\n this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n this._readyState = \"closed\";\n this.uri = uri;\n const _parser = opts.parser || parser;\n this.encoder = new _parser.Encoder();\n this.decoder = new _parser.Decoder();\n this._autoConnect = opts.autoConnect !== false;\n if (this._autoConnect)\n this.open();\n }\n reconnection(v) {\n if (!arguments.length)\n return this._reconnection;\n this._reconnection = !!v;\n if (!v) {\n this.skipReconnect = true;\n }\n return this;\n }\n reconnectionAttempts(v) {\n if (v === undefined)\n return this._reconnectionAttempts;\n this._reconnectionAttempts = v;\n return this;\n }\n reconnectionDelay(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelay;\n this._reconnectionDelay = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n return this;\n }\n randomizationFactor(v) {\n var _a;\n if (v === undefined)\n return this._randomizationFactor;\n this._randomizationFactor = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n return this;\n }\n reconnectionDelayMax(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelayMax;\n this._reconnectionDelayMax = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n return this;\n }\n timeout(v) {\n if (!arguments.length)\n return this._timeout;\n this._timeout = v;\n return this;\n }\n /**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @private\n */\n maybeReconnectOnOpen() {\n // Only try to reconnect if it's the first time we're connecting\n if (!this._reconnecting &&\n this._reconnection &&\n this.backoff.attempts === 0) {\n // keeps reconnection from firing twice for the same reconnection loop\n this.reconnect();\n }\n }\n /**\n * Sets the current transport `socket`.\n *\n * @param {Function} fn - optional, callback\n * @return self\n * @public\n */\n open(fn) {\n if (~this._readyState.indexOf(\"open\"))\n return this;\n this.engine = new Engine(this.uri, this.opts);\n const socket = this.engine;\n const self = this;\n this._readyState = \"opening\";\n this.skipReconnect = false;\n // emit `open`\n const openSubDestroy = on(socket, \"open\", function () {\n self.onopen();\n fn && fn();\n });\n const onError = (err) => {\n this.cleanup();\n this._readyState = \"closed\";\n this.emitReserved(\"error\", err);\n if (fn) {\n fn(err);\n }\n else {\n // Only do this if there is no fn to handle the error\n this.maybeReconnectOnOpen();\n }\n };\n // emit `error`\n const errorSub = on(socket, \"error\", onError);\n if (false !== this._timeout) {\n const timeout = this._timeout;\n // set timer\n const timer = this.setTimeoutFn(() => {\n openSubDestroy();\n onError(new Error(\"timeout\"));\n socket.close();\n }, timeout);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(timer);\n });\n }\n this.subs.push(openSubDestroy);\n this.subs.push(errorSub);\n return this;\n }\n /**\n * Alias for open()\n *\n * @return self\n * @public\n */\n connect(fn) {\n return this.open(fn);\n }\n /**\n * Called upon transport open.\n *\n * @private\n */\n onopen() {\n // clear old subs\n this.cleanup();\n // mark as open\n this._readyState = \"open\";\n this.emitReserved(\"open\");\n // add new subs\n const socket = this.engine;\n this.subs.push(on(socket, \"ping\", this.onping.bind(this)), on(socket, \"data\", this.ondata.bind(this)), on(socket, \"error\", this.onerror.bind(this)), on(socket, \"close\", this.onclose.bind(this)), \n // @ts-ignore\n on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n }\n /**\n * Called upon a ping.\n *\n * @private\n */\n onping() {\n this.emitReserved(\"ping\");\n }\n /**\n * Called with data.\n *\n * @private\n */\n ondata(data) {\n try {\n this.decoder.add(data);\n }\n catch (e) {\n this.onclose(\"parse error\", e);\n }\n }\n /**\n * Called when parser fully decodes a packet.\n *\n * @private\n */\n ondecoded(packet) {\n // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a \"parse error\"\n nextTick(() => {\n this.emitReserved(\"packet\", packet);\n }, this.setTimeoutFn);\n }\n /**\n * Called upon socket error.\n *\n * @private\n */\n onerror(err) {\n this.emitReserved(\"error\", err);\n }\n /**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @public\n */\n socket(nsp, opts) {\n let socket = this.nsps[nsp];\n if (!socket) {\n socket = new Socket(this, nsp, opts);\n this.nsps[nsp] = socket;\n }\n else if (this._autoConnect && !socket.active) {\n socket.connect();\n }\n return socket;\n }\n /**\n * Called upon a socket close.\n *\n * @param socket\n * @private\n */\n _destroy(socket) {\n const nsps = Object.keys(this.nsps);\n for (const nsp of nsps) {\n const socket = this.nsps[nsp];\n if (socket.active) {\n return;\n }\n }\n this._close();\n }\n /**\n * Writes a packet.\n *\n * @param packet\n * @private\n */\n _packet(packet) {\n const encodedPackets = this.encoder.encode(packet);\n for (let i = 0; i < encodedPackets.length; i++) {\n this.engine.write(encodedPackets[i], packet.options);\n }\n }\n /**\n * Clean up transport subscriptions and packet buffer.\n *\n * @private\n */\n cleanup() {\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs.length = 0;\n this.decoder.destroy();\n }\n /**\n * Close the current socket.\n *\n * @private\n */\n _close() {\n this.skipReconnect = true;\n this._reconnecting = false;\n this.onclose(\"forced close\");\n }\n /**\n * Alias for close()\n *\n * @private\n */\n disconnect() {\n return this._close();\n }\n /**\n * Called when:\n *\n * - the low-level engine is closed\n * - the parser encountered a badly formatted packet\n * - all sockets are disconnected\n *\n * @private\n */\n onclose(reason, description) {\n var _a;\n this.cleanup();\n (_a = this.engine) === null || _a === void 0 ? void 0 : _a.close();\n this.backoff.reset();\n this._readyState = \"closed\";\n this.emitReserved(\"close\", reason, description);\n if (this._reconnection && !this.skipReconnect) {\n this.reconnect();\n }\n }\n /**\n * Attempt a reconnection.\n *\n * @private\n */\n reconnect() {\n if (this._reconnecting || this.skipReconnect)\n return this;\n const self = this;\n if (this.backoff.attempts >= this._reconnectionAttempts) {\n this.backoff.reset();\n this.emitReserved(\"reconnect_failed\");\n this._reconnecting = false;\n }\n else {\n const delay = this.backoff.duration();\n this._reconnecting = true;\n const timer = this.setTimeoutFn(() => {\n if (self.skipReconnect)\n return;\n this.emitReserved(\"reconnect_attempt\", self.backoff.attempts);\n // check again for the case socket closed in above events\n if (self.skipReconnect)\n return;\n self.open((err) => {\n if (err) {\n self._reconnecting = false;\n self.reconnect();\n this.emitReserved(\"reconnect_error\", err);\n }\n else {\n self.onreconnect();\n }\n });\n }, delay);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(timer);\n });\n }\n }\n /**\n * Called upon successful reconnect.\n *\n * @private\n */\n onreconnect() {\n const attempt = this.backoff.attempts;\n this._reconnecting = false;\n this.backoff.reset();\n this.emitReserved(\"reconnect\", attempt);\n }\n}\n","import { url } from \"./url.js\";\nimport { Manager } from \"./manager.js\";\nimport { Socket } from \"./socket.js\";\n/**\n * Managers cache.\n */\nconst cache = {};\nfunction lookup(uri, opts) {\n if (typeof uri === \"object\") {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n const parsed = url(uri, opts.path || \"/socket.io\");\n const source = parsed.source;\n const id = parsed.id;\n const path = parsed.path;\n const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n const newConnection = opts.forceNew ||\n opts[\"force new connection\"] ||\n false === opts.multiplex ||\n sameNamespace;\n let io;\n if (newConnection) {\n io = new Manager(source, opts);\n }\n else {\n if (!cache[id]) {\n cache[id] = new Manager(source, opts);\n }\n io = cache[id];\n }\n if (parsed.query && !opts.query) {\n opts.query = parsed.queryKey;\n }\n return io.socket(parsed.path, opts);\n}\n// so that \"lookup\" can be used both as a function (e.g. `io(...)`) and as a\n// namespace (e.g. `io.connect(...)`), for backward compatibility\nObject.assign(lookup, {\n Manager,\n Socket,\n io: lookup,\n connect: lookup,\n});\n/**\n * Protocol version.\n *\n * @public\n */\nexport { protocol } from \"socket.io-parser\";\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nexport { Manager, Socket, lookup as io, lookup as connect, lookup as default, };\nexport { Fetch, NodeXHR, XHR, NodeWebSocket, WebSocket, WebTransport, } from \"engine.io-client\";\n","/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n(function($protobuf) {\n \"use strict\";\n\n // Common aliases\n var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n \n // Exported root namespace\n var $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n \n $root.MeshData = (function() {\n \n /**\n * Properties of a MeshData.\n * @exports IMeshData\n * @interface IMeshData\n * @property {number|null} [index] MeshData index\n * @property {Array.<number>|null} [weights] MeshData weights\n */\n \n /**\n * Constructs a new MeshData.\n * @exports MeshData\n * @classdesc Represents a MeshData.\n * @implements IMeshData\n * @constructor\n * @param {IMeshData=} [properties] Properties to set\n */\n function MeshData(properties) {\n this.weights = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n \n /**\n * MeshData index.\n * @member {number} index\n * @memberof MeshData\n * @instance\n */\n MeshData.prototype.index = 0;\n \n /**\n * MeshData weights.\n * @member {Array.<number>} weights\n * @memberof MeshData\n * @instance\n */\n MeshData.prototype.weights = $util.emptyArray;\n \n /**\n * Creates a new MeshData instance using the specified properties.\n * @function create\n * @memberof MeshData\n * @static\n * @param {IMeshData=} [properties] Properties to set\n * @returns {MeshData} MeshData instance\n */\n MeshData.create = function create(properties) {\n return new MeshData(properties);\n };\n \n /**\n * Encodes the specified MeshData message. Does not implicitly {@link MeshData.verify|verify} messages.\n * @function encode\n * @memberof MeshData\n * @static\n * @param {IMeshData} message MeshData message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n MeshData.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.index);\n if (message.weights != null && message.weights.length) {\n writer.uint32(/* id 2, wireType 2 =*/18).fork();\n for (var i = 0; i < message.weights.length; ++i)\n writer.float(message.weights[i]);\n writer.ldelim();\n }\n return writer;\n };\n \n /**\n * Encodes the specified MeshData message, length delimited. Does not implicitly {@link MeshData.verify|verify} messages.\n * @function encodeDelimited\n * @memberof MeshData\n * @static\n * @param {IMeshData} message MeshData message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n MeshData.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n \n /**\n * Decodes a MeshData message from the specified reader or buffer.\n * @function decode\n * @memberof MeshData\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {MeshData} MeshData\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n MeshData.decode = function decode(reader, length, error) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.MeshData();\n while (reader.pos < end) {\n var tag = reader.uint32();\n if (tag === error)\n break;\n switch (tag >>> 3) {\n case 1: {\n message.index = reader.int32();\n break;\n }\n case 2: {\n if (!(message.weights && message.weights.length))\n message.weights = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.weights.push(reader.float());\n } else\n message.weights.push(reader.float());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n \n /**\n * Decodes a MeshData message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof MeshData\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {MeshData} MeshData\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n MeshData.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n \n /**\n * Verifies a MeshData message.\n * @function verify\n * @memberof MeshData\n * @static\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n MeshData.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.index != null && message.hasOwnProperty(\"index\"))\n if (!$util.isInteger(message.index))\n return \"index: integer expected\";\n if (message.weights != null && message.hasOwnProperty(\"weights\")) {\n if (!Array.isArray(message.weights))\n return \"weights: array expected\";\n for (var i = 0; i < message.weights.length; ++i)\n if (typeof message.weights[i] !== \"number\")\n return \"weights: number[] expected\";\n }\n return null;\n };\n \n /**\n * Creates a MeshData message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof MeshData\n * @static\n * @param {Object.<string,*>} object Plain object\n * @returns {MeshData} MeshData\n */\n MeshData.fromObject = function fromObject(object) {\n if (object instanceof $root.MeshData)\n return object;\n var message = new $root.MeshData();\n if (object.index != null)\n message.index = object.index | 0;\n if (object.weights) {\n if (!Array.isArray(object.weights))\n throw TypeError(\".MeshData.weights: array expected\");\n message.weights = [];\n for (var i = 0; i < object.weights.length; ++i)\n message.weights[i] = Number(object.weights[i]);\n }\n return message;\n };\n \n /**\n * Creates a plain object from a MeshData message. Also converts values to other types if specified.\n * @function toObject\n * @memberof MeshData\n * @static\n * @param {MeshData} message MeshData\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n */\n MeshData.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.weights = [];\n if (options.defaults)\n object.index = 0;\n if (message.index != null && message.hasOwnProperty(\"index\"))\n object.index = message.index;\n if (message.weights && message.weights.length) {\n object.weights = [];\n for (var j = 0; j < message.weights.length; ++j)\n object.weights[j] = options.json && !isFinite(message.weights[j]) ? String(message.weights[j]) : message.weights[j];\n }\n return object;\n };\n \n /**\n * Converts this MeshData to JSON.\n * @function toJSON\n * @memberof MeshData\n * @instance\n * @returns {Object.<string,*>} JSON object\n */\n MeshData.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n \n /**\n * Gets the default type url for MeshData\n * @function getTypeUrl\n * @memberof MeshData\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n MeshData.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/MeshData\";\n };\n \n return MeshData;\n })();\n \n $root.JointData = (function() {\n \n /**\n * Properties of a JointData.\n * @exports IJointData\n * @interface IJointData\n * @property {Array.<number>|null} [translate] JointData translate\n * @property {Uint8Array|null} [rotate] JointData rotate\n */\n \n /**\n * Constructs a new JointData.\n * @exports JointData\n * @classdesc Represents a JointData.\n * @implements IJointData\n * @constructor\n * @param {IJointData=} [properties] Properties to set\n */\n function JointData(properties) {\n this.translate = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n \n /**\n * JointData translate.\n * @member {Array.<number>} translate\n * @memberof JointData\n * @instance\n */\n JointData.prototype.translate = $util.emptyArray;\n \n /**\n * JointData rotate.\n * @member {Uint8Array} rotate\n * @memberof JointData\n * @instance\n */\n JointData.prototype.rotate = $util.newBuffer([]);\n \n /**\n * Creates a new JointData instance using the specified properties.\n * @function create\n * @memberof JointData\n * @static\n * @param {IJointData=} [properties] Properties to set\n * @returns {JointData} JointData instance\n */\n JointData.create = function create(properties) {\n return new JointData(properties);\n };\n \n /**\n * Encodes the specified JointData message. Does not implicitly {@link JointData.verify|verify} messages.\n * @function encode\n * @memberof JointData\n * @static\n * @param {IJointData} message JointData message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n JointData.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.translate != null && message.translate.length) {\n writer.uint32(/* id 1, wireType 2 =*/10).fork();\n for (var i = 0; i < message.translate.length; ++i)\n writer.float(message.translate[i]);\n writer.ldelim();\n }\n if (message.rotate != null && Object.hasOwnProperty.call(message, \"rotate\"))\n writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.rotate);\n return writer;\n };\n \n /**\n * Encodes the specified JointData message, length delimited. Does not implicitly {@link JointData.verify|verify} messages.\n * @function encodeDelimited\n * @memberof JointData\n * @static\n * @param {IJointData} message JointData message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n JointData.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n \n /**\n * Decodes a JointData message from the specified reader or buffer.\n * @function decode\n * @memberof JointData\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {JointData} JointData\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n JointData.decode = function decode(reader, length, error) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.JointData();\n while (reader.pos < end) {\n var tag = reader.uint32();\n if (tag === error)\n break;\n switch (tag >>> 3) {\n case 1: {\n if (!(message.translate && message.translate.length))\n message.translate = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.translate.push(reader.float());\n } else\n message.translate.push(reader.float());\n break;\n }\n case 2: {\n message.rotate = reader.bytes();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n \n /**\n * Decodes a JointData message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof JointData\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {JointData} JointData\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n JointData.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n \n /**\n * Verifies a JointData message.\n * @function verify\n * @memberof JointData\n * @static\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n JointData.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.translate != null && message.hasOwnProperty(\"translate\")) {\n if (!Array.isArray(message.translate))\n return \"translate: array expected\";\n for (var i = 0; i < message.translate.length; ++i)\n if (typeof message.translate[i] !== \"number\")\n return \"translate: number[] expected\";\n }\n if (message.rotate != null && message.hasOwnProperty(\"rotate\"))\n if (!(message.rotate && typeof message.rotate.length === \"number\" || $util.isString(message.rotate)))\n return \"rotate: buffer expected\";\n return null;\n };\n \n /**\n * Creates a JointData message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof JointData\n * @static\n * @param {Object.<string,*>} object Plain object\n * @returns {JointData} JointData\n */\n JointData.fromObject = function fromObject(object) {\n if (object instanceof $root.JointData)\n return object;\n var message = new $root.JointData();\n if (object.translate) {\n if (!Array.isArray(object.translate))\n throw TypeError(\".JointData.translate: array expected\");\n message.translate = [];\n for (var i = 0; i < object.translate.length; ++i)\n message.translate[i] = Number(object.translate[i]);\n }\n if (object.rotate != null)\n if (typeof object.rotate === \"string\")\n $util.base64.decode(object.rotate, message.rotate = $util.newBuffer($util.base64.length(object.rotate)), 0);\n else if (object.rotate.length >= 0)\n message.rotate = object.rotate;\n return message;\n };\n \n /**\n * Creates a plain object from a JointData message. Also converts values to other types if specified.\n * @function toObject\n * @memberof JointData\n * @static\n * @param {JointData} message JointData\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n */\n JointData.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.translate = [];\n if (options.defaults)\n if (options.bytes === String)\n object.rotate = \"\";\n else {\n object.rotate = [];\n if (options.bytes !== Array)\n object.rotate = $util.newBuffer(object.rotate);\n }\n if (message.translate && message.translate.length) {\n object.translate = [];\n for (var j = 0; j < message.translate.length; ++j)\n object.translate[j] = options.json && !isFinite(message.translate[j]) ? String(message.translate[j]) : message.translate[j];\n }\n if (message.rotate != null && message.hasOwnProperty(\"rotate\"))\n object.rotate = options.bytes === String ? $util.base64.encode(message.rotate, 0, message.rotate.length) : options.bytes === Array ? Array.prototype.slice.call(message.rotate) : message.rotate;\n return object;\n };\n \n /**\n * Converts this JointData to JSON.\n * @function toJSON\n * @memberof JointData\n * @instance\n * @returns {Object.<string,*>} JSON object\n */\n JointData.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n \n /**\n * Gets the default type url for JointData\n * @function getTypeUrl\n * @memberof JointData\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n JointData.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/JointData\";\n };\n \n return JointData;\n })();\n \n $root.FaceFrameData = (function() {\n \n /**\n * Properties of a FaceFrameData.\n * @exports IFaceFrameData\n * @interface IFaceFrameData\n * @property {number|null} [id] FaceFrameData id\n * @property {string|null} [s] FaceFrameData s\n * @property {number|null} [sf] FaceFrameData sf\n * @property {number|null} [ef] FaceFrameData ef\n * @property {Uint8Array|null} [bsw] FaceFrameData bsw\n * @property {Uint8Array|null} [cs] FaceFrameData cs\n * @property {Array.<IJointData>|null} [js] FaceFrameData js\n * @property {Array.<IMeshData>|null} [ms] FaceFrameData ms\n * @property {number|null} [bodyId] FaceFrameData bodyId\n * @property {number|null} [faceFrameType] FaceFrameData faceFrameType\n * @property {number|null} [asf] FaceFrameData asf\n * @property {number|null} [aef] FaceFrameData aef\n * @property {string|null} [n] FaceFrameData n\n */\n \n /**\n * Constructs a new FaceFrameData.\n * @exports FaceFrameData\n * @classdesc Represents a FaceFrameData.\n * @implements IFaceFrameData\n * @constructor\n * @param {IFaceFrameData=} [properties] Properties to set\n */\n function FaceFrameData(properties) {\n this.js = [];\n this.ms = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n \n /**\n * FaceFrameData id.\n * @member {number} id\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.id = 0;\n \n /**\n * FaceFrameData s.\n * @member {string} s\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.s = \"\";\n \n /**\n * FaceFrameData sf.\n * @member {number} sf\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.sf = 0;\n \n /**\n * FaceFrameData ef.\n * @member {number} ef\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.ef = 0;\n \n /**\n * FaceFrameData bsw.\n * @member {Uint8Array} bsw\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.bsw = $util.newBuffer([]);\n \n /**\n * FaceFrameData cs.\n * @member {Uint8Array} cs\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.cs = $util.newBuffer([]);\n \n /**\n * FaceFrameData js.\n * @member {Array.<IJointData>} js\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.js = $util.emptyArray;\n \n /**\n * FaceFrameData ms.\n * @member {Array.<IMeshData>} ms\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.ms = $util.emptyArray;\n \n /**\n * FaceFrameData bodyId.\n * @member {number} bodyId\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.bodyId = 0;\n \n /**\n * FaceFrameData faceFrameType.\n * @member {number} faceFrameType\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.faceFrameType = 0;\n \n /**\n * FaceFrameData asf.\n * @member {number} asf\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.asf = 0;\n \n /**\n * FaceFrameData aef.\n * @member {number} aef\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.aef = 0;\n \n /**\n * FaceFrameData n.\n * @member {string} n\n * @memberof FaceFrameData\n * @instance\n */\n FaceFrameData.prototype.n = \"\";\n \n /**\n * Creates a new FaceFrameData instance using the specified properties.\n * @function create\n * @memberof FaceFrameData\n * @static\n * @param {IFaceFrameData=} [properties] Properties to set\n * @returns {FaceFrameData} FaceFrameData instance\n */\n FaceFrameData.create = function create(properties) {\n return new FaceFrameData(properties);\n };\n \n /**\n * Encodes the specified FaceFrameData message. Does not implicitly {@link FaceFrameData.verify|verify} messages.\n * @function encode\n * @memberof FaceFrameData\n * @static\n * @param {IFaceFrameData} message FaceFrameData message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n FaceFrameData.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.id != null && Object.hasOwnProperty.call(message, \"id\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.id);\n if (message.s != null && Object.hasOwnProperty.call(message, \"s\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.s);\n if (message.sf != null && Object.hasOwnProperty.call(message, \"sf\"))\n writer.uint32(/* id 3, wireType 0 =*/24).int32(message.sf);\n if (message.ef != null && Object.hasOwnProperty.call(message, \"ef\"))\n writer.uint32(/* id 4, wireType 0 =*/32).int32(message.ef);\n if (message.bsw != null && Object.hasOwnProperty.call(message, \"bsw\"))\n writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.bsw);\n if (message.cs != null && Object.hasOwnProperty.call(message, \"cs\"))\n writer.uint32(/* id 11, wireType 2 =*/90).bytes(message.cs);\n if (message.js != null && message.js.length)\n for (var i = 0; i < message.js.length; ++i)\n $root.JointData.encode(message.js[i], writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();\n if (message.ms != null && message.ms.length)\n for (var i = 0; i < message.ms.length; ++i)\n $root.MeshData.encode(message.ms[i], writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();\n if (message.bodyId != null && Object.hasOwnProperty.call(message, \"bodyId\"))\n writer.uint32(/* id 14, wireType 0 =*/112).int32(message.bodyId);\n if (message.faceFrameType != null && Object.hasOwnProperty.call(message, \"faceFrameType\"))\n writer.uint32(/* id 15, wireType 0 =*/120).int32(message.faceFrameType);\n if (message.asf != null && Object.hasOwnProperty.call(message, \"asf\"))\n writer.uint32(/* id 16, wireType 0 =*/128).int32(message.asf);\n if (message.aef != null && Object.hasOwnProperty.call(message, \"aef\"))\n writer.uint32(/* id 17, wireType 0 =*/136).int32(message.aef);\n if (message.n != null && Object.hasOwnProperty.call(message, \"n\"))\n writer.uint32(/* id 18, wireType 2 =*/146).string(message.n);\n return writer;\n };\n \n /**\n * Encodes the specified FaceFrameData message, length delimited. Does not implicitly {@link FaceFrameData.verify|verify} messages.\n * @function encodeDelimited\n * @memberof FaceFrameData\n * @static\n * @param {IFaceFrameData} message FaceFrameData message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n FaceFrameData.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n \n /**\n * Decodes a FaceFrameData message from the specified reader or buffer.\n * @function decode\n * @memberof FaceFrameData\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {FaceFrameData} FaceFrameData\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n FaceFrameData.decode = function decode(reader, length, error) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.FaceFrameData();\n while (reader.pos < end) {\n var tag = reader.uint32();\n if (tag === error)\n break;\n switch (tag >>> 3) {\n case 1: {\n message.id = reader.int32();\n break;\n }\n case 2: {\n message.s = reader.string();\n break;\n }\n case 3: {\n message.sf = reader.int32();\n break;\n }\n case 4: {\n message.ef = reader.int32();\n break;\n }\n case 5: {\n message.bsw = reader.bytes();\n break;\n }\n case 11: {\n message.cs = reader.bytes();\n break;\n }\n case 12: {\n if (!(message.js && message.js.length))\n message.js = [];\n message.js.push($root.JointData.decode(reader, reader.uint32()));\n break;\n }\n case 13: {\n if (!(message.ms && message.ms.length))\n message.ms = [];\n message.ms.push($root.MeshData.decode(reader, reader.uint32()));\n break;\n }\n case 14: {\n message.bodyId = reader.int32();\n break;\n }\n case 15: {\n message.faceFrameType = reader.int32();\n break;\n }\n case 16: {\n message.asf = reader.int32();\n break;\n }\n case 17: {\n message.aef = reader.int32();\n break;\n }\n case 18: {\n message.n = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n \n /**\n * Decodes a FaceFrameData message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof FaceFrameData\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {FaceFrameData} FaceFrameData\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n FaceFrameData.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n \n /**\n * Verifies a FaceFrameData message.\n * @function verify\n * @memberof FaceFrameData\n * @static\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n FaceFrameData.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.id != null && message.hasOwnProperty(\"id\"))\n if (!$util.isInteger(message.id))\n return \"id: integer expected\";\n if (message.s != null && message.hasOwnProperty(\"s\"))\n if (!$util.isString(message.s))\n return \"s: string expected\";\n if (message.sf != null && message.hasOwnProperty(\"sf\"))\n if (!$util.isInteger(message.sf))\n return \"sf: integer expected\";\n if (message.ef != null && message.hasOwnProperty(\"ef\"))\n if (!$util.isInteger(message.ef))\n return \"ef: integer expected\";\n if (message.bsw != null && message.hasOwnProperty(\"bsw\"))\n if (!(message.bsw && typeof message.bsw.length === \"number\" || $util.isString(message.bsw)))\n return \"bsw: buffer expected\";\n if (message.cs != null && message.hasOwnProperty(\"cs\"))\n if (!(message.cs && typeof message.cs.length === \"number\" || $util.isString(message.cs)))\n return \"cs: buffer expected\";\n if (message.js != null && message.hasOwnProperty(\"js\")) {\n if (!Array.isArray(message.js))\n return \"js: array expected\";\n for (var i = 0; i < message.js.length; ++i) {\n var error = $root.JointData.verify(message.js[i]);\n if (error)\n return \"js.\" + error;\n }\n }\n if (message.ms != null && message.hasOwnProperty(\"ms\")) {\n if (!Array.isArray(message.ms))\n return \"ms: array expected\";\n for (var i = 0; i < message.ms.length; ++i) {\n var error = $root.MeshData.verify(message.ms[i]);\n if (error)\n return \"ms.\" + error;\n }\n }\n if (message.bodyId != null && message.hasOwnProperty(\"bodyId\"))\n if (!$util.isInteger(message.bodyId))\n return \"bodyId: integer expected\";\n if (message.faceFrameType != null && message.hasOwnProperty(\"faceFrameType\"))\n if (!$util.isInteger(message.faceFrameType))\n return \"faceFrameType: integer expected\";\n if (message.asf != null && message.hasOwnProperty(\"asf\"))\n if (!$util.isInteger(message.asf))\n return \"asf: integer expected\";\n if (message.aef != null && message.hasOwnProperty(\"aef\"))\n if (!$util.isInteger(message.aef))\n return \"aef: integer expected\";\n if (message.n != null && message.hasOwnProperty(\"n\"))\n if (!$util.isString(message.n))\n return \"n: string expected\";\n return null;\n };\n \n /**\n * Creates a FaceFrameData message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof FaceFrameData\n * @static\n * @param {Object.<string,*>} object Plain object\n * @returns {FaceFrameData} FaceFrameData\n */\n FaceFrameData.fromObject = function fromObject(object) {\n if (object instanceof $root.FaceFrameData)\n return object;\n var message = new $root.FaceFrameData();\n if (object.id != null)\n message.id = object.id | 0;\n if (object.s != null)\n message.s = String(object.s);\n if (object.sf != null)\n message.sf = object.sf | 0;\n if (object.ef != null)\n message.ef = object.ef | 0;\n if (object.bsw != null)\n if (typeof object.bsw === \"string\")\n $util.base64.decode(object.bsw, message.bsw = $util.newBuffer($util.base64.length(object.bsw)), 0);\n else if (object.bsw.length >= 0)\n message.bsw = object.bsw;\n if (object.cs != null)\n if (typeof object.cs === \"string\")\n $util.base64.decode(object.cs, message.cs = $util.newBuffer($util.base64.length(object.cs)), 0);\n else if (object.cs.length >= 0)\n message.cs = object.cs;\n if (object.js) {\n if (!Array.isArray(object.js))\n throw TypeError(\".FaceFrameData.js: array expected\");\n message.js = [];\n for (var i = 0; i < object.js.length; ++i) {\n if (typeof object.js[i] !== \"object\")\n throw TypeError(\".FaceFrameData.js: object expected\");\n message.js[i] = $root.JointData.fromObject(object.js[i]);\n }\n }\n if (object.ms) {\n if (!Array.isArray(object.ms))\n throw TypeError(\".FaceFrameData.ms: array expected\");\n message.ms = [];\n for (var i = 0; i < object.ms.length; ++i) {\n if (typeof object.ms[i] !== \"object\")\n throw TypeError(\".FaceFrameData.ms: object expected\");\n message.ms[i] = $root.MeshData.fromObject(object.ms[i]);\n }\n }\n if (object.bodyId != null)\n message.bodyId = object.bodyId | 0;\n if (object.faceFrameType != null)\n message.faceFrameType = object.faceFrameType | 0;\n if (object.asf != null)\n message.asf = object.asf | 0;\n if (object.aef != null)\n message.aef = object.aef | 0;\n if (object.n != null)\n message.n = String(object.n);\n return message;\n };\n \n /**\n * Creates a plain object from a FaceFrameData message. Also converts values to other types if specified.\n * @function toObject\n * @memberof FaceFrameData\n * @static\n * @param {FaceFrameData} message FaceFrameData\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n */\n FaceFrameData.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.js = [];\n object.ms = [];\n }\n if (options.defaults) {\n object.id = 0;\n object.s = \"\";\n object.sf = 0;\n object.ef = 0;\n if (options.bytes === String)\n object.bsw = \"\";\n else {\n object.bsw = [];\n if (options.bytes !== Array)\n object.bsw = $util.newBuffer(object.bsw);\n }\n if (options.bytes === String)\n object.cs = \"\";\n else {\n object.cs = [];\n if (options.bytes !== Array)\n object.cs = $util.newBuffer(object.cs);\n }\n object.bodyId = 0;\n object.faceFrameType = 0;\n object.asf = 0;\n object.aef = 0;\n object.n = \"\";\n }\n if (message.id != null && message.hasOwnProperty(\"id\"))\n object.id = message.id;\n if (message.s != null && message.hasOwnProperty(\"s\"))\n object.s = message.s;\n if (message.sf != null && message.hasOwnProperty(\"sf\"))\n object.sf = message.sf;\n if (message.ef != null && message.hasOwnProperty(\"ef\"))\n object.ef = message.ef;\n if (message.bsw != null && message.hasOwnProperty(\"bsw\"))\n object.bsw = options.bytes === String ? $util.base64.encode(message.bsw, 0, message.bsw.length) : options.bytes === Array ? Array.prototype.slice.call(message.bsw) : message.bsw;\n if (message.cs != null && message.hasOwnProperty(\"cs\"))\n object.cs = options.bytes === String ? $util.base64.encode(message.cs, 0, message.cs.length) : options.bytes === Array ? Array.prototype.slice.call(message.cs) : message.cs;\n if (message.js && message.js.length) {\n object.js = [];\n for (var j = 0; j < message.js.length; ++j)\n object.js[j] = $root.JointData.toObject(message.js[j], options);\n }\n if (message.ms && message.ms.length) {\n object.ms = [];\n for (var j = 0; j < message.ms.length; ++j)\n object.ms[j] = $root.MeshData.toObject(message.ms[j], options);\n }\n if (message.bodyId != null && message.hasOwnProperty(\"bodyId\"))\n object.bodyId = message.bodyId;\n if (message.faceFrameType != null && message.hasOwnProperty(\"faceFrameType\"))\n object.faceFrameType = message.faceFrameType;\n if (message.asf != null && message.hasOwnProperty(\"asf\"))\n object.asf = message.asf;\n if (message.aef != null && message.hasOwnProperty(\"aef\"))\n object.aef = message.aef;\n if (message.n != null && message.hasOwnProperty(\"n\"))\n object.n = message.n;\n return object;\n };\n \n /**\n * Converts this FaceFrameData to JSON.\n * @function toJSON\n * @memberof FaceFrameData\n * @instance\n * @returns {Object.<string,*>} JSON object\n */\n FaceFrameData.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n \n /**\n * Gets the default type url for FaceFrameData\n * @function getTypeUrl\n * @memberof FaceFrameData\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n FaceFrameData.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/FaceFrameData\";\n };\n \n return FaceFrameData;\n })();\n \n $root.FaceFrameDataList = (function() {\n \n /**\n * Properties of a FaceFrameDataList.\n * @exports IFaceFrameDataList\n * @interface IFaceFrameDataList\n * @property {Array.<IFaceFrameData>|null} [data] FaceFrameDataList data\n */\n \n /**\n * Constructs a new FaceFrameDataList.\n * @exports FaceFrameDataList\n * @classdesc Represents a FaceFrameDataList.\n * @implements IFaceFrameDataList\n * @constructor\n * @param {IFaceFrameDataList=} [properties] Properties to set\n */\n function FaceFrameDataList(properties) {\n this.data = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n \n /**\n * FaceFrameDataList data.\n * @member {Array.<IFaceFrameData>} data\n * @memberof FaceFrameDataList\n * @instance\n */\n FaceFrameDataList.prototype.data = $util.emptyArray;\n \n /**\n * Creates a new FaceFrameDataList instance using the specified properties.\n * @function create\n * @memberof FaceFrameDataList\n * @static\n * @param {IFaceFrameDataList=} [properties] Properties to set\n * @returns {FaceFrameDataList} FaceFrameDataList instance\n */\n FaceFrameDataList.create = function create(properties) {\n return new FaceFrameDataList(properties);\n };\n \n /**\n * Encodes the specified FaceFrameDataList message. Does not implicitly {@link FaceFrameDataList.verify|verify} messages.\n * @function encode\n * @memberof FaceFrameDataList\n * @static\n * @param {IFaceFrameDataList} message FaceFrameDataList message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n FaceFrameDataList.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.data != null && message.data.length)\n for (var i = 0; i < message.data.length; ++i)\n $root.FaceFrameData.encode(message.data[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n \n /**\n * Encodes the specified FaceFrameDataList message, length delimited. Does not implicitly {@link FaceFrameDataList.verify|verify} messages.\n * @function encodeDelimited\n * @memberof FaceFrameDataList\n * @static\n * @param {IFaceFrameDataList} message FaceFrameDataList message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n FaceFrameDataList.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n \n /**\n * Decodes a FaceFrameDataList message from the specified reader or buffer.\n * @function decode\n * @memberof FaceFrameDataList\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {FaceFrameDataList} FaceFrameDataList\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n FaceFrameDataList.decode = function decode(reader, length, error) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.FaceFrameDataList();\n while (reader.pos < end) {\n var tag = reader.uint32();\n if (tag === error)\n break;\n switch (tag >>> 3) {\n case 1: {\n if (!(message.data && message.data.length))\n message.data = [];\n message.data.push($root.FaceFrameData.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n \n /**\n * Decodes a FaceFrameDataList message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof FaceFrameDataList\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {FaceFrameDataList} FaceFrameDataList\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n FaceFrameDataList.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n \n /**\n * Verifies a FaceFrameDataList message.\n * @function verify\n * @memberof FaceFrameDataList\n * @static\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n FaceFrameDataList.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.data != null && message.hasOwnProperty(\"data\")) {\n if (!Array.isArray(message.data))\n return \"data: array expected\";\n for (var i = 0; i < message.data.length; ++i) {\n var error = $root.FaceFrameData.verify(message.data[i]);\n if (error)\n return \"data.\" + error;\n }\n }\n return null;\n };\n \n /**\n * Creates a FaceFrameDataList message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof FaceFrameDataList\n * @static\n * @param {Object.<string,*>} object Plain object\n * @returns {FaceFrameDataList} FaceFrameDataList\n */\n FaceFrameDataList.fromObject = function fromObject(object) {\n if (object instanceof $root.FaceFrameDataList)\n return object;\n var message = new $root.FaceFrameDataList();\n if (object.data) {\n if (!Array.isArray(object.data))\n throw TypeError(\".FaceFrameDataList.data: array expected\");\n message.data = [];\n for (var i = 0; i < object.data.length; ++i) {\n if (typeof object.data[i] !== \"object\")\n throw TypeError(\".FaceFrameDataList.data: object expected\");\n message.data[i] = $root.FaceFrameData.fromObject(object.data[i]);\n }\n }\n return message;\n };\n \n /**\n * Creates a plain object from a FaceFrameDataList message. Also converts values to other types if specified.\n * @function toObject\n * @memberof FaceFrameDataList\n * @static\n * @param {FaceFrameDataList} message FaceFrameDataList\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n */\n FaceFrameDataList.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.data = [];\n if (message.data && message.data.length) {\n object.data = [];\n for (var j = 0; j < message.data.length; ++j)\n object.data[j] = $root.FaceFrameData.toObject(message.data[j], options);\n }\n return object;\n };\n \n /**\n * Converts this FaceFrameDataList to JSON.\n * @function toJSON\n * @memberof FaceFrameDataList\n * @instance\n * @returns {Object.<string,*>} JSON object\n */\n FaceFrameDataList.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n \n /**\n * Gets the default type url for FaceFrameDataList\n * @function getTypeUrl\n * @memberof FaceFrameDataList\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n FaceFrameDataList.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/FaceFrameDataList\";\n };\n \n return FaceFrameDataList;\n })();\n\n return $root;\n})(protobuf);\n","/*!\n * protobuf.js v7.5.4 (c) 2016, daniel wirtz\n * compiled fri, 15 aug 2025 23:28:55 utc\n * licensed under the bsd-3-clause license\n * see: https://github.com/dcodeio/protobuf.js for details\n */\n!function(rt){\"use strict\";!function(r,e,t){var i=function t(i){var n=e[i];return n||r[i][0].call(n=e[i]={exports:{}},t,n,n.exports),n.exports}(t[0]);i.util.global.protobuf=i,\"function\"==typeof define&&define.amd&&define([\"long\"],function(t){return t&&t.isLong&&(i.util.Long=t,i.configure()),i}),\"object\"==typeof module&&module&&module.exports&&(module.exports=i)}({1:[function(t,i,n){i.exports=function(t,i){var n=Array(arguments.length-1),s=0,r=2,o=!0;for(;r<arguments.length;)n[s++]=arguments[r++];return new Promise(function(r,e){n[s]=function(t){if(o)if(o=!1,t)e(t);else{for(var i=Array(arguments.length-1),n=0;n<i.length;)i[n++]=arguments[n];r.apply(null,i)}};try{t.apply(i||null,n)}catch(t){o&&(o=!1,e(t))}})}},{}],2:[function(t,i,n){n.length=function(t){var i=t.length;if(!i)return 0;for(var n=0;1<--i%4&&\"=\"==(t[0|i]||\"\");)++n;return Math.ceil(3*t.length)/4-n};for(var h=Array(64),f=Array(123),r=0;r<64;)f[h[r]=r<26?r+65:r<52?r+71:r<62?r-4:r-59|43]=r++;n.encode=function(t,i,n){for(var r,e=null,s=[],o=0,u=0;i<n;){var f=t[i++];switch(u){case 0:s[o++]=h[f>>2],r=(3&f)<<4,u=1;break;case 1:s[o++]=h[r|f>>4],r=(15&f)<<2,u=2;break;case 2:s[o++]=h[r|f>>6],s[o++]=h[63&f],u=0}8191<o&&((e=e||[]).push(String.fromCharCode.apply(String,s)),o=0)}return u&&(s[o++]=h[r],s[o++]=61,1===u&&(s[o++]=61)),e?(o&&e.push(String.fromCharCode.apply(String,s.slice(0,o))),e.join(\"\")):String.fromCharCode.apply(String,s.slice(0,o))};var a=\"invalid encoding\";n.decode=function(t,i,n){for(var r,e=n,s=0,o=0;o<t.length;){var u=t.charCodeAt(o++);if(61==u&&1<s)break;if((u=f[u])===rt)throw Error(a);switch(s){case 0:r=u,s=1;break;case 1:i[n++]=r<<2|(48&u)>>4,r=u,s=2;break;case 2:i[n++]=(15&r)<<4|(60&u)>>2,r=u,s=3;break;case 3:i[n++]=(3&r)<<6|u,s=0}}if(1===s)throw Error(a);return n-e},n.test=function(t){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(t)}},{}],3:[function(t,i,n){function c(i,n){\"string\"==typeof i&&(n=i,i=rt);var f=[];function h(t){if(\"string\"!=typeof t){var i=a();if(c.verbose&&console.log(\"codegen: \"+i),i=\"return \"+i,t){for(var n=Object.keys(t),r=Array(n.length+1),e=Array(n.length),s=0;s<n.length;)r[s]=n[s],e[s]=t[n[s++]];return r[s]=i,Function.apply(null,r).apply(null,e)}return Function(i)()}for(var o=Array(arguments.length-1),u=0;u<o.length;)o[u]=arguments[++u];if(u=0,t=t.replace(/%([%dfijs])/g,function(t,i){var n=o[u++];switch(i){case\"d\":case\"f\":return\"\"+ +(\"\"+n);case\"i\":return\"\"+Math.floor(n);case\"j\":return JSON.stringify(n);case\"s\":return\"\"+n}return\"%\"}),u!==o.length)throw Error(\"parameter count mismatch\");return f.push(t),h}function a(t){return\"function \"+(t||n||\"\")+\"(\"+(i&&i.join(\",\")||\"\")+\"){\\n \"+f.join(\"\\n \")+\"\\n}\"}return h.toString=a,h}(i.exports=c).verbose=!1},{}],4:[function(t,i,n){function r(){this.i={}}(i.exports=r).prototype.on=function(t,i,n){return(this.i[t]||(this.i[t]=[])).push({fn:i,ctx:n||this}),this},r.prototype.off=function(t,i){if(t===rt)this.i={};else if(i===rt)this.i[t]=[];else for(var n=this.i[t],r=0;r<n.length;)n[r].fn===i?n.splice(r,1):++r;return this},r.prototype.emit=function(t){var i=this.i[t];if(i){for(var n=[],r=1;r<arguments.length;)n.push(arguments[r++]);for(r=0;r<i.length;)i[r].fn.apply(i[r++].ctx,n)}return this}},{}],5:[function(t,i,n){i.exports=u;var s=t(1),o=t(7)(\"fs\");function u(n,r,e){return r=\"function\"==typeof r?(e=r,{}):r||{},e?!r.xhr&&o&&o.readFile?o.readFile(n,function(t,i){return t&&\"undefined\"!=typeof XMLHttpRequest?u.xhr(n,r,e):t?e(t):e(null,r.binary?i:i.toString(\"utf8\"))}):u.xhr(n,r,e):s(u,this,n,r)}u.xhr=function(t,n,r){var e=new XMLHttpRequest;e.onreadystatechange=function(){if(4!==e.readyState)return rt;if(0!==e.status&&200!==e.status)return r(Error(\"status \"+e.status));if(n.binary){if(!(t=e.response))for(var t=[],i=0;i<e.responseText.length;++i)t.push(255&e.responseText.charCodeAt(i));return r(null,\"undefined\"!=typeof Uint8Array?new Uint8Array(t):t)}return r(null,e.responseText)},n.binary&&(\"overrideMimeType\"in e&&e.overrideMimeType(\"text/plain; charset=x-user-defined\"),e.responseType=\"arraybuffer\"),e.open(\"GET\",t),e.send()}},{1:1,7:7}],6:[function(t,i,n){function r(t){function i(t,i,n,r){var e=i<0?1:0;t(0===(i=e?-i:i)?0<1/i?0:2147483648:isNaN(i)?2143289344:34028234663852886e22<i?(e<<31|2139095040)>>>0:i<11754943508222875e-54?(e<<31|Math.round(i/1401298464324817e-60))>>>0:(e<<31|127+(t=Math.floor(Math.log(i)/Math.LN2))<<23|8388607&Math.round(i*Math.pow(2,-t)*8388608))>>>0,n,r)}function n(t,i,n){t=t(i,n),i=2*(t>>31)+1,n=t>>>23&255,t&=8388607;return 255==n?t?NaN:1/0*i:0==n?1401298464324817e-60*i*t:i*Math.pow(2,n-150)*(8388608+t)}function r(t,i,n){u[0]=t,i[n]=f[0],i[n+1]=f[1],i[n+2]=f[2],i[n+3]=f[3]}function e(t,i,n){u[0]=t,i[n]=f[3],i[n+1]=f[2],i[n+2]=f[1],i[n+3]=f[0]}function s(t,i){return f[0]=t[i],f[1]=t[i+1],f[2]=t[i+2],f[3]=t[i+3],u[0]}function o(t,i){return f[3]=t[i],f[2]=t[i+1],f[1]=t[i+2],f[0]=t[i+3],u[0]}var u,f,h,a,c;function l(t,i,n,r,e,s){var o,u=r<0?1:0;0===(r=u?-r:r)?(t(0,e,s+i),t(0<1/r?0:2147483648,e,s+n)):isNaN(r)?(t(0,e,s+i),t(2146959360,e,s+n)):17976931348623157e292<r?(t(0,e,s+i),t((u<<31|2146435072)>>>0,e,s+n)):r<22250738585072014e-324?(t((o=r/5e-324)>>>0,e,s+i),t((u<<31|o/4294967296)>>>0,e,s+n)):(t(4503599627370496*(o=r*Math.pow(2,-(r=1024===(r=Math.floor(Math.log(r)/Math.LN2))?1023:r)))>>>0,e,s+i),t((u<<31|r+1023<<20|1048576*o&1048575)>>>0,e,s+n))}function d(t,i,n,r,e){i=t(r,e+i),t=t(r,e+n),r=2*(t>>31)+1,e=t>>>20&2047,n=4294967296*(1048575&t)+i;return 2047==e?n?NaN:1/0*r:0==e?5e-324*r*n:r*Math.pow(2,e-1075)*(n+4503599627370496)}function p(t,i,n){h[0]=t,i[n]=a[0],i[n+1]=a[1],i[n+2]=a[2],i[n+3]=a[3],i[n+4]=a[4],i[n+5]=a[5],i[n+6]=a[6],i[n+7]=a[7]}function v(t,i,n){h[0]=t,i[n]=a[7],i[n+1]=a[6],i[n+2]=a[5],i[n+3]=a[4],i[n+4]=a[3],i[n+5]=a[2],i[n+6]=a[1],i[n+7]=a[0]}function b(t,i){return a[0]=t[i],a[1]=t[i+1],a[2]=t[i+2],a[3]=t[i+3],a[4]=t[i+4],a[5]=t[i+5],a[6]=t[i+6],a[7]=t[i+7],h[0]}function w(t,i){return a[7]=t[i],a[6]=t[i+1],a[5]=t[i+2],a[4]=t[i+3],a[3]=t[i+4],a[2]=t[i+5],a[1]=t[i+6],a[0]=t[i+7],h[0]}return\"undefined\"!=typeof Float32Array?(u=new Float32Array([-0]),f=new Uint8Array(u.buffer),c=128===f[3],t.writeFloatLE=c?r:e,t.writeFloatBE=c?e:r,t.readFloatLE=c?s:o,t.readFloatBE=c?o:s):(t.writeFloatLE=i.bind(null,y),t.writeFloatBE=i.bind(null,m),t.readFloatLE=n.bind(null,g),t.readFloatBE=n.bind(null,j)),\"undefined\"!=typeof Float64Array?(h=new Float64Array([-0]),a=new Uint8Array(h.buffer),c=128===a[7],t.writeDoubleLE=c?p:v,t.writeDoubleBE=c?v:p,t.readDoubleLE=c?b:w,t.readDoubleBE=c?w:b):(t.writeDoubleLE=l.bind(null,y,0,4),t.writeDoubleBE=l.bind(null,m,4,0),t.readDoubleLE=d.bind(null,g,0,4),t.readDoubleBE=d.bind(null,j,4,0)),t}function y(t,i,n){i[n]=255&t,i[n+1]=t>>>8&255,i[n+2]=t>>>16&255,i[n+3]=t>>>24}function m(t,i,n){i[n]=t>>>24,i[n+1]=t>>>16&255,i[n+2]=t>>>8&255,i[n+3]=255&t}function g(t,i){return(t[i]|t[i+1]<<8|t[i+2]<<16|t[i+3]<<24)>>>0}function j(t,i){return(t[i]<<24|t[i+1]<<16|t[i+2]<<8|t[i+3])>>>0}i.exports=r(r)},{}],7:[function(t,i,n){function r(t){try{var i=eval(\"require\")(t);if(i&&(i.length||Object.keys(i).length))return i}catch(t){}return null}i.exports=r},{}],8:[function(t,i,n){var e=n.isAbsolute=function(t){return/^(?:\\/|\\w+:)/.test(t)},r=n.normalize=function(t){var i=(t=t.replace(/\\\\/g,\"/\").replace(/\\/{2,}/g,\"/\")).split(\"/\"),n=e(t),t=\"\";n&&(t=i.shift()+\"/\");for(var r=0;r<i.length;)\"..\"===i[r]?0<r&&\"..\"!==i[r-1]?i.splice(--r,2):n?i.splice(r,1):++r:\".\"===i[r]?i.splice(r,1):++r;return t+i.join(\"/\")};n.resolve=function(t,i,n){return n||(i=r(i)),!e(i)&&(t=(t=n?t:r(t)).replace(/(?:\\/|^)[^/]+$/,\"\")).length?r(t+\"/\"+i):i}},{}],9:[function(t,i,n){i.exports=function(i,n,t){var r=t||8192,e=r>>>1,s=null,o=r;return function(t){if(t<1||e<t)return i(t);r<o+t&&(s=i(r),o=0);t=n.call(s,o,o+=t);return 7&o&&(o=1+(7|o)),t}}},{}],10:[function(t,i,n){n.length=function(t){for(var i,n=0,r=0;r<t.length;++r)(i=t.charCodeAt(r))<128?n+=1:i<2048?n+=2:55296==(64512&i)&&56320==(64512&t.charCodeAt(r+1))?(++r,n+=4):n+=3;return n},n.read=function(t,i,n){if(n-i<1)return\"\";for(var r,e=null,s=[],o=0;i<n;)(r=t[i++])<128?s[o++]=r:191<r&&r<224?s[o++]=(31&r)<<6|63&t[i++]:239<r&&r<365?(r=((7&r)<<18|(63&t[i++])<<12|(63&t[i++])<<6|63&t[i++])-65536,s[o++]=55296+(r>>10),s[o++]=56320+(1023&r)):s[o++]=(15&r)<<12|(63&t[i++])<<6|63&t[i++],8191<o&&((e=e||[]).push(String.fromCharCode.apply(String,s)),o=0);return e?(o&&e.push(String.fromCharCode.apply(String,s.slice(0,o))),e.join(\"\")):String.fromCharCode.apply(String,s.slice(0,o))},n.write=function(t,i,n){for(var r,e,s=n,o=0;o<t.length;++o)(r=t.charCodeAt(o))<128?i[n++]=r:(r<2048?i[n++]=r>>6|192:(55296==(64512&r)&&56320==(64512&(e=t.charCodeAt(o+1)))?(++o,i[n++]=(r=65536+((1023&r)<<10)+(1023&e))>>18|240,i[n++]=r>>12&63|128):i[n++]=r>>12|224,i[n++]=r>>6&63|128),i[n++]=63&r|128);return n-s}},{}],11:[function(t,i,n){i.exports=e;var r=/\\/|\\./;function e(t,i){r.test(t)||(t=\"google/protobuf/\"+t+\".proto\",i={nested:{google:{nested:{protobuf:{nested:i}}}}}),e[t]=i}e(\"any\",{Any:{fields:{type_url:{type:\"string\",id:1},value:{type:\"bytes\",id:2}}}}),e(\"duration\",{Duration:i={fields:{seconds:{type:\"int64\",id:1},nanos:{type:\"int32\",id:2}}}}),e(\"timestamp\",{Timestamp:i}),e(\"empty\",{Empty:{fields:{}}}),e(\"struct\",{Struct:{fields:{fields:{keyType:\"string\",type:\"Value\",id:1}}},Value:{oneofs:{kind:{oneof:[\"nullValue\",\"numberValue\",\"stringValue\",\"boolValue\",\"structValue\",\"listValue\"]}},fields:{nullValue:{type:\"NullValue\",id:1},numberValue:{type:\"double\",id:2},stringValue:{type:\"string\",id:3},boolValue:{type:\"bool\",id:4},structValue:{type:\"Struct\",id:5},listValue:{type:\"ListValue\",id:6}}},NullValue:{values:{NULL_VALUE:0}},ListValue:{fields:{values:{rule:\"repeated\",type:\"Value\",id:1}}}}),e(\"wrappers\",{DoubleValue:{fields:{value:{type:\"double\",id:1}}},FloatValue:{fields:{value:{type:\"float\",id:1}}},Int64Value:{fields:{value:{type:\"int64\",id:1}}},UInt64Value:{fields:{value:{type:\"uint64\",id:1}}},Int32Value:{fields:{value:{type:\"int32\",id:1}}},UInt32Value:{fields:{value:{type:\"uint32\",id:1}}},BoolValue:{fields:{value:{type:\"bool\",id:1}}},StringValue:{fields:{value:{type:\"string\",id:1}}},BytesValue:{fields:{value:{type:\"bytes\",id:1}}}}),e(\"field_mask\",{FieldMask:{fields:{paths:{rule:\"repeated\",type:\"string\",id:1}}}}),e.get=function(t){return e[t]||null}},{}],12:[function(t,i,n){var l=t(15),d=t(37);function o(t,i,n,r){var e=!1;if(i.resolvedType)if(i.resolvedType instanceof l){t(\"switch(d%s){\",r);for(var s=i.resolvedType.values,o=Object.keys(s),u=0;u<o.length;++u)s[o[u]]!==i.typeDefault||e||(t(\"default:\")('if(typeof(d%s)===\"number\"){m%s=d%s;break}',r,r,r),i.repeated||t(\"break\"),e=!0),t(\"case%j:\",o[u])(\"case %i:\",s[o[u]])(\"m%s=%j\",r,s[o[u]])(\"break\");t(\"}\")}else t('if(typeof d%s!==\"object\")',r)(\"throw TypeError(%j)\",i.fullName+\": object expected\")(\"m%s=types[%i].fromObject(d%s)\",r,n,r);else{var f=!1;switch(i.type){case\"double\":case\"float\":t(\"m%s=Number(d%s)\",r,r);break;case\"uint32\":case\"fixed32\":t(\"m%s=d%s>>>0\",r,r);break;case\"int32\":case\"sint32\":case\"sfixed32\":t(\"m%s=d%s|0\",r,r);break;case\"uint64\":f=!0;case\"int64\":case\"sint64\":case\"fixed64\":case\"sfixed64\":t(\"if(util.Long)\")(\"(m%s=util.Long.fromValue(d%s)).unsigned=%j\",r,r,f)('else if(typeof d%s===\"string\")',r)(\"m%s=parseInt(d%s,10)\",r,r)('else if(typeof d%s===\"number\")',r)(\"m%s=d%s\",r,r)('else if(typeof d%s===\"object\")',r)(\"m%s=new util.LongBits(d%s.low>>>0,d%s.high>>>0).toNumber(%s)\",r,r,r,f?\"true\":\"\");break;case\"bytes\":t('if(typeof d%s===\"string\")',r)(\"util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)\",r,r,r)(\"else if(d%s.length >= 0)\",r)(\"m%s=d%s\",r,r);break;case\"string\":t(\"m%s=String(d%s)\",r,r);break;case\"bool\":t(\"m%s=Boolean(d%s)\",r,r)}}return t}function p(t,i,n,r){if(i.resolvedType)i.resolvedType instanceof l?t(\"d%s=o.enums===String?(types[%i].values[m%s]===undefined?m%s:types[%i].values[m%s]):m%s\",r,n,r,r,n,r,r):t(\"d%s=types[%i].toObject(m%s,o)\",r,n,r);else{var e=!1;switch(i.type){case\"double\":case\"float\":t(\"d%s=o.json&&!isFinite(m%s)?String(m%s):m%s\",r,r,r,r);break;case\"uint64\":e=!0;case\"int64\":case\"sint64\":case\"fixed64\":case\"sfixed64\":t('if(typeof m%s===\"number\")',r)(\"d%s=o.longs===String?String(m%s):m%s\",r,r,r)(\"else\")(\"d%s=o.longs===String?util.Long.prototype.toString.call(m%s):o.longs===Number?new util.LongBits(m%s.low>>>0,m%s.high>>>0).toNumber(%s):m%s\",r,r,r,r,e?\"true\":\"\",r);break;case\"bytes\":t(\"d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s\",r,r,r,r,r);break;default:t(\"d%s=m%s\",r,r)}}return t}n.fromObject=function(t){var i=t.fieldsArray,n=d.codegen([\"d\"],t.name+\"$fromObject\")(\"if(d instanceof this.ctor)\")(\"return d\");if(!i.length)return n(\"return new this.ctor\");n(\"var m=new this.ctor\");for(var r=0;r<i.length;++r){var e=i[r].resolve(),s=d.safeProp(e.name);e.map?(n(\"if(d%s){\",s)('if(typeof d%s!==\"object\")',s)(\"throw TypeError(%j)\",e.fullName+\": object expected\")(\"m%s={}\",s)(\"for(var ks=Object.keys(d%s),i=0;i<ks.length;++i){\",s),o(n,e,r,s+\"[ks[i]]\")(\"}\")(\"}\")):e.repeated?(n(\"if(d%s){\",s)(\"if(!Array.isArray(d%s))\",s)(\"throw TypeError(%j)\",e.fullName+\": array expected\")(\"m%s=[]\",s)(\"for(var i=0;i<d%s.length;++i){\",s),o(n,e,r,s+\"[i]\")(\"}\")(\"}\")):(e.resolvedType instanceof l||n(\"if(d%s!=null){\",s),o(n,e,r,s),e.resolvedType instanceof l||n(\"}\"))}return n(\"return m\")},n.toObject=function(t){var i=t.fieldsArray.slice().sort(d.compareFieldsById);if(!i.length)return d.codegen()(\"return {}\");for(var n=d.codegen([\"m\",\"o\"],t.name+\"$toObject\")(\"if(!o)\")(\"o={}\")(\"var d={}\"),r=[],e=[],s=[],o=0;o<i.length;++o)i[o].partOf||(i[o].resolve().repeated?r:i[o].map?e:s).push(i[o]);if(r.length){for(n(\"if(o.arrays||o.defaults){\"),o=0;o<r.length;++o)n(\"d%s=[]\",d.safeProp(r[o].name));n(\"}\")}if(e.length){for(n(\"if(o.objects||o.defaults){\"),o=0;o<e.length;++o)n(\"d%s={}\",d.safeProp(e[o].name));n(\"}\")}if(s.length){for(n(\"if(o.defaults){\"),o=0;o<s.length;++o){var u,f=s[o],h=d.safeProp(f.name);f.resolvedType instanceof l?n(\"d%s=o.enums===String?%j:%j\",h,f.resolvedType.valuesById[f.typeDefault],f.typeDefault):f.long?n(\"if(util.Long){\")(\"var n=new util.Long(%i,%i,%j)\",f.typeDefault.low,f.typeDefault.high,f.typeDefault.unsigned)(\"d%s=o.longs===String?n.toString():o.longs===Number?n.toNumber():n\",h)(\"}else\")(\"d%s=o.longs===String?%j:%i\",h,f.typeDefault.toString(),f.typeDefault.toNumber()):f.bytes?(u=\"[\"+Array.prototype.slice.call(f.typeDefault).join(\",\")+\"]\",n(\"if(o.bytes===String)d%s=%j\",h,String.fromCharCode.apply(String,f.typeDefault))(\"else{\")(\"d%s=%s\",h,u)(\"if(o.bytes!==Array)d%s=util.newBuffer(d%s)\",h,h)(\"}\")):n(\"d%s=%j\",h,f.typeDefault)}n(\"}\")}for(var a=!1,o=0;o<i.length;++o){var f=i[o],c=t.e.indexOf(f),h=d.safeProp(f.name);f.map?(a||(a=!0,n(\"var ks2\")),n(\"if(m%s&&(ks2=Object.keys(m%s)).length){\",h,h)(\"d%s={}\",h)(\"for(var j=0;j<ks2.length;++j){\"),p(n,f,c,h+\"[ks2[j]]\")(\"}\")):f.repeated?(n(\"if(m%s&&m%s.length){\",h,h)(\"d%s=[]\",h)(\"for(var j=0;j<m%s.length;++j){\",h),p(n,f,c,h+\"[j]\")(\"}\")):(n(\"if(m%s!=null&&m.hasOwnProperty(%j)){\",h,f.name),p(n,f,c,h),f.partOf&&n(\"if(o.oneofs)\")(\"d%s=%j\",d.safeProp(f.partOf.name),f.name)),n(\"}\")}return n(\"return d\")}},{15:15,37:37}],13:[function(t,i,n){i.exports=function(t){for(var i=h.codegen([\"r\",\"l\",\"e\"],t.name+\"$decode\")(\"if(!(r instanceof Reader))\")(\"r=Reader.create(r)\")(\"var c=l===undefined?r.len:r.pos+l,m=new this.ctor\"+(t.fieldsArray.filter(function(t){return t.map}).length?\",k,value\":\"\"))(\"while(r.pos<c){\")(\"var t=r.uint32()\")(\"if(t===e)\")(\"break\")(\"switch(t>>>3){\"),n=0;n<t.fieldsArray.length;++n){var r=t.e[n].resolve(),e=r.resolvedType instanceof u?\"int32\":r.type,s=\"m\"+h.safeProp(r.name);i(\"case %i: {\",r.id),r.map?(i(\"if(%s===util.emptyObject)\",s)(\"%s={}\",s)(\"var c2 = r.uint32()+r.pos\"),f.defaults[r.keyType]!==rt?i(\"k=%j\",f.defaults[r.keyType]):i(\"k=null\"),f.defaults[e]!==rt?i(\"value=%j\",f.defaults[e]):i(\"value=null\"),i(\"while(r.pos<c2){\")(\"var tag2=r.uint32()\")(\"switch(tag2>>>3){\")(\"case 1: k=r.%s(); break\",r.keyType)(\"case 2:\"),f.basic[e]===rt?i(\"value=types[%i].decode(r,r.uint32())\",n):i(\"value=r.%s()\",e),i(\"break\")(\"default:\")(\"r.skipType(tag2&7)\")(\"break\")(\"}\")(\"}\"),f.long[r.keyType]!==rt?i('%s[typeof k===\"object\"?util.longToHash(k):k]=value',s):i(\"%s[k]=value\",s)):r.repeated?(i(\"if(!(%s&&%s.length))\",s,s)(\"%s=[]\",s),f.packed[e]!==rt&&i(\"if((t&7)===2){\")(\"var c2=r.uint32()+r.pos\")(\"while(r.pos<c2)\")(\"%s.push(r.%s())\",s,e)(\"}else\"),f.basic[e]===rt?i(r.delimited?\"%s.push(types[%i].decode(r,undefined,((t&~7)|4)))\":\"%s.push(types[%i].decode(r,r.uint32()))\",s,n):i(\"%s.push(r.%s())\",s,e)):f.basic[e]===rt?i(r.delimited?\"%s=types[%i].decode(r,undefined,((t&~7)|4))\":\"%s=types[%i].decode(r,r.uint32())\",s,n):i(\"%s=r.%s()\",s,e),i(\"break\")(\"}\")}for(i(\"default:\")(\"r.skipType(t&7)\")(\"break\")(\"}\")(\"}\"),n=0;n<t.e.length;++n){var o=t.e[n];o.required&&i(\"if(!m.hasOwnProperty(%j))\",o.name)(\"throw util.ProtocolError(%j,{instance:m})\",\"missing required '\"+o.name+\"'\")}return i(\"return m\")};var u=t(15),f=t(36),h=t(37)},{15:15,36:36,37:37}],14:[function(t,i,n){i.exports=function(t){for(var i,n=c.codegen([\"m\",\"w\"],t.name+\"$encode\")(\"if(!w)\")(\"w=Writer.create()\"),r=t.fieldsArray.slice().sort(c.compareFieldsById),e=0;e<r.length;++e){var s=r[e].resolve(),o=t.e.indexOf(s),u=s.resolvedType instanceof h?\"int32\":s.type,f=a.basic[u];i=\"m\"+c.safeProp(s.name),s.map?(n(\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)){\",i,s.name)(\"for(var ks=Object.keys(%s),i=0;i<ks.length;++i){\",i)(\"w.uint32(%i).fork().uint32(%i).%s(ks[i])\",(s.id<<3|2)>>>0,8|a.mapKey[s.keyType],s.keyType),f===rt?n(\"types[%i].encode(%s[ks[i]],w.uint32(18).fork()).ldelim().ldelim()\",o,i):n(\".uint32(%i).%s(%s[ks[i]]).ldelim()\",16|f,u,i),n(\"}\")(\"}\")):s.repeated?(n(\"if(%s!=null&&%s.length){\",i,i),s.packed&&a.packed[u]!==rt?n(\"w.uint32(%i).fork()\",(s.id<<3|2)>>>0)(\"for(var i=0;i<%s.length;++i)\",i)(\"w.%s(%s[i])\",u,i)(\"w.ldelim()\"):(n(\"for(var i=0;i<%s.length;++i)\",i),f===rt?l(n,s,o,i+\"[i]\"):n(\"w.uint32(%i).%s(%s[i])\",(s.id<<3|f)>>>0,u,i)),n(\"}\")):(s.optional&&n(\"if(%s!=null&&Object.hasOwnProperty.call(m,%j))\",i,s.name),f===rt?l(n,s,o,i):n(\"w.uint32(%i).%s(%s)\",(s.id<<3|f)>>>0,u,i))}return n(\"return w\")};var h=t(15),a=t(36),c=t(37);function l(t,i,n,r){i.delimited?t(\"types[%i].encode(%s,w.uint32(%i)).uint32(%i)\",n,r,(i.id<<3|3)>>>0,(i.id<<3|4)>>>0):t(\"types[%i].encode(%s,w.uint32(%i).fork()).ldelim()\",n,r,(i.id<<3|2)>>>0)}},{15:15,36:36,37:37}],15:[function(t,i,n){i.exports=s;var f=t(24),r=(((s.prototype=Object.create(f.prototype)).constructor=s).className=\"Enum\",t(23)),e=t(37);function s(t,i,n,r,e,s){if(f.call(this,t,n),i&&\"object\"!=typeof i)throw TypeError(\"values must be an object\");if(this.valuesById={},this.values=Object.create(this.valuesById),this.comment=r,this.comments=e||{},this.valuesOptions=s,this.o={},this.reserved=rt,i)for(var o=Object.keys(i),u=0;u<o.length;++u)\"number\"==typeof i[o[u]]&&(this.valuesById[this.values[o[u]]=i[o[u]]]=o[u])}s.prototype.u=function(t){return t=this.f||t,f.prototype.u.call(this,t),Object.keys(this.values).forEach(t=>{var i=Object.assign({},this.h);this.o[t]=Object.assign(i,this.valuesOptions&&this.valuesOptions[t]&&this.valuesOptions[t].features)}),this},s.fromJSON=function(t,i){t=new s(t,i.values,i.options,i.comment,i.comments);return t.reserved=i.reserved,i.edition&&(t.f=i.edition),t.a=\"proto3\",t},s.prototype.toJSON=function(t){t=!!t&&!!t.keepComments;return e.toObject([\"edition\",this.c(),\"options\",this.options,\"valuesOptions\",this.valuesOptions,\"values\",this.values,\"reserved\",this.reserved&&this.reserved.length?this.reserved:rt,\"comment\",t?this.comment:rt,\"comments\",t?this.comments:rt])},s.prototype.add=function(t,i,n,r){if(!e.isString(t))throw TypeError(\"name must be a string\");if(!e.isInteger(i))throw TypeError(\"id must be an integer\");if(this.values[t]!==rt)throw Error(\"duplicate name '\"+t+\"' in \"+this);if(this.isReservedId(i))throw Error(\"id \"+i+\" is reserved in \"+this);if(this.isReservedName(t))throw Error(\"name '\"+t+\"' is reserved in \"+this);if(this.valuesById[i]!==rt){if(!this.options||!this.options.allow_alias)throw Error(\"duplicate id \"+i+\" in \"+this);this.values[t]=i}else this.valuesById[this.values[t]=i]=t;return r&&(this.valuesOptions===rt&&(this.valuesOptions={}),this.valuesOptions[t]=r||null),this.comments[t]=n||null,this},s.prototype.remove=function(t){if(!e.isString(t))throw TypeError(\"name must be a string\");var i=this.values[t];if(null==i)throw Error(\"name '\"+t+\"' does not exist in \"+this);return delete this.valuesById[i],delete this.values[t],delete this.comments[t],this.valuesOptions&&delete this.valuesOptions[t],this},s.prototype.isReservedId=function(t){return r.isReservedId(this.reserved,t)},s.prototype.isReservedName=function(t){return r.isReservedName(this.reserved,t)}},{23:23,24:24,37:37}],16:[function(t,i,n){i.exports=o;var r,u=t(24),e=(((o.prototype=Object.create(u.prototype)).constructor=o).className=\"Field\",t(15)),f=t(36),h=t(37),a=/^required|optional|repeated$/;function o(t,i,n,r,e,s,o){if(h.isObject(r)?(o=e,s=r,r=e=rt):h.isObject(e)&&(o=s,s=e,e=rt),u.call(this,t,s),!h.isInteger(i)||i<0)throw TypeError(\"id must be a non-negative integer\");if(!h.isString(n))throw TypeError(\"type must be a string\");if(r!==rt&&!a.test(r=r.toString().toLowerCase()))throw TypeError(\"rule must be a string rule\");if(e!==rt&&!h.isString(e))throw TypeError(\"extend must be a string\");this.rule=(r=\"proto3_optional\"===r?\"optional\":r)&&\"optional\"!==r?r:rt,this.type=n,this.id=i,this.extend=e||rt,this.repeated=\"repeated\"===r,this.map=!1,this.message=null,this.partOf=null,this.typeDefault=null,this.defaultValue=null,this.long=!!h.Long&&f.long[n]!==rt,this.bytes=\"bytes\"===n,this.resolvedType=null,this.extensionField=null,this.declaringField=null,this.comment=o}o.fromJSON=function(t,i){t=new o(t,i.id,i.type,i.rule,i.extend,i.options,i.comment);return i.edition&&(t.f=i.edition),t.a=\"proto3\",t},Object.defineProperty(o.prototype,\"required\",{get:function(){return\"LEGACY_REQUIRED\"===this.h.field_presence}}),Object.defineProperty(o.prototype,\"optional\",{get:function(){return!this.required}}),Object.defineProperty(o.prototype,\"delimited\",{get:function(){return this.resolvedType instanceof r&&\"DELIMITED\"===this.h.message_encoding}}),Object.defineProperty(o.prototype,\"packed\",{get:function(){return\"PACKED\"===this.h.repeated_field_encoding}}),Object.defineProperty(o.prototype,\"hasPresence\",{get:function(){return!this.repeated&&!this.map&&(this.partOf||this.declaringField||this.extensionField||\"IMPLICIT\"!==this.h.field_presence)}}),o.prototype.setOption=function(t,i,n){return u.prototype.setOption.call(this,t,i,n)},o.prototype.toJSON=function(t){t=!!t&&!!t.keepComments;return h.toObject([\"edition\",this.c(),\"rule\",\"optional\"!==this.rule&&this.rule||rt,\"type\",this.type,\"id\",this.id,\"extend\",this.extend,\"options\",this.options,\"comment\",t?this.comment:rt])},o.prototype.resolve=function(){var t;return this.resolved?this:((this.typeDefault=f.defaults[this.type])===rt?(this.resolvedType=(this.declaringField||this).parent.lookupTypeOrEnum(this.type),this.resolvedType instanceof r?this.typeDefault=null:this.typeDefault=this.resolvedType.values[Object.keys(this.resolvedType.values)[0]]):this.options&&this.options.proto3_optional&&(this.typeDefault=null),this.options&&null!=this.options.default&&(this.typeDefault=this.options.default,this.resolvedType instanceof e&&\"string\"==typeof this.typeDefault&&(this.typeDefault=this.resolvedType.values[this.typeDefault])),this.options&&(this.options.packed===rt||!this.resolvedType||this.resolvedType instanceof e||delete this.options.packed,Object.keys(this.options).length||(this.options=rt)),this.long?(this.typeDefault=h.Long.fromNumber(this.typeDefault,\"u\"==(this.type[0]||\"\")),Object.freeze&&Object.freeze(this.typeDefault)):this.bytes&&\"string\"==typeof this.typeDefault&&(h.base64.test(this.typeDefault)?h.base64.decode(this.typeDefault,t=h.newBuffer(h.base64.length(this.typeDefault)),0):h.utf8.write(this.typeDefault,t=h.newBuffer(h.utf8.length(this.typeDefault)),0),this.typeDefault=t),this.map?this.defaultValue=h.emptyObject:this.repeated?this.defaultValue=h.emptyArray:this.defaultValue=this.typeDefault,this.parent instanceof r&&(this.parent.ctor.prototype[this.name]=this.defaultValue),u.prototype.resolve.call(this))},o.prototype.l=function(t){var i;return\"proto2\"!==t&&\"proto3\"!==t?{}:(t={},\"required\"===this.rule&&(t.field_presence=\"LEGACY_REQUIRED\"),this.parent&&f.defaults[this.type]===rt&&(i=this.parent.get(this.type.split(\".\").pop()))&&i instanceof r&&i.group&&(t.message_encoding=\"DELIMITED\"),!0===this.getOption(\"packed\")?t.repeated_field_encoding=\"PACKED\":!1===this.getOption(\"packed\")&&(t.repeated_field_encoding=\"EXPANDED\"),t)},o.prototype.u=function(t){return u.prototype.u.call(this,this.f||t)},o.d=function(n,r,e,s){return\"function\"==typeof r?r=h.decorateType(r).name:r&&\"object\"==typeof r&&(r=h.decorateEnum(r).name),function(t,i){h.decorateType(t.constructor).add(new o(i,n,r,e,{default:s}))}},o.p=function(t){r=t}},{15:15,24:24,36:36,37:37}],17:[function(t,i,n){var r=i.exports=t(18);r.build=\"light\",r.load=function(t,i,n){return(i=\"function\"==typeof i?(n=i,new r.Root):i||new r.Root).load(t,n)},r.loadSync=function(t,i){return(i=i||new r.Root).loadSync(t)},r.encoder=t(14),r.decoder=t(13),r.verifier=t(40),r.converter=t(12),r.ReflectionObject=t(24),r.Namespace=t(23),r.Root=t(29),r.Enum=t(15),r.Type=t(35),r.Field=t(16),r.OneOf=t(25),r.MapField=t(20),r.Service=t(33),r.Method=t(22),r.Message=t(21),r.wrappers=t(41),r.types=t(36),r.util=t(37),r.ReflectionObject.p(r.Root),r.Namespace.p(r.Type,r.Service,r.Enum),r.Root.p(r.Type),r.Field.p(r.Type)},{12:12,13:13,14:14,15:15,16:16,18:18,20:20,21:21,22:22,23:23,24:24,25:25,29:29,33:33,35:35,36:36,37:37,40:40,41:41}],18:[function(t,i,n){var r=n;function e(){r.util.p(),r.Writer.p(r.BufferWriter),r.Reader.p(r.BufferReader)}r.build=\"minimal\",r.Writer=t(42),r.BufferWriter=t(43),r.Reader=t(27),r.BufferReader=t(28),r.util=t(39),r.rpc=t(31),r.roots=t(30),r.configure=e,e()},{27:27,28:28,30:30,31:31,39:39,42:42,43:43}],19:[function(t,i,n){i=i.exports=t(17);i.build=\"full\",i.tokenize=t(34),i.parse=t(26),i.common=t(11),i.Root.p(i.Type,i.parse,i.common)},{11:11,17:17,26:26,34:34}],20:[function(t,i,n){i.exports=s;var o=t(16),r=(((s.prototype=Object.create(o.prototype)).constructor=s).className=\"MapField\",t(36)),u=t(37);function s(t,i,n,r,e,s){if(o.call(this,t,i,r,rt,rt,e,s),!u.isString(n))throw TypeError(\"keyType must be a string\");this.keyType=n,this.resolvedKeyType=null,this.map=!0}s.fromJSON=function(t,i){return new s(t,i.id,i.keyType,i.type,i.options,i.comment)},s.prototype.toJSON=function(t){t=!!t&&!!t.keepComments;return u.toObject([\"keyType\",this.keyType,\"type\",this.type,\"id\",this.id,\"extend\",this.extend,\"options\",this.options,\"comment\",t?this.comment:rt])},s.prototype.resolve=function(){if(this.resolved)return this;if(r.mapKey[this.keyType]===rt)throw Error(\"invalid key type: \"+this.keyType);return o.prototype.resolve.call(this)},s.d=function(n,r,e){return\"function\"==typeof e?e=u.decorateType(e).name:e&&\"object\"==typeof e&&(e=u.decorateEnum(e).name),function(t,i){u.decorateType(t.constructor).add(new s(i,n,r,e))}}},{16:16,36:36,37:37}],21:[function(t,i,n){i.exports=e;var r=t(39);function e(t){if(t)for(var i=Object.keys(t),n=0;n<i.length;++n)this[i[n]]=t[i[n]]}e.create=function(t){return this.$type.create(t)},e.encode=function(t,i){return this.$type.encode(t,i)},e.encodeDelimited=function(t,i){return this.$type.encodeDelimited(t,i)},e.decode=function(t){return this.$type.decode(t)},e.decodeDelimited=function(t){return this.$type.decodeDelimited(t)},e.verify=function(t){return this.$type.verify(t)},e.fromObject=function(t){return this.$type.fromObject(t)},e.toObject=function(t,i){return this.$type.toObject(t,i)},e.prototype.toJSON=function(){return this.$type.toObject(this,r.toJSONOptions)}},{39:39}],22:[function(t,i,n){i.exports=r;var h=t(24),a=(((r.prototype=Object.create(h.prototype)).constructor=r).className=\"Method\",t(37));function r(t,i,n,r,e,s,o,u,f){if(a.isObject(e)?(o=e,e=s=rt):a.isObject(s)&&(o=s,s=rt),i!==rt&&!a.isString(i))throw TypeError(\"type must be a string\");if(!a.isString(n))throw TypeError(\"requestType must be a string\");if(!a.isString(r))throw TypeError(\"responseType must be a string\");h.call(this,t,o),this.type=i||\"rpc\",this.requestType=n,this.requestStream=!!e||rt,this.responseType=r,this.responseStream=!!s||rt,this.resolvedRequestType=null,this.resolvedResponseType=null,this.comment=u,this.parsedOptions=f}r.fromJSON=function(t,i){return new r(t,i.type,i.requestType,i.responseType,i.requestStream,i.responseStream,i.options,i.comment,i.parsedOptions)},r.prototype.toJSON=function(t){t=!!t&&!!t.keepComments;return a.toObject([\"type\",\"rpc\"!==this.type&&this.type||rt,\"requestType\",this.requestType,\"requestStream\",this.requestStream,\"responseType\",this.responseType,\"responseStream\",this.responseStream,\"options\",this.options,\"comment\",t?this.comment:rt,\"parsedOptions\",this.parsedOptions])},r.prototype.resolve=function(){return this.resolved?this:(this.resolvedRequestType=this.parent.lookupType(this.requestType),this.resolvedResponseType=this.parent.lookupType(this.responseType),h.prototype.resolve.call(this))}},{24:24,37:37}],23:[function(t,i,n){i.exports=c;var s,o,u,r=t(24),f=(((c.prototype=Object.create(r.prototype)).constructor=c).className=\"Namespace\",t(16)),h=t(37),a=t(25);function e(t,i){if(!t||!t.length)return rt;for(var n={},r=0;r<t.length;++r)n[t[r].name]=t[r].toJSON(i);return n}function c(t,i){r.call(this,t,i),this.nested=rt,this.v=null,this.b={},this.w=!0,this.y=!0}function l(t){t.v=null,t.b={};for(var i=t;i=i.parent;)i.b={};return t}c.fromJSON=function(t,i){return new c(t,i.options).addJSON(i.nested)},c.arrayToJSON=e,c.isReservedId=function(t,i){if(t)for(var n=0;n<t.length;++n)if(\"string\"!=typeof t[n]&&t[n][0]<=i&&t[n][1]>i)return!0;return!1},c.isReservedName=function(t,i){if(t)for(var n=0;n<t.length;++n)if(t[n]===i)return!0;return!1},Object.defineProperty(c.prototype,\"nestedArray\",{get:function(){return this.v||(this.v=h.toArray(this.nested))}}),c.prototype.toJSON=function(t){return h.toObject([\"options\",this.options,\"nested\",e(this.nestedArray,t)])},c.prototype.addJSON=function(t){if(t)for(var i,n=Object.keys(t),r=0;r<n.length;++r)i=t[n[r]],this.add((i.fields!==rt?s:i.values!==rt?u:i.methods!==rt?o:i.id!==rt?f:c).fromJSON(n[r],i));return this},c.prototype.get=function(t){return this.nested&&this.nested[t]||null},c.prototype.getEnum=function(t){if(this.nested&&this.nested[t]instanceof u)return this.nested[t].values;throw Error(\"no such enum: \"+t)},c.prototype.add=function(t){if(!(t instanceof f&&t.extend!==rt||t instanceof s||t instanceof a||t instanceof u||t instanceof o||t instanceof c))throw TypeError(\"object must be a valid nested object\");if(this.nested){var i=this.get(t.name);if(i){if(!(i instanceof c&&t instanceof c)||i instanceof s||i instanceof o)throw Error(\"duplicate name '\"+t.name+\"' in \"+this);for(var n=i.nestedArray,r=0;r<n.length;++r)t.add(n[r]);this.remove(i),this.nested||(this.nested={}),t.setOptions(i.options,!0)}}else this.nested={};this.nested[t.name]=t,this instanceof s||this instanceof o||this instanceof u||this instanceof f||t.f||(t.f=t.a),this.w=!0,this.y=!0;for(var e=this;e=e.parent;)e.w=!0,e.y=!0;return t.onAdd(this),l(this)},c.prototype.remove=function(t){if(!(t instanceof r))throw TypeError(\"object must be a ReflectionObject\");if(t.parent!==this)throw Error(t+\" is not a member of \"+this);return delete this.nested[t.name],Object.keys(this.nested).length||(this.nested=rt),t.onRemove(this),l(this)},c.prototype.define=function(t,i){if(h.isString(t))t=t.split(\".\");else if(!Array.isArray(t))throw TypeError(\"illegal path\");if(t&&t.length&&\"\"===t[0])throw Error(\"path must be relative\");for(var n=this;0<t.length;){var r=t.shift();if(n.nested&&n.nested[r]){if(!((n=n.nested[r])instanceof c))throw Error(\"path conflicts with non-namespace objects\")}else n.add(n=new c(r))}return i&&n.addJSON(i),n},c.prototype.resolveAll=function(){if(this.y){this.g(this.f);var t=this.nestedArray,i=0;for(this.resolve();i<t.length;)t[i]instanceof c?t[i++].resolveAll():t[i++].resolve();this.y=!1}return this},c.prototype.g=function(i){return this.w&&(this.w=!1,i=this.f||i,r.prototype.g.call(this,i),this.nestedArray.forEach(t=>{t.g(i)})),this},c.prototype.lookup=function(t,i,n){if(\"boolean\"==typeof i?(n=i,i=rt):i&&!Array.isArray(i)&&(i=[i]),h.isString(t)&&t.length){if(\".\"===t)return this.root;t=t.split(\".\")}else if(!t.length)return this;var r=t.join(\".\");if(\"\"===t[0])return this.root.lookup(t.slice(1),i);var e=this.root.j&&this.root.j[\".\"+r];if(e&&(!i||~i.indexOf(e.constructor)))return e;if((e=this.k(t,r))&&(!i||~i.indexOf(e.constructor)))return e;if(!n)for(var s=this;s.parent;){if((e=s.parent.k(t,r))&&(!i||~i.indexOf(e.constructor)))return e;s=s.parent}return null},c.prototype.k=function(t,i){if(Object.prototype.hasOwnProperty.call(this.b,i))return this.b[i];var n=this.get(t[0]),r=null;if(n)1===t.length?r=n:n instanceof c&&(t=t.slice(1),r=n.k(t,t.join(\".\")));else for(var e=0;e<this.nestedArray.length;++e)this.v[e]instanceof c&&(n=this.v[e].k(t,i))&&(r=n);return this.b[i]=r},c.prototype.lookupType=function(t){var i=this.lookup(t,[s]);if(i)return i;throw Error(\"no such type: \"+t)},c.prototype.lookupEnum=function(t){var i=this.lookup(t,[u]);if(i)return i;throw Error(\"no such Enum '\"+t+\"' in \"+this)},c.prototype.lookupTypeOrEnum=function(t){var i=this.lookup(t,[s,u]);if(i)return i;throw Error(\"no such Type or Enum '\"+t+\"' in \"+this)},c.prototype.lookupService=function(t){var i=this.lookup(t,[o]);if(i)return i;throw Error(\"no such Service '\"+t+\"' in \"+this)},c.p=function(t,i,n){s=t,o=i,u=n}},{16:16,24:24,25:25,37:37}],24:[function(t,i,n){(i.exports=h).className=\"ReflectionObject\";const r=t(25);var e,o=t(37),s={enum_type:\"OPEN\",field_presence:\"EXPLICIT\",json_format:\"ALLOW\",message_encoding:\"LENGTH_PREFIXED\",repeated_field_encoding:\"PACKED\",utf8_validation:\"VERIFY\"},u={enum_type:\"CLOSED\",field_presence:\"EXPLICIT\",json_format:\"LEGACY_BEST_EFFORT\",message_encoding:\"LENGTH_PREFIXED\",repeated_field_encoding:\"EXPANDED\",utf8_validation:\"NONE\"},f={enum_type:\"OPEN\",field_presence:\"IMPLICIT\",json_format:\"ALLOW\",message_encoding:\"LENGTH_PREFIXED\",repeated_field_encoding:\"PACKED\",utf8_validation:\"VERIFY\"};function h(t,i){if(!o.isString(t))throw TypeError(\"name must be a string\");if(i&&!o.isObject(i))throw TypeError(\"options must be an object\");this.options=i,this.parsedOptions=null,this.name=t,this.f=null,this.a=\"proto2\",this.h={},this.O=!1,this.parent=null,this.resolved=!1,this.comment=null,this.filename=null}Object.defineProperties(h.prototype,{root:{get:function(){for(var t=this;null!==t.parent;)t=t.parent;return t}},fullName:{get:function(){for(var t=[this.name],i=this.parent;i;)t.unshift(i.name),i=i.parent;return t.join(\".\")}}}),h.prototype.toJSON=function(){throw Error()},h.prototype.onAdd=function(t){this.parent&&this.parent!==t&&this.parent.remove(this),this.parent=t,this.resolved=!1;t=t.root;t instanceof e&&t.A(this)},h.prototype.onRemove=function(t){t=t.root;t instanceof e&&t.T(this),this.parent=null,this.resolved=!1},h.prototype.resolve=function(){return this.resolved||this.root instanceof e&&(this.resolved=!0),this},h.prototype.g=function(t){return this.u(this.f||t)},h.prototype.u=function(t){if(!this.O){var i={};if(!t)throw Error(\"Unknown edition for \"+this.fullName);var n=Object.assign(this.options?Object.assign({},this.options.features):{},this.l(t));if(this.f){if(\"proto2\"===t)i=Object.assign({},u);else if(\"proto3\"===t)i=Object.assign({},f);else{if(\"2023\"!==t)throw Error(\"Unknown edition: \"+t);i=Object.assign({},s)}this.h=Object.assign(i,n||{})}else{if(this.partOf instanceof r){t=Object.assign({},this.partOf.h);this.h=Object.assign(t,n||{})}else if(!this.declaringField){if(!this.parent)throw Error(\"Unable to find a parent for \"+this.fullName);i=Object.assign({},this.parent.h);this.h=Object.assign(i,n||{})}this.extensionField&&(this.extensionField.h=this.h)}this.O=!0}},h.prototype.l=function(){return{}},h.prototype.getOption=function(t){return this.options?this.options[t]:rt},h.prototype.setOption=function(t,i,n){return this.options||(this.options={}),/^features\\./.test(t)?o.setProperty(this.options,t,i,n):n&&this.options[t]!==rt||(this.getOption(t)!==i&&(this.resolved=!1),this.options[t]=i),this},h.prototype.setParsedOption=function(i,t,n){this.parsedOptions||(this.parsedOptions=[]);var r,e,s=this.parsedOptions;return n?(r=s.find(function(t){return Object.prototype.hasOwnProperty.call(t,i)}))?(e=r[i],o.setProperty(e,n,t)):((r={})[i]=o.setProperty({},n,t),s.push(r)):((e={})[i]=t,s.push(e)),this},h.prototype.setOptions=function(t,i){if(t)for(var n=Object.keys(t),r=0;r<n.length;++r)this.setOption(n[r],t[n[r]],i);return this},h.prototype.toString=function(){var t=this.constructor.className,i=this.fullName;return i.length?t+\" \"+i:t},h.prototype.c=function(){return this.f&&\"proto3\"!==this.f?this.f:rt},h.p=function(t){e=t}},{25:25,37:37}],25:[function(t,i,n){i.exports=o;var e=t(24),r=(((o.prototype=Object.create(e.prototype)).constructor=o).className=\"OneOf\",t(16)),s=t(37);function o(t,i,n,r){if(Array.isArray(i)||(n=i,i=rt),e.call(this,t,n),i!==rt&&!Array.isArray(i))throw TypeError(\"fieldNames must be an Array\");this.oneof=i||[],this.fieldsArray=[],this.comment=r}function u(t){if(t.parent)for(var i=0;i<t.fieldsArray.length;++i)t.fieldsArray[i].parent||t.parent.add(t.fieldsArray[i])}o.fromJSON=function(t,i){return new o(t,i.oneof,i.options,i.comment)},o.prototype.toJSON=function(t){t=!!t&&!!t.keepComments;return s.toObject([\"options\",this.options,\"oneof\",this.oneof,\"comment\",t?this.comment:rt])},o.prototype.add=function(t){if(t instanceof r)return t.parent&&t.parent!==this.parent&&t.parent.remove(t),this.oneof.push(t.name),this.fieldsArray.push(t),u(t.partOf=this),this;throw TypeError(\"field must be a Field\")},o.prototype.remove=function(t){if(!(t instanceof r))throw TypeError(\"field must be a Field\");var i=this.fieldsArray.indexOf(t);if(i<0)throw Error(t+\" is not a member of \"+this);return this.fieldsArray.splice(i,1),-1<(i=this.oneof.indexOf(t.name))&&this.oneof.splice(i,1),t.partOf=null,this},o.prototype.onAdd=function(t){e.prototype.onAdd.call(this,t);for(var i=0;i<this.oneof.length;++i){var n=t.get(this.oneof[i]);n&&!n.partOf&&(n.partOf=this).fieldsArray.push(n)}u(this)},o.prototype.onRemove=function(t){for(var i,n=0;n<this.fieldsArray.length;++n)(i=this.fieldsArray[n]).parent&&i.parent.remove(i);e.prototype.onRemove.call(this,t)},Object.defineProperty(o.prototype,\"isProto3Optional\",{get:function(){var t;return null!=this.fieldsArray&&1===this.fieldsArray.length&&(null!=(t=this.fieldsArray[0]).options&&!0===t.options.proto3_optional)}}),o.d=function(){for(var n=Array(arguments.length),t=0;t<arguments.length;)n[t]=arguments[t++];return function(t,i){s.decorateType(t.constructor).add(new o(i,n)),Object.defineProperty(t,i,{get:s.oneOfGetter(n),set:s.oneOfSetter(n)})}}},{16:16,24:24,37:37}],26:[function(t,i,n){(i.exports=nt).filename=null,nt.defaults={keepCase:!1};var $=t(34),F=t(29),P=t(35),R=t(16),U=t(20),D=t(25),q=t(15),C=t(33),z=t(22),X=t(24),Z=t(36),B=t(37),G=/^[1-9][0-9]*$/,H=/^-?[1-9][0-9]*$/,Y=/^0[x][0-9a-fA-F]+$/,K=/^-?0[x][0-9a-fA-F]+$/,W=/^0[0-7]+$/,J=/^-?0[0-7]+$/,Q=/^(?![eE])[0-9]*(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/,tt=/^[a-zA-Z_][a-zA-Z_0-9]*$/,it=/^(?:\\.?[a-zA-Z_][a-zA-Z_0-9]*)(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*$/;function nt(t,i,n){i instanceof F||(n=i,i=new F);var r,e,s,h,o,u,f=(n=n||nt.defaults).preferTrailingComment||!1,a=$(t,n.alternateCommentMode||!1),c=a.next,l=a.push,d=a.peek,p=a.skip,v=a.cmnt,b=!0,w=\"proto2\",y=i,m=[],g={},j=n.keepCase?function(t){return t}:B.camelCase;function k(t,i,n){var r=nt.filename;return n||(nt.filename=null),Error(\"illegal \"+(i||\"token\")+\" '\"+t+\"' (\"+(r?r+\", \":\"\")+\"line \"+a.line+\")\")}function E(){var t,i=[];do{if('\"'!==(t=c())&&\"'\"!==t)throw k(t)}while(i.push(c()),p(t),'\"'===(t=d())||\"'\"===t);return i.join(\"\")}function O(i){var n=c();switch(n){case\"'\":case'\"':return l(n),E();case\"true\":case\"TRUE\":return!0;case\"false\":case\"FALSE\":return!1}try{var t=n,r=!0,e=1;switch(\"-\"==(t[0]||\"\")&&(e=-1,t=t.substring(1)),t){case\"inf\":case\"INF\":case\"Inf\":return e*(1/0);case\"nan\":case\"NAN\":case\"Nan\":case\"NaN\":return NaN;case\"0\":return 0}if(G.test(t))return e*parseInt(t,10);if(Y.test(t))return e*parseInt(t,16);if(W.test(t))return e*parseInt(t,8);if(Q.test(t))return e*parseFloat(t);throw k(t,\"number\",r)}catch(t){if(i&&it.test(n))return n;throw k(n,\"value\")}}function A(i,n){var t;do{if(!n||'\"'!==(r=d())&&\"'\"!==r)try{i.push([t=T(c()),p(\"to\",!0)?T(c()):t])}catch(t){if(!(n&&it.test(r)&&2023<=w))throw t;i.push(r)}else{var r=E();if(i.push(r),2023<=w)throw k(r,\"id\")}}while(p(\",\",!0));var e={options:rt,setOption:function(t,i){this.options===rt&&(this.options={}),this.options[t]=i}};x(e,function(t){if(\"option\"!==t)throw k(t);L(e,t),p(\";\")},function(){M(e)})}function T(t,i){switch(t){case\"max\":case\"MAX\":case\"Max\":return 536870911;case\"0\":return 0}if(i||\"-\"!=(t[0]||\"\")){if(H.test(t))return parseInt(t,10);if(K.test(t))return parseInt(t,16);if(J.test(t))return parseInt(t,8)}throw k(t,\"id\")}function _(t,i){switch(i){case\"option\":return L(t,i),p(\";\"),1;case\"message\":return S(t),1;case\"enum\":return N(t),1;case\"service\":var h,n=t,r=i;if(tt.test(r=c()))return x(h=new C(r),function(t){if(!_(h,t)){if(\"rpc\"!==t)throw k(t);var i=h,n=v(),r=t;if(!tt.test(t=c()))throw k(t,\"name\");var e,s,o,u=t;if(p(\"(\"),p(\"stream\",!0)&&(s=!0),!it.test(t=c()))throw k(t);if(e=t,p(\")\"),p(\"returns\"),p(\"(\"),p(\"stream\",!0)&&(o=!0),!it.test(t=c()))throw k(t);t=t,p(\")\");var f=new z(u,r,e,t,s,o);f.comment=n,x(f,function(t){if(\"option\"!==t)throw k(t);L(f,t),p(\";\")}),i.add(f)}}),n.add(h),n===y&&m.push(h),1;throw k(r,\"service name\");case\"extend\":var e,s=t,n=i;if(it.test(n=c()))return e=n,x(null,function(t){switch(t){case\"required\":case\"repeated\":I(s,t,e);break;case\"optional\":I(s,\"proto3\"===w?\"proto3_optional\":\"optional\",e);break;default:if(\"proto2\"===w||!it.test(t))throw k(t);l(t),I(s,\"optional\",e)}}),1;throw k(n,\"reference\")}}function x(t,i,n){var r,e=a.line;if(t&&(\"string\"!=typeof t.comment&&(t.comment=v()),t.filename=nt.filename),p(\"{\",!0)){for(;\"}\"!==(r=c());)i(r);p(\";\",!0)}else n&&n(),p(\";\"),t&&(\"string\"!=typeof t.comment||f)&&(t.comment=v(e)||t.comment)}function S(t,i){if(!tt.test(i=c()))throw k(i,\"type name\");var u=new P(i);x(u,function(t){if(!_(u,t))switch(t){case\"map\":var i=u,n=(p(\"<\"),c());if(Z.mapKey[n]===rt)throw k(n,\"type\");p(\",\");var r=c();if(!it.test(r))throw k(r,\"type\");p(\">\");var e=c();if(!tt.test(e))throw k(e,\"name\");p(\"=\");var s=new U(j(e),T(c()),n,r);x(s,function(t){if(\"option\"!==t)throw k(t);L(s,t),p(\";\")},function(){M(s)}),i.add(s);break;case\"required\":if(\"proto2\"!==w)throw k(t);case\"repeated\":I(u,t);break;case\"optional\":if(\"proto3\"===w)I(u,\"proto3_optional\");else{if(\"proto2\"!==w)throw k(t);I(u,\"optional\")}break;case\"oneof\":e=u,n=t;if(!tt.test(n=c()))throw k(n,\"name\");var o=new D(j(n));x(o,function(t){\"option\"===t?(L(o,t),p(\";\")):(l(t),I(o,\"optional\"))}),e.add(o);break;case\"extensions\":A(u.extensions||(u.extensions=[]));break;case\"reserved\":A(u.reserved||(u.reserved=[]),!0);break;default:if(\"proto2\"===w||!it.test(t))throw k(t);l(t),I(u,\"optional\")}}),t.add(u),t===y&&m.push(u)}function I(t,i,n){var r=c();if(\"group\"===r){var e=t,s=i;if(2023<=w)throw k(\"group\");var o,u,f=c();if(tt.test(f))return u=B.lcFirst(f),f===u&&(f=B.ucFirst(f)),p(\"=\"),h=T(c()),(o=new P(f)).group=!0,(u=new R(u,h,f,s)).filename=nt.filename,x(o,function(t){switch(t){case\"option\":L(o,t),p(\";\");break;case\"required\":case\"repeated\":I(o,t);break;case\"optional\":I(o,\"proto3\"===w?\"proto3_optional\":\"optional\");break;case\"message\":S(o);break;case\"enum\":N(o);break;case\"reserved\":A(o.reserved||(o.reserved=[]),!0);break;default:throw k(t)}}),void e.add(o).add(u);throw k(f,\"name\")}for(;r.endsWith(\".\")||d().startsWith(\".\");)r+=c();if(!it.test(r))throw k(r,\"type\");var h=c();if(!tt.test(h))throw k(h,\"name\");h=j(h),p(\"=\");var a=new R(h,T(c()),r,i,n);x(a,function(t){if(\"option\"!==t)throw k(t);L(a,t),p(\";\")},function(){M(a)}),\"proto3_optional\"===i?(s=new D(\"_\"+h),a.setOption(\"proto3_optional\",!0),s.add(a),t.add(s)):t.add(a),t===y&&m.push(a)}function N(t,i){if(!tt.test(i=c()))throw k(i,\"name\");var s=new q(i);x(s,function(t){switch(t){case\"option\":L(s,t),p(\";\");break;case\"reserved\":A(s.reserved||(s.reserved=[]),!0),s.reserved===rt&&(s.reserved=[]);break;default:var i=s,n=t;if(!tt.test(n))throw k(n,\"name\");p(\"=\");var r=T(c(),!0),e={options:rt,getOption:function(t){return this.options[t]},setOption:function(t,i){X.prototype.setOption.call(e,t,i)},setParsedOption:function(){return rt}};return x(e,function(t){if(\"option\"!==t)throw k(t);L(e,t),p(\";\")},function(){M(e)}),void i.add(n,r,e.comment,e.parsedOptions||e.options)}}),t.add(s),t===y&&m.push(s)}function L(t,i){var n=!0;for(\"option\"===i&&(i=c());\"=\"!==i;){if(\"(\"===i&&(r=c(),p(\")\"),i=\"(\"+r+\")\"),n){if(n=!1,i.includes(\".\")&&!i.includes(\"(\")){var r=i.split(\".\"),e=r[0]+\".\";i=r[1];continue}e=i}else f=f?f+i:i;i=c()}var s,o,u=f?e.concat(f):e,u=function t(i,n){if(p(\"{\",!0)){for(var r={};!p(\"}\",!0);){if(!tt.test(h=c()))throw k(h,\"name\");if(null===h)throw k(h,\"end of input\");var e,s,o=h;if(p(\":\",!0),\"{\"===d())e=t(i,n+\".\"+h);else if(\"[\"===d()){if(e=[],p(\"[\",!0)){for(;s=O(!0),e.push(s),p(\",\",!0););p(\"]\"),void 0!==s&&V(i,n+\".\"+h,s)}}else e=O(!0),V(i,n+\".\"+h,e);var u=r[o];u&&(e=[].concat(u).concat(e)),r[o]=e,p(\",\",!0),p(\";\",!0)}return r}var f=O(!0);V(i,n,f);return f}(t,u),f=f&&\".\"===f[0]?f.slice(1):f;e=e&&\".\"===e[e.length-1]?e.slice(0,-1):e,s=e,u=u,o=f,(t=t).setParsedOption&&t.setParsedOption(s,u,o)}function V(t,i,n){y===t&&/^features\\./.test(i)?g[i]=n:t.setOption&&t.setOption(i,n)}function M(t){if(p(\"[\",!0)){for(;L(t,\"option\"),p(\",\",!0););p(\"]\")}}for(;null!==(h=c());)switch(h){case\"package\":if(!b)throw k(h);if(r!==rt)throw k(\"package\");if(r=c(),!it.test(r))throw k(r,\"name\");y=y.define(r),p(\";\");break;case\"import\":if(!b)throw k(h);switch(u=o=void 0,d()){case\"weak\":u=s=s||[],c();break;case\"public\":c();default:u=e=e||[]}o=E(),p(\";\"),u.push(o);break;case\"syntax\":if(!b)throw k(h);if(p(\"=\"),(w=E())<2023)throw k(w,\"syntax\");p(\";\");break;case\"edition\":if(!b)throw k(h);if(p(\"=\"),w=E(),![\"2023\"].includes(w))throw k(w,\"edition\");p(\";\");break;case\"option\":L(y,h),p(\";\",!0);break;default:if(_(y,h)){b=!1;continue}throw k(h)}return m.forEach(i=>{i.f=w,Object.keys(g).forEach(t=>{i.getOption(t)===rt&&i.setOption(t,g[t],!0)})}),nt.filename=null,{package:r,imports:e,weakImports:s,root:i}}},{15:15,16:16,20:20,22:22,24:24,25:25,29:29,33:33,34:34,35:35,36:36,37:37}],27:[function(t,i,n){i.exports=f;var r,e=t(39),s=e.LongBits,o=e.utf8;function u(t,i){return RangeError(\"index out of range: \"+t.pos+\" + \"+(i||1)+\" > \"+t.len)}function f(t){this.buf=t,this.pos=0,this.len=t.length}function h(){return e.Buffer?function(t){return(f.create=function(t){return e.Buffer.isBuffer(t)?new r(t):c(t)})(t)}:c}var a,c=\"undefined\"!=typeof Uint8Array?function(t){if(t instanceof Uint8Array||Array.isArray(t))return new f(t);throw Error(\"illegal buffer\")}:function(t){if(Array.isArray(t))return new f(t);throw Error(\"illegal buffer\")};function l(){var t=new s(0,0),i=0;if(!(4<this.len-this.pos)){for(;i<3;++i){if(this.pos>=this.len)throw u(this);if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*i)>>>0,this.buf[this.pos++]<128)return t}return t.lo=(t.lo|(127&this.buf[this.pos++])<<7*i)>>>0,t}for(;i<4;++i)if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*i)>>>0,this.buf[this.pos++]<128)return t;if(t.lo=(t.lo|(127&this.buf[this.pos])<<28)>>>0,t.hi=(t.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return t;if(i=0,4<this.len-this.pos){for(;i<5;++i)if(t.hi=(t.hi|(127&this.buf[this.pos])<<7*i+3)>>>0,this.buf[this.pos++]<128)return t}else for(;i<5;++i){if(this.pos>=this.len)throw u(this);if(t.hi=(t.hi|(127&this.buf[this.pos])<<7*i+3)>>>0,this.buf[this.pos++]<128)return t}throw Error(\"invalid varint encoding\")}function d(t,i){return(t[i-4]|t[i-3]<<8|t[i-2]<<16|t[i-1]<<24)>>>0}function p(){if(this.pos+8>this.len)throw u(this,8);return new s(d(this.buf,this.pos+=4),d(this.buf,this.pos+=4))}f.create=h(),f.prototype._=e.Array.prototype.subarray||e.Array.prototype.slice,f.prototype.uint32=(a=4294967295,function(){if(a=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128||(a=(a|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128||(a=(a|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128||(a=(a|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128||(a=(a|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128||!((this.pos+=5)>this.len))))))return a;throw this.pos=this.len,u(this,10)}),f.prototype.int32=function(){return 0|this.uint32()},f.prototype.sint32=function(){var t=this.uint32();return t>>>1^-(1&t)|0},f.prototype.bool=function(){return 0!==this.uint32()},f.prototype.fixed32=function(){if(this.pos+4>this.len)throw u(this,4);return d(this.buf,this.pos+=4)},f.prototype.sfixed32=function(){if(this.pos+4>this.len)throw u(this,4);return 0|d(this.buf,this.pos+=4)},f.prototype.float=function(){if(this.pos+4>this.len)throw u(this,4);var t=e.float.readFloatLE(this.buf,this.pos);return this.pos+=4,t},f.prototype.double=function(){if(this.pos+8>this.len)throw u(this,4);var t=e.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,t},f.prototype.bytes=function(){var t=this.uint32(),i=this.pos,n=this.pos+t;if(n>this.len)throw u(this,t);return this.pos+=t,Array.isArray(this.buf)?this.buf.slice(i,n):i===n?(t=e.Buffer)?t.alloc(0):new this.buf.constructor(0):this._.call(this.buf,i,n)},f.prototype.string=function(){var t=this.bytes();return o.read(t,0,t.length)},f.prototype.skip=function(t){if(\"number\"==typeof t){if(this.pos+t>this.len)throw u(this,t);this.pos+=t}else do{if(this.pos>=this.len)throw u(this)}while(128&this.buf[this.pos++]);return this},f.prototype.skipType=function(t){switch(t){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;4!=(t=7&this.uint32());)this.skipType(t);break;case 5:this.skip(4);break;default:throw Error(\"invalid wire type \"+t+\" at offset \"+this.pos)}return this},f.p=function(t){r=t,f.create=h(),r.p();var i=e.Long?\"toLong\":\"toNumber\";e.merge(f.prototype,{int64:function(){return l.call(this)[i](!1)},uint64:function(){return l.call(this)[i](!0)},sint64:function(){return l.call(this).zzDecode()[i](!1)},fixed64:function(){return p.call(this)[i](!0)},sfixed64:function(){return p.call(this)[i](!1)}})}},{39:39}],28:[function(t,i,n){i.exports=s;var r=t(27),e=((s.prototype=Object.create(r.prototype)).constructor=s,t(39));function s(t){r.call(this,t)}s.p=function(){e.Buffer&&(s.prototype._=e.Buffer.prototype.slice)},s.prototype.string=function(){var t=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+t,this.len)):this.buf.toString(\"utf-8\",this.pos,this.pos=Math.min(this.pos+t,this.len))},s.p()},{27:27,39:39}],29:[function(t,i,n){i.exports=f;var r,d,p,e=t(23),s=(((f.prototype=Object.create(e.prototype)).constructor=f).className=\"Root\",t(16)),o=t(15),u=t(25),v=t(37);function f(t){e.call(this,\"\",t),this.deferred=[],this.files=[],this.f=\"proto2\",this.j={}}function b(){}f.fromJSON=function(t,i){return i=i||new f,t.options&&i.setOptions(t.options),i.addJSON(t.nested).resolveAll()},f.prototype.resolvePath=v.path.resolve,f.prototype.fetch=v.fetch,f.prototype.load=function t(i,s,e){\"function\"==typeof s&&(e=s,s=rt);var o=this;if(!e)return v.asPromise(t,o,i,s);var u=e===b;function f(t,i){if(e){if(u)throw t;i&&i.resolveAll();var n=e;e=null,n(t,i)}}function h(t){var i=t.lastIndexOf(\"google/protobuf/\");if(-1<i){t=t.substring(i);if(t in p)return t}return null}function a(t,i){try{if(v.isString(i)&&\"{\"==(i[0]||\"\")&&(i=JSON.parse(i)),v.isString(i)){d.filename=t;var n,r=d(i,o,s),e=0;if(r.imports)for(;e<r.imports.length;++e)(n=h(r.imports[e])||o.resolvePath(t,r.imports[e]))&&c(n);if(r.weakImports)for(e=0;e<r.weakImports.length;++e)(n=h(r.weakImports[e])||o.resolvePath(t,r.weakImports[e]))&&c(n,!0)}else o.setOptions(i.options).addJSON(i.nested)}catch(t){f(t)}u||l||f(null,o)}function c(n,r){if(n=h(n)||n,!~o.files.indexOf(n))if(o.files.push(n),n in p)u?a(n,p[n]):(++l,setTimeout(function(){--l,a(n,p[n])}));else if(u){var t;try{t=v.fs.readFileSync(n).toString(\"utf8\")}catch(t){return void(r||f(t))}a(n,t)}else++l,o.fetch(n,function(t,i){--l,e&&(t?r?l||f(null,o):f(t):a(n,i))})}var l=0;v.isString(i)&&(i=[i]);for(var n,r=0;r<i.length;++r)(n=o.resolvePath(\"\",i[r]))&&c(n);return u?o.resolveAll():l||f(null,o),o},f.prototype.loadSync=function(t,i){if(v.isNode)return this.load(t,i,b);throw Error(\"not supported\")},f.prototype.resolveAll=function(){if(!this.y)return this;if(this.deferred.length)throw Error(\"unresolvable extensions: \"+this.deferred.map(function(t){return\"'extend \"+t.extend+\"' in \"+t.parent.fullName}).join(\", \"));return e.prototype.resolveAll.call(this)};var h=/^[A-Z]/;function a(t,i){var n,r=i.parent.lookup(i.extend);if(r)return n=new s(i.fullName,i.id,i.type,i.rule,rt,i.options),r.get(n.name)||((n.declaringField=i).extensionField=n,r.add(n)),1}f.prototype.A=function(t){if(t instanceof s)t.extend===rt||t.extensionField||a(0,t)||this.deferred.push(t);else if(t instanceof o)h.test(t.name)&&(t.parent[t.name]=t.values);else if(!(t instanceof u)){if(t instanceof r)for(var i=0;i<this.deferred.length;)a(0,this.deferred[i])?this.deferred.splice(i,1):++i;for(var n=0;n<t.nestedArray.length;++n)this.A(t.v[n]);h.test(t.name)&&(t.parent[t.name]=t)}(t instanceof r||t instanceof o||t instanceof s)&&(this.j[t.fullName]=t)},f.prototype.T=function(t){var i;if(t instanceof s)t.extend!==rt&&(t.extensionField?(t.extensionField.parent.remove(t.extensionField),t.extensionField=null):-1<(i=this.deferred.indexOf(t))&&this.deferred.splice(i,1));else if(t instanceof o)h.test(t.name)&&delete t.parent[t.name];else if(t instanceof e){for(var n=0;n<t.nestedArray.length;++n)this.T(t.v[n]);h.test(t.name)&&delete t.parent[t.name]}delete this.j[t.fullName]},f.p=function(t,i,n){r=t,d=i,p=n}},{15:15,16:16,23:23,25:25,37:37}],30:[function(t,i,n){i.exports={}},{}],31:[function(t,i,n){n.Service=t(32)},{32:32}],32:[function(t,i,n){i.exports=r;var u=t(39);function r(t,i,n){if(\"function\"!=typeof t)throw TypeError(\"rpcImpl must be a function\");u.EventEmitter.call(this),this.rpcImpl=t,this.requestDelimited=!!i,this.responseDelimited=!!n}((r.prototype=Object.create(u.EventEmitter.prototype)).constructor=r).prototype.rpcCall=function t(n,i,r,e,s){if(!e)throw TypeError(\"request must be specified\");var o=this;if(!s)return u.asPromise(t,o,n,i,r,e);if(!o.rpcImpl)return setTimeout(function(){s(Error(\"already ended\"))},0),rt;try{return o.rpcImpl(n,i[o.requestDelimited?\"encodeDelimited\":\"encode\"](e).finish(),function(t,i){if(t)return o.emit(\"error\",t,n),s(t);if(null===i)return o.end(!0),rt;if(!(i instanceof r))try{i=r[o.responseDelimited?\"decodeDelimited\":\"decode\"](i)}catch(t){return o.emit(\"error\",t,n),s(t)}return o.emit(\"data\",i,n),s(null,i)})}catch(t){return o.emit(\"error\",t,n),setTimeout(function(){s(t)},0),rt}},r.prototype.end=function(t){return this.rpcImpl&&(t||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit(\"end\").off()),this}},{39:39}],33:[function(t,i,n){i.exports=o;var r=t(23),s=(((o.prototype=Object.create(r.prototype)).constructor=o).className=\"Service\",t(22)),u=t(37),f=t(31);function o(t,i){r.call(this,t,i),this.methods={},this.x=null}function e(t){return t.x=null,t}o.fromJSON=function(t,i){var n=new o(t,i.options);if(i.methods)for(var r=Object.keys(i.methods),e=0;e<r.length;++e)n.add(s.fromJSON(r[e],i.methods[r[e]]));return i.nested&&n.addJSON(i.nested),i.edition&&(n.f=i.edition),n.comment=i.comment,n.a=\"proto3\",n},o.prototype.toJSON=function(t){var i=r.prototype.toJSON.call(this,t),n=!!t&&!!t.keepComments;return u.toObject([\"edition\",this.c(),\"options\",i&&i.options||rt,\"methods\",r.arrayToJSON(this.methodsArray,t)||{},\"nested\",i&&i.nested||rt,\"comment\",n?this.comment:rt])},Object.defineProperty(o.prototype,\"methodsArray\",{get:function(){return this.x||(this.x=u.toArray(this.methods))}}),o.prototype.get=function(t){return this.methods[t]||r.prototype.get.call(this,t)},o.prototype.resolveAll=function(){if(this.y){r.prototype.resolve.call(this);for(var t=this.methodsArray,i=0;i<t.length;++i)t[i].resolve()}return this},o.prototype.g=function(i){return this.w&&(i=this.f||i,r.prototype.g.call(this,i),this.methodsArray.forEach(t=>{t.g(i)})),this},o.prototype.add=function(t){if(this.get(t.name))throw Error(\"duplicate name '\"+t.name+\"' in \"+this);return t instanceof s?e((this.methods[t.name]=t).parent=this):r.prototype.add.call(this,t)},o.prototype.remove=function(t){if(t instanceof s){if(this.methods[t.name]!==t)throw Error(t+\" is not a member of \"+this);return delete this.methods[t.name],t.parent=null,e(this)}return r.prototype.remove.call(this,t)},o.prototype.create=function(t,i,n){for(var r,e=new f.Service(t,i,n),s=0;s<this.methodsArray.length;++s){var o=u.lcFirst((r=this.x[s]).resolve().name).replace(/[^$\\w_]/g,\"\");e[o]=u.codegen([\"r\",\"c\"],u.isReserved(o)?o+\"_\":o)(\"return this.rpcCall(m,q,s,r,c)\")({m:r,q:r.resolvedRequestType.ctor,s:r.resolvedResponseType.ctor})}return e}},{22:22,23:23,31:31,37:37}],34:[function(t,i,n){i.exports=s;var E=/[\\s{}=;:[\\],'\"()<>]/g,O=/(?:\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\")/g,A=/(?:'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)')/g,T=/^ *[*/]+ */,_=/^\\s*\\*?\\/*/,x=/\\n/g,S=/\\s/,r=/\\\\(.?)/g,e={0:\"\\0\",r:\"\\r\",n:\"\\n\",t:\"\\t\"};function I(t){return t.replace(r,function(t,i){switch(i){case\"\\\\\":case\"\":return i;default:return e[i]||\"\"}})}function s(h,a){h=h.toString();var c=0,l=h.length,d=1,f=0,p={},v=[],b=null;function w(t){return Error(\"illegal \"+t+\" (line \"+d+\")\")}function y(t){return h[0|t]||\"\"}function m(t,i,n){var r,e={type:h[0|t++]||\"\",lineEmpty:!1,leading:n},n=a?2:3,s=t-n;do{if(--s<0||\"\\n\"==(r=h[0|s]||\"\")){e.lineEmpty=!0;break}}while(\" \"===r||\"\\t\"===r);for(var o=h.substring(t,i).split(x),u=0;u<o.length;++u)o[u]=o[u].replace(a?_:T,\"\").trim();e.text=o.join(\"\\n\").trim(),p[d]=e,f=d}function g(t){var i=j(t),t=h.substring(t,i);return/^\\s*\\/\\//.test(t)}function j(t){for(var i=t;i<l&&\"\\n\"!==y(i);)i++;return i}function r(){if(0<v.length)return v.shift();if(b){var t=\"'\"===b?A:O,i=(t.lastIndex=c-1,t.exec(h));if(i)return c=t.lastIndex,k(b),b=null,I(i[1]);throw w(\"string\")}var n,r,e,s,o,u=0===c;do{if(c===l)return null;for(n=!1;S.test(e=y(c));)if(\"\\n\"===e&&(u=!0,++d),++c===l)return null;if(\"/\"===y(c)){if(++c===l)throw w(\"comment\");if(\"/\"===y(c))if(a){if(o=!1,g((s=c)-1))for(o=!0;(c=j(c))!==l&&(c++,u&&g(c)););else c=Math.min(l,j(c)+1);o&&(m(s,c,u),u=!0),d++}else{for(o=\"/\"===y(s=c+1);\"\\n\"!==y(++c);)if(c===l)return null;++c,o&&(m(s,c-1,u),u=!0),++d}else{if(\"*\"!==(e=y(c)))return\"/\";s=c+1,o=a||\"*\"===y(s);do{if(\"\\n\"===e&&++d,++c===l)throw w(\"comment\")}while(r=e,e=y(c),\"*\"!==r||\"/\"!==e);++c,o&&(m(s,c-2,u),u=!0)}n=!0}}while(n);var f=c;if(E.lastIndex=0,!E.test(y(f++)))for(;f<l&&!E.test(y(f));)++f;t=h.substring(c,c=f);return'\"'!=t&&\"'\"!=t||(b=t),t}function k(t){v.push(t)}function e(){if(!v.length){var t=r();if(null===t)return null;k(t)}return v[0]}return Object.defineProperty({next:r,peek:e,push:k,skip:function(t,i){var n=e();if(n===t)return r(),!0;if(i)return!1;throw w(\"token '\"+n+\"', '\"+t+\"' expected\")},cmnt:function(t){var i,n=null;return t===rt?(i=p[d-1],delete p[d-1],i&&(a||\"*\"===i.type||i.lineEmpty)&&(n=i.leading?i.text:null)):(f<t&&e(),i=p[t],delete p[t],!i||i.lineEmpty||!a&&\"/\"!==i.type||(n=i.leading?null:i.text)),n}},\"line\",{get:function(){return d}})}s.unescape=I},{}],35:[function(t,i,n){i.exports=m;var o=t(23),u=(((m.prototype=Object.create(o.prototype)).constructor=m).className=\"Type\",t(15)),f=t(25),h=t(16),a=t(20),c=t(33),e=t(21),s=t(27),l=t(42),d=t(37),p=t(14),v=t(13),b=t(40),w=t(12),y=t(41);function m(t,i){o.call(this,t,i),this.fields={},this.oneofs=rt,this.extensions=rt,this.reserved=rt,this.group=rt,this.S=null,this.e=null,this.I=null,this.N=null}function r(t){return t.S=t.e=t.I=null,delete t.encode,delete t.decode,delete t.verify,t}Object.defineProperties(m.prototype,{fieldsById:{get:function(){if(!this.S){this.S={};for(var t=Object.keys(this.fields),i=0;i<t.length;++i){var n=this.fields[t[i]],r=n.id;if(this.S[r])throw Error(\"duplicate id \"+r+\" in \"+this);this.S[r]=n}}return this.S}},fieldsArray:{get:function(){return this.e||(this.e=d.toArray(this.fields))}},oneofsArray:{get:function(){return this.I||(this.I=d.toArray(this.oneofs))}},ctor:{get:function(){return this.N||(this.ctor=m.generateConstructor(this)())},set:function(t){for(var i=t.prototype,n=(i instanceof e||((t.prototype=new e).constructor=t,d.merge(t.prototype,i)),t.$type=t.prototype.$type=this,d.merge(t,e,!0),this.N=t,0);n<this.fieldsArray.length;++n)this.e[n].resolve();for(var r={},n=0;n<this.oneofsArray.length;++n)r[this.I[n].resolve().name]={get:d.oneOfGetter(this.I[n].oneof),set:d.oneOfSetter(this.I[n].oneof)};n&&Object.defineProperties(t.prototype,r)}}}),m.generateConstructor=function(t){for(var i,n=d.codegen([\"p\"],t.name),r=0;r<t.fieldsArray.length;++r)(i=t.e[r]).map?n(\"this%s={}\",d.safeProp(i.name)):i.repeated&&n(\"this%s=[]\",d.safeProp(i.name));return n(\"if(p)for(var ks=Object.keys(p),i=0;i<ks.length;++i)if(p[ks[i]]!=null)\")(\"this[ks[i]]=p[ks[i]]\")},m.fromJSON=function(t,i){for(var n=new m(t,i.options),r=(n.extensions=i.extensions,n.reserved=i.reserved,Object.keys(i.fields)),e=0;e<r.length;++e)n.add((void 0!==i.fields[r[e]].keyType?a:h).fromJSON(r[e],i.fields[r[e]]));if(i.oneofs)for(r=Object.keys(i.oneofs),e=0;e<r.length;++e)n.add(f.fromJSON(r[e],i.oneofs[r[e]]));if(i.nested)for(r=Object.keys(i.nested),e=0;e<r.length;++e){var s=i.nested[r[e]];n.add((s.id!==rt?h:s.fields!==rt?m:s.values!==rt?u:s.methods!==rt?c:o).fromJSON(r[e],s))}return i.extensions&&i.extensions.length&&(n.extensions=i.extensions),i.reserved&&i.reserved.length&&(n.reserved=i.reserved),i.group&&(n.group=!0),i.comment&&(n.comment=i.comment),i.edition&&(n.f=i.edition),n.a=\"proto3\",n},m.prototype.toJSON=function(t){var i=o.prototype.toJSON.call(this,t),n=!!t&&!!t.keepComments;return d.toObject([\"edition\",this.c(),\"options\",i&&i.options||rt,\"oneofs\",o.arrayToJSON(this.oneofsArray,t),\"fields\",o.arrayToJSON(this.fieldsArray.filter(function(t){return!t.declaringField}),t)||{},\"extensions\",this.extensions&&this.extensions.length?this.extensions:rt,\"reserved\",this.reserved&&this.reserved.length?this.reserved:rt,\"group\",this.group||rt,\"nested\",i&&i.nested||rt,\"comment\",n?this.comment:rt])},m.prototype.resolveAll=function(){if(this.y){o.prototype.resolveAll.call(this);for(var t=this.oneofsArray,i=0;i<t.length;)t[i++].resolve();for(var n=this.fieldsArray,i=0;i<n.length;)n[i++].resolve()}return this},m.prototype.g=function(i){return this.w&&(i=this.f||i,o.prototype.g.call(this,i),this.oneofsArray.forEach(t=>{t.u(i)}),this.fieldsArray.forEach(t=>{t.u(i)})),this},m.prototype.get=function(t){return this.fields[t]||this.oneofs&&this.oneofs[t]||this.nested&&this.nested[t]||null},m.prototype.add=function(t){if(this.get(t.name))throw Error(\"duplicate name '\"+t.name+\"' in \"+this);if(t instanceof h&&t.extend===rt){if((this.S||this.fieldsById)[t.id])throw Error(\"duplicate id \"+t.id+\" in \"+this);if(this.isReservedId(t.id))throw Error(\"id \"+t.id+\" is reserved in \"+this);if(this.isReservedName(t.name))throw Error(\"name '\"+t.name+\"' is reserved in \"+this);return t.parent&&t.parent.remove(t),(this.fields[t.name]=t).message=this,t.onAdd(this),r(this)}return t instanceof f?(this.oneofs||(this.oneofs={}),(this.oneofs[t.name]=t).onAdd(this),r(this)):o.prototype.add.call(this,t)},m.prototype.remove=function(t){if(t instanceof h&&t.extend===rt){if(this.fields&&this.fields[t.name]===t)return delete this.fields[t.name],t.parent=null,t.onRemove(this),r(this);throw Error(t+\" is not a member of \"+this)}if(t instanceof f){if(this.oneofs&&this.oneofs[t.name]===t)return delete this.oneofs[t.name],t.parent=null,t.onRemove(this),r(this);throw Error(t+\" is not a member of \"+this)}return o.prototype.remove.call(this,t)},m.prototype.isReservedId=function(t){return o.isReservedId(this.reserved,t)},m.prototype.isReservedName=function(t){return o.isReservedName(this.reserved,t)},m.prototype.create=function(t){return new this.ctor(t)},m.prototype.setup=function(){for(var t=this.fullName,i=[],n=0;n<this.fieldsArray.length;++n)i.push(this.e[n].resolve().resolvedType);this.encode=p(this)({Writer:l,types:i,util:d}),this.decode=v(this)({Reader:s,types:i,util:d}),this.verify=b(this)({types:i,util:d}),this.fromObject=w.fromObject(this)({types:i,util:d}),this.toObject=w.toObject(this)({types:i,util:d});var r,t=y[t];return t&&((r=Object.create(this)).fromObject=this.fromObject,this.fromObject=t.fromObject.bind(r),r.toObject=this.toObject,this.toObject=t.toObject.bind(r)),this},m.prototype.encode=function(t,i){return this.setup().encode(t,i)},m.prototype.encodeDelimited=function(t,i){return this.encode(t,i&&i.len?i.fork():i).ldelim()},m.prototype.decode=function(t,i){return this.setup().decode(t,i)},m.prototype.decodeDelimited=function(t){return t instanceof s||(t=s.create(t)),this.decode(t,t.uint32())},m.prototype.verify=function(t){return this.setup().verify(t)},m.prototype.fromObject=function(t){return this.setup().fromObject(t)},m.prototype.toObject=function(t,i){return this.setup().toObject(t,i)},m.d=function(i){return function(t){d.decorateType(t,i)}}},{12:12,13:13,14:14,15:15,16:16,20:20,21:21,23:23,25:25,27:27,33:33,37:37,40:40,41:41,42:42}],36:[function(t,i,n){var t=t(37),e=[\"double\",\"float\",\"int32\",\"uint32\",\"sint32\",\"fixed32\",\"sfixed32\",\"int64\",\"uint64\",\"sint64\",\"fixed64\",\"sfixed64\",\"bool\",\"string\",\"bytes\"];function r(t,i){var n=0,r={};for(i|=0;n<t.length;)r[e[n+i]]=t[n++];return r}n.basic=r([1,5,0,0,0,5,5,0,0,0,1,1,0,2,2]),n.defaults=r([0,0,0,0,0,0,0,0,0,0,0,0,!1,\"\",t.emptyArray,null]),n.long=r([0,0,0,1,1],7),n.mapKey=r([0,0,0,5,5,0,0,0,1,1,0,2],2),n.packed=r([1,5,0,0,0,5,5,0,0,0,1,1,0])},{37:37}],37:[function(n,t,i){var r,e,s=t.exports=n(39),o=n(30),u=(s.codegen=n(3),s.fetch=n(5),s.path=n(8),s.fs=s.inquire(\"fs\"),s.toArray=function(t){if(t){for(var i=Object.keys(t),n=Array(i.length),r=0;r<i.length;)n[r]=t[i[r++]];return n}return[]},s.toObject=function(t){for(var i={},n=0;n<t.length;){var r=t[n++],e=t[n++];e!==rt&&(i[r]=e)}return i},/\\\\/g),f=/\"/g,h=(s.isReserved=function(t){return/^(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$/.test(t)},s.safeProp=function(t){return!/^[$\\w_]+$/.test(t)||s.isReserved(t)?'[\"'+t.replace(u,\"\\\\\\\\\").replace(f,'\\\\\"')+'\"]':\".\"+t},s.ucFirst=function(t){return(t[0]||\"\").toUpperCase()+t.substring(1)},/_([a-z])/g),a=(s.camelCase=function(t){return t.substring(0,1)+t.substring(1).replace(h,function(t,i){return i.toUpperCase()})},s.compareFieldsById=function(t,i){return t.id-i.id},s.decorateType=function(t,i){return t.$type?(i&&t.$type.name!==i&&(s.decorateRoot.remove(t.$type),t.$type.name=i,s.decorateRoot.add(t.$type)),t.$type):(i=new(r=r||n(35))(i||t.name),s.decorateRoot.add(i),i.ctor=t,Object.defineProperty(t,\"$type\",{value:i,enumerable:!1}),Object.defineProperty(t.prototype,\"$type\",{value:i,enumerable:!1}),i)},0);s.decorateEnum=function(t){var i;return t.$type||(i=new(e=e||n(15))(\"Enum\"+a++,t),s.decorateRoot.add(i),Object.defineProperty(t,\"$type\",{value:i,enumerable:!1}),i)},s.setProperty=function(t,i,n,s){if(\"object\"!=typeof t)throw TypeError(\"dst must be an object\");if(i)return function t(i,n,r){var e=n.shift();if(\"__proto__\"!==e&&\"prototype\"!==e)if(0<n.length)i[e]=t(i[e]||{},n,r);else{if((n=i[e])&&s)return i;n&&(r=[].concat(n).concat(r)),i[e]=r}return i}(t,i=i.split(\".\"),n);throw TypeError(\"path must be specified\")},Object.defineProperty(s,\"decorateRoot\",{get:function(){return o.decorated||(o.decorated=new(n(29)))}})},{15:15,29:29,3:3,30:30,35:35,39:39,5:5,8:8}],38:[function(t,i,n){i.exports=e;var r=t(39);function e(t,i){this.lo=t>>>0,this.hi=i>>>0}var s=e.zero=new e(0,0),o=(s.toNumber=function(){return 0},s.zzEncode=s.zzDecode=function(){return this},s.length=function(){return 1},e.zeroHash=\"\\0\\0\\0\\0\\0\\0\\0\\0\",e.fromNumber=function(t){var i,n;return 0===t?s:(n=(t=(i=t<0)?-t:t)>>>0,t=(t-n)/4294967296>>>0,i&&(t=~t>>>0,n=~n>>>0,4294967295<++n&&(n=0,4294967295<++t&&(t=0))),new e(n,t))},e.from=function(t){if(\"number\"==typeof t)return e.fromNumber(t);if(r.isString(t)){if(!r.Long)return e.fromNumber(parseInt(t,10));t=r.Long.fromString(t)}return t.low||t.high?new e(t.low>>>0,t.high>>>0):s},e.prototype.toNumber=function(t){var i;return!t&&this.hi>>>31?(t=1+~this.lo>>>0,i=~this.hi>>>0,-(t+4294967296*(i=t?i:i+1>>>0))):this.lo+4294967296*this.hi},e.prototype.toLong=function(t){return r.Long?new r.Long(0|this.lo,0|this.hi,!!t):{low:0|this.lo,high:0|this.hi,unsigned:!!t}},String.prototype.charCodeAt);e.fromHash=function(t){return\"\\0\\0\\0\\0\\0\\0\\0\\0\"===t?s:new e((o.call(t,0)|o.call(t,1)<<8|o.call(t,2)<<16|o.call(t,3)<<24)>>>0,(o.call(t,4)|o.call(t,5)<<8|o.call(t,6)<<16|o.call(t,7)<<24)>>>0)},e.prototype.toHash=function(){return String.fromCharCode(255&this.lo,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,255&this.hi,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},e.prototype.zzEncode=function(){var t=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^t)>>>0,this.lo=(this.lo<<1^t)>>>0,this},e.prototype.zzDecode=function(){var t=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^t)>>>0,this.hi=(this.hi>>>1^t)>>>0,this},e.prototype.length=function(){var t=this.lo,i=(this.lo>>>28|this.hi<<4)>>>0,n=this.hi>>>24;return 0==n?0==i?t<16384?t<128?1:2:t<2097152?3:4:i<16384?i<128?5:6:i<2097152?7:8:n<128?9:10}},{39:39}],39:[function(t,i,n){var r=n;function e(t,i,n){for(var r=Object.keys(i),e=0;e<r.length;++e)t[r[e]]!==rt&&n||(t[r[e]]=i[r[e]]);return t}function s(t){function n(t,i){if(!(this instanceof n))return new n(t,i);Object.defineProperty(this,\"message\",{get:function(){return t}}),Error.captureStackTrace?Error.captureStackTrace(this,n):Object.defineProperty(this,\"stack\",{value:Error().stack||\"\"}),i&&e(this,i)}return n.prototype=Object.create(Error.prototype,{constructor:{value:n,writable:!0,enumerable:!1,configurable:!0},name:{get:function(){return t},set:rt,enumerable:!1,configurable:!0},toString:{value:function(){return this.name+\": \"+this.message},writable:!0,enumerable:!1,configurable:!0}}),n}r.asPromise=t(1),r.base64=t(2),r.EventEmitter=t(4),r.float=t(6),r.inquire=t(7),r.utf8=t(10),r.pool=t(9),r.LongBits=t(38),r.isNode=!!(\"undefined\"!=typeof global&&global&&global.process&&global.process.versions&&global.process.versions.node),r.global=r.isNode&&global||\"undefined\"!=typeof window&&window||\"undefined\"!=typeof self&&self||this,r.emptyArray=Object.freeze?Object.freeze([]):[],r.emptyObject=Object.freeze?Object.freeze({}):{},r.isInteger=Number.isInteger||function(t){return\"number\"==typeof t&&isFinite(t)&&Math.floor(t)===t},r.isString=function(t){return\"string\"==typeof t||t instanceof String},r.isObject=function(t){return t&&\"object\"==typeof t},r.isset=r.isSet=function(t,i){var n=t[i];return null!=n&&t.hasOwnProperty(i)&&(\"object\"!=typeof n||0<(Array.isArray(n)?n:Object.keys(n)).length)},r.Buffer=function(){try{var t=r.inquire(\"buffer\").Buffer;return t.prototype.utf8Write?t:null}catch(t){return null}}(),r.L=null,r.V=null,r.newBuffer=function(t){return\"number\"==typeof t?r.Buffer?r.V(t):new r.Array(t):r.Buffer?r.L(t):\"undefined\"==typeof Uint8Array?t:new Uint8Array(t)},r.Array=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,r.Long=r.global.dcodeIO&&r.global.dcodeIO.Long||r.global.Long||r.inquire(\"long\"),r.key2Re=/^true|false|0|1$/,r.key32Re=/^-?(?:0|[1-9][0-9]*)$/,r.key64Re=/^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,r.longToHash=function(t){return t?r.LongBits.from(t).toHash():r.LongBits.zeroHash},r.longFromHash=function(t,i){t=r.LongBits.fromHash(t);return r.Long?r.Long.fromBits(t.lo,t.hi,i):t.toNumber(!!i)},r.merge=e,r.lcFirst=function(t){return(t[0]||\"\").toLowerCase()+t.substring(1)},r.newError=s,r.ProtocolError=s(\"ProtocolError\"),r.oneOfGetter=function(t){for(var n={},i=0;i<t.length;++i)n[t[i]]=1;return function(){for(var t=Object.keys(this),i=t.length-1;-1<i;--i)if(1===n[t[i]]&&this[t[i]]!==rt&&null!==this[t[i]])return t[i]}},r.oneOfSetter=function(n){return function(t){for(var i=0;i<n.length;++i)n[i]!==t&&delete this[n[i]]}},r.toJSONOptions={longs:String,enums:String,bytes:String,json:!0},r.p=function(){var n=r.Buffer;n?(r.L=n.from!==Uint8Array.from&&n.from||function(t,i){return new n(t,i)},r.V=n.allocUnsafe||function(t){return new n(t)}):r.L=r.V=null}},{1:1,10:10,2:2,38:38,4:4,6:6,7:7,9:9}],40:[function(t,i,n){i.exports=function(t){var i=f.codegen([\"m\"],t.name+\"$verify\")('if(typeof m!==\"object\"||m===null)')(\"return%j\",\"object expected\"),n=t.oneofsArray,r={};n.length&&i(\"var p={}\");for(var e=0;e<t.fieldsArray.length;++e){var s,o=t.e[e].resolve(),u=\"m\"+f.safeProp(o.name);o.optional&&i(\"if(%s!=null&&m.hasOwnProperty(%j)){\",u,o.name),o.map?(i(\"if(!util.isObject(%s))\",u)(\"return%j\",h(o,\"object\"))(\"var k=Object.keys(%s)\",u)(\"for(var i=0;i<k.length;++i){\"),function(t,i,n){switch(i.keyType){case\"int32\":case\"uint32\":case\"sint32\":case\"fixed32\":case\"sfixed32\":t(\"if(!util.key32Re.test(%s))\",n)(\"return%j\",h(i,\"integer key\"));break;case\"int64\":case\"uint64\":case\"sint64\":case\"fixed64\":case\"sfixed64\":t(\"if(!util.key64Re.test(%s))\",n)(\"return%j\",h(i,\"integer|Long key\"));break;case\"bool\":t(\"if(!util.key2Re.test(%s))\",n)(\"return%j\",h(i,\"boolean key\"))}}(i,o,\"k[i]\"),a(i,o,e,u+\"[k[i]]\")(\"}\")):o.repeated?(i(\"if(!Array.isArray(%s))\",u)(\"return%j\",h(o,\"array\"))(\"for(var i=0;i<%s.length;++i){\",u),a(i,o,e,u+\"[i]\")(\"}\")):(o.partOf&&(s=f.safeProp(o.partOf.name),1===r[o.partOf.name]&&i(\"if(p%s===1)\",s)(\"return%j\",o.partOf.name+\": multiple values\"),r[o.partOf.name]=1,i(\"p%s=1\",s)),a(i,o,e,u)),o.optional&&i(\"}\")}return i(\"return null\")};var o=t(15),f=t(37);function h(t,i){return t.name+\": \"+i+(t.repeated&&\"array\"!==i?\"[]\":t.map&&\"object\"!==i?\"{k:\"+t.keyType+\"}\":\"\")+\" expected\"}function a(t,i,n,r){if(i.resolvedType)if(i.resolvedType instanceof o){t(\"switch(%s){\",r)(\"default:\")(\"return%j\",h(i,\"enum value\"));for(var e=Object.keys(i.resolvedType.values),s=0;s<e.length;++s)t(\"case %i:\",i.resolvedType.values[e[s]]);t(\"break\")(\"}\")}else t(\"{\")(\"var e=types[%i].verify(%s);\",n,r)(\"if(e)\")(\"return%j+e\",i.name+\".\")(\"}\");else switch(i.type){case\"int32\":case\"uint32\":case\"sint32\":case\"fixed32\":case\"sfixed32\":t(\"if(!util.isInteger(%s))\",r)(\"return%j\",h(i,\"integer\"));break;case\"int64\":case\"uint64\":case\"sint64\":case\"fixed64\":case\"sfixed64\":t(\"if(!util.isInteger(%s)&&!(%s&&util.isInteger(%s.low)&&util.isInteger(%s.high)))\",r,r,r,r)(\"return%j\",h(i,\"integer|Long\"));break;case\"float\":case\"double\":t('if(typeof %s!==\"number\")',r)(\"return%j\",h(i,\"number\"));break;case\"bool\":t('if(typeof %s!==\"boolean\")',r)(\"return%j\",h(i,\"boolean\"));break;case\"string\":t(\"if(!util.isString(%s))\",r)(\"return%j\",h(i,\"string\"));break;case\"bytes\":t('if(!(%s&&typeof %s.length===\"number\"||util.isString(%s)))',r,r,r)(\"return%j\",h(i,\"buffer\"))}return t}},{15:15,37:37}],41:[function(t,i,n){var o=t(21);n[\".google.protobuf.Any\"]={fromObject:function(t){if(t&&t[\"@type\"]){var i,n=t[\"@type\"].substring(1+t[\"@type\"].lastIndexOf(\"/\")),n=this.lookup(n);if(n)return~(i=\".\"==(t[\"@type\"][0]||\"\")?t[\"@type\"].slice(1):t[\"@type\"]).indexOf(\"/\")||(i=\"/\"+i),this.create({type_url:i,value:n.encode(n.fromObject(t)).finish()})}return this.fromObject(t)},toObject:function(t,i){var n,r,e=\"\",s=\"\";return i&&i.json&&t.type_url&&t.value&&(s=t.type_url.substring(1+t.type_url.lastIndexOf(\"/\")),e=t.type_url.substring(0,1+t.type_url.lastIndexOf(\"/\")),(n=this.lookup(s))&&(t=n.decode(t.value))),!(t instanceof this.ctor)&&t instanceof o?(n=t.$type.toObject(t,i),r=\".\"===t.$type.fullName[0]?t.$type.fullName.slice(1):t.$type.fullName,n[\"@type\"]=s=(e=\"\"===e?\"type.googleapis.com/\":e)+r,n):this.toObject(t,i)}}},{21:21}],42:[function(t,i,n){i.exports=c;var r,e=t(39),s=e.LongBits,o=e.base64,u=e.utf8;function f(t,i,n){this.fn=t,this.len=i,this.next=rt,this.val=n}function h(){}function a(t){this.head=t.head,this.tail=t.tail,this.len=t.len,this.next=t.states}function c(){this.len=0,this.head=new f(h,0,0),this.tail=this.head,this.states=null}function l(){return e.Buffer?function(){return(c.create=function(){return new r})()}:function(){return new c}}function d(t,i,n){i[n]=255&t}function p(t,i){this.len=t,this.next=rt,this.val=i}function v(t,i,n){for(;t.hi;)i[n++]=127&t.lo|128,t.lo=(t.lo>>>7|t.hi<<25)>>>0,t.hi>>>=7;for(;127<t.lo;)i[n++]=127&t.lo|128,t.lo=t.lo>>>7;i[n++]=t.lo}function b(t,i,n){i[n]=255&t,i[n+1]=t>>>8&255,i[n+2]=t>>>16&255,i[n+3]=t>>>24}c.create=l(),c.alloc=function(t){return new e.Array(t)},e.Array!==Array&&(c.alloc=e.pool(c.alloc,e.Array.prototype.subarray)),c.prototype.M=function(t,i,n){return this.tail=this.tail.next=new f(t,i,n),this.len+=i,this},(p.prototype=Object.create(f.prototype)).fn=function(t,i,n){for(;127<t;)i[n++]=127&t|128,t>>>=7;i[n]=t},c.prototype.uint32=function(t){return this.len+=(this.tail=this.tail.next=new p((t>>>=0)<128?1:t<16384?2:t<2097152?3:t<268435456?4:5,t)).len,this},c.prototype.int32=function(t){return t<0?this.M(v,10,s.fromNumber(t)):this.uint32(t)},c.prototype.sint32=function(t){return this.uint32((t<<1^t>>31)>>>0)},c.prototype.int64=c.prototype.uint64=function(t){t=s.from(t);return this.M(v,t.length(),t)},c.prototype.sint64=function(t){t=s.from(t).zzEncode();return this.M(v,t.length(),t)},c.prototype.bool=function(t){return this.M(d,1,t?1:0)},c.prototype.sfixed32=c.prototype.fixed32=function(t){return this.M(b,4,t>>>0)},c.prototype.sfixed64=c.prototype.fixed64=function(t){t=s.from(t);return this.M(b,4,t.lo).M(b,4,t.hi)},c.prototype.float=function(t){return this.M(e.float.writeFloatLE,4,t)},c.prototype.double=function(t){return this.M(e.float.writeDoubleLE,8,t)};var w=e.Array.prototype.set?function(t,i,n){i.set(t,n)}:function(t,i,n){for(var r=0;r<t.length;++r)i[n+r]=t[r]};c.prototype.bytes=function(t){var i,n=t.length>>>0;return n?(e.isString(t)&&(i=c.alloc(n=o.length(t)),o.decode(t,i,0),t=i),this.uint32(n).M(w,n,t)):this.M(d,1,0)},c.prototype.string=function(t){var i=u.length(t);return i?this.uint32(i).M(u.write,i,t):this.M(d,1,0)},c.prototype.fork=function(){return this.states=new a(this),this.head=this.tail=new f(h,0,0),this.len=0,this},c.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new f(h,0,0),this.len=0),this},c.prototype.ldelim=function(){var t=this.head,i=this.tail,n=this.len;return this.reset().uint32(n),n&&(this.tail.next=t.next,this.tail=i,this.len+=n),this},c.prototype.finish=function(){for(var t=this.head.next,i=this.constructor.alloc(this.len),n=0;t;)t.fn(t.val,i,n),n+=t.len,t=t.next;return i},c.p=function(t){r=t,c.create=l(),r.p()}},{39:39}],43:[function(t,i,n){i.exports=s;var r=t(42),e=((s.prototype=Object.create(r.prototype)).constructor=s,t(39));function s(){r.call(this)}function o(t,i,n){t.length<40?e.utf8.write(t,i,n):i.utf8Write?i.utf8Write(t,n):i.write(t,n)}s.p=function(){s.alloc=e.V,s.writeBytesBuffer=e.Buffer&&e.Buffer.prototype instanceof Uint8Array&&\"set\"===e.Buffer.prototype.set.name?function(t,i,n){i.set(t,n)}:function(t,i,n){if(t.copy)t.copy(i,n,0,t.length);else for(var r=0;r<t.length;)i[n++]=t[r++]}},s.prototype.bytes=function(t){var i=(t=e.isString(t)?e.L(t,\"base64\"):t).length>>>0;return this.uint32(i),i&&this.M(s.writeBytesBuffer,i,t),this},s.prototype.string=function(t){var i=e.Buffer.byteLength(t);return this.uint32(i),i&&this.M(o,i,t),this},s.p()},{39:39,42:42}]},{},[19])}();\n//# sourceMappingURL=protobuf.min.js.map\n","/**\n * WebSocket 模块,即 TTSA 服务\n */\nimport { decode } from \"@msgpack/msgpack\";\nimport io, { Socket } from \"socket.io-client\";\nimport {\n EFrameDataType,\n FRAME_SOURCE_SOURCE,\n IRawAudioFrameData,\n IRawBodyFrameData,\n IRawEventFrameData,\n IRawFrameData,\n ITtsFaceFrameData,\n StateChangeInfo,\n} from \"../types/frame-data\";\nimport type XmovAvatar from \"../index\";\nimport { AvatarStatus, DeviceInfo, Layout, WalkConfig } from \"../types\";\nimport { EErrorCode } from \"../types/error\";\nimport { performanceConstant } from \"../utils/perfermance\";\nimport { IResumeParams } from \"../modules/ResourceManager\";\nimport { scaledInt16BytesToFloat32 } from \"../utils/float32-decoder\";\nimport Pako from 'pako';\nimport '../proto/protobuf.min';\nimport '../proto/face_data_pb';\n\nconst proxyProtobuf = protobuf.roots.default;\n\nconst pointNameObj = {\n 'connect_sdk': '连接SDK',\n 'connect_sdk_success': '连接SDK成功',\n 'llm_text_sdk_received': '大模型输出的文本SDK前端收到',\n 'rendering_data_received': '客户端收到音频数据时间',\n 'rendering_display': '客户端播放音频数据时间',\n 'close_session': '关闭会话',\n 'audio_data_expired': '音频数据过期', \n}\n\ninterface ITtsaOptions {\n sdkInstance: XmovAvatar;\n url: string;\n room: string;\n session_id: string;\n token: string;\n appInfo: {\n appId: string;\n env: string;\n };\n framedata_proto_version: number;\n onReady(): void;\n handleMessage: (type: EFrameDataType, data: IRawFrameData[]) => void;\n handleAAFrame: (data: any) => void;\n runStartFrameIndex: (server_time: number) => void;\n ttsaStateChangeHandle: (state: StateChangeInfo) => void;\n reloadSuccess: () => void;\n enterOfflineMode: () => void;\n reStartSDK: () => void;\n reconnect_client_timeout: number;\n sendVoiceEnd: () => void;\n getCurrentFrameIndex: () => number;\n}\n\nexport default class Ttsa {\n private TAG = \"[TTSA]\";\n private ws: Socket;\n private room: string;\n private session_id: string;\n private token: string;\n private framedata_proto_version: number;\n private getResumeInfo?: () => IResumeParams;\n private runStartFrameIndex: (client_time: number) => void;\n private ttsaStateChangeHandle: (state: StateChangeInfo) => void;\n private sdk: XmovAvatar;\n private reloadSuccess: () => void;\n private _lastSessionId = \"\";\n private _uniqueSpeakId: number;\n private session_speak_req_id: number;\n private enterOfflineMode: () => void;\n private reStartSDK: () => void;\n private reconnect_client_timeout: number;\n private reconnectTimer = -1;\n private wsConnectTimer = 0;\n private enterOfflineFlag = false;\n private sendVoiceEnd: () => void;\n private syncTimestampInterval: any = 0;\n // 每 5 秒检查一次\n private syncTimestampNum: number = 5 * 1000;\n // 真正目标:5 分钟\n private readonly SYNC_INTERVAL = 5 * 60 * 1000;\n // 上次同步时间\n private lastSyncTime = Date.now();\n private getCurrentFrameIndex: () => number;\n // 客户端心跳定时器(每 2s 发送一次)\n private heartbeatTimer: number = -1;\n private readonly HEARTBEAT_INTERVAL = 2000;\n\n /**\n * 清除WebSocket重连定时器\n */\n public clearReconnectTimer(): void {\n if (this.reconnectTimer !== -1) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = -1;\n }\n }\n\n /**\n * 启动客户端心跳(每 2s 发送一次 client_heartbeat)\n */\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = window.setInterval(() => {\n this.send(\"client_heartbeat\", {\n timestamp: Date.now(),\n frame: this.getCurrentFrameIndex(),\n });\n }, this.HEARTBEAT_INTERVAL);\n }\n\n /**\n * 停止客户端心跳\n */\n private stopHeartbeat(): void {\n if (this.heartbeatTimer !== -1) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = -1;\n }\n }\n\n private _isResume = false;\n private appInfo: {\n appId: string;\n env: string;\n };\n constructor(options: ITtsaOptions) {\n this.appInfo = options.appInfo;\n this.sdk = options.sdkInstance;\n this.room = options.room;\n this.session_id = options.session_id;\n this.token = options.token;\n this.framedata_proto_version = options.framedata_proto_version;\n this._uniqueSpeakId = 0;\n this.runStartFrameIndex = options.runStartFrameIndex;\n this.ttsaStateChangeHandle = options.ttsaStateChangeHandle;\n this.reloadSuccess = options.reloadSuccess;\n this.session_speak_req_id = 0;\n this.enterOfflineMode = options.enterOfflineMode;\n this.reStartSDK = options.reStartSDK;\n this.reconnect_client_timeout = options.reconnect_client_timeout;\n this.sendVoiceEnd = options.sendVoiceEnd;\n this.getCurrentFrameIndex = options.getCurrentFrameIndex;\n\n const ws = io(options.url, {\n query: {\n token: this.token,\n },\n transports: ['websocket'],\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 1000,\n randomizationFactor: 0.3\n });\n\n ws.on(\"connect\", () => {\n // 连接成功时清理重连定时器\n this.clearReconnectTimer();\n this.initWsTimeoutTimer();\n // 启动客户端心跳\n this.startHeartbeat();\n (window as any).performanceTracker.markEnd(performanceConstant.ttsa_connect);\n const payload = {\n room: this.room,\n client_type: \"web\",\n invisible_mode: this.sdk.getPendingInvisibleMode(),\n };\n // TODO: 临时处理,待后端修复\n if(this.sdk.getStatus()=== AvatarStatus.offline) {\n this.sdk.onStatusChange(AvatarStatus.online);\n }\n this.send(\"enter_room\", payload);\n });\n ws.on(\"first_start_timestamp\", (e: any) => {\n (window as any).avatarSDKLogger.log(this.TAG, \"first_start_timestamp\", e);\n // 前端在发送first_start_timestamp后运行帧索引\n this.firstStartTimestamp(e.server_time);\n (window as any).performanceTracker.markEnd(performanceConstant.ttsa_ready);\n (window as any).performanceTracker.markStart(performanceConstant.ttsa_body_res);\n (window as any).avatarSDKLogger.log(this.TAG, 'ready');\n this.reloadSuccess()\n options.onReady();\n });\n ws.on(\"state_change\", (e: StateChangeInfo) => {\n this.ttsaStateChangeHandle(e);\n });\n ws.on(\"tts_audio\", (e: any) => {\n try {\n const decodedData = decode(e) as IRawAudioFrameData[];\n this.sendSdkPoint('rendering_data_received', { multi_turn_conversation_id: decodedData[0].multi_turn_conversation_id });\n\n (window as any).avatarSDKLogger.log(this.TAG, \"下发音频数据tts_audio\", decodedData);\n options.handleMessage(EFrameDataType.AUDIO, decodedData);\n } catch (error) {\n this.sdk.onMessage({\n code: EErrorCode.AUDIO_DECODE_ERROR,\n message: `Error: 音频数据解码失败`,\n e: error,\n });\n }\n });\n ws.on(\"face_data\", async (e: any) => {\n try {\n if(!this.framedata_proto_version) {\n const faceDecodeData = decode(e) as ITtsFaceFrameData[];\n (window as any).avatarSDKLogger.log(this.TAG, \"face_data\", faceDecodeData);\n if(faceDecodeData[0].s !== 'speak' && this.enterOfflineFlag) {\n // 发送voice_end\n this.sendVoiceEnd();\n this.enterOfflineFlag = false;\n }\n options.handleMessage(EFrameDataType.FACE, faceDecodeData);\n } else {\n let frameList: any[] = []\n const uint8Array = new Uint8Array(e);\n const decompressed = Pako.inflate(uint8Array);\n const FaceFrameDataList = proxyProtobuf.FaceFrameDataList.decode(decompressed, undefined, () => { });\n const faceFrameList = FaceFrameDataList.toJSON() || { data: [] };\n frameList = faceFrameList.data.map((frame) => {\n // 1. 解析 JointData 实例(转为普通对象 + 解码 float16)\n const joints = (frame.js || []).map((joint) => {\n // joint 是 protobuf 生成的 JointData 实例,直接访问字段\n return {\n translate: joint.translate || [], // float32 无需解码,直接提取\n rotate: joint.rotate ? scaledInt16BytesToFloat32(joint.rotate) : []\n };\n });\n\n // 2. 解析 MeshData 实例(转为普通对象 + 解码 float16)\n const meshes = (frame.ms || []).map((mesh) => {\n return {\n index: mesh.index || 0,\n weights: mesh.weights || []\n };\n });\n return {\n ...frame,\n bsw: frame.bsw ? scaledInt16BytesToFloat32(frame.bsw) : [],\n js: joints,\n ms: meshes,\n body_id: frame.bodyId || 0, // proto 中的 body_id → 编译后 bodyId(驼峰)\n face_frame_type: frame.faceFrameType || 0\n };\n })\n options.handleMessage(EFrameDataType.FACE, frameList);\n if(frameList[0].s !== 'speak' && this.enterOfflineFlag) {\n // 发送voice_end\n this.sendVoiceEnd();\n this.enterOfflineFlag = false;\n }\n // const faceDecodeData = decode(e) as ITtsFaceFrameData[];\n (window as any).avatarSDKLogger.log(this.TAG, \"face_data\", frameList);\n }\n } catch (error) {\n this.sdk.destroy();\n this.sdk.onMessage({\n code: EErrorCode.FACE_DECODE_ERROR,\n message: `Error: 表情数据解码失败`,\n e: error,\n });\n }\n });\n ws.on(\"body_data\", (e: any) => {\n try {\n // 清空离线mode\n let bodyDecodeData = decode(e) as IRawBodyFrameData[];\n (window as any).performanceTracker.markEnd(performanceConstant.start_action_res, bodyDecodeData[0].s);\n const cBody = bodyDecodeData.map(item => ({\n ...item,\n x_offset: []\n }));\n (window as any).avatarSDKLogger.log(this.TAG, \"body_data\", JSON.stringify(cBody), new Date().getTime());\n (window as any).performanceTracker.markEnd(performanceConstant.ttsa_body_res);\n options.handleMessage(EFrameDataType.BODY, bodyDecodeData);\n } catch (error) {\n this.sdk.onMessage({\n code: EErrorCode.VIDEO_DECODE_ERROR,\n message: `Error: 身体数据解码失败`,\n e: error,\n });\n }\n });\n ws.on(\"event_data\", (e: any) => {\n try {\n const decodeData = decode(e) as IRawEventFrameData[];\n (window as any).avatarSDKLogger.log(this.TAG, \"event_data\", JSON.stringify(decodeData));\n options.handleMessage(EFrameDataType.EVENT, decodeData);\n } catch (error) {\n this.sdk.onMessage({\n code: EErrorCode.EVENT_DECODE_ERROR,\n message: `Error: 事件数据解码失败`,\n e: error\n });\n }\n });\n ws.on(\"sync_frame\", (e: any) => {\n options.handleMessage(EFrameDataType.SYNC_FRAME, e);\n });\n ws.on(\"aa_frame\", (e: any) => {\n (window as any).avatarSDKLogger.log(this.TAG, \"下发机器人视频帧aa_frame\", e);\n options.handleAAFrame(e);\n });\n ws.on(\"error_message\", (e: any) => {\n this.sdk.onMessage({\n code: e?.error_code || EErrorCode.TTSA_ERROR,\n message: e?.user_hint || 'TTSA 返回异常',\n });\n });\n ws.on(\"disconnect\", (e) => {\n this.clearOldWsTimeoutTimer();\n // 停止客户端心跳\n this.stopHeartbeat();\n if(e === 'io client disconnect') {\n return;\n }\n // 增加状态检查,避免重复处理断开事件\n if (this.enterOfflineFlag) {\n (window as any).avatarSDKLogger.warn(this.TAG, \"已在离线处理中,忽略重复的disconnect事件\");\n return;\n }\n this.sdk.onMessage({\n code: EErrorCode.SOCKET_DISCONNECT,\n message: `client Warning: socket disconnect, ${e}`,\n });\n (window as any).avatarSDKLogger.warn(this.TAG, `${options.url} 已断开`, \"disconnect原因\", e);\n this.enterOfflineFlag = true;\n if(this.sdk.getStatus() === AvatarStatus.offline) {\n // 已进入离线模式,不销毁\n this.sdk.onStatusChange(AvatarStatus.offline);\n } else {\n // 无网断开则进入离线模式\n this.enterOfflineMode();\n }\n // 发起定时器,getReconnectClientTimeout时间内重连socket,超过时间则发起reStartSession\n // 只有在网络断开时才设置重连定时器,网络恢复时由NetworkMonitor处理\n if (!navigator.onLine) {\n // 清除可能存在的旧定时器\n this.clearReconnectTimer();\n this.reconnectTimer = window.setTimeout(async () => {\n try {\n ws.disconnect();\n } catch (error) {\n (window as any).avatarSDKLogger.warn(this.TAG, \"disconnect error\", error);\n }\n await this.sdk.stopSessionFromSocket(\"WS_TIMEOUT\");\n this.reStartSDK();\n }, this.reconnect_client_timeout * 1000);\n }\n }) as any;\n ws.on(\"client_quit\", (e) => {\n (window as any).avatarSDKLogger.warn(this.TAG, \"client_quit\", \"断开原因\", e);\n ws.disconnect();\n this.session_speak_req_id = 0;\n if (Object.keys(e).length) {\n this.sdk.onMessage({\n code: EErrorCode.SOCKET_QUIT,\n message: `ttsa主动关闭 reason: ${JSON.stringify({ e })}`,\n e\n })\n }\n // 字符库加载失败,进入离线模式\n // 优化代码\n const not_reStart_reason = ['user', 'char_bin_load_error', 'admin kick', 'nebula admin stop', 'no_time'];\n if(!not_reStart_reason.includes(e?.stop_reason)) {\n if(this.sdk.getStatus() === AvatarStatus.offline) {\n // 已进入离线模式,不销毁\n this.sdk.onStatusChange(AvatarStatus.offline);\n } else {\n // 无网断开则进入离线模式\n this.enterOfflineMode();\n }\n this.reStartSDK();\n } else {\n this.sdk.destroyClient();\n this.sdk.onStatusChange(AvatarStatus.close);\n }\n });\n ws.on(\"connect_error\", (e: any) => {\n this.sdk.onMessage({\n code: EErrorCode.CONNECT_SOCKET_ERROR,\n message: `Error: socket连接失败`,\n e,\n });\n });\n ws.onAny((event, args) => {\n if (this.ws.connected) {\n this.initWsTimeoutTimer();\n }\n })\n this.ws = ws;\n }\n\n clearOldWsTimeoutTimer = () => {\n if (this.wsConnectTimer) {\n clearTimeout(this.wsConnectTimer);\n this.wsConnectTimer = 0; // 重置为初始值 0,保持状态统一\n }\n };\n initWsTimeoutTimer = () => {\n this.clearOldWsTimeoutTimer();\n\n this.wsConnectTimer = window.setTimeout(async () => {\n \n try {\n this.sdk.onMessage({\n code: EErrorCode.CONNECT_SOCKET_ERROR,\n message: `Error: socket长时间未下发数据`,\n });\n\n if (this.session_id) {\n await this.sdk.stopSessionFromSocket(\"WS_NO_DATA_TIMEOUT\");\n this.ws.disconnect();\n }\n\n this.reStartSDK();\n } finally {\n this.clearOldWsTimeoutTimer();\n }\n }, (this.reconnect_client_timeout + 10) * 1000);\n };\n\n start() {\n if (this._isResume) {\n this._isResume = false;\n return;\n }\n this.stateChange(\"interactive_idle\");\n }\n\n idle() {\n this.stateChange(\"idle\");\n }\n\n // faceDetect() {\n // this.stateChange(\"face_detect\");\n // }\n\n // wakeUp() {\n // this.stateChange(\"wake_up\");\n // }\n\n listen() {\n this.stateChange(\"listen\");\n }\n\n think() {\n this.stateChange(\"think\");\n }\n\n // skill(action_semantic: string) {\n // this.stateChange(\"skill\",{\n // action_semantic\n // });\n // }\n\n // exitInteraction() {\n // this.stateChange(\"exit_interaction\");\n // }\n\n // touchReact() {\n // this.stateChange(\"touch_react\");\n // }\n\n interactiveidle() {\n this.stateChange(\"interactive_idle\");\n }\n\n /**\n * 通知后端进入隐身模式\n */\n enterInvisibleMode(): void {\n this.send('switch_invisible_mode', { session_id: this.session_id, invisible_mode: true });\n }\n\n /**\n * 通知后端退出隐身模式\n */\n exitInvisibleMode(): void {\n this.send('switch_invisible_mode', { session_id: this.session_id, invisible_mode: false });\n }\n\n firstStartTimestamp(server_time: number) {\n const client_time = Date.now() / 1000;\n const payload = {\n server_time,\n client_time,\n };\n const resumeInfo = this._getResumeInfo()\n if (this._isResume && resumeInfo && resumeInfo.client_frame > 0) {\n payload['resume_from_offline_idle'] = resumeInfo;\n } else {\n // 数据异常,重置_isResume\n this._isResume = false;\n }\n this.runStartFrameIndex(client_time);\n this.send(\"first_start_timestamp\", payload);\n }\n \n syncTimestamp() {\n if (this.syncTimestampInterval) {\n clearInterval(this.syncTimestampInterval);\n this.syncTimestampInterval = 0;\n }\n\n this.syncTimestampInterval = setInterval(() => {\n const now = Date.now();\n if (now - this.lastSyncTime >= this.SYNC_INTERVAL) {\n const client_frame = this.getCurrentFrameIndex();\n this.sendSyncTimestamp(client_frame);\n this.lastSyncTime = now;\n }\n }, this.syncTimestampNum);\n }\n\n sendSyncTimestamp(client_frame: number) {\n const client_time = Date.now() / 1000;\n this.send(\"sync_frame\", { client_time, source: FRAME_SOURCE_SOURCE, client_frame });\n }\n\n sendText(ssml: string, is_start: boolean, is_end: boolean, extra = {client_speak_id: ''}) {\n if (!this.ws.connected) {\n return\n }\n const uniqueSpeakId = this.getUniqueSpeakId();\n if(!extra?.client_speak_id) {\n extra.client_speak_id = uniqueSpeakId;\n }\n const payload = {\n ssml,\n is_start,\n is_end,\n extra,\n multi_turn_conversation_id: uniqueSpeakId,\n session_speak_req_id: this.session_speak_req_id,\n timestamp: Date.now(),\n // @ts-ignore\n sdkVersion: VERSION,\n };\n this.sendSdkPoint('llm_text_sdk_received', {\n ...extra,\n is_start,\n is_end,\n content: { ssml },\n multi_turn_conversation_id: uniqueSpeakId,\n speak_id: this.session_speak_req_id++,\n });\n if (is_start) {\n (window as any).performanceTracker.markStart(performanceConstant.start_action_res, 'speak');\n (window as any).performanceTracker.markStart(performanceConstant.start_action_render, 'speak');\n (window as any).performanceTracker.markStart(performanceConstant.voice_response_play, 'speak');\n }\n if (is_end) {\n this.updateUniqueSpeakId();\n }\n this.send(\"send_text\", payload);\n return uniqueSpeakId;\n }\n\n sendSdkPoint(name: string, params: any = {}, extra?: any) {\n this.send(\"sdk_burial_point\", {\n ...params,\n ...extra,\n ...this.appInfo,\n burial_type: 1,\n session_id: this.session_id,\n event_en_name: name,\n event_cn_name: pointNameObj[name],\n device: navigator.userAgent,\n timestamp: params.timestamp || Date.now(),\n // @ts-ignore\n sdkVersion: VERSION,\n\n });\n }\n\n stateChange(state: string, params?: object) {\n const payload = {\n state,\n params: params || {},\n };\n (window as any).performanceTracker.markStart(performanceConstant.start_action_res, state);\n (window as any).performanceTracker.markStart(performanceConstant.start_action_render, state);\n this.send(\"state_change\", payload);\n }\n\n sendPerfLog(payload: object) {\n // 目前该点位服务端未处理,暂不上报\n // this.ws.emit('perf_log', {\n // payload,\n // sessionId: this._lastSessionId,\n // });\n }\n\n changeLayout(layout: Layout) {\n this.send(\"change_layout\", layout);\n }\n\n changeWalkConfig(walkConfig: WalkConfig) {\n this.send(\"walk_config\", walkConfig);\n }\n\n public send(event: string, payload: Object) {\n if (!this.ws.connected) {\n return\n }\n this.ws.emit(event, payload);\n }\n\n sendDeviceInfo(deviceInfo: DeviceInfo) {\n this.send(\"stat_report\", deviceInfo);\n }\n\n getStatus() {\n return this.ws.connected;\n }\n\n _setResumeInfoCallback(lastSessionId: string, _getResumeInfo: () => IResumeParams) {\n this._isResume = true\n this._lastSessionId = lastSessionId\n this.getResumeInfo = _getResumeInfo\n }\n _getResumeInfo() {\n if (this.getResumeInfo) {\n const resumeInfo = this.getResumeInfo()\n if (this._lastSessionId) {\n resumeInfo['last_session_id'] = this._lastSessionId\n }\n return resumeInfo\n }\n return null\n }\n\n updateUniqueSpeakId() {\n this._uniqueSpeakId += 1\n }\n\n getUniqueSpeakId() {\n return `${this._uniqueSpeakId}-${this.session_id}`\n }\n\n close() {\n // 使用 disconnect() 而不是 close(),disconnect() 会停止所有重连尝试\n if (this.ws) {\n this.ws.disconnect();\n }\n this.clearOldWsTimeoutTimer();\n this.stopHeartbeat();\n this.session_speak_req_id = 0;\n if (this.reconnectTimer !== -1) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = -1;\n }\n if (this.syncTimestampInterval) {\n clearInterval(this.syncTimestampInterval);\n this.syncTimestampInterval = 0; // 重置为初始值 0,保持状态统一\n }\n }\n\n connect() {\n this.ws.connect();\n }\n\n seekToFrame(frame: number) {\n this.ws.emit('seek_to_frame', {\n frame\n });\n }\n}\n","/**\n * @file 时间处理工具函数\n */\n\n/**\n * 格式化时间戳字符串为 'YYYY-MM-DD HH:mm:ss' 格式\n * @param timestamp - ISO 格式的时间字符串, e.g., \"2025-07-02T15:02:36.391615\"\n * @returns 格式化后的时间字符串,如果输入无效则返回 'N/A'\n */\nexport function formatTimestamp(timestamp: string): string {\n if (!timestamp || typeof timestamp !== 'string') {\n return 'N/A';\n }\n try {\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) {\n return 'Invalid Date';\n }\n\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n const seconds = date.getSeconds().toString().padStart(2, '0');\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n } catch (error) {\n (window as any).avatarSDKLogger.error('Error formatting timestamp:', error);\n return timestamp; // 如果格式化失败,返回原始字符串\n }\n} ","import { EErrorCode, type SDKError } from \"../types/error\";\nimport { type ISessionResponse } from \"../modules/ResourceManager\";\nimport { formatTimestamp } from \"../utils/time\";\n\n/**\n * 调试信息浮层(支持复制会话ID + 禁止疯狂刷新DOM)\n */\nexport class DebugOverlay {\n private container: HTMLDivElement | null = null;\n private sdkContainer: HTMLElement | null = null;\n private sdk: any;\n private sessionInfo: ISessionResponse;\n private startTime: number;\n private updateInterval: number | null = null;\n\n private errors: SDKError[] = [];\n private fps: number = 0;\n private frameCount: number = 0;\n private lastFpsUpdate: number = performance.now();\n\n private videoInfo: { name: string; body_id: number; id: number } = {\n name: \"\",\n body_id: 0,\n id: 0,\n };\n private audioInfo: { sf: number; ef: number; ad: Uint8Array } = {\n sf: 0,\n ef: 0,\n ad: new Uint8Array(),\n };\n private eventInfo: { sf: number; ef: number; event: any[] } = {\n sf: 0,\n ef: 0,\n event: [],\n };\n\n private memoryInfo: {\n jsHeapSizeLimit?: number;\n totalJSHeapSize?: number;\n usedJSHeapSize?: number;\n } = {};\n\n private perfMetrics: Record<\n string,\n { times: number[]; avg: number; last: number; count: number }\n > = {};\n private currentFrameIndex: number = 0;\n\n private domRefs: Record<string, HTMLElement> = {};\n\n constructor(sdk: any, sessionInfo: ISessionResponse) {\n this.sdk = sdk;\n this.sdkContainer = sdk.el;\n this.sessionInfo = sessionInfo;\n this.startTime = Date.now();\n this.trackFPS();\n this.trackMemory();\n }\n\n setAudioInfo(info: { sf: number; ef: number; ad: Uint8Array }) {\n this.audioInfo = info;\n }\n\n setEventData(info: { sf: number; ef: number; event: any[] }) {\n this.eventInfo = info;\n }\n\n addError(error: SDKError) {\n this.errors.unshift(error);\n if (this.errors.length >= 20) this.errors.pop();\n }\n\n public show(): void {\n if (this.container) {\n this.container.style.display = \"block\";\n return;\n }\n this.createOverlay();\n this.updateInterval = window.setInterval(() => this.updateTextOnly(), 200);\n this.updateTextOnly();\n }\n\n public hide(): void {\n if (this.container) this.container.style.display = \"none\";\n if (this.updateInterval) {\n clearInterval(this.updateInterval);\n this.updateInterval = null;\n }\n }\n\n public destroy(): void {\n this.hide();\n if (this.container?.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n this.container = null;\n }\n\n setVideoInfo(info: any) {\n this.videoInfo = info;\n }\n\n private updateTextOnly(): void {\n if (!this.container) return;\n\n this.sessionInfo.session_id = this.sdk.resourceManager.session_id;\n this.currentFrameIndex =\n this.sdk.renderScheduler.frameAnimationController?.getCurrentFrame() ?? 0;\n\n this.updatePerfMetrics();\n this.updateMemory();\n\n this.setText(\"look_name\", this.sessionInfo.config.look_name);\n this.setText(\"video_name\", `${this.videoInfo.name} - ${this.videoInfo.body_id}`);\n this.setText(\"session_id\", this.sessionInfo.session_id);\n this.setText(\"frame_idx\", String(this.currentFrameIndex));\n this.setText(\n \"audio_info\",\n `开始帧: ${this.audioInfo.sf} / 结束帧: ${this.audioInfo.ef} / 长度: ${this.audioInfo.ad.length}`\n );\n this.setText(\n \"event_info\",\n `开始帧: ${this.eventInfo.sf} / 结束帧: ${this.eventInfo.ef} / 长度: ${this.eventInfo.event.length}`\n );\n\n this.setText(\"perf\", this.formatPerfMetrics());\n this.setText(\"fps\", String(this.fps));\n this.setText(\"mem\", this.formatMemory());\n\n const duration = ((Date.now() - this.startTime) / 1000).toFixed(1);\n this.setText(\"session_start\", formatTimestamp(this.sessionInfo.session_start_time));\n this.setText(\"session_duration\", `${duration}s`);\n this.setText(\"network\", this.getNetworkInfo());\n\n this.setText(\"error_count\", `(${this.errors.length})`);\n this.setText(\"error_log\", this.formatErrors(false));\n this.setText(\"ttsa_error_log\", this.formatErrors(true));\n }\n\n private setText(id: string, text: string) {\n const el = this.domRefs[id];\n if (el) el.innerHTML = text;\n }\n\n // 🔥 复制会话 ID 功能\n private copySessionId() {\n const sessionId = this.sessionInfo.session_id;\n if (!sessionId) return;\n navigator.clipboard.writeText(sessionId).then(() => {\n }).catch(err => {\n console.warn(\"复制失败\", err);\n });\n }\n\n private createOverlay(): void {\n this.container = document.createElement(\"div\");\n this.container.id = \"sdk-debug-overlay\";\n this.applyStyles(this.container);\n this.container.style.userSelect = \"text\";\n\n const make = (id: string, label: string, value = \"\") => {\n const d = document.createElement(\"div\");\n d.style.marginBottom = \"8px\";\n d.innerHTML = `<span style=\"color:#888;font-size:11px;\">${label}:</span>`;\n const v = document.createElement(\"span\");\n v.style.color = \"#fff\";\n v.style.fontSize = \"11px\";\n v.style.marginLeft = \"4px\";\n v.textContent = value;\n d.append(v);\n this.domRefs[id] = v;\n return d;\n };\n\n // ==========================\n // 🔥 带复制按钮的会话 ID\n // ==========================\n const makeSessionIdWithCopy = () => {\n const d = document.createElement(\"div\");\n d.style.marginBottom = \"8px\";\n d.style.display = \"flex\";\n d.style.alignItems = \"center\";\n d.style.gap = \"6px\";\n\n const label = document.createElement(\"span\");\n label.style.color = \"#888\";\n label.style.fontSize = \"11px\";\n label.textContent = \"会话 ID:\";\n\n const value = document.createElement(\"span\");\n value.style.color = \"#fff\";\n value.style.fontSize = \"11px\";\n value.style.wordBreak = \"break-all\";\n value.style.flex = \"1\";\n this.domRefs[\"session_id\"] = value;\n\n const copyBtn = document.createElement(\"button\");\n copyBtn.textContent = \"复制\";\n copyBtn.style.fontSize = \"10px\";\n copyBtn.style.padding = \"2px 6px\";\n copyBtn.style.borderRadius = \"3px\";\n copyBtn.style.border = \"none\";\n copyBtn.style.background = \"#007aff\";\n copyBtn.style.color = \"#fff\";\n copyBtn.style.cursor = \"pointer\";\n copyBtn.onclick = () => this.copySessionId();\n\n d.append(label, value, copyBtn);\n return d;\n };\n\n const title = document.createElement(\"h3\");\n title.textContent = \"🔍 调试信息\";\n title.style.margin = \"0 0 12px 0\";\n title.style.color = \"#00ff88\";\n title.style.fontSize = \"14px\";\n\n const content = document.createElement(\"div\");\n content.append(\n title,\n make(\"look_name\", \"角色look_name\"),\n make(\"video_name\", \"当前视频\"),\n makeSessionIdWithCopy(), // 🔥 替换成带复制按钮的\n make(\"frame_idx\", \"当前帧\"),\n make(\"audio_info\", \"下发音频\"),\n make(\"event_info\", \"下发事件\"),\n make(\"fps\", \"FPS\"),\n );\n\n const perfTitle = document.createElement(\"div\");\n perfTitle.style.marginBottom = \"8px\";\n perfTitle.innerHTML = `<span style=\"color:#888;font-size:11px;\">性能耗时:</span>`;\n const perf = document.createElement(\"div\");\n perf.style.fontSize = \"11px\";\n perf.style.background = \"rgba(0,0,0,0.2)\";\n perf.style.padding = \"4px\";\n perf.style.borderRadius = \"4px\";\n perf.style.color = \"#fff\";\n this.domRefs[\"perf\"] = perf;\n content.append(perfTitle, perf);\n\n const errWrap = document.createElement(\"div\");\n errWrap.style.borderTop = \"1px solid #444\";\n errWrap.style.paddingTop = \"8px\";\n errWrap.style.marginBottom = \"8px\";\n\n const errTitle = document.createElement(\"h4\");\n errTitle.style.margin = \"0 0 6px 0\";\n errTitle.style.fontSize = \"12px\";\n errTitle.style.color = \"#888\";\n const errCount = document.createElement(\"span\");\n this.domRefs[\"error_count\"] = errCount;\n errTitle.append(\"✅ 错误日志 \", errCount);\n errWrap.append(errTitle);\n\n const makePre = (id: string) => {\n const p = document.createElement(\"pre\");\n p.style.margin = \"0 0 4px 0\";\n p.style.padding = \"6px\";\n p.style.background = \"rgba(255,255,255,0.05)\";\n p.style.borderRadius = \"4px\";\n p.style.fontSize = \"10px\";\n p.style.lineHeight = \"1.3\";\n p.style.color = \"#888\";\n p.style.maxHeight = \"120px\";\n p.style.overflowY = \"auto\";\n p.style.whiteSpace = \"pre-wrap\";\n this.domRefs[id] = p;\n return p;\n };\n\n const errLog = makePre(\"error_log\");\n const ttsaLog = makePre(\"ttsa_error_log\");\n errWrap.append(errLog, ttsaLog);\n content.append(errWrap);\n\n content.append(\n make(\"mem\", \"内存占用\"),\n make(\"session_start\", \"会话开始时间\"),\n make(\"session_duration\", \"会话时长\"),\n make(\"network\", \"网络信息\")\n );\n\n this.container.append(content);\n this.sdkContainer?.appendChild(this.container);\n this.enableDrag(this.container);\n }\n\n private formatErrors(isTtsa: boolean): string {\n let list = this.errors;\n if (isTtsa) list = list.filter(e => e.code === EErrorCode.TTSA_ERROR);\n else list = list.filter(e => e.code !== EErrorCode.TTSA_ERROR);\n if (list.length === 0) return \"暂无错误\";\n return list\n .map(e => `[${new Date(e.timestamp).toLocaleTimeString()}] ${e.code}: ${e.message}`)\n .join(\"\\n\");\n }\n\n private updatePerfMetrics() {\n if (!(window as any).performanceTracker) return;\n const raw = (window as any).performanceTracker.getVideoMetrics();\n for (const [k, v] of Object.entries(raw)) {\n const t = (v as any)?.time ?? 0;\n if (!this.perfMetrics[k]) this.perfMetrics[k] = { times: [], avg: 0, last: 0, count: 0 };\n const m = this.perfMetrics[k];\n m.times.push(t);\n m.last = t;\n m.count++;\n m.avg = m.times.reduce((a, b) => a + b, 0) / m.times.length;\n }\n }\n\n private formatPerfMetrics(): string {\n const m = this.perfMetrics;\n if (!Object.keys(m).length) return \"暂无数据\";\n return Object.entries(m)\n .map(([k, v]) => `${k}: 最近:${v.last.toFixed(2)}ms 平均:${v.avg.toFixed(2)}ms 次数:${v.count}`)\n .join(\"<br>\");\n }\n\n private formatMemory(): string {\n const m = this.memoryInfo;\n if (!m.usedJSHeapSize) return \"N/A\";\n const used = (m.usedJSHeapSize! / 1048576).toFixed(1);\n const total = (m.totalJSHeapSize! / 1048576).toFixed(1);\n const limit = (m.jsHeapSizeLimit! / 1048576).toFixed(1);\n return `${used}MB / ${total}MB / ${limit}MB`;\n }\n\n private trackFPS() {\n const loop = (now: number) => {\n this.frameCount++;\n if (now - this.lastFpsUpdate >= 1000) {\n this.fps = this.frameCount;\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n requestAnimationFrame(loop);\n };\n requestAnimationFrame(loop);\n }\n\n private updateMemory() {\n if ((window as any).performance?.memory) {\n const m = (window as any).performance.memory;\n this.memoryInfo = {\n jsHeapSizeLimit: m.jsHeapSizeLimit,\n totalJSHeapSize: m.totalJSHeapSize,\n usedJSHeapSize: m.usedJSHeapSize,\n };\n }\n }\n\n private trackMemory() {\n if ((window as any).performance?.memory) {\n setInterval(() => this.updateMemory(), 1000);\n }\n }\n\n private getNetworkInfo(): string {\n const conn = (navigator as any).connection;\n if (!conn) return \"N/A\";\n return `类型:${conn.effectiveType} 下行:${conn.downlink}Mbps 延迟:${conn.rtt}ms`;\n }\n\n private applyStyles(el: HTMLElement) {\n el.style.position = \"fixed\";\n el.style.bottom = \"50px\";\n el.style.right = \"10px\";\n el.style.width = \"350px\";\n el.style.maxHeight = \"400px\";\n el.style.overflowY = \"auto\";\n el.style.background = \"rgba(0,0,0,0.8)\";\n el.style.borderRadius = \"8px\";\n el.style.padding = \"10px\";\n el.style.zIndex = \"99999\";\n el.style.fontSize = \"12px\";\n el.style.color = \"#fff\";\n el.style.textAlign=\"left\";\n }\n\n private enableDrag(el: HTMLElement) {\n let dragging = false, startX = 0, startY = 0, left = 0, top = 0;\n el.style.cursor = \"move\";\n el.addEventListener(\"mousedown\", e => {\n dragging = true;\n startX = e.clientX;\n startY = e.clientY;\n left = el.offsetLeft;\n top = el.offsetTop;\n (document.body as any).style.userSelect = \"none\";\n });\n document.addEventListener(\"mousemove\", e => {\n if (!dragging) return;\n el.style.left = left + e.clientX - startX + \"px\";\n el.style.top = top + e.clientY - startY + \"px\";\n el.style.right = el.style.bottom = \"unset\";\n });\n document.addEventListener(\"mouseup\", () => {\n dragging = false;\n (document.body as any).style.userSelect = \"\";\n });\n }\n}","interface NetworkOptions {\n offlineCallback(message?: string): void\n onlineCallback(message?: string): void\n // retryCallback(count: number): Promise<void>\n}\n\nexport default class NetworkMonitor {\n private TAG = \"[NetworkMonitor]\";\n static ONLINE = true;\n private readonly options: NetworkOptions;\n private retryCount = 1;\n private retryTimer = -1;\n private bindHandleOnline: () => void;\n private bindHandleOffline: () => void;\n public constructor(options: NetworkOptions) {\n this.options = options;\n this.bindHandleOnline = this._handleOnline.bind(this);\n this.bindHandleOffline = this._handleOffline.bind(this);\n this._initEventListeners();\n }\n\n private _initEventListeners(): void {\n window.addEventListener('online', this.bindHandleOnline);\n window.addEventListener('offline', this.bindHandleOffline);\n }\n\n private _handleOnline(): void {\n window.clearTimeout(this.retryTimer)\n NetworkMonitor.ONLINE = true\n this.options.onlineCallback('[NetworkMonitor] 网络已恢复');\n }\n\n private _handleOffline(): void {\n NetworkMonitor.ONLINE = false\n this.options.offlineCallback('[NetworkMonitor] 网络已断开');\n this._attempt();\n }\n\n private _attempt(): void {\n let delay = 1000\n if (this.retryCount > 1) {\n delay = Math.pow(2, this.retryCount) * 1000;\n }\n this.retryTimer = window.setTimeout(() => {\n // this.options.retryCallback(this.retryCount)\n // .then((result) => {\n // if (result === null) {\n // this.retryCount += 1;\n // this._attempt();\n // } else {\n // this._handleOnline()\n // }\n // })\n // .catch(() => {\n // this.retryCount += 1;\n // this._attempt();\n // });\n }, delay);\n };\n\n setState(isOnline: boolean) {\n NetworkMonitor.ONLINE = isOnline;\n }\n\n destroy() {\n window.removeEventListener('online', this.bindHandleOnline);\n window.removeEventListener('offline', this.bindHandleOffline);\n this.retryTimer = -1;\n this.retryCount = 1;\n }\n}","import { EErrorCode, ERROR_CODE_MAP, ERROR_NAME_MAP } from \"../types/error\";\n\nexport default function Errors(params: {\n code: EErrorCode\n message: string\n e?: any\n session_id?: string\n client_speak_id?: string\n}) {\n return {\n code: params.code,\n error_code: ERROR_CODE_MAP[params.code] ?? params.code,\n error_name: ERROR_NAME_MAP[params.code] ?? 'UNKNOWN_ERROR',\n message: params.message,\n session_id: params.session_id || '',\n client_speak_id: params.client_speak_id,\n timestamp: Date.now(),\n originalError: params.e ? JSON.stringify(params.e) : null,\n }\n}\n","// logger.js - 改进的单例日志系统\nlet isLoggingEnabled = false;\n\nfunction executeLog(consoleMethod, ...args) {\n // 边界防护:1. 开关关闭 2. 控制台方法不存在(兼容异常环境)\n if (!isLoggingEnabled || typeof consoleMethod !== 'function') {\n return;\n }\n // 统一拼接前缀,执行原生控制台方法\n consoleMethod( ...args);\n}\n\nconst sdkLog = {\n log: (...args) => executeLog(console.log, ...args),\n info: (...args) => executeLog(console.info, ...args),\n warn: (...args) => executeLog(console.warn, ...args),\n error: (...args) => executeLog(console.error, ...args)\n};\n\n\n// 对外暴露的配置方法\nfunction setLoggingEnabled(enabled) {\n isLoggingEnabled = enabled;\n // 可选:添加日志说明当前日志状态变化\n if (!enabled) {\n console.log('[AVATAR SDK] version:', VERSION, '日志已禁用');\n } else {\n console.log('[AVATAR SDK] version:', VERSION, '日志已启用');\n }\n}\n\n// 定义完整的日志对象\nwindow.avatarSDKLogger = {\n ...sdkLog,\n setEnabled: setLoggingEnabled\n};","import { GLPipelineCharData } from './GLPipeline'\nimport { mvmul } from './Math'\nimport { TensorDataType, RigidTransform, IBRAnimationFrameData_NN } from './DataInterface'\n\nfunction sampleUniformTensor(data: TensorDataType, index: number): number {\n // @ts-ignore\n if(Float16Array === data.constructor || Float32Array === data.constructor || Float64Array === data.constructor)return data[index];\n else if(Uint8Array === data.constructor)return (data[index] / 0xFF);\n else if(Int8Array === data.constructor)return ((data[index] + 0x80) / 0xFF) * 2.0 - 1.0;\n else if(Uint16Array === data.constructor)return (data[index] / 0xFFFF);\n else if(Int16Array === data.constructor)return ((data[index] + 0x8000) / 0xFFFF) * 2.0 - 1.0;\n else if(Uint32Array === data.constructor)return (data[index] / 0xFFFFFFFF);\n else if(Int32Array === data.constructor)return ((data[index] + 0x80000000) / 0xFFFFFFFF) * 2.0 - 1.0;\n else if(BigUint64Array === data.constructor)return (Number(data[index] >> 32n) / 0xFFFFFFFF);\n else if(BigInt64Array === data.constructor)return ((Number(data[index] >> 32n) + 0x80000000) / 0xFFFFFFFF) * 2.0 - 1.0;\n else return 0.0;\n}\nfunction sampleUniformPCATensor(data: TensorDataType, index: number): number {\n // @ts-ignore\n if(Float16Array === data.constructor || Float32Array === data.constructor || Float64Array === data.constructor)return data[index];\n else if(Uint8Array === data.constructor)return (data[index] / 0xFF) * 2.0 - 1.0;\n else if(Int8Array === data.constructor)return ((data[index] + 0x80) / 0xFF) * 2.0 - 1.0;\n else if(Uint16Array === data.constructor)return (data[index] / 0xFFFF) * 2.0 - 1.0;\n else if(Int16Array === data.constructor)return ((data[index] + 0x8000) / 0xFFFF) * 2.0 - 1.0;\n else if(Uint32Array === data.constructor)return (data[index] / 0xFFFFFFFF) * 2.0 - 1.0;\n else if(Int32Array === data.constructor)return ((data[index] + 0x80000000) / 0xFFFFFFFF) * 2.0 - 1.0;\n else if(BigUint64Array === data.constructor)return (Number(data[index] >> 32n) / 0xFFFFFFFF) * 2.0 - 1.0;\n else if(BigInt64Array === data.constructor)return ((Number(data[index] >> 32n) + 0x80000000) / 0xFFFFFFFF) * 2.0 - 1.0;\n else return 0.0;\n}\n\nexport function getVertices(data: GLPipelineCharData, frame_data: IBRAnimationFrameData_NN): number[][][] {\n let char = data.char!;\n\n let initSkeletonStatus = char.evalSkeleton();\n let currentSkeletonStatus = char.evalSkeletonFromMovable(frame_data.movableJointTransforms);\n let joint_matrices = Array(char.skeleton.length);\n for (let i = 0; i < char.skeleton.length; i++) {\n const joint_transform = currentSkeletonStatus[i].apply(initSkeletonStatus[i].inv()) as RigidTransform;\n joint_matrices[i] = joint_transform.homogeneous_matrix();\n }\n\n let result: number[][][] = [];\n for (let mesh_index = 0; mesh_index < char.mesh.length; mesh_index++) {\n let geometry: number[][] = [];\n for (let i = 0; i < char.mesh[mesh_index].blendshapes.size[0]; i++) {\n let vertex: number[] = [];\n let neutral_vertices = char.mesh[mesh_index].vertices;\n let blendshapes = char.mesh[mesh_index].blendshapes;\n let blendshapeWeights = frame_data.blendshapeWeights;\n for (let k = 0; k < 3; k++)vertex.push(neutral_vertices.data[i * neutral_vertices.size[1] + k] as number);\n for (let j = 0; j < char.mesh[mesh_index].blendshapeIndices.length; j++) {\n for (let k = 0; k < 3; k++)vertex[k] += blendshapeWeights[char.mesh[mesh_index].blendshapeIndices[j]] * Number(blendshapes.data[(i * blendshapes.size[1] + k) * blendshapes.size[2] + j]);\n }\n\n vertex.push(1.0);\n let vertex_lbs = [0.0, 0.0, 0.0, 0.0];\n let jointIndex = char.mesh[mesh_index].jointIndex;\n let jointWeight = char.mesh[mesh_index].jointWeight;\n for (let j = 0; j < char.maxJointsPerVertex; j++) {\n let curJointIndex = jointIndex[i * char.maxJointsPerVertex + j];\n if(curJointIndex < char.skeleton.length){\n let vertex_transformed = mvmul(joint_matrices[curJointIndex], vertex);\n for (let k = 0; k < 4; k++)vertex_lbs[k] += jointWeight[i * char.maxJointsPerVertex + j] * vertex_transformed[k];\n }\n }\n\n for (let k = 0; k < 3; k++)vertex_lbs[k] /= vertex_lbs[3];\n geometry.push([vertex_lbs[0], vertex_lbs[1], vertex_lbs[2]]);\n }\n result.push(geometry);\n }\n return result;\n}\n\nexport function getPCATextures(data: GLPipelineCharData, frame_data: IBRAnimationFrameData_NN): ImageData[] {\n let char = data.char!;\n let result: ImageData[] = [];\n\n for (let mesh_index = 0; mesh_index < char.mesh.length; mesh_index++) {\n let texture_model = char.mesh[mesh_index].textureModels[frame_data.mesh[mesh_index].textureModelIndex];\n let texture: number[][][] = [];\n let texture_data = new Uint8ClampedArray(texture_model.data.size[1] * texture_model.data.size[2] * 4);\n\n let mean_weight = 1.0;\n if(texture_model.scalingFactor)mean_weight *= Number(texture_model.scalingFactor.data[0]);\n for (let j = 0; j < texture_model.data.size[1]; j++){\n let row: number[][] = [];\n for (let k = 0; k < texture_model.data.size[2]; k++){\n let pixel: number[] = [];\n for (let l = 0; l < 3; l++)pixel.push(mean_weight * sampleUniformPCATensor(texture_model.data.data, (j * texture_model.data.size[2] + k) * 3 + l));\n row.push(pixel);\n }\n texture.push(row);\n }\n for (let i = 1; i < texture_model.data.size[0]; i++) {\n let weight = frame_data.mesh[mesh_index].texturePCAWeights[i - 1];\n if(texture_model.scalingFactor)weight *= Number(texture_model.scalingFactor.data[i]);\n for (let j = 0; j < texture_model.data.size[1]; j++){\n for (let k = 0; k < texture_model.data.size[2]; k++){\n for (let l = 0; l < 3; l++)texture[j][k][l] += weight * sampleUniformPCATensor(texture_model.data.data, ((i * texture_model.data.size[1] + j) * texture_model.data.size[2] + k) * 3 + l);\n }\n }\n }\n for (let j = 0; j < texture_model.data.size[1]; j++){\n let row: number[][] = [];\n for (let k = 0; k < texture_model.data.size[2]; k++){\n let pixel: number[] = [];\n for (let l = 0; l < 3; l++)texture_data[(j * texture_model.data.size[2] + k) * 4 + l] = Math.round(texture[texture_model.data.size[1] - 1 - j][k][2 - l] * 255);\n texture_data[(j * texture_model.data.size[2] + k) * 4 + 3] = 0xFF;\n }\n }\n result.push(new ImageData(texture_data, texture_model.data.size[1], texture_model.data.size[2]));\n }\n\n return result;\n}\n\ninterface PolygonMeshInfo {\n vertices: number[][],\n uv: number[][],\n polygons: number[][]\n}\n\nfunction exportAsWavefrontObj(geometries: PolygonMeshInfo[]): string {\n let vertex_string = \"\";\n let polygon_string = \"\";\n let vertex_index_offset = 1;\n let geometry_offset = 0;\n for(const geometry of geometries){\n for(const vertex of geometry.vertices)vertex_string += `v ${vertex[0]} ${vertex[1]} ${vertex[2]}\\n`\n for(const uv of geometry.uv)vertex_string += `vt ${uv[0]} ${uv[1]}}\\n`\n\n polygon_string += `g Obj${geometry_offset}\\n`\n for(const poly of geometry.polygons){\n let poly_str = poly.map(x => (x + vertex_index_offset).toString()).map(x => `${x}/${x}`).join(\" \");\n polygon_string += `f ${poly_str}\\n`;\n }\n\n vertex_index_offset += geometry.vertices.length;\n geometry_offset += 1;\n }\n return vertex_string + polygon_string;\n}\n\nexport function getWavefrontObjFromVertices(data: GLPipelineCharData, vertices: number[][][]): string {\n function unflattenUniform(data: TensorDataType, new_axis_size: number): number[][] {\n let result: number[][] = [];\n for (let i = 0; i < data.length; i++) {\n if (0 == i % new_axis_size) result.push([]);\n result[result.length - 1].push(sampleUniformTensor(data, i));\n }\n return result;\n }\n function unflatten(data: TensorDataType, new_axis_size: number): number[][] {\n let result: number[][] = [];\n for (let i = 0; i < data.length; i++) {\n if (0 == i % new_axis_size) result.push([]);\n result[result.length - 1].push(Number(data[i]));\n }\n return result;\n }\n\n let char = data.char!;\n let geometries: PolygonMeshInfo[] = [];\n for (let mesh_index = 0; mesh_index < char.mesh.length; mesh_index++) {\n geometries.push({\n vertices: vertices[mesh_index],\n uv: unflattenUniform(char.mesh[mesh_index].UVCoord.data, 2),\n polygons: unflatten(char.mesh[mesh_index].triangles.data, 3)\n });\n }\n return exportAsWavefrontObj(geometries);\n}","/**\n * StreamingClient - 薄客户端模式下的 WebSocket 连接管理器\n * 负责与 Streaming Server 建立连接,管理消息路由、心跳和重连。\n */\n\nexport interface StreamingClientOptions {\n url: string;\n onReady?: () => void;\n onOffer?: (sdp: string) => void;\n onIce?: (candidate: RTCIceCandidateInit) => void;\n onEventProxy?: (eventType: string, data: any, serverFrame?: number) => void;\n onError?: (error: string) => void;\n onDisconnect?: () => void;\n}\n\nexport class StreamingClient {\n private ws: WebSocket | null = null;\n private options: StreamingClientOptions;\n private retryCount = 0;\n private maxRetry = 27; // 3轮 × 9次\n private retryTimer: number = -1;\n private destroyed = false;\n private connected = false;\n\n constructor(options: StreamingClientOptions) {\n this.options = options;\n }\n\n connect() {\n if (this.destroyed) return;\n\n try {\n this.ws = new WebSocket(this.options.url);\n } catch (e) {\n console.error('[StreamingClient] 创建 WebSocket 失败:', e);\n this.scheduleRetry();\n return;\n }\n\n this.ws.onopen = () => {\n this.connected = true;\n this.retryCount = 0;\n console.log('[StreamingClient] 已连接');\n // 以 client 角色加入\n this.send({ type: 'join', role: 'client' });\n };\n\n this.ws.onmessage = (e) => {\n let msg: any;\n try {\n msg = JSON.parse(e.data);\n } catch {\n return;\n }\n this.handleMessage(msg);\n };\n\n this.ws.onclose = () => {\n this.connected = false;\n if (!this.destroyed) {\n this.options.onDisconnect?.();\n this.scheduleRetry();\n }\n };\n\n this.ws.onerror = () => {\n this.options.onError?.('WebSocket 连接错误');\n };\n }\n\n private handleMessage(msg: any) {\n switch (msg.type) {\n case 'ready':\n this.options.onReady?.();\n break;\n case 'offer':\n this.options.onOffer?.(msg.sdp);\n break;\n case 'answer':\n // Client 不发送 offer,不会收到 answer\n break;\n case 'ice':\n this.options.onIce?.(msg.candidate);\n break;\n case 'event_proxy':\n this.options.onEventProxy?.(msg.event_type, msg.data, msg.server_frame);\n break;\n case 'error':\n this.options.onError?.(msg.message || '未知错误');\n break;\n }\n }\n\n send(msg: object) {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg));\n }\n }\n\n /**\n * 发送 API 调用\n */\n sendApiCall(method: string, params: any[] = []) {\n this.send({ type: 'api_call', method, params });\n }\n\n private scheduleRetry() {\n if (this.destroyed) return;\n if (this.retryCount >= this.maxRetry) {\n console.warn('[StreamingClient] 重试次数已达上限');\n this.options.onError?.('连接重试次数已达上限');\n return;\n }\n\n const delay = this.retryCount === 0 ? 1000 : Math.pow(2, Math.min(this.retryCount, 6)) * 1000;\n this.retryCount++;\n this.retryTimer = window.setTimeout(() => {\n this.connect();\n }, delay);\n }\n\n isConnected() {\n return this.connected;\n }\n\n destroy() {\n this.destroyed = true;\n if (this.retryTimer !== -1) {\n clearTimeout(this.retryTimer);\n this.retryTimer = -1;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.connected = false;\n }\n}\n","/**\n * VideoPlayer - 薄客户端模式下的 WebRTC 收流与播放管理\n * 支持两种模式:\n * - 普通模式:直接 <video> 播放\n * - Alpha Mask 模式:canvas 渲染 + 双路流 alpha 合成(透明背景)\n */\n\nimport { StreamingClient } from './StreamingClient';\n\nexport interface VideoPlayerOptions {\n container: HTMLElement;\n streamingClient: StreamingClient;\n useAlphaMask?: boolean; // 是否启用 alpha mask 透明背景\n onConnected?: () => void;\n onDisconnected?: () => void;\n}\n\nexport class VideoPlayer {\n private video: HTMLVideoElement | null = null;\n private canvas: HTMLCanvasElement | null = null;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private pc: RTCPeerConnection | null = null;\n private stream: MediaStream | null = null;\n private options: VideoPlayerOptions;\n private destroyed = false;\n private animFrameId = 0;\n // alpha 处理用的临时 canvas\n private tempCanvas: HTMLCanvasElement | null = null;\n private tempCtx: CanvasRenderingContext2D | null = null;\n\n constructor(options: VideoPlayerOptions) {\n this.options = options;\n if (options.useAlphaMask) {\n this.createCanvasElement();\n } else {\n this.createVideoElement();\n }\n }\n\n private createVideoElement() {\n const video = document.createElement('video');\n video.autoplay = true;\n video.playsInline = true;\n video.muted = true; // 先静音,等音频轨到达后取消\n video.style.width = '100%';\n video.style.height = '100%';\n video.style.objectFit = 'contain';\n video.style.background = 'transparent';\n this.video = video;\n this.options.container.appendChild(video);\n }\n\n private createCanvasElement() {\n const canvas = document.createElement('canvas');\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.style.objectFit = 'contain';\n canvas.style.background = 'transparent';\n this.canvas = canvas;\n this.canvasCtx = canvas.getContext('2d', { willReadFrequently: true });\n\n // 用于 alpha 合成的临时 canvas\n this.tempCanvas = document.createElement('canvas');\n this.tempCtx = this.tempCanvas.getContext('2d', { willReadFrequently: true });\n\n this.options.container.appendChild(canvas);\n\n // 创建隐藏的 video 元素用于接收 WebRTC 流\n // 注意:不能用 display:none,某些浏览器不解码。用绝对定位 + 1px 尺寸\n const video = document.createElement('video');\n video.autoplay = true;\n video.playsInline = true;\n video.muted = true;\n video.style.position = 'absolute';\n video.style.width = '1px';\n video.style.height = '1px';\n video.style.opacity = '0';\n video.style.pointerEvents = 'none';\n video.style.zIndex = '-1';\n this.video = video;\n this.options.container.appendChild(video);\n }\n\n /**\n * 处理远端 SDP offer,创建 answer 并通过 StreamingClient 回传\n */\n async handleOffer(sdp: string) {\n this.destroyPeer();\n\n this.pc = new RTCPeerConnection({\n iceServers: [\n { urls: 'stun:stun.l.google.com:19302' },\n { urls: 'stun:stun1.l.google.com:19302' },\n // Open Relay 免费 TURN 服务器(跨网络 NAT 穿透)\n { urls: 'turn:openrelay.metered.ca:80', username: 'openrelayproject', credential: 'openrelayproject' },\n { urls: 'turn:openrelay.metered.ca:443', username: 'openrelayproject', credential: 'openrelayproject' },\n { urls: 'turns:openrelay.metered.ca:443', username: 'openrelayproject', credential: 'openrelayproject' },\n ]\n });\n\n this.pc.onicecandidate = (e) => {\n if (e.candidate) {\n this.options.streamingClient.send({\n type: 'ice',\n candidate: e.candidate.toJSON(),\n });\n }\n };\n\n this.pc.ontrack = (e) => {\n console.log('[VideoPlayer] 收到轨道:', e.track.kind, e.track.id);\n if (!this.stream) {\n this.stream = new MediaStream();\n if (this.video) {\n this.video.srcObject = this.stream;\n }\n }\n this.stream.addTrack(e.track);\n\n // 音频轨到达后取消静音并尝试播放\n if (e.track.kind === 'audio' && this.video) {\n this.video.muted = false;\n this.video.play().catch(() => {});\n }\n\n // 视频轨到达后,如果启用 alpha mask,开始渲染循环\n if (e.track.kind === 'video' && this.options.useAlphaMask) {\n console.log('[VideoPlayer] Alpha Mask 模式:启动 canvas 渲染循环');\n this.startAlphaRendering();\n }\n };\n\n this.pc.onconnectionstatechange = () => {\n if (!this.pc) return;\n console.log('[VideoPlayer] WebRTC 状态:', this.pc.connectionState);\n if (this.pc.connectionState === 'connected') {\n this.options.onConnected?.();\n } else if (this.pc.connectionState === 'disconnected' || this.pc.connectionState === 'failed') {\n this.options.onDisconnected?.();\n }\n };\n\n await this.pc.setRemoteDescription(new RTCSessionDescription({ type: 'offer', sdp }));\n const answer = await this.pc.createAnswer();\n await this.pc.setLocalDescription(answer);\n\n this.options.streamingClient.send({ type: 'answer', sdp: answer.sdp });\n }\n\n /**\n * Alpha Mask 渲染循环\n * 将双路流(RGB + Alpha)合成为带透明度的画面\n */\n private startAlphaRendering() {\n if (!this.video || !this.canvas || !this.canvasCtx || !this.tempCanvas || !this.tempCtx) return;\n\n const video = this.video;\n const canvas = this.canvas;\n const ctx = this.canvasCtx;\n const tempCanvas = this.tempCanvas;\n const tempCtx = this.tempCtx;\n\n let lastWidth = 0;\n let lastHeight = 0;\n let frameCount = 0;\n let debugInterval: ReturnType<typeof setInterval> | null = null;\n\n // 启动调试日志:每 2 秒打印一次状态\n debugInterval = setInterval(() => {\n if (this.destroyed) {\n if (debugInterval) clearInterval(debugInterval);\n return;\n }\n console.log(`[VideoPlayer] Alpha 渲染调试: frames=${frameCount}, videoReadyState=${video.readyState}, videoSize=${video.videoWidth}x${video.videoHeight}, currentTime=${video.currentTime.toFixed(2)}s, paused=${video.paused}`);\n }, 2000);\n\n const render = () => {\n if (this.destroyed) {\n if (debugInterval) clearInterval(debugInterval);\n return;\n }\n\n // 视频数据就绪\n if (video.readyState >= 2 && video.videoWidth > 0) {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n\n // 双路流:宽度是原始 2x,左半 RGB,右半 Alpha\n const realW = vw / 2;\n const realH = vh;\n\n // 尺寸变化时更新 canvas 大小\n if (vw !== lastWidth || vh !== lastHeight) {\n canvas.width = realW;\n canvas.height = realH;\n tempCanvas.width = vw; // 需要容纳完整视频帧(RGB + Alpha)\n tempCanvas.height = realH;\n lastWidth = vw;\n lastHeight = vh;\n console.log(`[VideoPlayer] Alpha Mask: 检测到双流 ${vw}x${vh} → 原始 ${realW}x${realH}`);\n }\n\n // 快照:先将整个视频帧绘制到临时 canvas,避免两次 drawImage(video) 之间视频切帧\n tempCtx.clearRect(0, 0, realW * 2, realH);\n tempCtx.drawImage(video, 0, 0);\n\n // 1. 从快照绘制左半 RGB 到输出 canvas\n ctx.clearRect(0, 0, realW, realH);\n ctx.drawImage(tempCanvas, 0, 0, realW, realH, 0, 0, realW, realH);\n\n // 2. 从同一快照读取右半 Alpha 灰度图\n // 3. 读取像素数据并合成 alpha\n try {\n const rgbData = ctx.getImageData(0, 0, realW, realH);\n const alphaData = tempCtx.getImageData(realW, 0, realW, realH);\n const rgb = rgbData.data;\n const alpha = alphaData.data;\n\n // 首帧调试:检查像素数据\n if (frameCount === 0) {\n let nonZeroRGB = 0;\n let nonZeroAlpha = 0;\n const sampleSize = Math.min(1000, rgb.length / 4);\n for (let i = 0; i < sampleSize * 4; i += 4) {\n if (rgb[i] > 0 || rgb[i+1] > 0 || rgb[i+2] > 0) nonZeroRGB++;\n if (alpha[i] > 0) nonZeroAlpha++;\n }\n console.log(`[VideoPlayer] 首帧像素检查: RGB非零=${nonZeroRGB}/${sampleSize}, Alpha非零=${nonZeroAlpha}/${sampleSize}`);\n if (nonZeroRGB === 0) {\n console.warn(`[VideoPlayer] 警告: RGB 全黑!视频可能没有内容`);\n }\n }\n\n // 将 alpha 灰度(R 通道)写入 RGB 的 alpha 通道\n for (let i = 0; i < rgb.length; i += 4) {\n rgb[i + 3] = alpha[i]; // alpha[i] = R 通道 = 灰度值 = 原始 alpha\n }\n\n ctx.putImageData(rgbData, 0, 0);\n frameCount++;\n } catch (e) {\n // getImageData/putImageData 可能因 tainted canvas 失败\n // 降级为直接绘制(无透明背景)\n console.warn(`[VideoPlayer] Alpha 合成失败,降级为直接绘制:`, e);\n ctx.drawImage(video, 0, 0, realW, realH, 0, 0, realW, realH);\n frameCount++;\n }\n }\n\n this.animFrameId = requestAnimationFrame(render);\n };\n\n this.animFrameId = requestAnimationFrame(render);\n }\n\n /**\n * 添加 ICE candidate\n */\n async addIceCandidate(candidate: RTCIceCandidateInit) {\n if (this.pc) {\n await this.pc.addIceCandidate(candidate).catch((e) => {\n console.warn('[VideoPlayer] addIceCandidate 失败:', e);\n });\n }\n }\n\n getVideoElement(): HTMLVideoElement | null {\n return this.video;\n }\n\n getCanvasElement(): HTMLCanvasElement | null {\n return this.canvas;\n }\n\n isConnected(): boolean {\n return this.pc?.connectionState === 'connected';\n }\n\n private destroyPeer() {\n if (this.pc) {\n this.pc.close();\n this.pc = null;\n }\n this.stream = null;\n if (this.animFrameId) {\n cancelAnimationFrame(this.animFrameId);\n this.animFrameId = 0;\n }\n }\n\n destroy() {\n this.destroyed = true;\n this.destroyPeer();\n if (this.video && this.video.parentNode) {\n this.video.parentNode.removeChild(this.video);\n }\n if (this.canvas && this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n this.video = null;\n this.canvas = null;\n this.canvasCtx = null;\n this.tempCanvas = null;\n this.tempCtx = null;\n }\n}\n","/**\n * EventDispatcher - 薄客户端模式下的事件分发器\n * 接收来自 Streaming Server 转发的 event_proxy 消息,\n * 分发到用户注册的回调函数。\n */\n\nimport { AvatarStatus, RenderState, IFrameDataUpdate } from '../types/index';\nimport type { IRawWidgetData } from '../types/frame-data';\nimport { FPSStats } from '../utils/fpsTracker';\n\nexport interface EventDispatcherCallbacks {\n onStateChange?: (state: string) => void;\n onSpeakStateChange?: (state: string, client_speak_id: string | number) => void;\n onVoiceStateChange?: (state: string, duration?: number, client_speak_id?: string | number) => void;\n onStatusChange?: (status: AvatarStatus) => void;\n onRenderChange?: (state: RenderState) => void;\n onWalkStateChange?: (state: string) => void;\n onWidgetEvent?: (data: IRawWidgetData) => void;\n onMessage?: (error: any) => void;\n onNetworkInfo?: (info: any) => void;\n onFPSUpdate?: (stats: FPSStats) => void;\n onDownloadProgress?: (progress: number) => void;\n onSessionId?: (sessionId: string) => void;\n onFrameDataUpdate?: (data: IFrameDataUpdate) => void;\n}\n\nexport class EventDispatcher {\n private callbacks: EventDispatcherCallbacks;\n private subtitleText = '';\n private subtitleVisible = false;\n\n constructor(callbacks: EventDispatcherCallbacks) {\n this.callbacks = callbacks;\n }\n\n /**\n * 处理来自 Streaming Server 的 event_proxy 消息\n */\n dispatch(eventType: string, data: any, _serverFrame?: number) {\n switch (eventType) {\n case 'state_change':\n this.callbacks.onStateChange?.(data.state || data);\n break;\n\n case 'speak_state_change':\n this.callbacks.onSpeakStateChange?.(data.state, data.client_speak_id);\n break;\n\n case 'voice_state_change':\n this.callbacks.onVoiceStateChange?.(data.state, data.duration, data.client_speak_id || '');\n break;\n\n case 'status_change':\n this.callbacks.onStatusChange?.(data.status);\n break;\n\n case 'render_change':\n this.callbacks.onRenderChange?.(data.state);\n break;\n\n case 'walk_state_change':\n this.callbacks.onWalkStateChange?.(data.state || data);\n break;\n\n case 'widget_event':\n this.callbacks.onWidgetEvent?.(data);\n break;\n\n case 'message':\n case 'error':\n this.callbacks.onMessage?.(data);\n break;\n\n case 'network_info':\n this.callbacks.onNetworkInfo?.(data);\n break;\n\n case 'fps_update':\n this.callbacks.onFPSUpdate?.(data);\n break;\n\n case 'download_progress':\n this.callbacks.onDownloadProgress?.(data.progress);\n break;\n\n case 'session_id':\n this.callbacks.onSessionId?.(data.session_id);\n break;\n\n case 'frame_data_update':\n this.callbacks.onFrameDataUpdate?.(data);\n break;\n\n default:\n console.log('[EventDispatcher] 未处理的事件类型:', eventType, data);\n }\n }\n\n getSubtitleText(): string {\n return this.subtitleText;\n }\n\n isSubtitleVisible(): boolean {\n return this.subtitleVisible;\n }\n}\n","/**\n * APIForwarder - 薄客户端模式下的 API 代理转发器\n * 将客户端的 speak/idle/listen 等 API 调用封装为 api_call 消息,\n * 通过 StreamingClient 发送给 Server 端 SDK 执行。\n */\n\nimport { StreamingClient } from './StreamingClient';\n\nexport class APIForwarder {\n private client: StreamingClient;\n\n constructor(client: StreamingClient) {\n this.client = client;\n }\n\n speak(ssml: string, is_start: boolean = true, is_end: boolean = true, extra: any = {}) {\n this.client.sendApiCall('speak', [ssml, is_start, is_end, extra]);\n }\n\n idle() {\n this.client.sendApiCall('idle', []);\n }\n\n listen() {\n this.client.sendApiCall('listen', []);\n }\n\n think() {\n this.client.sendApiCall('think', []);\n }\n\n interactiveidle() {\n this.client.sendApiCall('interactiveidle', []);\n }\n\n interrupt(type: string) {\n this.client.sendApiCall('interrupt', [type]);\n }\n\n changeLayout(layout: any) {\n this.client.sendApiCall('changeLayout', [layout]);\n }\n\n changeWalkConfig(walkConfig: any) {\n this.client.sendApiCall('changeWalkConfig', [walkConfig]);\n }\n\n setVolume(volume: number) {\n this.client.sendApiCall('setVolume', [volume]);\n }\n\n changeAvatarVisible(visible: boolean) {\n this.client.sendApiCall('changeAvatarVisible', [visible]);\n }\n\n switchInvisibleMode() {\n this.client.sendApiCall('switchInvisibleMode', []);\n }\n\n destroy(reason: string = 'user') {\n this.client.sendApiCall('destroy', [reason]);\n }\n\n init(config?: any) {\n this.client.send({ type: 'init', config });\n }\n}\n","import type { ICapabilityCheckItem, ICapabilityCheckReport } from '../types/capability';\n\n// ==================== 同步检查(constructor 使用) ====================\n\n/**\n * 同步检查安全上下文(HTTPS / localhost)\n */\nfunction checkSecureContextSync(): ICapabilityCheckItem {\n const supported = window.isSecureContext;\n return {\n name: 'secureContext',\n supported,\n severity: 'fatal',\n reason: supported ? undefined : '当前环境不是安全上下文,请使用 HTTPS 或 localhost',\n };\n}\n\n/**\n * 同步检查 WebGL2 支持(创建上下文)\n */\nfunction checkWebGL2Sync(): ICapabilityCheckItem {\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl2', { failIfMajorPerformanceCaveat: true });\n if (!gl) {\n return {\n name: 'webgl2',\n supported: false,\n severity: 'fatal',\n reason: '浏览器不支持 WebGL2',\n };\n }\n // 获取基本信息\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n const detail = {\n version: gl.getParameter(gl.VERSION),\n vendor: gl.getParameter(gl.VENDOR),\n renderer: gl.getParameter(gl.RENDERER),\n gpuVendor: debugInfo ? gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) : undefined,\n gpuRenderer: debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : undefined,\n };\n return {\n name: 'webgl2',\n supported: true,\n severity: 'fatal',\n detail,\n };\n } catch (e) {\n return {\n name: 'webgl2',\n supported: false,\n severity: 'fatal',\n reason: 'WebGL2 初始化失败',\n detail: e,\n };\n }\n}\n\n/**\n * 同步检查音频系统(PCM 或 MSE 任一可用即可)\n * \n * SDK 有两种音频播放器:\n * 1. PCM 播放器:AudioWorklet + AudioContext(raw_audio = true)\n * 2. MSE 播放器:MediaSource + HTMLAudioElement(raw_audio = false)\n * \n * 两者二选一,任一可用则 SDK 音频能力可用\n */\nfunction checkAudioSystemSync(): ICapabilityCheckItem {\n // PCM 路径:需要 AudioContext + AudioWorkletNode\n const hasAudioContext = typeof (window as any).AudioContext !== 'undefined'\n || typeof (window as any).webkitAudioContext !== 'undefined';\n const hasAudioWorklet = typeof (window as any).AudioWorkletNode !== 'undefined';\n const pcmSupported = hasAudioContext && hasAudioWorklet;\n\n // MSE 路径:需要 MediaSource + SourceBuffer\n const hasMediaSource = typeof (window as any).MediaSource !== 'undefined';\n const mseSupported = hasMediaSource;\n\n const supported = pcmSupported || mseSupported;\n\n const detail = {\n pcm: {\n supported: pcmSupported,\n hasAudioContext,\n hasAudioWorklet,\n },\n mse: {\n supported: mseSupported,\n hasMediaSource,\n },\n };\n\n if (!supported) {\n return {\n name: 'audio',\n supported: false,\n severity: 'fatal',\n reason: '音频播放能力不可用:PCM(AudioWorklet)和 MSE(MediaSource)均不支持',\n detail,\n };\n }\n\n return {\n name: 'audio',\n supported: true,\n severity: 'fatal',\n detail,\n };\n}\n\n/**\n * 同步检查 WebCodecs API 是否存在(不探测具体编解码器)\n */\nfunction checkWebCodecsSync(): ICapabilityCheckItem {\n const hasVideoDecoder = typeof (window as any).VideoDecoder !== 'undefined';\n const supported = hasVideoDecoder;\n\n return {\n name: 'webcodecs',\n supported,\n severity: 'fatal',\n reason: supported ? undefined : '浏览器不支持 WebCodecs VideoDecoder API',\n detail: { hasVideoDecoder },\n };\n}\n\n/**\n * 同步检查 Web Worker 构造函数是否存在\n */\nfunction checkWorkerSync(): ICapabilityCheckItem {\n const supported = typeof Worker !== 'undefined';\n return {\n name: 'worker',\n supported,\n severity: 'fatal',\n reason: supported ? undefined : '浏览器不支持 Web Worker',\n };\n}\n\n/**\n * 同步检查所有浏览器能力(用于 constructor 快速校验)\n * \n * 检查项:\n * - secureContext:安全上下文(HTTPS / localhost)\n * - webgl2:WebGL2 渲染能力\n * - audio:音频播放能力(PCM 或 MSE 任一可用即可)\n * - webcodecs:WebCodecs API 存在性\n * - worker:Web Worker 支持\n * \n * 音频检查逻辑:SDK 有两种音频播放器(PCM 和 MSE),只需其中一种可用即可\n * - PCM 播放器依赖:AudioContext + AudioWorkletNode\n * - MSE 播放器依赖:MediaSource\n * - 两者都不可用时,音频能力检查失败\n */\nexport function checkCapabilitySync(audioOnlyMode = false): ICapabilityCheckReport {\n const items: ICapabilityCheckItem[] = [\n checkSecureContextSync(),\n ];\n\n if (audioOnlyMode) {\n // audioOnlyMode: only check secureContext, audio, and worker\n items.push(checkAudioSystemSync());\n items.push(checkWorkerSync());\n } else {\n // Full mode: check all capabilities\n items.push(\n checkWebGL2Sync(),\n checkAudioSystemSync(),\n checkWebCodecsSync(),\n checkWorkerSync(),\n );\n }\n\n const fatalCount = items.filter(i => i.severity === 'fatal' && !i.supported).length;\n const warnCount = items.filter(i => i.severity === 'warn' && !i.supported).length;\n\n return {\n supported: fatalCount === 0,\n fatalCount,\n warnCount,\n items,\n };\n}\n\n// ==================== 异步检查(init 详细探测使用) ====================\n\n/**\n * 异步检查 WebCodecs 详细编解码器支持\n */\nasync function checkWebCodecsDetailed(): Promise<ICapabilityCheckItem> {\n try {\n const hasVideoDecoder = typeof (window as any).VideoDecoder !== 'undefined';\n const supported = hasVideoDecoder;\n\n if (!supported) {\n return {\n name: 'webcodecs',\n supported: false,\n severity: 'fatal',\n reason: '浏览器不支持 WebCodecs VideoDecoder API',\n detail: { hasVideoDecoder },\n };\n }\n\n // 探测具体编解码器支持\n let codecSupport: Record<string, boolean> = {};\n const testCodecs = [\n 'video/mp4; codecs=\"avc1.42E01E\"', // H.264 Baseline\n 'video/mp4; codecs=\"avc1.4D001F\"', // H.264 Main\n 'video/mp4; codecs=\"avc1.64001F\"', // H.264 High\n ];\n for (const codec of testCodecs) {\n try {\n const result = await (window as any).VideoDecoder.isConfigSupported({\n codec,\n });\n codecSupport[codec] = result.supported;\n } catch {\n codecSupport[codec] = false;\n }\n }\n\n return {\n name: 'webcodecs',\n supported: true,\n severity: 'fatal',\n detail: { hasVideoDecoder, codecSupport },\n };\n } catch (e) {\n return {\n name: 'webcodecs',\n supported: false,\n severity: 'fatal',\n reason: 'WebCodecs 探测失败',\n detail: e,\n };\n }\n}\n\n/**\n * 异步检查 Worker 实际执行能力\n */\nconst WORKER_CHECK_TIMEOUT_MS = 3000;\nconst WORKER_CHECK_MAX_ATTEMPTS = 2;\n\ntype WorkerProbeResult =\n | { status: 'supported' }\n | { status: 'timeout' }\n | { status: 'failed'; reason: string; detail?: unknown };\n\nfunction probeWorkerExecution(): Promise<WorkerProbeResult> {\n return new Promise((resolve) => {\n let worker: Worker | null = null;\n let url: string | null = null;\n let settled = false;\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n const finish = (result: WorkerProbeResult) => {\n if (settled) return;\n settled = true;\n if (timeout !== null) clearTimeout(timeout);\n worker?.terminate();\n if (url) URL.revokeObjectURL(url);\n resolve(result);\n };\n\n try {\n const blob = new Blob(['self.postMessage(\"ok\");'], { type: 'application/javascript' });\n url = URL.createObjectURL(blob);\n worker = new Worker(url);\n worker.onmessage = (event) => {\n finish(event.data === 'ok'\n ? { status: 'supported' }\n : { status: 'failed', reason: 'Web Worker 执行异常' });\n };\n worker.onerror = (event) => {\n finish({ status: 'failed', reason: 'Web Worker 创建失败', detail: event });\n };\n timeout = setTimeout(() => {\n finish({ status: 'timeout' });\n }, WORKER_CHECK_TIMEOUT_MS);\n } catch (error) {\n finish({ status: 'failed', reason: 'Web Worker 异常', detail: error });\n }\n });\n}\n\nasync function checkWorkerDetailed(): Promise<ICapabilityCheckItem> {\n if (typeof Worker === 'undefined') {\n return {\n name: 'worker',\n supported: false,\n severity: 'fatal',\n reason: '浏览器不支持 Web Worker',\n };\n }\n\n for (let attempt = 1; attempt <= WORKER_CHECK_MAX_ATTEMPTS; attempt += 1) {\n const result = await probeWorkerExecution();\n if (result.status === 'supported') {\n return {\n name: 'worker',\n supported: true,\n severity: 'fatal',\n detail: { attempts: attempt },\n };\n }\n if (result.status === 'failed') {\n return {\n name: 'worker',\n supported: false,\n severity: 'fatal',\n reason: result.reason,\n detail: result.detail,\n };\n }\n }\n\n // iOS/WebKit can suspend or delay a Blob Worker while the page is being\n // inspected, backgrounded, or recovering from a reload. The Worker API is\n // present and no explicit error was raised, so a timing-only probe must not\n // reject the entire SDK initialization. Real worker creation still reports\n // its own fatal error later if the capability is genuinely unavailable.\n return {\n name: 'worker',\n supported: false,\n severity: 'warn',\n reason: `Web Worker 创建超时(已重试 ${WORKER_CHECK_MAX_ATTEMPTS} 次)`,\n detail: { attempts: WORKER_CHECK_MAX_ATTEMPTS },\n };\n}\n\n/**\n * 异步检查所有浏览器能力(详细版,用于 init 阶段详细探测)\n * \n * 包含更详细的编解码器探测和 Worker 执行测试\n */\nexport async function checkCapability(audioOnlyMode = false): Promise<ICapabilityCheckReport> {\n // 先执行同步检查\n const syncReport = checkCapabilitySync(audioOnlyMode);\n\n if (audioOnlyMode) {\n // audioOnlyMode: only detailed check worker\n const detailedItems = await Promise.all([\n Promise.resolve(syncReport.items.find(i => i.name === 'secureContext')!),\n Promise.resolve(syncReport.items.find(i => i.name === 'audio')!),\n checkWorkerDetailed(),\n ]);\n\n const fatalCount = detailedItems.filter(i => i.severity === 'fatal' && !i.supported).length;\n const warnCount = detailedItems.filter(i => i.severity === 'warn' && !i.supported).length;\n\n return {\n supported: fatalCount === 0,\n fatalCount,\n warnCount,\n items: detailedItems,\n };\n }\n\n // 替换 webcodecs 和 worker 为详细版本\n const detailedItems = await Promise.all([\n Promise.resolve(syncReport.items.find(i => i.name === 'secureContext')!),\n Promise.resolve(syncReport.items.find(i => i.name === 'webgl2')!),\n Promise.resolve(syncReport.items.find(i => i.name === 'audio')!),\n checkWebCodecsDetailed(),\n checkWorkerDetailed(),\n ]);\n\n const fatalCount = detailedItems.filter(i => i.severity === 'fatal' && !i.supported).length;\n const warnCount = detailedItems.filter(i => i.severity === 'warn' && !i.supported).length;\n\n return {\n supported: fatalCount === 0,\n fatalCount,\n warnCount,\n items: detailedItems,\n };\n}\n","/**\n * WebCodecs AudioEncoder Opus 编码封装\n * 使用浏览器原生 WebCodecs API 将 PCM 音频编码为 Opus 帧\n */\n\nexport interface OpusEncoderConfig {\n sampleRate: number; // 16000\n channels: number; // 1 (mono)\n bitrate: number; // 24000\n frameSize: number; // 1600 (100ms @ 16kHz)\n}\n\nexport interface EncodedOpusFrame {\n data: Uint8Array;\n durationMs: number;\n}\n\nconst OPUS_FRAME_DURATION_US = 20_000;\nconst ENCODE_TIMEOUT_MS = 2_000;\n\ninterface PendingEncode {\n startTimestampUs: number;\n endTimestampUs: number;\n expectedFrameCount: number;\n chunks: EncodedAudioChunk[];\n resolve(frames: EncodedOpusFrame[]): void;\n reject(error: Error): void;\n timeoutId: number;\n}\n\nfunction buildAudioEncoderConfig(config: OpusEncoderConfig) {\n return {\n codec: 'opus',\n sampleRate: config.sampleRate,\n numberOfChannels: config.channels,\n bitrate: config.bitrate,\n // Safari may otherwise choose a 120 ms Opus packet for a 100 ms AudioData\n // input. The AU protocol clock is fixed at 100 ms, so pin packetization to\n // five 20 ms packets per input block.\n opus: {\n format: 'opus' as const,\n frameDuration: OPUS_FRAME_DURATION_US,\n },\n };\n}\n\nexport class WebCodecOpusEncoder {\n private encoder: AudioEncoder | null = null;\n private config: OpusEncoderConfig;\n private isInitialized = false;\n private pendingEncode: PendingEncode | null = null;\n private timestamp: number = 0; // 单位:微秒\n\n constructor(config: Partial<OpusEncoderConfig> = {}) {\n this.config = {\n sampleRate: 16000,\n channels: 1,\n bitrate: 24000,\n frameSize: 1600,\n ...config,\n };\n }\n\n /**\n * 检测当前浏览器是否支持 WebCodecs Opus 编码\n */\n static async isSupported(): Promise<boolean> {\n if (typeof AudioEncoder === 'undefined') return false;\n try {\n const support = await AudioEncoder.isConfigSupported(buildAudioEncoderConfig({\n sampleRate: 16000,\n channels: 1,\n bitrate: 24000,\n frameSize: 1600,\n }));\n return support.supported === true\n && support.config?.opus?.frameDuration === OPUS_FRAME_DURATION_US;\n } catch {\n return false;\n }\n }\n\n async init(): Promise<void> {\n if (this.isInitialized) return;\n\n this.encoder = this.createEncoder();\n\n this.isInitialized = true;\n }\n\n /**\n * 异步编码 PCM 为 Opus 帧\n * @param pcm S16LE PCM 数据 (Int16Array, 1600 samples = 100ms)\n * @returns 保留 packet 边界和时长的 Opus 帧数组\n */\n async encode(pcm: Int16Array): Promise<EncodedOpusFrame[]> {\n if (!this.isInitialized || !this.encoder) {\n return Promise.reject(new Error('WebCodecOpusEncoder 未初始化'));\n }\n if (this.pendingEncode) {\n return Promise.reject(new Error('WebCodecs Opus 编码器仍在处理上一音频块'));\n }\n\n // 构造 AudioData(S16 格式)\n // 复制为独立 ArrayBuffer,避免 SharedArrayBuffer 类型不兼容\n // 同时确保数据边界精确(Int16Array 可能是更大 buffer 的 view)\n const pcmCopy = new Int16Array(pcm);\n\n const startTimestampUs = this.timestamp;\n const blockDurationUs = Math.round((pcm.length * 1_000_000) / this.config.sampleRate);\n const endTimestampUs = startTimestampUs + blockDurationUs;\n const expectedFrameCount = blockDurationUs / OPUS_FRAME_DURATION_US;\n if (!Number.isInteger(expectedFrameCount)) {\n return Promise.reject(new Error('PCM 音频块无法按 20ms Opus packet 完整分包'));\n }\n\n const audioData = new AudioData({\n format: 's16',\n sampleRate: this.config.sampleRate,\n numberOfFrames: pcmCopy.length,\n numberOfChannels: this.config.channels,\n timestamp: startTimestampUs,\n data: pcmCopy,\n });\n\n const result = new Promise<EncodedOpusFrame[]>((resolve, reject) => {\n const timeoutId = globalThis.setTimeout(() => {\n this.failPending(new Error('WebCodecs Opus 编码输出超过 2 秒'));\n }, ENCODE_TIMEOUT_MS);\n this.pendingEncode = {\n startTimestampUs,\n endTimestampUs,\n expectedFrameCount,\n chunks: [],\n resolve,\n reject,\n timeoutId,\n };\n });\n\n try {\n this.encoder.encode(audioData);\n this.timestamp = endTimestampUs;\n } catch (cause) {\n this.failPending(cause instanceof Error ? cause : new Error('WebCodecs Opus 编码失败'));\n } finally {\n audioData.close();\n }\n\n return result;\n }\n\n /**\n * 重置时间戳(新 speak 段开始时调用)\n */\n reset(): void {\n this.timestamp = 0;\n this.failPending(new Error('WebCodecs Opus 编码已重置'));\n if (this.encoder) {\n try {\n this.encoder.close();\n } catch {}\n this.encoder = this.createEncoder();\n }\n }\n\n async destroy(): Promise<void> {\n const encoder = this.encoder;\n if (encoder) {\n try {\n await encoder.flush();\n } catch {}\n this.failPending(new Error('WebCodecs Opus 编码器已销毁'));\n try {\n encoder.close();\n } catch {}\n }\n this.encoder = null;\n this.isInitialized = false;\n }\n\n private createEncoder() {\n let encoder: AudioEncoder;\n encoder = new AudioEncoder({\n output: (chunk) => {\n if (this.encoder === encoder) {\n this.handleOutput(chunk);\n }\n },\n error: (cause) => {\n if (this.encoder !== encoder) return;\n const error = cause instanceof Error ? cause : new Error('WebCodecs Opus 编码失败');\n const logger = (globalThis as typeof globalThis & {\n avatarSDKLogger?: Pick<Console, 'error'>;\n }).avatarSDKLogger || console;\n logger.error('[WebCodecOpusEncoder] 编码错误:', error);\n this.failPending(error);\n },\n });\n encoder.configure(buildAudioEncoderConfig(this.config));\n return encoder;\n }\n\n private handleOutput(chunk: EncodedAudioChunk) {\n const pending = this.pendingEncode;\n if (!pending) {\n // flush() may emit one codec-delay/padding packet after all real PCM input.\n return;\n }\n if (\n chunk.timestamp < pending.startTimestampUs\n || chunk.timestamp >= pending.endTimestampUs\n || (chunk.duration !== null && chunk.duration !== OPUS_FRAME_DURATION_US)\n ) {\n this.failPending(new Error('WebCodecs Opus 未按 20ms 分包,无法生成固定 100ms AU 音频'));\n return;\n }\n\n pending.chunks.push(chunk);\n if (pending.chunks.length > pending.expectedFrameCount) {\n this.failPending(new Error('WebCodecs Opus 未按 20ms 分包,无法生成固定 100ms AU 音频'));\n return;\n }\n if (pending.chunks.length < pending.expectedFrameCount) {\n return;\n }\n\n const frames = pending.chunks.map((encodedChunk, index) => {\n const data = new Uint8Array(encodedChunk.byteLength);\n encodedChunk.copyTo(data);\n const nextTimestamp = pending.chunks[index + 1]?.timestamp ?? pending.endTimestampUs;\n const durationUs = encodedChunk.duration && encodedChunk.duration > 0\n ? encodedChunk.duration\n : Math.max(1, nextTimestamp - encodedChunk.timestamp);\n return { data, durationMs: durationUs / 1000 };\n });\n const totalDurationMs = frames.reduce((total, frame) => total + frame.durationMs, 0);\n if (\n frames.some((frame) => frame.durationMs !== OPUS_FRAME_DURATION_US / 1000)\n || totalDurationMs !== (pending.endTimestampUs - pending.startTimestampUs) / 1000\n ) {\n this.failPending(new Error('WebCodecs Opus 未按 20ms 分包,无法生成固定 100ms AU 音频'));\n return;\n }\n\n globalThis.clearTimeout(pending.timeoutId);\n this.pendingEncode = null;\n pending.resolve(frames);\n }\n\n private failPending(error: Error) {\n const pending = this.pendingEncode;\n if (!pending) return;\n globalThis.clearTimeout(pending.timeoutId);\n this.pendingEncode = null;\n pending.reject(error);\n }\n}\n","/**\n * WebM EBML 封装器\n * 将 Opus 帧封装为 WebM 容器格式,产出与 MSE 模式一致的 WebM/Opus 数据\n *\n * WebM 结构:\n * EBML Header → Segment → SegmentInfo → Tracks → Cluster(s) → SimpleBlock(s)\n */\n\n// EBML Element IDs\nconst EBML_ID = {\n EBML: 0x1A45DFA3,\n EBMLVersion: 0x4286,\n EBMLReadVersion: 0x42F7,\n EBMLMaxIDLength: 0x42F2,\n EBMLMaxSizeLength: 0x42F3,\n DocType: 0x4282,\n DocTypeVersion: 0x4287,\n DocTypeReadVersion: 0x4285,\n\n Segment: 0x18538067,\n SegmentInfo: 0x1549A966,\n TimecodeScale: 0x2AD7B1,\n MuxingApp: 0x4D80,\n WritingApp: 0x5741,\n\n Tracks: 0x1654AE6B,\n TrackEntry: 0xAE,\n TrackNumber: 0xD7,\n TrackUID: 0x73C5,\n TrackType: 0x83,\n FlagLacing: 0x9C,\n Language: 0x22B59C,\n CodecID: 0x86,\n CodecPrivate: 0x63A2,\n CodecDelay: 0x56AA,\n SeekPreRoll: 0x56BB,\n Audio: 0xE1,\n SamplingFrequency: 0xB5,\n Channels: 0x9F,\n\n Cluster: 0x1F43B675,\n Timecode: 0xE7,\n SimpleBlock: 0xA3,\n};\n\nexport class WebMMuxer {\n private chunks: Uint8Array[] = [];\n private hasHeader = false;\n private clusterTimestamp: number = 0; // 单位:毫秒\n private sampleRate: number;\n private frameDuration: number = 100; // 100ms per frame\n\n constructor(sampleRate: number = 16000) {\n this.sampleRate = sampleRate;\n }\n\n /**\n * 写入 WebM 文件头(EBML Header + Segment Info + Track)\n */\n writeHeader(): void {\n if (this.hasHeader) return;\n\n const header = this.buildEBMLHeader();\n const segmentInfo = this.buildSegmentInfo();\n const tracks = this.buildOpusTracks();\n\n // EBML Header\n this.chunks.push(header);\n // Segment (open-ended, use unknown size)\n this.chunks.push(new Uint8Array([0x18, 0x53, 0x80, 0x67, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]));\n // SegmentInfo\n this.chunks.push(segmentInfo);\n // Tracks\n this.chunks.push(tracks);\n\n this.hasHeader = true;\n this.clusterTimestamp = 0;\n }\n\n /**\n * 写入 Opus 帧\n * @param opusFrame Opus 编码后的数据\n * @param durationMs 帧时长 (默认 100ms)\n */\n feedOpusFrame(opusFrame: Uint8Array, durationMs: number = this.frameDuration): void {\n if (!this.hasHeader) {\n this.writeHeader();\n }\n\n // 每帧都创建一个新 Cluster(与 MediaRecorder 行为一致)\n const cluster = this.buildCluster(Math.round(this.clusterTimestamp), opusFrame);\n this.chunks.push(cluster);\n this.clusterTimestamp += durationMs;\n }\n\n /**\n * 获取新增的 WebM 数据(自上次 flush 以来的数据)\n * 返回后清空已返回的数据,避免重复发送\n */\n flush(): ArrayBuffer {\n if (this.chunks.length === 0) {\n return new ArrayBuffer(0);\n }\n \n const totalLength = this.chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n \n // 关键:清空已返回的数据,避免下次 flush 重复发送\n this.chunks = [];\n \n return result.buffer;\n }\n\n /**\n * 重置(新 speak 段开始时调用)\n */\n reset(): void {\n this.chunks = [];\n this.hasHeader = false;\n this.clusterTimestamp = 0;\n }\n\n // ── EBML 编码辅助方法 ──\n\n /**\n * 编码 VINT(Variable-length Integer)\n */\n private encodeVINT(value: number, width?: number): Uint8Array {\n if (width !== undefined) {\n const bytes = new Uint8Array(width);\n for (let i = width - 1; i >= 0; i--) {\n bytes[i] = value & 0xFF;\n value >>>= 8;\n }\n bytes[0] |= (1 << (8 - width));\n return bytes;\n }\n\n // 自动选择最小宽度\n if (value < 0x7F) {\n return new Uint8Array([0x80 | value]);\n } else if (value < 0x3FFF) {\n return new Uint8Array([0x40 | (value >> 8), value & 0xFF]);\n } else if (value < 0x1FFFFF) {\n return new Uint8Array([0x20 | (value >> 16), (value >> 8) & 0xFF, value & 0xFF]);\n } else if (value < 0x0FFFFFFF) {\n return new Uint8Array([0x10 | (value >> 24), (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF]);\n }\n throw new Error(`VINT value too large: ${value}`);\n }\n\n /**\n * 编码 EBML Element ID\n */\n private encodeID(id: number): Uint8Array {\n if (id <= 0xFF) return new Uint8Array([id]);\n if (id <= 0xFFFF) return new Uint8Array([id >> 8, id & 0xFF]);\n if (id <= 0xFFFFFF) return new Uint8Array([id >> 16, (id >> 8) & 0xFF, id & 0xFF]);\n return new Uint8Array([id >>> 24, (id >> 16) & 0xFF, (id >> 8) & 0xFF, id & 0xFF]);\n }\n\n /**\n * 编码无符号整数\n */\n private encodeUint(value: number): Uint8Array {\n if (value === 0) return new Uint8Array([0]);\n const bytes: number[] = [];\n let v = value;\n while (v > 0) {\n bytes.unshift(v & 0xFF);\n v = Math.floor(v / 256);\n }\n return new Uint8Array(bytes);\n }\n\n /**\n * 编码字符串\n */\n private encodeString(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n }\n\n /**\n * 编码浮点数(32-bit IEEE 754)\n */\n private encodeFloat32(value: number): Uint8Array {\n const buf = new ArrayBuffer(4);\n new DataView(buf).setFloat32(0, value, false); // big-endian\n return new Uint8Array(buf);\n }\n\n /**\n * 编码 EBML Element = ID + Size + Data\n */\n private encodeElement(id: number, data: Uint8Array): Uint8Array {\n const idBytes = this.encodeID(id);\n const sizeBytes = this.encodeVINT(data.length);\n const result = new Uint8Array(idBytes.length + sizeBytes.length + data.length);\n result.set(idBytes, 0);\n result.set(sizeBytes, idBytes.length);\n result.set(data, idBytes.length + sizeBytes.length);\n return result;\n }\n\n /**\n * 编码 unsigned integer Element\n */\n private encodeUintElement(id: number, value: number): Uint8Array {\n return this.encodeElement(id, this.encodeUint(value));\n }\n\n /**\n * 编码 string Element\n */\n private encodeStringElement(id: number, value: string): Uint8Array {\n return this.encodeElement(id, this.encodeString(value));\n }\n\n /**\n * 编码 float32 Element\n */\n private encodeFloat32Element(id: number, value: number): Uint8Array {\n return this.encodeElement(id, this.encodeFloat32(value));\n }\n\n /**\n * 合并多个 Uint8Array\n */\n private concatArrays(arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n }\n\n /**\n * 构建 EBML Header\n */\n private buildEBMLHeader(): Uint8Array {\n const children = this.concatArrays([\n this.encodeUintElement(EBML_ID.EBMLVersion, 1),\n this.encodeUintElement(EBML_ID.EBMLReadVersion, 1),\n this.encodeUintElement(EBML_ID.EBMLMaxIDLength, 4),\n this.encodeUintElement(EBML_ID.EBMLMaxSizeLength, 8),\n this.encodeStringElement(EBML_ID.DocType, 'webm'),\n // Opus tracks use CodecDelay and SeekPreRoll, which require WebM v4.\n this.encodeUintElement(EBML_ID.DocTypeVersion, 4),\n this.encodeUintElement(EBML_ID.DocTypeReadVersion, 2),\n ]);\n return this.encodeElement(EBML_ID.EBML, children);\n }\n\n /**\n * 构建 SegmentInfo\n */\n private buildSegmentInfo(): Uint8Array {\n const children = this.concatArrays([\n this.encodeUintElement(EBML_ID.TimecodeScale, 1000000), // 1ms precision\n this.encodeStringElement(EBML_ID.MuxingApp, 'xmov-avatar-sdk'),\n this.encodeStringElement(EBML_ID.WritingApp, 'xmov-avatar-sdk'),\n ]);\n return this.encodeElement(EBML_ID.SegmentInfo, children);\n }\n\n /**\n * 构建 Opus Audio Track\n */\n private buildOpusTracks(): Uint8Array {\n // Opus CodecPrivate data (OpusHead)\n // Version(1) + Channels(1) + PreSkip(2) + InputSampleRate(4) + OutputGain(2) + ChannelMappingFamily(1)\n const opusHead = new Uint8Array([\n 0x4F, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64, // \"OpusHead\"\n 0x01, // Version\n 0x01, // Channel count (mono)\n 0x00, 0x00, // Pre-skip (0)\n 0x80, 0x3E, 0x00, 0x00, // Input sample rate (16000, little-endian)\n 0x00, 0x00, // Output gain (0)\n 0x00, // Channel mapping family (0)\n ]);\n\n const audioChildren = this.concatArrays([\n this.encodeFloat32Element(EBML_ID.SamplingFrequency, this.sampleRate),\n this.encodeUintElement(EBML_ID.Channels, 1),\n ]);\n\n const trackEntryChildren = this.concatArrays([\n this.encodeUintElement(EBML_ID.TrackNumber, 1),\n this.encodeUintElement(EBML_ID.TrackUID, 1),\n this.encodeUintElement(EBML_ID.TrackType, 2), // Audio\n this.encodeUintElement(EBML_ID.FlagLacing, 0),\n this.encodeStringElement(EBML_ID.Language, 'und'),\n this.encodeStringElement(EBML_ID.CodecID, 'A_OPUS'),\n this.encodeElement(EBML_ID.CodecPrivate, opusHead),\n this.encodeUintElement(EBML_ID.CodecDelay, 0),\n this.encodeUintElement(EBML_ID.SeekPreRoll, 80000000), // 80ms in ns\n this.encodeElement(EBML_ID.Audio, audioChildren),\n ]);\n\n const trackEntry = this.encodeElement(EBML_ID.TrackEntry, trackEntryChildren);\n return this.encodeElement(EBML_ID.Tracks, trackEntry);\n }\n\n /**\n * 构建 Cluster + SimpleBlock\n */\n private buildCluster(timecodeMs: number, opusData: Uint8Array): Uint8Array {\n // Timecode element\n const timecode = this.encodeUintElement(EBML_ID.Timecode, timecodeMs);\n\n // SimpleBlock: TrackNumber(VINT) + Timecode(2 bytes, signed, relative to cluster) + Flags(1 byte) + Data\n const trackNumber = this.encodeVINT(1); // Track 1\n const relativeTimecode = new Uint8Array([0x00, 0x00]); // 0ms relative\n // WebCodecs Opus EncodedAudioChunk values are always key chunks.\n const flags = new Uint8Array([0x80]);\n\n const simpleBlockData = this.concatArrays([\n trackNumber,\n relativeTimecode,\n flags,\n opusData,\n ]);\n const simpleBlock = this.encodeElement(EBML_ID.SimpleBlock, simpleBlockData);\n\n // Cluster = Timecode + SimpleBlock\n const clusterChildren = this.concatArrays([timecode, simpleBlock]);\n return this.encodeElement(EBML_ID.Cluster, clusterChildren);\n }\n}\n","import { WebCodecOpusEncoder } from './webcodec-opus-encoder';\nimport { WebMMuxer } from './webm-muxer';\n\nexport class PcmWebMEncoder {\n private readonly opusEncoder = new WebCodecOpusEncoder({\n sampleRate: 16000,\n channels: 1,\n bitrate: 24000,\n frameSize: 1600,\n });\n private readonly muxer = new WebMMuxer(16000);\n private queue: Promise<void> = Promise.resolve();\n private generation = 0;\n private destroyed = false;\n private pendingBlocks = 0;\n\n static isSupported() {\n return WebCodecOpusEncoder.isSupported();\n }\n\n async init() {\n await this.opusEncoder.init();\n }\n\n async encode(pcm: Int16Array) {\n if (pcm.length !== 1600) {\n throw new Error(`PCM 音频块必须为 1600 samples,实际为 ${pcm.length}`);\n }\n if (this.pendingBlocks >= 20) {\n throw new Error(\"PCM/Opus 编码队列超过 2 秒\");\n }\n this.pendingBlocks += 1;\n const generation = this.generation;\n const pcmCopy = new Int16Array(pcm);\n const operation = this.queue.then(async () => {\n if (this.destroyed || generation !== this.generation) {\n return new ArrayBuffer(0);\n }\n const frames = await this.opusEncoder.encode(pcmCopy);\n if (this.destroyed || generation !== this.generation) {\n return new ArrayBuffer(0);\n }\n for (const frame of frames) {\n this.muxer.feedOpusFrame(frame.data, frame.durationMs);\n }\n return this.muxer.flush();\n });\n const trackedOperation = operation.finally(() => {\n this.pendingBlocks -= 1;\n });\n this.queue = trackedOperation.then(() => undefined, () => undefined);\n return trackedOperation;\n }\n\n reset() {\n const generation = ++this.generation;\n this.queue = this.queue.then(() => {\n if (!this.destroyed && generation === this.generation) {\n this.opusEncoder.reset();\n this.muxer.reset();\n }\n });\n }\n\n async destroy() {\n this.destroyed = true;\n this.generation += 1;\n await this.opusEncoder.destroy();\n await this.queue;\n this.muxer.reset();\n }\n}\n","/**\n * MediaRecorder 降级编码器\n * 对于不支持 WebCodecs Opus 但支持 MediaRecorder webm/opus 的平台(Safari 18.4+)\n * 通过 16kHz AudioContext + PCMInjectorProcessor + MediaRecorder 实现 Opus 编码\n */\n\nexport class MediaRecorderEncoder {\n private audioCtx: AudioContext | null = null;\n private workletNode: AudioWorkletNode | null = null;\n private destination: MediaStreamAudioDestinationNode | null = null;\n private recorder: MediaRecorder | null = null;\n private isRecording = false;\n private nextResolve: ((data: ArrayBuffer | null) => void) | null = null;\n private dataQueue: ArrayBuffer[] = []; // 缓冲 ondataavailable 产生的数据\n\n /**\n * 检测当前浏览器是否支持 MediaRecorder webm/opus\n */\n static isSupported(): boolean {\n if (typeof MediaRecorder === 'undefined') return false;\n return MediaRecorder.isTypeSupported('audio/webm;codecs=opus');\n }\n\n /**\n * 初始化:创建 16kHz AudioContext + 中转 Worklet + MediaRecorder\n */\n async init(): Promise<void> {\n const AudioContextCtor = window.AudioContext || (window as any).webkitAudioContext;\n this.audioCtx = new AudioContextCtor({ sampleRate: 16000 });\n\n // PCM 注入处理器:接收主线程传入的 S16LE PCM 数据,输出到音频流\n const workletCode = `\n class PCMInjectorProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this.buffer = new Float32Array(0);\n this.port.onmessage = (e) => {\n if (e.data.type === 'pcm') {\n const int16 = new Int16Array(e.data.pcm);\n const float32 = new Float32Array(int16.length);\n for (let i = 0; i < int16.length; i++) {\n float32[i] = int16[i] / 32768;\n }\n const newBuffer = new Float32Array(this.buffer.length + float32.length);\n newBuffer.set(this.buffer);\n newBuffer.set(float32, this.buffer.length);\n this.buffer = newBuffer;\n }\n };\n }\n process(inputs, outputs) {\n const output = outputs[0][0];\n if (!output) return true;\n const len = Math.min(output.length, this.buffer.length);\n for (let i = 0; i < len; i++) {\n output[i] = this.buffer[i];\n }\n this.buffer = this.buffer.slice(len);\n for (let i = len; i < output.length; i++) {\n output[i] = 0;\n }\n return true;\n }\n }\n registerProcessor('pcm-injector-processor', PCMInjectorProcessor);\n `;\n const blob = new Blob([workletCode], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n await this.audioCtx.audioWorklet.addModule(url);\n URL.revokeObjectURL(url);\n\n this.workletNode = new AudioWorkletNode(this.audioCtx, 'pcm-injector-processor');\n this.destination = this.audioCtx.createMediaStreamDestination();\n this.workletNode.connect(this.destination);\n\n // 创建 MediaRecorder\n const mimeType = MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n this.recorder = new MediaRecorder(this.destination.stream, {\n mimeType,\n audioBitsPerSecond: 24000,\n });\n\n this.recorder.ondataavailable = (ev: BlobEvent) => {\n if (ev.data && ev.data.size > 0) {\n ev.data.arrayBuffer().then((buffer) => {\n // 如果有等待中的 resolve,立即触发\n if (this.nextResolve) {\n const resolve = this.nextResolve;\n this.nextResolve = null;\n resolve(buffer);\n } else {\n // 否则加入队列缓冲\n this.dataQueue.push(buffer);\n }\n });\n }\n };\n\n // 恢复 AudioContext\n if (this.audioCtx.state === 'suspended') {\n await this.audioCtx.resume();\n }\n }\n\n /**\n * 注入 PCM 数据并等待编码输出\n * @param pcmData S16LE PCM ArrayBuffer (16kHz)\n * @returns 编码后的 WebM 数据,或 null\n */\n async feedPCM(pcmData: ArrayBuffer): Promise<ArrayBuffer | null> {\n if (!this.workletNode || !this.recorder) return null;\n\n // 启动录制(首次)\n if (!this.isRecording) {\n this.recorder.start(100);\n this.isRecording = true;\n }\n\n // 发送 PCM 到 worklet\n this.workletNode.port.postMessage({ type: 'pcm', pcm: pcmData }, [pcmData]);\n\n // 如果队列有缓冲数据,立即返回\n if (this.dataQueue.length > 0) {\n return this.dataQueue.shift()!;\n }\n\n // 否则等待下一个 ondataavailable\n return new Promise<ArrayBuffer | null>((resolve) => {\n const timeout = setTimeout(() => {\n this.nextResolve = null;\n resolve(null);\n }, 200); // 超时 200ms\n\n this.nextResolve = (data) => {\n clearTimeout(timeout);\n resolve(data);\n };\n });\n }\n\n /**\n * 重置(新 speak 段开始时调用)\n */\n reset(): void {\n if (this.recorder && this.recorder.state !== 'inactive') {\n this.recorder.stop();\n }\n this.isRecording = false;\n this.nextResolve = null;\n this.dataQueue = []; // 清空队列缓冲\n }\n\n destroy(): void {\n this.nextResolve = null;\n this.dataQueue = []; // 清空队列缓冲\n if (this.recorder) {\n try {\n if (this.recorder.state !== 'inactive') {\n this.recorder.stop();\n }\n } catch {}\n }\n this.workletNode?.disconnect();\n this.destination?.disconnect();\n try {\n this.audioCtx?.close();\n } catch {}\n this.recorder = null;\n this.workletNode = null;\n this.destination = null;\n this.audioCtx = null;\n }\n}\n","import { AvatarStatus, RenderState, IAvatarOptions, IInitParams, InitModel, Layout, WalkConfig } from \"./types/index\";\nimport { EErrorCode } from \"./types/error\";\nimport { EFrameDataType, IRawFrameData, StateChangeInfo, SYNC_FRAME_DATA } from \"./types/frame-data\";\nimport RenderScheduler from \"./control/RenderScheduler\";\nimport ResourceManager, { ISessionResponse, TDownloadProgress } from \"./modules/ResourceManager\";\nimport WidgetDefaultRender from \"./modules/TrackRenderer/render-implements\";\nimport Ttsa from \"./control/ttsa\";\nimport { DebugOverlay } from \"./view/DebugOverlay\";\nimport NetworkMonitor from './modules/network';\nimport Errors from './modules/error-handle';\n\nimport { performanceConstant } from \"./utils/perfermance\";\nimport './utils/logger.js';\nimport { IBRAnimationGeneratorCharInfo_NN, unpackIBRAnimation, formatMJT } from './utils/DataInterface'\nimport { getVertices, getWavefrontObjFromVertices, getPCATextures } from './utils/GLPipelineDebugTools'\nimport { GLDevice } from './utils/GLDevice'\nimport { GLPipeline } from './utils/GLPipeline'\nimport { getDeviceInfo, isharmony, isSupportMES, validateScaleWithDecimal } from \"./utils\";\nimport { StreamingClient } from './control/StreamingClient';\nimport { VideoPlayer } from './control/VideoPlayer';\nimport { EventDispatcher } from './control/EventDispatcher';\nimport { APIForwarder } from './control/APIForwarder';\nimport { checkCapability } from './utils/capability-checker';\nimport { FPSStats } from \"./utils/fpsTracker\";\nimport { PcmWebMEncoder } from './encoding/pcm-webm-encoder';\nimport { MediaRecorderEncoder } from './encoding/media-recorder-encoder';\n\ntype InternalAvatarOptions = IAvatarOptions & {\n sessionRequestData?: Record<string, unknown>\n}\n\nexport default class XmovAvatar {\n //static STATUS: AvatarStatus | -1 = -1;\n\n private options!: IAvatarOptions;\n\n private TAG = \"[XMOV AVATAR]\";\n private el: HTMLElement | null = null;\n \n // 实例状态,每个 XmovAvatar 实例都有自己独立的状态\n private status: AvatarStatus | -1 = -1;\n\n // 使用 ! 操作符告诉 TypeScript 这些属性会在构造函数中被初始化\n private resourceManager!: ResourceManager;\n private renderScheduler!: RenderScheduler;\n private networkMonitor: NetworkMonitor | null = null;\n private ttsa: Ttsa | null = null;\n\n private debugOverlay: DebugOverlay | null = null;\n\n private _offlineTimer = -1\n private readonly _offlineInterval = 300\n private _env = \"production\"\n // 可以与隐身模式做联动,\n private avatarCanvasVisible: boolean = true; // 数字人canvas显隐状态,默认为true\n private pendingInvisibleMode: boolean = false; // 待处理的隐身模式(在init时设置,在start时应用)\n private isInitialized: boolean = false; // 初始化是否完成(progress === 100)\n public onStateChange: (state: string) => void = () => {};\n\n public onDownloadProgress: TDownloadProgress | null = null;\n\n static IBRAnimationGeneratorCharInfo_NN = IBRAnimationGeneratorCharInfo_NN;\n static unpackIBRAnimation = unpackIBRAnimation;\n static formatMJT = formatMJT;\n static getVertices = getVertices;\n static getPCATextures = getPCATextures;\n static getWavefrontObjFromVertices = getWavefrontObjFromVertices;\n static GLDevice = GLDevice;\n static GLPipeline = GLPipeline;\n static checkCapability = checkCapability;\n private boundVisibilityChange: () => void;\n private replayData: any = null;\n private startConnectTime: number = 0;\n private connectSuccessTime: number = 0;\n private sessionResTime: number = 0;\n private charbinResTime: number = 0;\n private isfirstReceive: boolean = true;\n private enableClientInterrupt: boolean = false; // 是否开启客户端打断\n private retryCount = 1;\n private retryTimer = -1;\n private maxRetryCount = 9;\n private retryRound = 1; // 重试轮次\n private maxRetryRound = 3; // 最大轮次\n private isRetrying = false; // 重试中锁,避免并发调用\n private isStartRetry = false;\n private destroyed = false;\n private incompleteInitializationCleanupPromise: Promise<void> | null = null;\n\n // 音频捕获相关(用于 ASR 回声消除)\n private captureAudioCtx: AudioContext | null = null;\n private captureWorklet: AudioWorkletNode | null = null;\n private captureSource: MediaElementAudioSourceNode | null = null;\n private captureSetupPromise: Promise<void> | null = null;\n private captureLastSpeechId: number = -2;\n private restartPlaybackCaptureImpl: (() => void) | null = null;\n private captureEncodeQueue: Promise<void> = Promise.resolve();\n private captureGeneration = 0;\n\n // PCM 捕获相关(raw_audio=true 模式)\n private pcmCaptureLastSpeechId: number = -2;\n private pcmCaptureFirstChunk: boolean = true;\n private pcmWebMEncoder: PcmWebMEncoder | null = null;\n private mediaRecorderEncoder: MediaRecorderEncoder | null = null;\n private pcmCaptureMode: 'webcodec' | 'mediarecorder' | 'none' = 'none';\n private pcmEncodeId: number = 0; // 用于 reset 竞态检测,递增标识当前编码会话\n\n private reconnectDebounceTimer = -1; // 重连防抖定时器\n private networkInfo: any = {\n rtt: 0,\n downlink: 0.0,\n networkStatus: false,\n };\n\n private mediaRecorder: MediaRecorder | null = null;\n private recordedChunks: Blob[] = [];\n private stream: MediaStream | null = null;\n\n // 薄客户端模式相关字段\n private _isClientMode: boolean = false;\n private _streamingClient: StreamingClient | null = null;\n private _videoPlayer: VideoPlayer | null = null;\n private _eventDispatcher: EventDispatcher | null = null;\n private _apiForwarder: APIForwarder | null = null;\n private _clientOnDownloadProgress: ((progress: number) => void) | null = null;\n private _pendingInit: boolean = false;\n private _pendingInitConfig: any = null;\n private _clientSessionId: string = '';\n\n constructor(options: IAvatarOptions) {\n (window as any).avatarSDKLogger.setEnabled(options.enableLogger);\n this.options = options;\n this._env = options.env || \"production\"\n this.enableClientInterrupt = options.enableClientInterrupt || false;\n this.boundVisibilityChange = this.visibilitychange.bind(this);\n\n // 薄客户端模式:跳过所有重量级初始化,仅准备容器\n if (options.renderMode === 'client') {\n this._isClientMode = true;\n this.initializeClient(options);\n return;\n }\n\n // 完整渲染模式(原有逻辑)\n this.initializeSDK(options);\n this.networkMonitor = new NetworkMonitor({\n offlineCallback: (message) => {\n this.onMessage({\n code: EErrorCode.NETWORK_DOWN,\n message: message || '网络断开',\n });\n console.log('网络断开(network off)', message);\n \n // 如果初始化未完成(progress < 100),清除所有已初始化的资源并断开连接\n if (!this.isInitialized) {\n (window as any).avatarSDKLogger.warn(this.TAG, '初始化未完成时断网,清除所有资源并断开连接');\n void this.cleanupBeforeInitComplete(\"network_offline_before_init\");\n return;\n }\n \n if(this.status !== AvatarStatus.offline) {\n // 无网断开则进入离线模式\n this.offlineHandle();\n }\n },\n onlineCallback: (message) => {\n this.onMessage({\n code: EErrorCode.NETWORK_UP,\n message: message || '网络恢复',\n });\n \n // 如果初始化未完成(progress < 100),清除所有已初始化的资源并断开连接\n if (!this.isInitialized) {\n (window as any).avatarSDKLogger.warn(this.TAG, '网络恢复但初始化未完成,清除所有资源并断开连接');\n void this.cleanupBeforeInitComplete(\"network_online_before_init\");\n return;\n }\n \n // 网络恢复时,取消WebSocket的reconnectTimer,避免与网络恢复的重连逻辑冲突\n this.ttsa?.clearReconnectTimer();\n \n if(this.isStartRetry) {\n this.triggerReconnect(); \n }\n // this.onStatusChange(AvatarStatus.network_on)\n // this._reload()\n // this.ttsa?.connect()\n },\n // retryCallback: (count: number) => {\n // this.onMessage({\n // code: EErrorCode.NETWORK_RETRY,\n // message: '网络重试中',\n // });\n // this.ttsa?.connect();\n // return this.resourceManager._startSession();\n // },\n })\n }\n\n public getStatus() {\n return this.status\n }\n\n public get businessENV() {\n return this._env\n }\n\n public getUniqueSpeakId() {\n return this.ttsa?.getUniqueSpeakId() || `0-${this.getSessionId()}`\n\n }\n\n private async initializeSDK(options: IAvatarOptions) {\n if (!navigator.onLine) {\n this.onMessage({\n code: EErrorCode.NETWORK_BREAK,\n message: '没有网络,请联网后重试',\n });\n return\n }\n const self = this;\n const internalOptions = options as InternalAvatarOptions;\n const { containerId, container, appId, appSecret, gatewayServer, cacheServer, config } = options;\n\n const {scale = 1} = config?.layout?.avatar ?? {}\n if(config?.layout?.avatar?.scale){\n config.layout.avatar.scale = validateScaleWithDecimal(scale, \"initializeSDK\") as number | string;\n }\n const _config = { ...(config || {}), raw_audio: !isSupportMES() };\n\n if(container && container instanceof HTMLElement){\n this.el = container as HTMLElement;\n } else {\n const el = document.querySelector(containerId) as HTMLElement;\n if (!el) {\n this.onMessage({\n code: EErrorCode.CONTAINER_NOT_FOUND,\n message: `containerId: ${containerId} 不存在`,\n })\n return;\n }\n this.el = el;\n }\n const bgContainer = document.createElement(\"div\");\n bgContainer.setAttribute(\"id\", \"avatar-bg-container\");\n bgContainer.setAttribute(\"style\", \"position:absolute;top:0;left:0;width:100%;height:100%;z-index:0;opacity:0;\");\n this.el.appendChild(bgContainer);\n const style = this.el.getAttribute(\"style\");\n if (style) {\n this.el.setAttribute(\n \"style\",\n `position:relative;overflow:hidden;${style}`\n );\n } else {\n this.el.setAttribute(\n \"style\",\n `position:relative;overflow:hidden;`\n );\n }\n this.resourceManager = new ResourceManager({\n sdkInstance: this,\n headers: options.headers,\n tag: options.tag,\n gateway_type: options.gateway_type || 'default',\n asr_id: options.asr_id,\n llm_id: options.llm_id,\n session_speak_req_id: options.session_speak_req_id,\n sessionRequestData: internalOptions.sessionRequestData,\n appId,\n appSecret,\n gatewayServer,\n cacheServer,\n config:_config,\n onNetworkInfo(networkInfo) {\n self.networkInfo = networkInfo;\n options.onNetworkInfo?.(networkInfo);\n },\n onStartSessionWarning: (message: Object) => {\n this.options.onStartSessionWarning?.(message);\n },\n });\n\n this.renderScheduler = new RenderScheduler({\n sdkInstance: this,\n container: this.el,\n resourceManager: this.resourceManager,\n enableDebugger: options.enableDebugger,\n hardwareAcceleration: options.hardwareAcceleration || \"default\",\n enableClientInterrupt: this.enableClientInterrupt,\n audioOnlyMode: options.audioOnlyMode || false,\n onDownloadProgress: (progress: number) => {\n this.onDownloadProgress?.(progress);\n this.el?.setAttribute(\"style\", this.el?.style.cssText + `opacity:${progress === 100 ? '1' : '0'};`);\n // 标记初始化完成\n this.isInitialized = progress === 100;\n if(progress === 100) {\n this.resourceManager._setOfflineCache();\n this.ttsa?.sendSdkPoint('loadvideo_decode_time', {\n timestamp: Date.now(),\n });\n setTimeout(() => {\n this.ttsa?.sendDeviceInfo({\n ...getDeviceInfo(),\n ...(window as any).performanceTracker.getFirstInfo(),\n // @ts-ignore\n sdk_version: VERSION,\n resolution: this.resourceManager.getConfig()?.resolution,\n download_speed: self.networkInfo.downlink || 0,\n })\n }, 20);\n // 初始化音频捕获(MSE 模式下,用于 ASR 回声消除)\n void this.enableAudioPlaybackCapture();\n }\n },\n onStateChange: (state: string) => {\n if((this.getStatus() === AvatarStatus.offline && state !== 'idle') || state === \"\") {\n return\n }\n options.onStateChange?.(state);\n },\n onRenderChange: (state: RenderState, oldState?: RenderState) => {\n options.onRenderChange?.(state);\n // 在如果数字人在恢复渲染态一会和数字人在线态的时候,数字人进入渲染中了,都应该认为是可见状态\n if(state === RenderState.rendering && (oldState === RenderState.resumed || this.getStatus() === AvatarStatus.online) && this.isInitialized) {\n (window as any).avatarSDKLogger.log(this.TAG, 'Status:===== 渲染中,状态: rendering', this.getSessionId());\n this.onStatusChange(AvatarStatus.visible)\n }\n },\n onVoiceStateChange: (state: string, duration?: number, client_speak_id?: string | number) => {\n options.onVoiceStateChange?.(state, duration, client_speak_id);\n },\n onWalkStateChange: (state: string) => {\n options.onWalkStateChange?.(state);\n },\n sendVideoInfo: (info: {name: string, body_id: number, id: number}) => {\n this.debugOverlay?.setVideoInfo(info);\n },\n onSpeakStateChange: (state: string, client_speak_id: string | number) => {\n options.onSpeakStateChange?.(state, client_speak_id);\n },\n setAudioInfo: (info: {\n sf: number;\n ef: number;\n ad: Uint8Array;\n }) => {\n this.debugOverlay?.setAudioInfo(info);\n },\n setEventData: (info: {\n sf: number;\n ef: number;\n event: Array<any>;\n }) => {\n this.debugOverlay?.setEventData(info);\n },\n renderFrameCallback: (frame: number) => {\n this.renderFrameCallback(frame);\n this.handleReplaySend(frame);\n },\n reportMessage: (message: {\n code: EErrorCode;\n message: string;\n e?: object;\n }) => {\n this.onMessage(message);\n },\n sendSdkPoint: (type: string, data: any, extra?: any) => {\n this.ttsa?.sendSdkPoint(type, data, extra);\n },\n sendMessage: (type: string, payload: any) => {\n this.ttsa?.send(type, payload);\n },\n onFPSUpdate: (stats: FPSStats) => {\n options.onFPSUpdate?.(stats);\n },\n onFrameDataUpdate: (data) => {\n options.onFrameDataUpdate?.(data);\n },\n });\n options.onStateRenderChange && (window as any).performanceTracker.setOnStateRenderChange(options.onStateRenderChange);\n\n \n if(config?.walk_config){\n this.changeWalkConfig(config.walk_config)\n }\n if(config?.layout) {\n this.changeLayout(config.layout);\n }\n WidgetDefaultRender.CUSTOM_WIDGET = options.onWidgetEvent;\n WidgetDefaultRender.PROXY_WIDGET = options.proxyWidget || {};\n }\n\n /**\n * 薄客户端模式初始化:创建容器、StreamingClient、VideoPlayer、EventDispatcher、APIForwarder\n */\n private initializeClient(options: IAvatarOptions) {\n const { containerId, container } = options;\n\n // 准备容器\n if (container && container instanceof HTMLElement) {\n this.el = container;\n } else {\n const el = document.querySelector(containerId) as HTMLElement;\n if (!el) {\n this.options.onMessage?.({ code: EErrorCode.CONTAINER_NOT_FOUND, message: `containerId: ${containerId} 不存在` } as any);\n return;\n }\n this.el = el;\n }\n const style = this.el.getAttribute(\"style\");\n if (style) {\n this.el.setAttribute(\"style\", `position:relative;overflow:hidden;${style}`);\n } else {\n this.el.setAttribute(\"style\", \"position:relative;overflow:hidden;\");\n }\n\n // 创建 EventDispatcher\n this._eventDispatcher = new EventDispatcher({\n onStateChange: options.onStateChange,\n onSpeakStateChange: options.onSpeakStateChange,\n onVoiceStateChange: options.onVoiceStateChange,\n onStatusChange: options.onStatusChange,\n onRenderChange: options.onRenderChange,\n onWalkStateChange: options.onWalkStateChange,\n onWidgetEvent: options.onWidgetEvent,\n onMessage: options.onMessage,\n onNetworkInfo: options.onNetworkInfo,\n onFPSUpdate: options.onFPSUpdate,\n onFrameDataUpdate: options.onFrameDataUpdate,\n onDownloadProgress: (progress: number) => {\n this._clientOnDownloadProgress?.(progress);\n if (progress >= 100 && !this.isInitialized) {\n this.isInitialized = true;\n }\n },\n onSessionId: (sessionId: string) => {\n this._clientSessionId = sessionId;\n (window as any).avatarSDKLogger.log(this.TAG, '[client] 收到 session_id:', sessionId);\n },\n });\n\n const streamingUrl = options.streamingServer || `ws://${location.hostname}:8080`;\n\n // 创建 StreamingClient\n this._streamingClient = new StreamingClient({\n url: streamingUrl,\n onReady: () => {\n (window as any).avatarSDKLogger.log(this.TAG, '[client] 双方就绪,等待 Server 推流...');\n // 如果 init() 在 WebSocket 连接前被调用,在此补发\n if (this._pendingInit) {\n this._pendingInit = false;\n const config = this._pendingInitConfig;\n this._pendingInitConfig = null;\n (window as any).avatarSDKLogger.log(this.TAG, '[client] 补发 init 命令');\n this._apiForwarder?.init(config);\n }\n },\n onOffer: (sdp: string) => {\n this._videoPlayer?.handleOffer(sdp);\n },\n onIce: (candidate: RTCIceCandidateInit) => {\n this._videoPlayer?.addIceCandidate(candidate);\n },\n onEventProxy: (eventType: string, data: any, serverFrame?: number) => {\n this._eventDispatcher?.dispatch(eventType, data, serverFrame);\n },\n onError: (error: string) => {\n this.options.onMessage?.({ code: EErrorCode.NETWORK_DOWN, message: error } as any);\n },\n onDisconnect: () => {\n this.onStatusChange(AvatarStatus.offline);\n },\n });\n\n // 创建 VideoPlayer\n this._videoPlayer = new VideoPlayer({\n container: this.el,\n streamingClient: this._streamingClient,\n useAlphaMask: options.useAlphaMask,\n onConnected: () => {\n (window as any).avatarSDKLogger.log(this.TAG, '[client] WebRTC 已连接');\n this.onStatusChange(AvatarStatus.online);\n },\n onDisconnected: () => {\n this.onStatusChange(AvatarStatus.offline);\n },\n });\n\n // 创建 APIForwarder\n this._apiForwarder = new APIForwarder(this._streamingClient);\n\n // 连接信令\n this._streamingClient.connect();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n }\n\n // async preCache() {\n // return this.resourceManager.preCache(this.options.appId, this.options.appSecret);\n // }\n\n private renderFrameCallback(frame: number) {\n // 间隔24帧执行一次\n if(!this.ttsa?.getStatus() && ![AvatarStatus.offline].includes(this.status as AvatarStatus) && frame % 24 === 0) {\n this.offlineHandle()\n }\n }\n\n async init(params: IInitParams): Promise<ISessionResponse | null | undefined> {\n // 浏览器能力检查\n const capabilityReport = await checkCapability(this.options.audioOnlyMode);\n if (!capabilityReport.supported) {\n const fatalItems = capabilityReport.items.filter(i => i.severity === 'fatal' && !i.supported);\n const errorMsg = `浏览器能力检查失败: ${fatalItems.map(i => i.reason).join('; ')}`;\n this.onMessage({\n code: EErrorCode.INIT_ERROR,\n message: errorMsg,\n });\n return;\n }\n\n this.destroyed = false;\n this.isInitialized = false; // 重置初始化状态\n this.incompleteInitializationCleanupPromise = null;\n this.startConnectTime = Date.now();\n\n // 薄客户端模式:保存进度回调,通知 server 端开始初始化,等待 server 的 download_progress 事件\n if (this._isClientMode) {\n this._clientOnDownloadProgress = params.onDownloadProgress || null;\n // 构建发给 server 的配置(排除客户端专用字段)\n const clientConfig = {\n appId: this.options.appId,\n appSecret: this.options.appSecret,\n gatewayServer: this.options.gatewayServer,\n cacheServer: this.options.cacheServer,\n headers: this.options.headers,\n tag: this.options.tag,\n gateway_type: this.options.gateway_type,\n env: this.options.env,\n config: this.options.config,\n hardwareAcceleration: this.options.hardwareAcceleration,\n enableDebugger: this.options.enableDebugger,\n initModel: params.initModel,\n scaleDownBy: this.options.scaleDownBy || 1,\n useAlphaMask: this.options.useAlphaMask,\n };\n // 发送 init 命令通知 server 端初始化数字人\n // 如果 WebSocket 尚未连接,暂存等 onReady 时补发\n if (this._streamingClient?.isConnected()) {\n this._apiForwarder?.init(clientConfig);\n } else {\n this._pendingInit = true;\n this._pendingInitConfig = clientConfig;\n (window as any).avatarSDKLogger.log(this.TAG, '[client] WebSocket 未连接,init 命令暂存');\n }\n return;\n }\n\n const { onDownloadProgress, initModel } = params;\n this.onDownloadProgress = (progress: number) => {\n if(progress === 15) {\n this.sessionResTime = Date.now();\n }\n if(progress === 80) {\n this.charbinResTime = Date.now();\n }\n onDownloadProgress(progress);\n };\n\n // 如果初始化时指定了隐身模式,先标记待处理,等start时再真正应用\n if(initModel === InitModel.invisible) {\n this.pendingInvisibleMode = true;\n }\n\n // 加载资源\n (window as any).performanceTracker.markStart(performanceConstant.load_resource);\n (window as any).performanceTracker.markStart(performanceConstant.first_avatar_render);\n (window as any).performanceTracker.markStart(performanceConstant.first_webgl_render);\n const sessionInfo = await this.resourceManager.load(this.onDownloadProgress.bind(this));\n // 如果在load过程中被销毁了,直接返回,避免继续初始化\n if(this.destroyed) {\n (window as any).avatarSDKLogger.warn(this.TAG, \"sdk destroyed during load, aborting after resourceManager load\");\n return\n };\n if(!sessionInfo?.socket_io_url || !sessionInfo?.token) {\n (window as any).avatarSDKLogger.error(this.TAG, \"init error, socket_io_url or token is empty reload\");\n return\n };\n this.connectSuccessTime = Date.now();\n (window as any).performanceTracker.markEnd(performanceConstant.load_resource);\n this.debugOverlay = new DebugOverlay(this, sessionInfo);\n\n this.ttsa = this.connectTtsa(sessionInfo)\n this.renderScheduler.init();\n // 同步初始canvas显隐状态\n this.renderScheduler.setAvatarCanvasVisible(this.avatarCanvasVisible);\n // 设置上报使用ttsa\n (window as any).performanceTracker.setReportFunc(this.ttsa);\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n document.addEventListener('visibilitychange', this.boundVisibilityChange);\n return sessionInfo;\n }\n\n /**\n * 初始化音频捕获(MSE 模式)\n * 通过 AudioContext.createMediaElementSource 接管 <audio> 元素输出,\n * 按 1600 samples 分桶后使用 WebCodecs 编码为 opus (WebM 容器),\n * 并回调给业务侧用于 ASR 回声消除(AEC)。\n *\n * 架构:\n * - AudioWorklet 负责 100ms 分桶和静音检测\n * - WebCodecs AudioEncoder + WebMMuxer 负责 opus/WebM 编码\n * - 每次 speak 会话的首段音频自动包含 WebM 容器头(isFirstChunk=true)\n *\n * 注意:\n * - createMediaElementSource 对同一个 audio 元素只能调用一次\n * - 接管后必须手动 connect 到 destination,否则音频不会播放\n * - MSE 播放器 stop 时只销毁 MediaSource,audio 元素不变,捕获绑定不受影响\n */\n protected setAudioPlaybackDataHandler(handler?: IAvatarOptions[\"onAudioPlaybackData\"]) {\n this.options.onAudioPlaybackData = handler;\n }\n\n protected restartAudioPlaybackCapture() {\n this.restartPlaybackCaptureImpl?.();\n }\n\n protected enableAudioPlaybackCapture() {\n if (!this.options.onAudioPlaybackData) {\n return Promise.resolve();\n }\n if (!this.captureSetupPromise) {\n if (this.resourceManager?.config.raw_audio) {\n // PCM 模式:通过 capture worklet 捕获并编码\n this.captureSetupPromise = this.setupPCMCapture().finally(() => {\n this.captureSetupPromise = null;\n });\n } else {\n // MSE/WebM 模式:通过 AudioWorklet 分桶并用 WebCodecs 编码\n this.captureSetupPromise = this.setupAudioCapture().finally(() => {\n this.captureSetupPromise = null;\n });\n }\n }\n return this.captureSetupPromise;\n }\n\n private async setupAudioCapture() {\n const audioEl = document.getElementById('xmov-avatar-audio') as HTMLAudioElement;\n if (!audioEl || !this.options.onAudioPlaybackData) return;\n if (this.captureAudioCtx || this.captureSource) return;\n\n // 检查 AudioWorkletNode 支持\n if (typeof (window as any).AudioWorkletNode === 'undefined') {\n this.onMessage({\n code: EErrorCode.INIT_ERROR,\n message: '当前浏览器不支持 AudioWorkletNode,无法启用音频捕获(ASR 回声消除)',\n });\n return;\n }\n\n try {\n if (!await PcmWebMEncoder.isSupported()) {\n this.onMessage({\n code: EErrorCode.INIT_ERROR,\n message: '当前浏览器不支持 WebCodecs AudioEncoder Opus,无法启用 100ms 双路音频',\n });\n return;\n }\n this.pcmWebMEncoder = new PcmWebMEncoder();\n await this.pcmWebMEncoder.init();\n\n // 创建 16kHz 采样率的 AudioContext(farend 协议要求)\n this.captureAudioCtx = new AudioContext({ sampleRate: 16000 });\n if (this.captureAudioCtx.sampleRate !== 16000) {\n throw new Error(`浏览器无法创建 16000 Hz AudioContext: ${this.captureAudioCtx.sampleRate}`);\n }\n this.captureSource = this.captureAudioCtx.createMediaElementSource(audioEl);\n\n // 路由到扬声器(必须连接,否则无声)\n this.captureSource.connect(this.captureAudioCtx.destination);\n\n let isRecording = false;\n let isFirstEmit = true;\n let captureStartedAt = 0;\n let captureSequence = 0;\n const startCapture = (sessionId: number) => {\n const generation = ++this.captureGeneration;\n isRecording = true;\n isFirstEmit = true;\n captureStartedAt = Date.now() - 100;\n captureSequence = 0;\n this.captureLastSpeechId = sessionId;\n this.captureEncodeQueue = this.captureEncodeQueue.then(() => {\n if (generation === this.captureGeneration) {\n this.pcmWebMEncoder?.reset();\n }\n });\n };\n\n const stopCapture = () => {\n const generation = ++this.captureGeneration;\n isRecording = false;\n this.captureLastSpeechId = -2;\n this.captureEncodeQueue = this.captureEncodeQueue.then(() => {\n if (generation === this.captureGeneration) {\n this.pcmWebMEncoder?.reset();\n }\n });\n };\n\n this.restartPlaybackCaptureImpl = () => {\n if (isRecording) {\n startCapture(this.renderScheduler.getSpeechId());\n }\n };\n\n // 创建 AudioWorkletProcessor 脚本(在音频线程中运行)\n // 缓冲 1600 个采样点(100ms @ 16kHz),直接回传 S16LE PCM。\n const processorCode = `\n class AudioCaptureProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this.buffer = new Float32Array(1600); // 100ms @ 16kHz\n this.bufferIndex = 0;\n }\n\n process(inputs, outputs) {\n for (const output of outputs) {\n for (const channel of output) channel.fill(0);\n }\n const input = inputs[0];\n if (input && input.length > 0 && input[0] && input[0].length > 0) {\n const frameCount = input[0].length;\n\n for (let i = 0; i < frameCount; i++) {\n let sample = 0;\n for (let channel = 0; channel < input.length; channel++) {\n sample += input[channel][i] || 0;\n }\n this.buffer[this.bufferIndex++] = sample / input.length;\n\n // 缓冲区满 1600 采样点时,检测静音并发送到主线程\n if (this.bufferIndex >= 1600) {\n // 检测是否全是静音(全零或极低值)\n let hasAudio = false;\n for (let j = 0; j < 1600; j++) {\n if (Math.abs(this.buffer[j]) > 0.0001) {\n hasAudio = true;\n break;\n }\n }\n\n const pcm = new Int16Array(1600);\n for (let j = 0; j < 1600; j++) {\n const value = Math.max(-1, Math.min(1, this.buffer[j]));\n pcm[j] = value < 0 ? value * 0x8000 : value * 0x7fff;\n }\n this.port.postMessage(\n { hasAudio: hasAudio, pcmData: pcm.buffer },\n [pcm.buffer]\n );\n this.bufferIndex = 0;\n }\n }\n }\n return true;\n }\n }\n registerProcessor('audio-capture-processor', AudioCaptureProcessor);\n `;\n\n // 通过 Blob URL 加载 processor\n const blob = new Blob([processorCode], { type: 'application/javascript' });\n const processorUrl = URL.createObjectURL(blob);\n await this.captureAudioCtx.audioWorklet.addModule(processorUrl);\n URL.revokeObjectURL(processorUrl);\n\n // 创建 AudioWorkletNode(仅用于静音检测,不连接 destination)\n this.captureWorklet = new AudioWorkletNode(\n this.captureAudioCtx,\n 'audio-capture-processor'\n );\n this.captureSource.connect(this.captureWorklet);\n this.captureWorklet.connect(this.captureAudioCtx.destination);\n\n this.captureEncodeQueue = Promise.resolve();\n this.captureWorklet.port.onmessage = (e) => {\n if (!this.options.onAudioPlaybackData) return;\n\n const { hasAudio, pcmData } = e.data as { hasAudio: boolean; pcmData: ArrayBuffer };\n const speechId = this.renderScheduler.getSpeechId();\n\n if (hasAudio && !isRecording) {\n startCapture(speechId);\n } else if (hasAudio && isRecording && speechId !== this.captureLastSpeechId) {\n startCapture(speechId);\n } else if (!hasAudio && isRecording) {\n stopCapture();\n }\n if (!hasAudio || !isRecording || !(pcmData instanceof ArrayBuffer)) return;\n\n const generation = this.captureGeneration;\n const firstChunk = isFirstEmit;\n isFirstEmit = false;\n const blockStartedAt = captureStartedAt + captureSequence * 100;\n captureSequence += 1;\n this.captureEncodeQueue = this.captureEncodeQueue\n .then(async () => {\n const buffer = await this.pcmWebMEncoder?.encode(new Int16Array(pcmData));\n if (!buffer || buffer.byteLength === 0 || generation !== this.captureGeneration) return;\n this.options.onAudioPlaybackData?.({\n data: buffer,\n codec: 'opus',\n isFirstChunk: firstChunk,\n sampleRate: 16000,\n samples: 1600,\n timestamp: blockStartedAt,\n speech_id: speechId,\n });\n })\n .catch((error) => {\n (window as any).avatarSDKLogger?.error(\n this.TAG,\n '[AudioCapture] PCM/WebCodecs 编码失败:',\n error\n );\n });\n };\n\n // 处理 AudioContext 挂起(浏览器自动播放策略)\n if (this.captureAudioCtx.state === 'suspended') {\n await this.captureAudioCtx.resume();\n }\n if (this.captureAudioCtx.state !== 'running') {\n throw new Error('AudioContext 未运行,无法启动 farend PCM 捕获');\n }\n\n (window as any).avatarSDKLogger?.log(\n this.TAG,\n '[AudioCapture] 初始化成功,采样率:',\n this.captureAudioCtx.sampleRate,\n 'Hz,opus 编码 (WebM 容器)'\n );\n } catch (e) {\n this.captureGeneration++;\n this.restartPlaybackCaptureImpl = null;\n if (this.captureWorklet) {\n try {\n this.captureWorklet.port.onmessage = null;\n this.captureWorklet.disconnect();\n } catch {}\n this.captureWorklet = null;\n }\n try {\n this.captureSource?.disconnect();\n } catch {}\n this.captureSource = null;\n if (this.captureAudioCtx && this.captureAudioCtx.state !== 'closed') {\n await this.captureAudioCtx.close().catch(() => undefined);\n }\n this.captureAudioCtx = null;\n void this.pcmWebMEncoder?.destroy();\n this.pcmWebMEncoder = null;\n (window as any).avatarSDKLogger?.error(\n this.TAG,\n '[AudioCapture] 初始化失败:',\n e\n );\n }\n }\n\n /**\n * 初始化 PCM 模式音频捕获(raw_audio=true 时使用)\n * 通过 PCMAudioPlayer 的 capture worklet 拦截音频输出,\n * 经 WebCodecs 或 MediaRecorder 编码为 WebM/Opus 后回调给业务侧\n */\n private async setupPCMCapture() {\n if (!this.options.onAudioPlaybackData) return;\n\n const audioPlayer = this.renderScheduler.getAudioRenderer()?.getAudioPlayer();\n if (!audioPlayer) {\n (window as any).avatarSDKLogger?.error(\n this.TAG, '[PCMCapture] PCMAudioPlayer 未就绪'\n );\n return;\n }\n\n // 运行时检测编码能力,选择编码路径\n const webCodecsSupported = await PcmWebMEncoder.isSupported();\n const mediaRecorderSupported = MediaRecorderEncoder.isSupported();\n\n if (!webCodecsSupported && !mediaRecorderSupported) {\n (window as any).avatarSDKLogger?.warn(\n this.TAG, '[PCMCapture] 当前浏览器不支持 Opus 编码(WebCodecs 和 MediaRecorder 均不可用),跳过 PCM 捕获'\n );\n this.onMessage({\n code: EErrorCode.INIT_ERROR,\n message: '当前浏览器不支持 Opus 编码,PCM 模式下无法启用音频捕获(ASR 回声消除)',\n });\n return;\n }\n\n try {\n if (webCodecsSupported) {\n // 首选路径:WebCodecs AudioEncoder\n this.pcmWebMEncoder = new PcmWebMEncoder();\n await this.pcmWebMEncoder.init();\n this.pcmCaptureMode = 'webcodec';\n } else {\n // 降级路径:MediaRecorder\n this.mediaRecorderEncoder = new MediaRecorderEncoder();\n await this.mediaRecorderEncoder.init();\n this.pcmCaptureMode = 'mediarecorder';\n }\n\n this.restartPlaybackCaptureImpl = () => {\n this.pcmCaptureFirstChunk = true;\n this.pcmCaptureLastSpeechId = this.renderScheduler.getSpeechId();\n this.pcmEncodeId++;\n this.pcmWebMEncoder?.reset();\n this.mediaRecorderEncoder?.reset();\n audioPlayer.resetCaptureBuffer();\n };\n\n await audioPlayer.attachCapture(async ({ pcmData, hasAudio }) => {\n try {\n if (!this.options.onAudioPlaybackData) return;\n const blockStartedAt = Date.now() - 100;\n\n // 音频未播放时丢弃数据(speak_end 后 capture worklet 可能还有尾巴数据)\n if (!audioPlayer.isPlaying) {\n audioPlayer.resetCaptureBuffer();\n return;\n }\n\n const speechId = this.renderScheduler.getSpeechId();\n\n // 会话变化时重置\n if (speechId !== this.pcmCaptureLastSpeechId) {\n this.pcmCaptureFirstChunk = true;\n this.pcmCaptureLastSpeechId = speechId;\n this.pcmEncodeId++; // 递增编码会话 ID\n this.pcmWebMEncoder?.reset();\n this.mediaRecorderEncoder?.reset();\n // 清空 capture worklet 内部缓冲区,避免打断后旧音频数据混入新 session\n audioPlayer.resetCaptureBuffer();\n }\n\n // 静音时不发送\n if (!hasAudio) return;\n\n // 记录当前编码会话 ID(用于竞态检测)\n const currentEncodeId = this.pcmEncodeId;\n\n let webmData: ArrayBuffer | null = null;\n const startTime = performance.now();\n\n if (this.pcmCaptureMode === 'webcodec' && this.pcmWebMEncoder) {\n // WebCodecs 路径:PCM → Opus → WebM\n const pcm = new Int16Array(pcmData);\n webmData = await this.pcmWebMEncoder.encode(pcm);\n \n // 竞态检测:如果 reset 已被调用,丢弃这个结果\n if (currentEncodeId !== this.pcmEncodeId) {\n (window as any).avatarSDKLogger?.log(\n this.TAG, '[PCMCapture] 丢弃过期编码数据(编码会话已重置)'\n );\n return;\n }\n \n if (webmData.byteLength === 0) return;\n \n // 性能监控\n const encodeTime = performance.now() - startTime;\n if (encodeTime > 10) {\n (window as any).avatarSDKLogger?.warn(\n this.TAG, `[PCMCapture] WebCodecs 编码耗时过长: ${encodeTime.toFixed(2)}ms`\n );\n }\n } else if (this.pcmCaptureMode === 'mediarecorder' && this.mediaRecorderEncoder) {\n // MediaRecorder 降级路径\n webmData = await this.mediaRecorderEncoder.feedPCM(pcmData);\n \n // 竞态检测\n if (currentEncodeId !== this.pcmEncodeId) {\n (window as any).avatarSDKLogger?.log(\n this.TAG, '[PCMCapture] 丢弃过期编码数据(编码会话已重置)'\n );\n return;\n }\n \n if (!webmData) return; // 首次启动无数据\n \n // 性能监控\n const encodeTime = performance.now() - startTime;\n if (encodeTime > 10) {\n (window as any).avatarSDKLogger?.warn(\n this.TAG, `[PCMCapture] MediaRecorder 编码耗时过长: ${encodeTime.toFixed(2)}ms`\n );\n }\n }\n\n if (!webmData) return;\n\n const firstChunk = this.pcmCaptureFirstChunk;\n this.pcmCaptureFirstChunk = false;\n\n // 回调(格式与 MSE 模式完全一致)\n this.options.onAudioPlaybackData({\n data: webmData,\n codec: 'opus',\n isFirstChunk: firstChunk,\n sampleRate: 16000,\n samples: 1600,\n timestamp: blockStartedAt,\n speech_id: speechId,\n });\n } catch (error) {\n (window as any).avatarSDKLogger?.error(\n this.TAG, '[PCMCapture] 捕获回调错误:', error\n );\n }\n });\n\n (window as any).avatarSDKLogger?.log(\n this.TAG, `[PCMCapture] PCM 捕获初始化成功,编码路径: ${this.pcmCaptureMode}`\n );\n } catch (e) {\n (window as any).avatarSDKLogger?.error(\n this.TAG, '[PCMCapture] PCM 捕获初始化失败:', e\n );\n void this.pcmWebMEncoder?.destroy();\n this.pcmWebMEncoder = null;\n this.mediaRecorderEncoder?.destroy();\n this.mediaRecorderEncoder = null;\n this.pcmCaptureMode = 'none';\n }\n }\n\n visibilitychange() {\n if (document.hidden) {\n // this.offlineMode()\n // tab 回来时,强制同步解帧队列\n // this.renderScheduler.forceSyncDecoder();\n } else {\n if (this.ttsa?.getStatus()) {\n this.renderScheduler.forceSyncDecoder();\n }\n // tab 切换回来时,恢复音频捕获的 AudioContext\n if (this.captureAudioCtx && this.captureAudioCtx.state === 'suspended') {\n this.captureAudioCtx.resume().catch(() => {});\n }\n }\n }\n\n setReplayData(data: any) {\n this.replayData = data;\n }\n\n handleReplaySend(frame: number) {\n if(!this.replayData) {\n return;\n }\n const frameReplayData = this.replayData.filter((item: any) => (Number(item.client_frame_number) === frame && item.event_type !== \"sdk_burial_point\"));\n for(const item of frameReplayData) {\n if(item.event_type === 'state_change') {\n this.ttsa?.stateChange(item.event_data.state, item.event_data.params);\n }else if(item.event_type === 'send_text') {\n this.speak(item.event_data.ssml, item.event_data.is_start, item.event_data.is_end, item.event_data.extra);\n\n }else {\n (window as any).avatarSDKLogger.log(this.TAG, `[handleReplaySend] 未知事件类型: ${item}`);\n }\n }\n }\n\n // 初始化 ttsa\n private connectTtsa(sessionInfo: ISessionResponse) {\n (window as any).performanceTracker.markStart(performanceConstant.ttsa_connect);\n (window as any).performanceTracker.markStart(performanceConstant.ttsa_ready);\n return new Ttsa({\n sdkInstance: this,\n url: sessionInfo.socket_io_url,\n room: sessionInfo.room,\n session_id: sessionInfo.session_id,\n token: sessionInfo.token,\n framedata_proto_version: this.resourceManager.getConfig().framedata_proto_version,\n reconnect_client_timeout: sessionInfo?.reconnect_client_timeout || 0,\n appInfo: {\n ...this.resourceManager.getAppInfo(),\n env: this._env\n },\n onReady: () => {\n this.ttsa?.sendSdkPoint('connect_sdk', {\n timestamp: this.startConnectTime,\n });\n this.onDownloadProgress?.(85);\n this.ttsa?.sendSdkPoint('connect_sdk_success', {\n timestamp: this.connectSuccessTime,\n });\n this.ttsa?.sendSdkPoint('session_processing_time', {\n timestamp: this.sessionResTime,\n });\n this.ttsa?.sendSdkPoint('Char_bin_download_time', {\n timestamp: this.charbinResTime,\n });\n this.ttsa?.sendSdkPoint('socket_connect_time', {\n timestamp: Date.now(),\n });\n this.onTtsaReady(sessionInfo)\n this.ttsa?.syncTimestamp();\n },\n handleMessage: (type: EFrameDataType, data: IRawFrameData[] | SYNC_FRAME_DATA) => {\n if(this.isfirstReceive && type === EFrameDataType.BODY) {\n this.ttsa?.sendSdkPoint('body_completed_first_time', {\n timestamp: Date.now(),\n });\n this.isfirstReceive = false;\n }\n // 处理下行数据\n this.renderScheduler.handleData(type, data);\n },\n handleAAFrame: (data: any) => {\n this.options.onAAFrameHandle?.(data);\n },\n runStartFrameIndex: (client_time: number) => {\n this.renderScheduler.runStartFrameIndex();\n },\n ttsaStateChangeHandle: (state: StateChangeInfo) => {\n this.renderScheduler.ttsaStateChangeHandle(state);\n },\n reloadSuccess: () => {\n this.reloadSuccess()\n },\n enterOfflineMode: () => {\n this.offlineHandle()\n },\n reStartSDK: () => {\n this.reStartSession()\n },\n sendVoiceEnd: () => {\n this.renderScheduler?.sendVoiceEnd();\n },\n getCurrentFrameIndex: () => {\n return this.renderScheduler?.getCurrentFrameIndex()??0;\n }\n });\n }\n\n protected start() {\n this.renderScheduler.render();\n this.ttsa?.start();\n \n // 如果初始化时设置了隐身模式,则立即进入隐身状态\n if (this.pendingInvisibleMode) {\n this.pendingInvisibleMode = false;\n this.setInvisibleMode()\n } else {\n this.onStatusChange(AvatarStatus.online);\n }\n \n }\n\n protected onTtsaReady(_sessionInfo?: ISessionResponse) {\n this.start();\n }\n\n private async _reload() {\n const res = await this.resourceManager._reload();\n if (res && !this.destroyed) {\n await this.onSessionReloaded(res);\n if (this.destroyed) {\n return null;\n }\n this.ttsa = this.connectTtsa(res);\n this.ttsa._setResumeInfoCallback(\n this.resourceManager._getSessionId(),\n this.renderScheduler._getResumeInfo.bind(this.renderScheduler)\n )\n }\n return res;\n }\n\n protected async onSessionReloaded(_sessionInfo: ISessionResponse): Promise<void> {}\n\n protected onSessionReloadExhausted(_error?: unknown): void {}\n\n protected async restartSessionForTransport(reason: string): Promise<void> {\n this.renderScheduler.interrupt(\"in_offline_mode\");\n await this.resourceManager.stopSession(reason);\n if (this.destroyed) {\n return;\n }\n this.ttsa?.close();\n if (this.status !== AvatarStatus.offline) {\n this.offlineHandle();\n }\n this.reStartSession();\n }\n\n protected cancelSessionRestart(): void {\n this.resetRetryState();\n this.clearAllRetryTimers();\n }\n\n reloadSuccess() {\n this.onStatusChange(AvatarStatus.online);\n setTimeout(() => {\n window.clearInterval(this._offlineTimer)\n }, 1000)\n }\n\n protected async stop() {\n await this.renderScheduler.stop();\n }\n\n private handleBeforeUnload = () => {\n this.destroy(\"beforeunload\");\n };\n\n public isDestroyed() {\n return this.destroyed;\n }\n\n public async destroyClient() {\n // 增加重复销毁检查,避免重复销毁导致的异常\n if (this.destroyed) {\n (window as any).avatarSDKLogger.warn(this.TAG, \"SDK 已销毁,忽略重复销毁请求\");\n return;\n }\n this.destroyed = true;\n\n // 薄客户端模式:清理薄客户端相关资源\n if (this._isClientMode) {\n if (this._streamingClient) {\n this._streamingClient.destroy();\n this._streamingClient = null;\n }\n if (this._videoPlayer) {\n this._videoPlayer.destroy();\n this._videoPlayer = null;\n }\n this._eventDispatcher = null;\n this._apiForwarder = null;\n this.el = null;\n window.removeEventListener(\"beforeunload\", this.handleBeforeUnload);\n (window as any).avatarSDKLogger.log(this.TAG, \"薄客户端 SDK 已销毁\");\n return;\n }\n \n this.cancelSessionRestart();\n \n // 清理离线模式定时器\n if (this._offlineTimer !== -1) {\n clearInterval(this._offlineTimer);\n this._offlineTimer = -1;\n }\n\n // 停止TTSA连接\n if (this.ttsa) {\n this.ttsa.close();\n this.ttsa = null;\n }\n\n // 停止渲染调度器\n if (this.renderScheduler) {\n this.renderScheduler.destroy();\n }\n\n // 清理资源管理器(包括缓存)\n if (this.resourceManager) {\n this.resourceManager.destroy();\n }\n\n // 清理调试浮层\n if (this.debugOverlay) {\n this.debugOverlay.destroy();\n this.debugOverlay = null;\n }\n // 主动断开需要销毁网络监听相关事件\n // 增加状态检查和异常捕获,避免重复销毁 networkMonitor\n if(this.networkMonitor) {\n try {\n this.networkMonitor.destroy();\n this.networkMonitor = null; // 标记已销毁\n } catch (e) {\n (window as any).avatarSDKLogger.warn(this.TAG, '销毁 networkMonitor 时出错', e);\n }\n }\n\n // 清理音频捕获资源\n this.pcmEncodeId++;\n this.captureGeneration++;\n this.restartPlaybackCaptureImpl = null;\n if (this.captureWorklet) {\n try {\n this.captureWorklet.port.onmessage = null;\n this.captureWorklet.disconnect();\n } catch {}\n this.captureWorklet = null;\n }\n if (this.captureSource) {\n try {\n this.captureSource.disconnect();\n } catch {}\n this.captureSource = null;\n }\n if (this.captureAudioCtx) {\n try {\n this.captureAudioCtx.close();\n } catch {}\n this.captureAudioCtx = null;\n }\n\n // 清理 PCM 捕获资源\n const audioPlayer = this.renderScheduler?.getAudioRenderer()?.getAudioPlayer();\n if (audioPlayer) {\n audioPlayer.detachCapture();\n }\n void this.pcmWebMEncoder?.destroy();\n this.pcmWebMEncoder = null;\n this.mediaRecorderEncoder?.destroy();\n this.mediaRecorderEncoder = null;\n this.pcmCaptureLastSpeechId = -2;\n this.pcmCaptureFirstChunk = true;\n this.pcmCaptureMode = 'none';\n\n // 清理DOM元素\n this.el = null;\n this.startConnectTime = 0;\n this.connectSuccessTime = 0;\n this.sessionResTime = 0;\n this.charbinResTime = 0;\n this.isfirstReceive = true;\n this.networkInfo = {\n rtt: 0,\n downlink: 0.0,\n networkStatus: false,\n };\n\n window.removeEventListener(\"beforeunload\", this.handleBeforeUnload);\n document.removeEventListener(\"visibilitychange\", this.boundVisibilityChange);\n\n (window as any).avatarSDKLogger.log(this.TAG, \"SDK 已销毁\");\n }\n\n public async destroy(stop_reason: string = \"user\"): Promise<void> {\n this.replayData = null;\n\n // 薄客户端模式:通知 server 端销毁,然后清理本地资源\n if (this._isClientMode) {\n this._apiForwarder?.destroy(stop_reason);\n this.destroyClient();\n this.onStatusChange(AvatarStatus.close);\n return;\n }\n\n this.ttsa?.sendSdkPoint('close_session', {\n reason: stop_reason,\n });\n this.destroyClient();\n const res = await this.resourceManager.stopSession(stop_reason);\n if(res) {\n this.onStatusChange(AvatarStatus.close);\n }\n return res\n }\n\n idle() {\n if (this._isClientMode) { this._apiForwarder?.idle(); return; }\n if(this.enableClientInterrupt) {\n this.renderScheduler.interrupt(\"idle\");\n }\n this.ttsa?.idle();\n }\n\n listen() {\n if (this._isClientMode) { this._apiForwarder?.listen(); return; }\n if(this.enableClientInterrupt) { \n this.renderScheduler.interrupt(\"listen\");\n }\n this.ttsa?.listen();\n }\n\n think() {\n if (this._isClientMode) { this._apiForwarder?.think(); return; }\n if(this.enableClientInterrupt) { \n this.renderScheduler.interrupt(\"think\");\n }\n this.ttsa?.think();\n }\n interactiveidle() {\n if (this._isClientMode) { this._apiForwarder?.interactiveidle(); return; }\n if(this.enableClientInterrupt) { \n this.renderScheduler.interrupt(\"interactiveidle\");\n }\n this.ttsa?.interactiveidle();\n }\n\n speak(ssml: string, is_start: boolean = true, is_end: boolean = true, extra = {client_speak_id: '', client_frame: 0}): string | undefined{\n if (this._isClientMode) { this._apiForwarder?.speak(ssml, is_start, is_end, extra); return; }\n if(this.enableClientInterrupt && is_start) {\n this.renderScheduler.interrupt(\"speak\");\n }\n extra.client_frame = this.renderScheduler?.getCurrentFrameIndex()??0;\n const uniqueSpeakId = this.ttsa?.sendText(ssml, is_start, is_end, extra);\n this.renderScheduler.resume();\n return uniqueSpeakId;\n }\n\n setOffsetFrame(offsetFrame: number) {\n this.renderScheduler.setOffsetFrame(offsetFrame);\n }\n\n // 主动同步时间戳\n syncTimestamp() {\n this.ttsa?.sendSyncTimestamp(this.renderScheduler?.getCurrentFrameIndex()??0);\n }\n\n /**\n * 通知后端进入隐身模式\n */\n private notifyEnterInvisibleMode(): void {\n this.ttsa?.enterInvisibleMode();\n }\n\n /**\n * 通知后端退出隐身模式\n */\n private notifyExitInvisibleMode(): void {\n this.ttsa?.exitInvisibleMode();\n }\n\n setVolume(volume: number) {\n if (this._isClientMode) { this._apiForwarder?.setVolume(volume); return; }\n this.renderScheduler.setVolume(volume);\n }\n\n getSessionId() {\n if (this._isClientMode) {\n return this._clientSessionId;\n }\n return this.resourceManager?.session_id;\n }\n\n // 显示调试浮层\n public showDebugInfo() {\n if (!this.debugOverlay) {\n return;\n }\n this.debugOverlay?.show();\n }\n\n // 隐藏调试浮层\n public hideDebugInfo() {\n this.debugOverlay?.hide();\n }\n\n // 改变数字人canvas的显隐状态\n public changeAvatarVisible(visible: boolean) {\n this.avatarCanvasVisible = visible;\n if (this._isClientMode) { this._apiForwarder?.changeAvatarVisible(visible); return; }\n this.renderScheduler?.setAvatarCanvasVisible(visible);\n }\n\n /**\n * 在初始化未完成时清理所有已初始化的资源\n * @param reason 清理原因\n */\n protected cleanupBeforeInitComplete(reason: string): Promise<void> {\n if (this.incompleteInitializationCleanupPromise) {\n return this.incompleteInitializationCleanupPromise;\n }\n\n (window as any).avatarSDKLogger.warn(this.TAG, `清理初始化未完成的资源,原因: ${reason}`);\n this.isInitialized = false;\n const stopSessionPromise = this.resourceManager?.stopSession(reason);\n void stopSessionPromise?.catch((error) => {\n (window as any).avatarSDKLogger.warn(this.TAG, '停止初始化未完成的会话时出错', error);\n });\n this.incompleteInitializationCleanupPromise = (async () => {\n try {\n await this.destroyClient();\n } catch (error) {\n (window as any).avatarSDKLogger.warn(this.TAG, '清理初始化未完成的本地资源时出错', error);\n }\n })();\n return this.incompleteInitializationCleanupPromise;\n }\n\n protected reportInitializationFailure(message: string, cause?: unknown) {\n this.onMessage({\n code: EErrorCode.INIT_ERROR,\n message,\n e: cause as any,\n });\n }\n\n private offlineHandle() {\n this.onStatusChange(AvatarStatus.offline)\n this.renderScheduler._offlineMode()\n this._offlineTimer = window.setInterval(() => {\n if(this.status !== AvatarStatus.offline) {\n clearInterval(this._offlineTimer);\n this._offlineTimer = -1;\n return\n }\n this.renderScheduler._offlineRun()\n }, this._offlineInterval)\n }\n\n public async stopSessionFromSocket(reason: string) {\n await this.resourceManager.stopSession(reason)\n }\n\n offlineMode() {\n // this.networkMonitor.setState(false)\n this.renderScheduler.interrupt(\"in_offline_mode\")\n this.resourceManager.stopSession(\"offline_mode\")\n this.ttsa?.close()\n this.offlineHandle()\n }\n\n onlineMode() {\n if (!NetworkMonitor.ONLINE) {\n return\n }\n // this.networkMonitor.setState(true)\n this._reload()\n }\n\n onMessage(params: Parameters<typeof Errors>[0]) {\n // 添加 session_id\n try {\n if (typeof params.e !== 'object' || params.e === null) {\n params.e = { msg: params.e };\n }\n params.session_id = this.getSessionId();\n } catch (e) {\n (window as any).avatarSDKLogger.warn(this.TAG, '获取 session_id 时出错', e);\n }\n const e = Errors(params)\n if(params.code !== EErrorCode.RENDER_BODY_ERROR && params.code !== EErrorCode.RENDER_FACE_ERROR && params.code !== EErrorCode.BODY_DATA_EXPIRED) {\n this.options.onMessage(e)\n }\n this.ttsa?.send(\"client_error\", params);\n this.debugOverlay?.addError(e)\n }\n\n onStatusChange(status: AvatarStatus) {\n if(status === this.status) {\n return\n }\n this.status = status\n this.options.onStatusChange?.(status)\n }\n\n /**\n * 切换隐身模式(暂停/恢复音视频实时渲染)\n */\n public switchInvisibleMode(): void {\n if (this._isClientMode) { this._apiForwarder?.switchInvisibleMode(); return; }\n if (!this.renderScheduler) {\n (window as any).avatarSDKLogger?.warn(\n this.TAG,\n 'RenderScheduler 未初始化,无法切换隐身模式'\n );\n return;\n }\n \n // 如果当前数字人状态是在线 或者 visible,切换到暂停时\n if (this.status === AvatarStatus.visible || this.status === AvatarStatus.online ) {\n this.setInvisibleMode()\n } else {\n this.notifyExitInvisibleMode();\n this.renderScheduler.switchInvisibleMode();\n this.listen();\n }\n }\n private setInvisibleMode() {\n // 先调用 interactiveidle()\n this.interactiveidle();\n this.renderScheduler.switchInvisibleMode();\n this.notifyEnterInvisibleMode();\n this.onStatusChange(AvatarStatus.invisible);\n }\n public getPendingInvisibleMode() {\n return this.pendingInvisibleMode || false;\n }\n /**\n * 获取当前渲染状态\n */\n public getRenderState(): RenderState {\n if (!this.renderScheduler) {\n return RenderState.init;\n }\n return this.renderScheduler.getRenderState();\n }\n\n changeLayout(layout: Layout) {\n if (this._isClientMode) { this._apiForwarder?.changeLayout(layout); return; }\n const {scale = 1} = layout.avatar || {}\n layout.avatar.scale = validateScaleWithDecimal(scale, \"changeLayout\") as number | string;\n this.ttsa?.changeLayout(layout);\n this.renderScheduler.setCharacterCanvasLayout(layout);\n }\n\n changeWalkConfig(walkConfig: WalkConfig) {\n if (this._isClientMode) { this._apiForwarder?.changeWalkConfig(walkConfig); return; }\n this.ttsa?.changeWalkConfig(walkConfig)\n this.renderScheduler.setWalkConfig(walkConfig);\n }\n \n interrupt(type: string):number {\n if (this._isClientMode) { this._apiForwarder?.interrupt(type); return 0; }\n return this.renderScheduler.interrupt(type)\n }\n\n private triggerReconnect() {\n // 如果已经在重连中,直接返回,避免重复触发\n if (this.isRetrying) {\n (window as any).avatarSDKLogger.warn(this.TAG, \"正在重连中,跳过本次触发\");\n return;\n }\n\n if (this.reconnectDebounceTimer !== -1) {\n clearTimeout(this.reconnectDebounceTimer);\n this.reconnectDebounceTimer = -1;\n }\n if (this.retryTimer !== -1) {\n clearTimeout(this.retryTimer);\n this.retryTimer = -1;\n }\n\n this.reconnectDebounceTimer = window.setTimeout(() => {\n this.isRetrying = false;\n this.retryCount = 1;\n this.retryRound = 1;\n this.reStartSession();\n this.reconnectDebounceTimer = -1;\n }, 100);\n }\n\n reStartSession() {\n if (this.isRetrying || this.retryRound > this.maxRetryRound) return;\n\n this.clearAllRetryTimers();\n\n // 标记重试状态\n this.isStartRetry = true;\n this.isRetrying = true;\n\n // 使用非递归方式实现重试逻辑\n this._retryImpl();\n }\n\n private async _retryImpl() {\n if (this.retryRound > this.maxRetryRound || !this.isRetrying) {\n return;\n }\n\n let delay = 1000;\n if (this.retryCount > 1) {\n delay = Math.pow(2, this.retryCount) * 1000;\n }\n\n // 使用setTimeout代替递归,避免调用栈溢出\n setTimeout(async () => {\n if (!this.isRetrying || this.destroyed) {\n return;\n }\n try {\n const result = await this._reload();\n if (!this.isRetrying || this.destroyed) {\n return;\n }\n if (result === null) {\n // 重试失败:判断本轮是否达上限\n if (this.retryCount >= this.maxRetryCount) {\n // 本轮次数用尽,判断是否达最大轮次\n if (this.retryRound >= this.maxRetryRound) {\n // 总次数用尽(3*9=27次),停止重试\n (window as any).avatarSDKLogger.warn(\n this.TAG, \n `重试达最大轮次(${this.maxRetryRound})+每轮最大次数(${this.maxRetryCount}),总次数=${this.maxRetryRound*this.maxRetryCount},停止重试`\n );\n this.onSessionReloadExhausted();\n this.resetRetryState(); // 完全重置状态\n return;\n } else {\n // 未达最大轮次:重置本轮计数,轮次+1\n (window as any).avatarSDKLogger.warn(\n this.TAG, \n `第${this.retryRound}轮重试次数达上限(${this.maxRetryCount}),进入第${this.retryRound+1}轮重试`\n );\n this.retryCount = 1; // 重置本轮计数\n this.retryRound += 1; // 轮次+1\n }\n } else {\n // 本轮未达上限:计数+1\n this.retryCount += 1;\n }\n // 继续重试\n this._retryImpl();\n } else {\n // 重试成功:完全重置所有状态\n this.renderScheduler.stopAudio(-1);\n (window as any).avatarSDKLogger.log(\n this.TAG, \n `第${this.retryRound}轮第${this.retryCount}次重试成功,停止重试`\n );\n this.resetRetryState();\n }\n } catch (error) {\n // 异常处理:逻辑同失败场景\n (window as any).avatarSDKLogger.error(this.TAG, \"重试过程异常\", error);\n if (this.retryCount >= this.maxRetryCount) {\n if (this.retryRound >= this.maxRetryRound) {\n (window as any).avatarSDKLogger.warn(\n this.TAG, \n `重试异常且达总次数上限(${this.maxRetryRound*this.maxRetryCount}),停止重试`\n );\n this.onSessionReloadExhausted(error);\n this.resetRetryState();\n return;\n } else {\n this.retryCount = 1;\n this.retryRound += 1;\n }\n } else {\n this.retryCount += 1;\n }\n // 仅当未达最大轮次时,继续重试\n if (this.retryRound <= this.maxRetryRound && this.isRetrying) {\n this._retryImpl();\n } else {\n this.resetRetryState();\n }\n }\n }, delay);\n }\n private clearAllRetryTimers() {\n // 清理重连防抖定时器\n if (this.reconnectDebounceTimer !== -1) {\n clearTimeout(this.reconnectDebounceTimer);\n this.reconnectDebounceTimer = -1;\n }\n // 清理重试定时器\n if (this.retryTimer !== -1) {\n clearTimeout(this.retryTimer);\n this.retryTimer = -1;\n }\n }\n\n // 统一重置重试状态\n private resetRetryState() {\n this.isRetrying = false;\n this.isStartRetry = false;\n this.retryCount = 1; // 重置每轮计数\n this.retryRound = 1; // 重置轮次(关键)\n }\n\n public seekToFrame(frame: number) {\n this.renderScheduler.seekToFrame(frame);\n this.ttsa?.seekToFrame(frame);\n }\n\n public async startRecoder() {\n try {\n const canvas = this.el?.querySelector('canvas') as HTMLCanvasElement;\n const audio = this.el?.querySelector('audio') as HTMLAudioElement;\n\n if (!canvas || !audio) {\n console.error('找不到 canvas 或 audio 元素');\n return;\n }\n\n // 画面流\n const canvasStream = canvas.captureStream(60);\n\n // 获取音频流:\n // 如果 setupAudioCapture 已调用 createMediaElementSource,audio 元素的输出\n // 已被劫持到 Web Audio API,captureStream() 会拿到静音流。\n // 此时复用已有的 captureSource 节点,追加 MediaStreamDestination 获取音频。\n let audioTracks: MediaStreamTrack[] = [];\n\n if (this.captureSource && this.captureAudioCtx) {\n // 复用 setupAudioCapture 的音频图,追加录制专用输出节点\n const recorderDestination = this.captureAudioCtx.createMediaStreamDestination();\n this.captureSource.connect(recorderDestination);\n audioTracks = recorderDestination.stream.getAudioTracks();\n } else if (typeof (audio as any).captureStream === 'function') {\n // audio 未被劫持,直接用 captureStream\n audioTracks = (audio as any).captureStream().getAudioTracks();\n } else if (typeof (audio as any).mozCaptureStream === 'function') {\n audioTracks = (audio as any).mozCaptureStream().getAudioTracks();\n } else {\n (window as any).avatarSDKLogger.error('❌ 当前浏览器不支持 captureStream,无法录制音频');\n return;\n }\n\n // 合并流\n this.stream = new MediaStream([\n ...canvasStream.getVideoTracks(),\n ...audioTracks\n ]);\n\n // 清空上一次数据\n this.recordedChunks = [];\n\n // 创建录制器\n this.mediaRecorder = new MediaRecorder(this.stream, {\n mimeType: 'video/mp4',\n videoBitsPerSecond: 12 * 1024 * 1024, // 12Mbps 超清\n });\n\n // 数据收集\n this.mediaRecorder.ondataavailable = (e) => {\n if (e.data && e.data.size > 0) {\n this.recordedChunks.push(e.data);\n }\n };\n\n // 开始录制\n this.mediaRecorder.start(100); // 100ms 收集一次,避免丢数据\n\n (window as any).avatarSDKLogger.log('✅ 开始录制');\n } catch (err) {\n (window as any).avatarSDKLogger.error('❌ 录制失败:', err);\n }\n }\n\n public stopRecoder() {\n if (!this.mediaRecorder) return;\n this.mediaRecorder.stop();\n this.stream?.getTracks().forEach(track => track.stop());\n (window as any).avatarSDKLogger.log('⏹ 停止录制');\n }\n\n public exportVideo() {\n // 关键:检查有没有数据\n if (!this.recordedChunks.length) {\n (window as any).avatarSDKLogger.error('没有录制到数据');\n return;\n }\n\n const blob = new Blob(this.recordedChunks, { type: 'video/mp4' });\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement('a');\n a.href = url;\n a.download = `录制_${new Date().getTime()}.mp4`;\n a.click();\n (window as any).avatarSDKLogger.log('✅ 下载成功,大小:', blob.size);\n }\n\n public getOptions() {\n return this.options;\n }\n\n // ── 测试用方法:模拟 WebGL 上下文丢失 ─────────────────────────────\n\n /**\n * [测试用] 模拟 WebGL 上下文丢失\n * 用于测试分阶段恢复策略是否正常工作\n * \n * @param restoreAfterMs 自动恢复上下文的延迟时间(毫秒),默认 5000ms\n * @param forceFail 强制恢复失败(用于测试 medium/full 阶段的升级逻辑)\n * \n * @example\n * // 在浏览器控制台执行:\n * avatar.simulateContextLoss(5000); // 模拟丢失,5秒后自动恢复\n * avatar.simulateContextLoss(0, true); // 模拟丢失,不自动恢复(测试升级逻辑)\n */\n public simulateContextLoss(restoreAfterMs: number = 5000, forceFail: boolean = false): void {\n if (!this.renderScheduler) {\n (window as any).avatarSDKLogger.warn(\"[Test] renderScheduler not initialized\");\n return;\n }\n this.renderScheduler.simulateContextLoss(restoreAfterMs, forceFail);\n }\n\n /**\n * [测试用] 获取当前 WebGL 上下文恢复状态\n */\n public getRecoveryStatus() {\n if (!this.renderScheduler) {\n return null;\n }\n return this.renderScheduler.getRecoveryStatus();\n }\n\n /**\n * [测试用] 批量测试分阶段恢复\n * 依次触发多次上下文丢失,观察各阶段的恢复情况\n */\n public async testStagedRecovery(): Promise<void> {\n if (!this.renderScheduler) {\n (window as any).avatarSDKLogger.warn(\"[Test] renderScheduler not initialized\");\n return;\n }\n return this.renderScheduler.testStagedRecovery();\n }\n\n /**\n * 手动重启 WebGL:创建新 canvas + 新 GLDevice + 新 GLPipeline\n * 用于分阶段恢复全部失败后的手动恢复\n * @returns 是否成功\n *\n * @example\n * const ok = avatar.restartWebGL();\n */\n public restartWebGL(): boolean {\n if (!this.renderScheduler) {\n (window as any).avatarSDKLogger.warn(\"[restartWebGL] renderScheduler not initialized\");\n return false;\n }\n return this.renderScheduler.restartWebGL();\n }\n}\n"],"names":["EErrorCode","ERROR_CODE_MAP","ERROR_NAME_MAP","AvatarStatus","RenderState","InitModel","EFrameDataType","FRAME_SOURCE_SOURCE","DataCacheQueue","constructor","this","TAG","_bodyQueue","Map","_facialQueue","_realFacialQueue","audioQueue","eventQueue","videoIdList","_currentPlayState","_currentTtsaState","window","currentPlayState","state","currentTtsaState","bodyQueue","Array","from","values","_updateBodyImageBitmap","data","old","get","frameIndex","frame","close","curIndex","curFrame","entries","body_id","delete","set","clearOldFrames","sf","clearOldFaceData","frameNumber","filter","item","setVideoIdList","videoId","includes","push","getVideoIdList","_getBodyImageBitmap","getBodyVideoNameListLength","list","forEach","name","length","_getFaceImageBitmap","targetItem","i","_updateFacial","facialQueue","_getRealFaceImageBitmap","_updateRealFacial","realFacialQueue","clearAllFaceData","_window$avatarSDKLogg","avatarSDKLogger","log","_updateAudio","_clearAudio","speech_id","sid","_getAudio","targetIndex","findIndex","splice","_getAudioInterval","startFrame","endFrame","audioList","audio","index","id","_updateUiEvent","clearOldEvent","clearSubtitleOn","map","_item$e","_extends","e","subItem","type","_clearEvent","_getEvent","matchedItems","_mergeEventsBySf","_getEventInterval","events","grouped","event","key","mergedList","Object","allE","mergeFrameFlag","checkValidData","BODY","FACE","AUDIO","_this$audioQueue","_this$audioQueue$","ef","audioIndex","destroy","clear","GLDevice","canvas","running","syncMedia","syncMediaTime","_lost_context_sim","_isDestroyed","frameID","initContext","gl","getContext","antialias","premultipliedAlpha","preserveDrawingBuffer","Error","getExtension","shaderStage","vertex","VERTEX_SHADER","fragment","FRAGMENT_SHADER","_ElementTypeMap_JS2GL","Uint8Array","UNSIGNED_BYTE","Uint8ClampedArray","Int8Array","BYTE","Uint16Array","UNSIGNED_SHORT","Int16Array","SHORT","Uint32Array","UNSIGNED_INT","Int32Array","INT","Float16Array","HALF_FLOAT","Float32Array","FLOAT","_FormatTypeMap_Ext2Int_Raw","RED","R8","RED_INTEGER","R8UI","RG","RG8","RG_INTEGER","RG8UI","RGB","RGB8","RGB_INTEGER","RGB8UI","RGBA","RGBA8","RGBA_INTEGER","RGBA8UI","R8_SNORM","R8I","RG8_SNORM","RG8I","RGB8_SNORM","RGB8I","RGBA8_SNORM","RGBA8I","R16UI","RG16UI","RGB16UI","RGBA16UI","DEPTH_COMPONENT","DEPTH_COMPONENT16","R16I","RG16I","RGB16I","RGBA16I","R32UI","RG32UI","RGB32UI","RGBA32UI","DEPTH_COMPONENT24","R32I","RG32I","RGB32I","RGBA32I","R16F","RG16F","RGB16F","RGBA16F","R32F","RG32F","RGB32F","RGBA32F","DEPTH_COMPONENT32F","UNSIGNED_SHORT_5_6_5","RGB565","UNSIGNED_SHORT_4_4_4_4","RGBA4","UNSIGNED_SHORT_5_5_5_1","RGB5_A1","UNSIGNED_INT_2_10_10_10_REV","RGB10_A2","UNSIGNED_INT_10F_11F_11F_REV","R11F_G11F_B10F","UNSIGNED_INT_5_9_9_9_REV","RGB9_E5","UNSIGNED_INT_24_8","DEPTH_STENCIL","DEPTH24_STENCIL8","FLOAT_32_UNSIGNED_INT_24_8_REV","DEPTH32F_STENCIL8","_FormatTypeMap_Ext2Int","elemType","formats","formatMap","extFormat","intFormat","_FormatTypeMap_Ext2Str_Raw","GL_RED","GL_RED_INTEGER","GL_RG","GL_RG_INTEGER","GL_RGB","GL_RGB_INTEGER","GL_RGBA","GL_RGBA_INTEGER","GL_DEPTH_COMPONENT","GL_DEPTH_STENCIL","_FormatTypeMap_Ext2Str","value","cbRender","_onContextLost","preventDefault","stop","_onContextRestored","_onContextCreationError","console","error","statusMessage","addEventListener","compileShaderProgram","shaders","shaderProgram","createProgram","stage","code","shader","createShader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","compile_log","getShaderInfoLog","deleteShader","attachShader","linkProgram","getProgramParameter","LINK_STATUS","link_log","getProgramInfoLog","deleteProgram","getShaderProgramUniformLocation","program","attribNames","result","getUniformLocation","getShaderProgramUniformBlockLocation","getUniformBlockIndex","getShaderProgramAttribLocation","getAttribLocation","getGLArrayElementType","arr","tag","Symbol","toStringTag","getGLTexInternalFormat","externalFormat","elementType","internalFormat","texImage2D","target","level","width","height","format","srcData","_this$_FormatTypeMap_","buffer","texImage3D","depth","_this$_FormatTypeMap_2","run","fn","HTMLVideoElement","fnWrapper","now","metadata","mediaTime","requestVideoFrameCallback","currentTime","requestAnimationFrame","refresh","getSyncMediaTime","cancelVideoFrameCallback","cancelAnimationFrame","simulateContextFault","contextAvailable","restoreContext","loseContext","captureFrame","pixelData","readPixels","loseExtension","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","STENCIL_BUFFER_BIT","flush","ctx2d","clearRect","removeEventListener","vec","Math","sqrt","reduce","sum","val","normalize","vec_len","x","mvmul","lhs","rhs","size_row","size_col","j","mmul","size_mid","result_row","k","transpose","mat","identity","size","det3","inv3","invdet","inv4","xPos","yPos","tmp","pivot","abs","Number","EPSILON","fill","NaN","quaternion_conj","q","quaternion_mul","quaternion_to_mat","r","GivensTransform","row0","row1","angle","s","sin","c","cos","a2","Euler_to_mat","angles","order","make_homogeneous","translation","flatten","performanceConstant","load_resource","ttsa_connect","ttsa_ready","first_avatar_render","first_webgl_render","ttsa_body_res","start_action_res","start_action_render","load_video","decode_video","voice_response_play","first_decode_video","first_render","PerformanceTracker","marks","measures","reportFunc","onStateRenderChange","firstDecodeTime","firstRenderTime","getFirstInfo","decode_speed","render_speed","markStart","time","performance","markEnd","mark","duration","reportMetric","getAllMetrics","fromEntries","getVideoMetrics","setReportFunc","ttsa","_this$reportFunc","keys","getStatus","filterData","_this$reportFunc2","sendPerfLog","setOnStateRenderChange","performanceTracker","shadow_sample_count","shader_common","vs_background","fs_background","uniform_var_list_bg","uniform_block_list_bg","generateMeshPipelineShader","params","max_bones","max_bs_count","fragment_mask","max_pca_component_count","uniform_var_list_mesh","uniform_block_list_mesh","GLPipeline","assembleBackgroundPipeline","_ub_shadow_fx_data","device","progUniforms","progUniformBlocks","backgroundPipelineInfo","uniformBlockBinding","backgroundVAO","createVertexArray","bindVertexArray","positionBuffer","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","enableVertexAttribArray","vertexAttribPointer","buffers","UNIFORM_BUFFER","DYNAMIC_DRAW","backgroundBuffers","textures","createTexture","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","TEXTURE_MIN_FILTER","LINEAR","backgroundTextures","assembleMeshPipelines","char","meshStatistics","max","skeleton","mesh_index","mesh","textureModels","pca_component_count","model","pca_component_count_model","blendshapes","_ub_rig_info_data","_ub_pca_info_data","meshPipelineInfo","maskPipelineInfo","meshInfos","currentMeshInfo","VAO","texturePCAModels","uniformUInts","vertices","UVCoord","opacity","jointIndex","vertexAttribIPointer","jointWeight","triangles","ELEMENT_ARRAY_BUFFER","bs_texture_size","ceil","square_bs_texture_size","bs_vec_stride","bs_texture_data","NEAREST","TEXTURE_MAG_FILTER","pca_model","pca_texture","TEXTURE_2D_ARRAY","TEXTURE_WRAP_R","dataType","assembledPCAModel","texture","unsigned","PCAData","compat_features","texture_component_size","roundedTexture","scalingFactor","scale_factor","inv_scale_factor","round","initSkeletonStatus","evalSkeleton","FrameTexture_meshColor","multisample","FrameTexture_meshAlpha","FrameBuffer_meshColor","createFramebuffer","bindFramebuffer","FRAMEBUFFER","framebufferTexture2D","COLOR_ATTACHMENT0","FrameBuffer_meshAlpha","depthBuffer","createRenderbuffer","bindRenderbuffer","RENDERBUFFER","renderbufferStorageMultisample","colorBuffer","coverageBuffer","FrameBuffer_mesh","framebufferRenderbuffer","COLOR_ATTACHMENT1","DEPTH_ATTACHMENT","renderbufferStorage","LUT","LUTTexture","TEXTURE_3D","backgroundTextureSrc","getProjMat","camera","getProjMatrix","getExtrinsicMatrix","initFrame","viewport","drawingBufferWidth","drawingBufferHeight","clearColor","clearDepth","charData","renderBackground","frame_data","disable","DEPTH_TEST","CULL_FACE","BLEND","flags","backgroundTexture","useProgram","transform","fx","shadow","geometryInfo","getBillboardShadowGeometryInfo","refPos","light","lightType","Mat_World2ObjImage","Mat_ShadowImage2World","tint","intensity","blurRadius","bindBufferBase","uniformMatrix2fv","scaleX","scaleY","offsetX","offsetY","uniform1ui","uniform1i","activeTexture","TEXTURE0","charBodyTexture","drawArrays","TRIANGLES","renderMesh","enable","transform_2d_mat","proj_mat","cameraConfig","currentSkeletonStatus","evalSkeletonFromMovable","movableJointTransforms","joint_matrices","joint_transform","apply","inv","homogeneous_matrix","ub_rig_info_data_offset","min","uniformMatrix4fv","genMask","effective_bs_count","blendshapeIndices","blendshapeWeights","var_name","drawElements","itemSize","DRAW_FRAMEBUFFER","blitFramebuffer","genMaskForCurrentMesh","PCAModel","textureModelIndex","colorMask","uniform3f","currentGamma","g","b","currentColorBalance","rc","gm","by","effective_pca_component_count","texturePCAWeights","sendSdkPoint","frameDataCallback","reinitialize","setSyncMedia","render","setCharData","setFrameDataCallback","cb","setGamma","gammaR","gammaG","gammaB","setColorBalance","getBillboardTransform2D","pos_orig","pos_new","projMat","projMatInv","posScr","w_ratio","dxdPx_new","dxdPy_orig","dxdPy_new","point_src","C1","C2","transitionMat","_this$device$gl","frameData","onPostRender","renderFrame","timestamp","Date","_this$device$destroy","_this$device","_this$meshPipelineInf","_this$maskPipelineInf","meshInfo","deleteVertexArray","deleteBuffer","deleteTexture","pcaModel","FrameBuffer_MSAA","deleteFramebuffer","call","containerWidgetMaps","containerIdCounter","getContainerElement","instance","el","HTMLElement","getContainerId","container","existingId","getAttribute","newId","setAttribute","getContainerWidgetMap","containerId","has","subtitleStyle","WidgetDefaultRenderer","_el","axis_id","x_location","y_location","_div","document","createElement","style","undefined","_getWidgetKey","axisId","_replaceWidget","newElement","_currentInstance","widgetMap","oldElement","parentNode","remove","WIDGET_PIC","div","img","crossOrigin","src","image","appendChild","WIDGET_SUBTITLE","text","innerHTML","cssText","element","startsWith","querySelectorAll","widget","__version__","checkVersion","version","ArrayBuffer","offset","dataview","DataView","dataver","getUint8","refver","split","parseInt","decodeStr","charView","byteLength","strlen","stringBytes","slice","TextDecoder","decode","decodeLongInt","shift","byte_val","new_result","TensorDataTypeMap","B","H","h","I","L","BigUint64Array","l","BigInt64Array","f","d","Float64Array","Tensor","dim","byteSize","BYTES_PER_ELEMENT","zeros","part","newLength","newStart","deserialize","dimCount","dataSize","dataTypeSymbol","String","fromCodePoint","dataByteSize","loadArchives","mimeType","dataLen","decoder","JSON","parse","dataSlice","Blob","CameraConfig","focalLength","filmAperture","rotation","getIntrinsicMatrix","resolution","size_X","size_Y","camera_aperture_in_mm_x","near","far","Infinity","intrinsic_mat","proj22","proj23","deg2rad","PI","R_inv","GLMath","getFloat32","RigidTransform","rotQuaternion","result_quaternion","result_translation","matrix","newRotQuaternion","R_inv_neg_x","sum_sqr","IBRMeshInfo","spec","meshFlag","bs_indices","bs_element_indices","first_bs","bs_index","cur_bs_element_indices","segment_stat","segment_ptr","segment_len","vertexCount","rawBlendshapeData","archivedItems","bs_data_index","elementIndexList","element_index","bs_stride","maxJointsPerVertex","textureModelCount","getUint16","triangleCount","blendshapeCount","PCASize","PCAComponents","IBRMeshFrameInfo","char_data","IBRAnimationGeneratorCharInfo_NN","blendshapeMap","bsIndexSet","Set","add","skeletonJointCount","movableJointCount","movableJoints","parent","local_transform","jointEvalOrder","meshInfoSpec","meshCount","IBRAnimationFrameData_NN","interp","frame1","frame2","frameJointRef","t","new_mesh_pca_info","preserved","index_child","_","index_parent","T1","T2","blended_transform","unpackIBRAnimation","frameCount","getUint32","formatMJT","a1","isSupportMES","ua","navigator","userAgent","vendor","hasChrome","test","isGoogleVendor","isEdge","hasMediaSource","MediaSource","getStyleStr","styles","toString","replace","match","toLowerCase","join","updateCanvasXOffset","offset_PX","newTransform","trim","generateFingerprint","screenSize","screen","language","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","fingerprint","encodeURIComponent","btoa","getDeviceInfo","deviceBrand","deviceModel","deviceVersion","browserType","browserVersion","windowsMatch","androidMatch","iosMatch","chromeMatch","safariMatch","firefoxMatch","edgeMatch","operaMatch","ieMatch","device_id","device_brand","device_model","os_version","browser","browser_version","browser_ua","validateScaleWithDecimal","scale","warn","isharmony","AvatarRender","options","currentBodyFrame","lastFaceFrame","isInit","isFirstRender","lastFrameState","lastRenderState","init","onStateChange","onRenderChange","sendVideoInfo","lostHandler","restoreHandler","avatarCanvasVisible","lastRealFaceFrameData","lastRealFaceFrame","lastWeight","lastFrameIndex","canvasOffsetX","baseWalkOffset","lastBodyOffset","pendingCharData","interrupt","walkConfig","layout","allLostFrameCount","allLostFaceFrameCount","maxLostFrameCount","forceSyncDecoder","createPipelineLock","restoreTimeout","isRecovering","recoverStartTime","recoveryStage","recoveryMaxAttempts","medium","full","recoveryBaseDelays","recoveryMaxDelay","currentStageAttempts","isUsingReducedResolution","resolutionRestoreTimer","RESOLUTION_RESTORE_DELAY","onDownloadProgress","saveAndDownload","_lostHandler","bind","_restoreHandler","setCanvasVisibility","pipeline","copyCanvas","copyCtx","resetFaceFrameState","createPipeline","reportMessage","WEBGL_CONTEXT_LOST","message","clearTimeout","_scheduleNextAttempt","WEBGL_CONTEXT_RESTORED","_recoverContext","isContextLost","success","_tryLightRecovery","_tryMediumRecovery","_tryFullRecovery","_onRecoverySuccess","_advanceStage","_reportRecoveryFailure","_this$options$resourc","oldCanvas","oldCanvasStyle","oldCanvasParent","newCanvas","resourceManager","getConfig","_resolution$width","_resolution$height","replaceChild","_this$options$resourc2","_resolution$width2","_resolution$height2","scaleFactor","targetWidth","targetHeight","recoveryTime","wasFullRecovery","WEBGL_CONTEXT_RECOVERED","attempts","reducedResolution","_scheduleResolutionRestore","setTimeout","_restoreOriginalResolution","_this$options$resourc3","_resolution$width3","_resolution$height3","originalWidth","originalHeight","currentStyle","WEBGL_RESOLUTION_RESTORED","stages","currentIndex","indexOf","nextStage","WEBGL_CONTEXT_RECOVERY_MAX_ATTEMPTS","elapsedTime","stagesAttempted","baseDelay","maxAttempts","calculatedDelay","pow","delay","WEBGL_CONTEXT_RECOVERY_FAILED","attempt","_this$options$resourc4","_this$options$resourc5","_this$options$resourc6","_this$options$resourc7","_charInitData","charInitData","setCharacterCanvasAnchor","getMouthShapeLib","char_info","setCanvasStyle","_ref","_this$walkConfig$init","_this$walkConfig","_this$options$resourc8","_this$options$resourc9","_this$options$resourc0","_layout$container$siz","_layout$container","initPoint","init_point","walk_config","containerWidth","containerHeight","v_align","h_align","offset_x","offset_y","avatar","vhValue","parseFloat","isNaN","avatarHeight","avatarWidth","marginX","marginY","baseStyles","position","zIndex","objectFit","top","right","bottom","left","marginLeft","marginTop","willChange","styleStr","setWalkConfig","_this$options$resourc1","_this$options$resourc10","_this$options$resourc11","auchor","init_events","find","computeWeight","frameDiff","_ref2","_bodyFrame$body_id","_ref3","_bodyFrame$body_id2","_faceFrame","_faceFrame2","_faceFrame5","dataCacheQueue","rendered","bodyFrame","faceFrame","curRealFaceData","frameState","FaceFrameData","face_frame_type","_faceFrame3","_this$options$resourc12","cs","resource_pack","interpolate_joints","_faceFrame4","_this$options$resourc13","_setCurrentBodyFrame","hfd","onError","RENDER_FACE_ERROR","stringify","RENDER_BODY_ERROR","RENDER_DATA_MISSING","RENDER_FACE_DATA_MISSING","_this$onStateChange","_this$onDownloadProgr","_this$onRenderChange","_faceFrame$FaceFrameD","_faceFrame6","_faceFrame$FaceFrameD2","_faceFrame7","_this$options$resourc14","_this$options$resourc15","_bodyFrame$offset","faceData","getIsEnableRobotExpression","appendMultipleToArray","renderBodyFrame","_this$copyCtx","displayWidth","displayHeight","drawImage","bodyOffset","DefaultWidgetRenderer","CUSTOM_WIDGET","PROXY_WIDGET","WebGL_RENDER_ERROR","rendering","background","getBackgroundImageElement","bgContainer","getElementById","backgroundImage","backgroundSize","backgroundPosition","_getCurrentBodyFrameInfo","client_frame","current_ani","current_ani_frame","next_state","_getCurrentFrameData","_ref4","_bodyFrame$body_id3","_ref5","_faceFrame$body_id","_faceFrame$face_frame","body","video_frame","face","visible","display","getCanvasVisibility","deviceToDestroy","_window$avatarSDKLogg2","removeChild","setInterrupt","_this$lastFaceFrame","simulateContextLoss","restoreAfterMs","forceFail","getRecoveryStatus","testStagedRecovery","testCases","desc","tc","Promise","resolve","status","restartWebGL","_this$options$resourc16","_resolution$width4","_resolution$height4","WEBGL_CONTEXT_MANUAL_RESTARTED","method","BaseTrack","ImageTrack","super","_this$data","DefaultRender","SubtitleTrack","TrackRenderer","_data$axis_id","tracker","TrackPic","TrackSubtitle","_this$tracker","UIRenderer","trackerRenderer","root","initEventsRendered","lastSpeechId","interruptSpeechId","enableClientInterrupt","onVoiceStart","onVoiceEnd","onWalkStateChange","onSpeakStateChange","_event","_event$e","_event$e4","_event$e5","_event$e6","_event$e7","_event$e8","_event$e9","_event$e0","initEvents","config","concat","noSpeechIdEvents","typesStr","sdk","onMessage","EVENT_WITHOUT_SPEECH_ID","_event$e2","_event$e3","endsWith","some","speakStart","client_speak_id","voiceStart","multi_turn_conversation_id","voiceEnd","eventType","speakEvent","remainingWidgets","widgetData","prototype","hasOwnProperty","TrackerRenderer","clearTrackerRenderer","FPSTracker","maxSamples","frameTimestamps","lastFrameTime","lastUpdateTime","currentFPS","totalFrames","totalTime","droppedFrames","totalRenderedFrames","tick","delta","getStats","current","average","avgDelta","a","minDelta","maxDelta","getCurrentFPS","getAverageFPS","reset","getDroppedFrames","Composition","avatarRenderer","restRenderers","audioRenderer","onFPSUpdate","audioOnlyMode","fpsTracker","compose","avatarResult","stats","layer","ele","getFPSStats","mp4boxSource","workerLogic","fullWorkerScript","blob","workerURL","URL","createObjectURL","base64ToUint8Array","base64Str","binaryStr","atob","uint8Array","charCodeAt","twoByteToInt16","byte0","byte1","uint16","scaledInt16BytesToFloat32","float32View","byteIndex","int16Value","parseUint8ToFloat32","uint8Arr","alignedBuffer","float32Arr","ParallelDecoder","pendingAbort","abortAfterEf","pendingNewQueue","currentDecodedFrameIndex","abortAfterFrame","cacheVideoCount","maxVideoCount","hardwareAcceleration","MAX_LOAD_VIDEO_TIMEOUT_MS","_offlineLastFrame","_offlineIdle","_offlineIdleIndex","firstDecodeFrame","tasks","queue","maxParallel","currentParallel","_locked","currentTaskId","onFrame","onDone","isFirstDecode","bodyFrameCountMap","getRandomTaskId","random","files","abort","file","startFrameIndex","_handlePendingAbort","updateQueue","clearOldQueue","firstQueueSf","newSf","oldQueue","mp4Index","_isIOS","getQueue","x_offset","timeoutPromise","ms","reason","reject","loadVideoWithTimeout","videoKey","race","loadVideo","_tryStartNext","_this$queue","maxAllowed","_bodyInfo$body_id","bodyInfo","_cleanupOldWorkers","n","INVALID_BODY_NAME","arrayBuffer","_startWorker","start","asf","end","aef","endFrameIndex","_file$body_id","taskId","worker","Worker","dataCopy","_this$bodyFrameCountM","cacheVideo","bodyFrameCount","abortOne","_this$bodyFrameCountM2","task","postMessage","terminate","cacheQueue","preloadVideo","newBodyId","bodyIdStr","bodyId","syncDecode","currentFrameIndex","mp4List","_reload","_offLineMode","offlineIdle","currentFrame","_offlineRun","idle","_putOfflineBodyData","FrameAnimationController","defaultSpeed","frameRate","frameCallback","startTime","speed","isPlaying","animationId","startTimeFromDate","currentFrameFromDate","playing","play","_animate","pause","_updateFrame","setSpeed","gotoFrame","nextFrame","prevFrame","nowTime","calculatedFrame","floor","elapsedTimeFromDate","calculatedFrameFromDate","timeJson","getCurrentFrame","updateStartTime","captureStates","WeakMap","playbackSessionRestoredListeners","configureWebAudioPlaybackSession","audioSession","getAudioSession","captureState","setAudioSessionType","count","subscribeWebAudioPlaybackSessionRestored","listener","listeners","_listeners","_listeners2","_unused2","pcm_audio_script","pcm_capture_script","workletBlob","workletUrl","captureWorkletBlob","captureWorkletUrl","PCMAudioPlayer","SAMPLE_RATE","FRAME_ALIGNMENT","WORKLET_SCRIPT_URL","audioCtx","audioWorkletNode","isInitialized","destroyResolve","unsubscribePlaybackSessionRestored","captureWorklet","captureCallback","AudioContextConstructor","AudioContext","webkitAudioContext","AudioWorklet","sampleRate","logger","audioWorklet","addModule","AudioWorkletNode","connect","destination","port","onmessage","_this$destroyResolve","_this$audioWorkletNod","_this$audioWorkletNod2","detail","parameters","volume","refreshPlaybackRoute","err","disconnect","resume","catch","receivePCMStream","pcmData","_this$unsubscribePlay","detachCapture","_this$audioWorkletNod3","timeout","_this$destroyResolve2","_this$destroyResolve3","attachCapture","callback","hasAudio","_this$audioWorkletNod4","_unused","resetCaptureBuffer","isWorkletReady","setVolume","valume","_this$audioCtx","then","info","MediaSourceAudioPlayer","getInstance","mediaSource","audioElement","sourceBuffer","MIME_TYPE","isUpdating","currentObjectURL","isDestroyed","playbackRate","firstFrameIndex","createAudioElement","createNewMediaSource","preload","pointerEvents","addSourceBuffer","mode","processQueue","destroyCurrentMediaSource","removeAttribute","load","revokeObjectURL","addAudioSegment","audioData","updating","readyState","appendBuffer","_unused3","_this$mediaSource","queueLength","bufferedRanges","getBufferedRanges","mediaSourceReadyState","setPlaybackRate","buffered","ranges","toFixed","rate","_unused4","AudioRender","cacheFirstFrameIndex","cacheAudioData","oldSpeechId","mseCacheAudioData","mseAudioPlayer","raw_audio","updateAudioData","totalLength","_audio$ad","ad","mergedData","_this$audio","_this$audio2","firstAudio","speechId","byteOffset","offline","_this$audio3","debug","_this$audio4","_this$audio5","_this$mseAudioPlayer","addNewAudioSegment","_this$audio6","_this$mseAudioPlayer2","_this$audio7","_this$mseAudioPlayer3","_this$audio8","_this$mseAudioPlayer4","_this$audio9","_this$mseAudioPlayer5","getAudioPlayer","_this$audio0","_this$mseAudioPlayer6","SaveAndDownload","fileName","enabled","downloadButton","initDownloadButton","color","fontSize","padding","borderRadius","textDecoration","cursor","download","writeFields","fields","assign","fieldName","items","jsonContent","generateJSONContent","downloadFile","content","contentType","url","href","scrollIntoView","behavior","block","dataset","objectUrl","RenderScheduler","currentSpeechId","isStartPlay","renderState","_speedResetTimer","offsetFrame","hasSendTimeJson","setAudioInfo","setEventData","sendMessage","enableDebugger","sdkInstance","AvatarRenderer","progress","uiRenderer","onVoiceStateChange","stopAudio","extra","AudioRenderer","composition","frameAnimationController","AnimationController","renderFrameCallback","onFrameDataUpdate","mouthShapeLib","handleData","_this$sdk$getOptions$","_syncData$client_time","_syncData$server_clie","AA_FRAME","getCurrentFrameIndex","paused","BODY_DATA_EXPIRED","handleFaceData","realFaceData","nowFaceData","_faceData$i","AUDIO_DATA_EXPIRED","FRAME_DURATION_MS","audioLenFrames","frameOffset","playbackSpeed","processedAudioData","EVENT","hasAnySpeakStart","expiredSpeakStartEv","expiredVoiceStartEv","ev","EVENT_TRIGGERED","EVENT_SPEAK_START_EXPIRED","_expiredVoiceStartEv$","_expiredVoiceStartEv","EVENT_VOICE_START_EXPIRED","specialEvents","WidgetDefaultRender","_WidgetDefaultRender$","_WidgetDefaultRender$2","normalEvents","SYNC_FRAME","syncData","getOptions","replay","source","clientTime","client_time","correctedFrame","server_client_frame","INVALID_DATA_STRUCTURE","setOffsetFrame","runStartFrameIndex","_this$frameAnimationC","stateChangeHandle","stopped","pauseRender","_this$frameAnimationC2","resumeRender","_this$frameAnimationC3","_window$avatarSDKLogg3","resumed","switchInvisibleMode","_window$avatarSDKLogg4","_window$avatarSDKLogg5","_window$avatarSDKLogg6","getRenderState","_window$avatarSDKLogg7","_this$frameAnimationC4","_resourcePack$blendsh","resourcePack","framedata_proto_version","blendshape_map","bsw_list","js","bsw","blendshape_map_item","_ms$index$index","_ms$index3","_ms$index$weights","_ms$index4","weights","_ms$index$","_ms$index","_ms$index$2","_ms$index2","_ms$index$index2","_ms$index7","_ms$index$weights2","_ms$index8","_ms$index$3","_ms$index5","_ms$index$4","_ms$index6","joint","translate","rotate","FACE_PROCESSING_ERROR","_getResumeInfo","sendVoiceEnd","_this$getCurrentFrame","_this$uiRenderer$last","_this$uiRenderer$last2","_offlineMode","_this$getCurrentFrame2","_this$uiRenderer$last3","_getOfflineIdle","ttsaStateChangeHandle","setAvatarCanvasVisible","setCharacterCanvasLayout","_this$getCurrentFrame3","seekToFrame","_this$frameAnimationC5","_this$frameAnimationC6","_this$frameAnimationC7","getSpeechId","getAudioRenderer","Z_FIXED$1","Z_BINARY","Z_TEXT","Z_UNKNOWN$1","zero$1","buf","len","STORED_BLOCK","STATIC_TREES","DYN_TREES","MIN_MATCH$1","MAX_MATCH$1","LENGTH_CODES$1","LITERALS$1","L_CODES$1","D_CODES$1","BL_CODES$1","HEAP_SIZE$1","MAX_BITS$1","Buf_size","MAX_BL_BITS","END_BLOCK","REP_3_6","REPZ_3_10","REPZ_11_138","extra_lbits","extra_dbits","extra_blbits","bl_order","DIST_CODE_LEN","static_ltree","static_dtree","_dist_code","_length_code","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","max_code","d_code","dist","put_short","w","pending_buf","pending","send_bits","bi_valid","bi_buf","send_code","tree","bi_reverse","res","bi_flush","gen_bitlen","stree","base","m","bits","xbits","overflow","bl_count","heap","heap_max","opt_len","static_len","gen_codes","next_code","tr_static_init","init_block","dyn_ltree","dyn_dtree","bl_tree","sym_next","matches","bi_windup","smaller","_n2","_m2","pqdownheap","v","heap_len","compress_block","ltree","dtree","lc","sx","sym_buf","build_tree","node","scan_tree","curlen","prevlen","nextlen","max_count","min_count","send_tree","build_bl_tree","max_blindex","l_desc","d_desc","bl_desc","send_all_trees","lcodes","dcodes","blcodes","rank","detect_data_type","block_mask","static_init_done","_tr_init$1","_tr_stored_block$1","stored_len","last","subarray","_tr_align$1","_tr_flush_block$1","opt_lenb","static_lenb","strm","data_type","strategy","_tr_tally$1","sym_end","_tr_init_1","_tr_stored_block_1","_tr_flush_block_1","_tr_tally_1","_tr_align_1","trees","_tr_init","_tr_stored_block","_tr_flush_block","_tr_tally","_tr_align","adler32","adler","pos","s1","s2","adler32_1","makeTable","table","crcTable","crc32","crc","crc32_1","messages","constants$2","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_UNKNOWN","Z_DEFLATED","Z_NO_FLUSH$2","Z_FULL_FLUSH$1","Z_FINISH$3","Z_BLOCK$1","Z_OK$3","Z_STREAM_END$3","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_BUF_ERROR$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$2","MAX_MEM_LEVEL","MAX_WBITS$1","DEF_MEM_LEVEL","LENGTH_CODES","LITERALS","L_CODES","D_CODES","BL_CODES","HEAP_SIZE","MAX_BITS","MIN_MATCH","MAX_MATCH","MIN_LOOKAHEAD","PRESET_DICT","INIT_STATE","GZIP_STATE","EXTRA_STATE","NAME_STATE","COMMENT_STATE","HCRC_STATE","BUSY_STATE","FINISH_STATE","BS_NEED_MORE","BS_BLOCK_DONE","BS_FINISH_STARTED","BS_FINISH_DONE","OS_CODE","errorCode","msg","zero","slide_hash","p","wsize","w_size","hash_size","head","prev","HASH_ZLIB","hash_shift","hash_mask","HASH","flush_pending","avail_out","output","pending_out","next_out","total_out","flush_block_only","block_start","strstart","put_byte","putShortMSB","read_buf","avail_in","input","next_in","wrap","total_in","longest_match","cur_match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","_w_size","more","str","window_size","insert","ins_h","deflate_stored","have","min_block","pending_buf_size","used","high_water","deflate_fast","hash_head","bflush","match_length","max_lazy_match","deflate_slow","max_insert","prev_match","match_available","deflate_rle","deflate_huff","Config","good_length","max_lazy","nice_length","max_chain","func","configuration_table","lm_init","DeflateState","gzhead","gzindex","last_flush","w_bits","hash_bits","lit_bufsize","deflateStateCheck","deflateResetKeep","deflateReset","ret","deflateSetHeader","deflateInit2","windowBits","memLevel","deflateInit","deflate$2","old_flush","header","level_flags","hcrc","comment","os","beg","copy","gzhead_extra","bstate","deflateEnd","deflateSetDictionary","dictionary","dictLength","tmpDict","avail","next","deflateInit_1","deflateInit2_1","deflateReset_1","deflateResetKeep_1","deflateSetHeader_1","deflate_2$1","deflateEnd_1","deflateSetDictionary_1","deflateInfo","deflate_1$2","deflate","_has","obj","sources","arguments","TypeError","flattenChunks","chunks","chunk","common","STR_APPLY_UIA_OK","fromCharCode","__","_utf8len","string2buf","TextEncoder","encode","c2","m_pos","str_len","buf_len","buf2binstring","buf2string","out","utf16buf","c_len","utf8border","strings","ZStream","zstream","toString$1","Z_NO_FLUSH$1","Z_FINISH$2","Z_OK$2","Z_STREAM_END$2","Z_DEFLATED$1","Deflate$1","chunkSize","opt","raw","gzip","ended","dict","_dict_set","deflate$1","deflator","deflateRaw$1","gzip$1","flush_mode","_flush_mode","onData","onEnd","Deflate_1$1","deflate_2","deflateRaw_1$1","gzip_1$1","constants$1","deflate_1$1","Deflate","deflateRaw","constants","BAD$1","TYPE$1","inffast","_in","_out","dmax","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","here","op","from_source","lencode","distcode","lenbits","distbits","dolen","sane","MAXBITS","ENOUGH_LENS$1","ENOUGH_DISTS$1","CODES$1","LENS$1","DISTS$1","lbase","lext","dbase","dext","inflate_table","lens","lens_index","codes","table_index","work","opts","incr","low","mask","sym","curr","drop","huff","offs","here_bits","here_op","here_val","inftrees","CODES","LENS","DISTS","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_NEED_DICT$1","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_MEM_ERROR$1","HEAD","FLAGS","TIME","OS","EXLEN","EXTRA","NAME","COMMENT","HCRC","DICTID","DICT","TYPE","TYPEDO","STORED","COPY_","COPY","TABLE","LENLENS","CODELENS","LEN_","LEN","LENEXT","DIST","DISTEXT","MATCH","LIT","CHECK","LENGTH","DONE","BAD","MEM","SYNC","ENOUGH_LENS","ENOUGH_DISTS","MAX_WBITS","DEF_WBITS","zswap32","InflateState","havedict","check","total","wbits","ncode","nlen","ndist","lendyn","distdyn","back","was","inflateStateCheck","inflateResetKeep","inflateReset","inflateReset2","inflateInit2","inflateInit","virgin","lenfix","distfix","fixedtables","updatewindow","inflate$2","put","last_bits","last_op","last_val","hbuf","inf_leave","done","xflags","extra_len","inflateEnd","inflateGetHeader","inflateSetDictionary","dictid","inflateReset_1","inflateReset2_1","inflateResetKeep_1","inflateInit_1","inflateInit2_1","inflate_2$1","inflateEnd_1","inflateGetHeader_1","inflateSetDictionary_1","inflateInfo","inflate_1$2","inflate","GZheader","gzheader","Inflate$1","to","inflate$1","inflator","inflateRaw$1","last_avail_out","next_out_utf8","tail","utf8str","Inflate_1$1","inflate_2","inflateRaw_1$1","ungzip$1","inflate_1$1","Inflate","inflateRaw","ungzip","Deflate_1","deflate_1","deflateRaw_1","gzip_1","Inflate_1","inflate_1","inflateRaw_1","ungzip_1","constants_1","pako","request","headers","URLSearchParams","response","fetch","ok","statusText","XMLRequest","xhr","XMLHttpRequest","open","responseType","onload","onprogress","lengthComputable","percent","loaded","onProgress","send","$","safeAdd","y","lsw","md5cmn","num","cnt","md5ff","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","length32","rstr2binl","length8","rstr2hex","hexTab","charAt","str2rstrUTF8","unescape","rawMD5","rstrMD5","rawHMACMD5","hash","bkey","ipad","opad","rstrHMACMD5","md5","string","module","exports","encodeWithMd5","escapeNonAsciiForPythonJson","character","padStart","compareUnicodeCodePoints","leftPoints","codePointAt","rightPoints","parseUrlWithoutBase","urlObj","isAbsolute","pathWithQuery","pathname","search","path","headersNeedSign","ak","sk","urlPathQuery","sortedData","sortObjectKeys","isArray","sortedKeys","sort","sortedObj","dataStr","sign","CacheManager","cacheServer","getVideo","ResourceManager","offlineCache","networkInfos","bg","destroyed","videoCache","maxCacheSize","maxCacheEntries","cacheCleanupInterval","isProcessingVideo","startSessionTimer","downloadingVideos","first_load","enable_robot_expression","body_data_dir","face_ani_char_data","face_ani_preload_data","startCacheCleanup","getAppInfo","appId","getBackgroundImage","_this$config","_this$config2","Image","background_img","onerror","BACKGROUND_IMAGE_LOAD_ERROR","_this$resource_pack","_res$resource_pack","clearInterval","setInterval","startSession","_this$mouthShapeLib","_res$resource_pack2","session_id","offline_idle","loadMouthShapeLib","_startSession","_this$options$onStart","_this$options","verify_res","onStartSessionWarning","_this$options$session","onLine","NETWORK_BREAK","gatewayServer","gateway_type","asr_id","llm_id","session_speak_req_id","sessionRequestData","walk_version","signedData","appSecret","json","_res$data","error_code","error_reason","START_SESSION_ERROR","stopSession","stop_reason","STOP_SESSION_ERROR","_this$options$onNetwo2","_this$options3","gzError","finalUrl","fileSize","preTime","preLoaded","createProgressHandler","_this$options$onNetwo","_this$options2","deltaTime","deltaLoaded","onNetworkInfo","rtt","downlink","networkStatus","gzUrl","gz_data","decompressed","Pako","ab","binUrl","bin_data","_this$sdk$onMessage","_this$sdk","FACE_BIN_LOAD_ERROR","binError","totalCostMs","_this$sdk$onMessage2","_this$sdk2","getVideoUrl","_this$cacheServer","cacheEntry","updateCacheAccess","downloadPromise","downloadVideo","_fetchVideo","addToCache","VIDEO_DOWNLOAD_ERROR","_this$options$onNetwo3","_this$options4","avgRtt","avgDownlink","totalSize","endTime","networkInfo","cleanupCache","targetSize","sortedEntries","lastAccessTime","cacheKey","cacheValue","accessCount","entriesToRemove","clearAllCache","_getSessionId","_res$resource_pack3","_setOfflineCache","names","$i","_runOfflineCache","PACKET_TYPES","create","PACKET_TYPES_REVERSE","ERROR_PACKET","withNativeBlob","withNativeArrayBuffer","isView","encodePacket","supportsBinary","encodeBlobAsBase64","fileReader","FileReader","readAsDataURL","toArray","TEXT_ENCODER","encodePacketToBinary","packet","encoded","chars","lookup","base64","encoded1","encoded2","encoded3","encoded4","bufferLength","arraybuffer","bytes","decodePacket","encodedPacket","binaryType","mapBinary","decodeBase64Packet","substring","decoded","SEPARATOR","encodePayload","packets","encodedPackets","decodePayload","encodedPayload","decodedPacket","createPacketEncoderStream","TransformStream","controller","payloadLength","setUint8","view","setUint16","setBigUint64","BigInt","enqueue","TEXT_DECODER","acc","concatChunks","createPacketDecoderStream","maxPayload","expectedLength","isBinary","headerArray","protocol","Emitter","mixin","on","_callbacks","once","off","removeListener","removeAllListeners","callbacks","emit","args","emitReserved","hasListeners","nextTick","setTimeoutFn","globalThisShim","self","Function","defaultBinaryType","createCookieJar","pick","attr","NATIVE_SET_TIMEOUT","globalThis","NATIVE_CLEAR_TIMEOUT","installTimerFunctions","useNativeTimers","clearTimeoutFn","BASE64_OVERHEAD","utf8Length","randomString","qs","qry","pairs","pair","decodeURIComponent","TransportError","description","context","Transport","writable","query","socket","forceBase64","doOpen","doClose","onClose","write","onOpen","onPacket","details","onPause","createUri","schema","_hostname","_port","_query","hostname","secure","encodedQuery","Polling","_polling","_poll","doPoll","doWrite","uri","timestampRequests","timestampParam","b64","hasCORS","empty","BaseXHR","location","isSSL","xd","req","xhrStatus","pollXhr","Request","createRequest","_opts","_method","_uri","_data","_create","_a","xdomain","_xhr","extraHeaders","setDisableHeaderCheck","setRequestHeader","cookieJar","addCookies","withCredentials","requestTimeout","onreadystatechange","parseCookies","getResponseHeader","_onLoad","_onError","_index","requestsCount","requests","_cleanup","fromError","responseText","attachEvent","unloadHandler","terminationEvent","hasXHR2","newRequest","XHR","isReactNative","product","BaseWS","protocols","ws","createSocket","addEventListeners","onopen","autoUnref","_socket","unref","onclose","closeEvent","lastPacket","WebSocketCtor","WebSocket","MozWebSocket","WS","_packet","WT","_transport","WebTransport","transportOptions","closed","ready","createBidirectionalStream","stream","decoderStream","MAX_SAFE_INTEGER","reader","readable","pipeThrough","getReader","encoderStream","pipeTo","_writer","getWriter","read","transports","websocket","webtransport","polling","re","parts","exec","host","authority","ipv6uri","pathNames","queryKey","$0","$1","$2","withEventListeners","OFFLINE_EVENT_LISTENERS","SocketWithoutUpgrade","writeBuffer","_prevBufferLen","_pingInterval","_pingTimeout","_maxPayload","_pingTimeoutTime","parsedUri","_transportsByName","transportName","agent","upgrade","rememberUpgrade","addTrailingSlash","rejectUnauthorized","perMessageDeflate","threshold","closeOnBeforeunload","_beforeunloadEventListener","transport","_offlineEventListener","_onClose","_cookieJar","_open","createTransport","EIO","priorWebsocketSuccess","setTransport","_onDrain","_onPacket","onHandshake","_sendPacket","_resetPingTimeout","pingInterval","pingTimeout","_pingTimeoutTimer","upgrading","_getWritablePackets","payloadSize","_hasPingExpired","hasExpired","compress","cleanupAndClose","waitForUpgrade","tryAllTransports","SocketWithUpgrade","_upgrades","_probe","failed","onTransportOpen","cleanup","freezeTransport","onTransportClose","onupgrade","_filterUpgrades","upgrades","filteredUpgrades","Socket","o","DEFAULT_TRANSPORTS","loc","withNativeFile","File","hasBinary","toJSON","deconstructPacket","pack","_deconstructPacket","attachments","placeholder","_placeholder","newData","reconstructPacket","_reconstructPacket","RESERVED_EVENTS","PacketType","Encoder","replacer","ACK","encodeAsString","encodeAsBinary","BINARY_EVENT","BINARY_ACK","nsp","deconstruction","unshift","isObject","Decoder","reviver","reconstructor","decodeString","isBinaryEvent","BinaryReconstructor","takeBinaryData","payload","tryParse","substr","isPayloadValid","CONNECT","DISCONNECT","CONNECT_ERROR","finishedReconstruction","reconPack","binData","freeze","connect_error","disconnecting","newListener","io","connected","recovered","receiveBuffer","sendBuffer","_queue","_queueSeq","ids","acks","auth","_autoConnect","disconnected","subEvents","subs","onpacket","active","_readyState","_b","_c","retries","fromQueue","volatile","_addToQueue","ack","pop","_registerAckCallback","isTransportWritable","engine","isConnected","notifyOutgoingListeners","ackTimeout","timer","withError","emitWithAck","arg1","arg2","tryCount","responseArgs","_drainQueue","force","_sendConnectPacket","_pid","pid","_lastOffset","_clearAcks","onconnect","onevent","onack","ondisconnect","emitEvent","_anyListeners","sent","emitBuffered","subDestroy","onAny","prependAny","offAny","listenersAny","onAnyOutgoing","_anyOutgoingListeners","prependAnyOutgoing","offAnyOutgoing","listenersAnyOutgoing","Backoff","factor","jitter","rand","deviation","setMin","setMax","setJitter","Manager","nsps","reconnection","reconnectionAttempts","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","_parser","parser","encoder","autoConnect","_reconnection","skipReconnect","_reconnectionAttempts","_reconnectionDelay","_randomizationFactor","_reconnectionDelayMax","_timeout","maybeReconnectOnOpen","_reconnecting","reconnect","Engine","openSubDestroy","errorSub","onping","ondata","ondecoded","_destroy","_close","onreconnect","cache","parsed","forceNew","multiplex","$protobuf","$Reader","$Writer","$util","$root","rt","u","verbose","ctx","readFile","binary","overrideMimeType","LN2","writeFloatLE","writeFloatBE","readFloatLE","readFloatBE","writeDoubleLE","writeDoubleBE","readDoubleLE","readDoubleBE","eval","nested","google","protobuf","Any","type_url","Duration","seconds","nanos","Timestamp","Empty","Struct","keyType","Value","oneofs","kind","oneof","nullValue","numberValue","stringValue","boolValue","structValue","listValue","NullValue","NULL_VALUE","ListValue","rule","DoubleValue","FloatValue","Int64Value","UInt64Value","Int32Value","UInt32Value","BoolValue","StringValue","BytesValue","FieldMask","paths","resolvedType","typeDefault","repeated","fullName","fromObject","fieldsArray","codegen","safeProp","toObject","compareFieldsById","partOf","valuesById","long","high","toNumber","defaults","basic","packed","delimited","required","mapKey","optional","className","comments","valuesOptions","reserved","features","fromJSON","edition","keepComments","isString","isInteger","isReservedId","isReservedName","allow_alias","extend","defaultValue","Long","extensionField","declaringField","defineProperty","field_presence","message_encoding","repeated_field_encoding","setOption","resolved","lookupTypeOrEnum","proto3_optional","default","fromNumber","newBuffer","utf8","emptyObject","emptyArray","ctor","group","getOption","decorateType","decorateEnum","build","Root","loadSync","verifier","converter","ReflectionObject","Namespace","Enum","Type","Field","OneOf","MapField","Service","Method","Message","wrappers","types","util","Writer","BufferWriter","Reader","BufferReader","rpc","roots","configure","tokenize","resolvedKeyType","$type","encodeDelimited","decodeDelimited","verify","toJSONOptions","requestType","requestStream","responseStream","resolvedRequestType","resolvedResponseType","parsedOptions","lookupType","addJSON","arrayToJSON","nestedArray","methods","getEnum","setOptions","onAdd","onRemove","define","resolveAll","lookupEnum","lookupService","enum_type","json_format","utf8_validation","O","filename","defineProperties","A","T","setProperty","setParsedOption","oneOfGetter","oneOfSetter","nt","keepCase","F","P","R","U","D","C","z","X","Z","G","Y","K","W","J","Q","tt","it","preferTrailingComment","alternateCommentMode","peek","skip","cmnt","camelCase","line","E","M","S","N","extensions","lcFirst","ucFirst","V","package","imports","weakImports","LongBits","RangeError","Buffer","isBuffer","lo","hi","uint32","int32","sint32","bool","fixed32","sfixed32","float","double","alloc","skipType","merge","int64","uint64","sint64","zzDecode","fixed64","sfixed64","utf8Slice","deferred","resolvePath","asPromise","lastIndexOf","fs","readFileSync","isNode","EventEmitter","rpcImpl","requestDelimited","responseDelimited","rpcCall","finish","methodsArray","isReserved","lineEmpty","leading","lastIndex","fieldsById","oneofsArray","generateConstructor","setup","fork","ldelim","inquire","toUpperCase","decorateRoot","enumerable","decorated","zzEncode","zeroHash","fromString","toLong","fromHash","toHash","captureStackTrace","stack","configurable","pool","global","process","versions","isFinite","isset","isSet","utf8Write","dcodeIO","key2Re","key32Re","key64Re","longToHash","longFromHash","fromBits","newError","ProtocolError","longs","enums","allocUnsafe","states","writeBytesBuffer","amd","isLong","MeshData","properties","writer","end2","object","arrays","getTypeUrl","typeUrlPrefix","JointData","faceFrameType","FaceFrameDataList","proxyProtobuf","pointNameObj","connect_sdk","connect_sdk_success","llm_text_sdk_received","rendering_data_received","rendering_display","close_session","audio_data_expired","Ttsa","clearReconnectTimer","reconnectTimer","startHeartbeat","stopHeartbeat","heartbeatTimer","HEARTBEAT_INTERVAL","_this","_lastSessionId","wsConnectTimer","enterOfflineFlag","syncTimestampInterval","syncTimestampNum","SYNC_INTERVAL","lastSyncTime","_isResume","clearOldWsTimeoutTimer","initWsTimeoutTimer","async","CONNECT_SOCKET_ERROR","stopSessionFromSocket","reStartSDK","reconnect_client_timeout","appInfo","room","token","_uniqueSpeakId","reloadSuccess","enterOfflineMode","client_type","invisible_mode","getPendingInvisibleMode","onStatusChange","online","firstStartTimestamp","server_time","onReady","decodedData","handleMessage","AUDIO_DECODE_ERROR","frameList","joints","meshes","faceDecodeData","FACE_DECODE_ERROR","bodyDecodeData","cBody","getTime","VIDEO_DECODE_ERROR","decodeData","EVENT_DECODE_ERROR","handleAAFrame","TTSA_ERROR","user_hint","SOCKET_DISCONNECT","SOCKET_QUIT","destroyClient","stateChange","listen","think","interactiveidle","enterInvisibleMode","exitInvisibleMode","resumeInfo","syncTimestamp","sendSyncTimestamp","sendText","ssml","is_start","is_end","uniqueSpeakId","getUniqueSpeakId","sdkVersion","speak_id","updateUniqueSpeakId","burial_type","event_en_name","event_cn_name","changeLayout","changeWalkConfig","sendDeviceInfo","deviceInfo","_setResumeInfoCallback","lastSessionId","getResumeInfo","formatTimestamp","date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","DebugOverlay","sessionInfo","sdkContainer","updateInterval","errors","fps","lastFpsUpdate","videoInfo","audioInfo","eventInfo","memoryInfo","perfMetrics","domRefs","trackFPS","trackMemory","addError","show","createOverlay","updateTextOnly","hide","_this$container","setVideoInfo","_this$sdk$renderSched","_this$sdk$renderSched2","renderScheduler","updatePerfMetrics","updateMemory","setText","look_name","formatPerfMetrics","formatMemory","session_start_time","getNetworkInfo","formatErrors","copySessionId","sessionId","clipboard","writeText","_this$sdkContainer","applyStyles","userSelect","make","label","marginBottom","textContent","append","title","margin","makeSessionIdWithCopy","alignItems","gap","wordBreak","flex","copyBtn","border","onclick","perfTitle","perf","errWrap","borderTop","paddingTop","errTitle","errCount","makePre","lineHeight","maxHeight","overflowY","whiteSpace","errLog","ttsaLog","enableDrag","isTtsa","toLocaleTimeString","_v$time","times","avg","usedJSHeapSize","totalJSHeapSize","jsHeapSizeLimit","loop","_window$performance","memory","_window$performance2","conn","connection","effectiveType","textAlign","dragging","startX","startY","clientX","clientY","offsetLeft","offsetTop","NetworkMonitor","retryCount","retryTimer","bindHandleOnline","_handleOnline","bindHandleOffline","_handleOffline","_initEventListeners","ONLINE","onlineCallback","offlineCallback","_attempt","setState","isOnline","Errors","_ERROR_CODE_MAP$param","_ERROR_NAME_MAP$param","error_name","originalError","isLoggingEnabled","executeLog","consoleMethod","sdkLog","setLoggingEnabled","sampleUniformTensor","sampleUniformPCATensor","getVertices","geometry","neutral_vertices","vertex_lbs","curJointIndex","vertex_transformed","getPCATextures","texture_model","texture_data","mean_weight","row","pixel","weight","ImageData","exportAsWavefrontObj","geometries","vertex_string","polygon_string","vertex_index_offset","geometry_offset","uv","poly","polygons","getWavefrontObjFromVertices","unflattenUniform","new_axis_size","unflatten","setEnabled","StreamingClient","maxRetry","scheduleRetry","role","_this$options$onDisco","onDisconnect","_this$options$onError","_this$options$onReady","_this$options$onOffer","_this$options$onIce","_this$options5","_this$options$onEvent","_this$options6","_this$options$onError2","_this$options7","onOffer","sdp","onIce","candidate","onEventProxy","event_type","server_frame","OPEN","sendApiCall","_this$options$onError3","_this$options8","VideoPlayer","video","canvasCtx","pc","animFrameId","tempCanvas","tempCtx","useAlphaMask","createCanvasElement","createVideoElement","autoplay","playsInline","muted","willReadFrequently","handleOffer","destroyPeer","RTCPeerConnection","iceServers","urls","username","credential","onicecandidate","streamingClient","ontrack","track","MediaStream","srcObject","addTrack","startAlphaRendering","onconnectionstatechange","_this$options$onConne","connectionState","onConnected","onDisconnected","setRemoteDescription","RTCSessionDescription","answer","createAnswer","setLocalDescription","lastWidth","lastHeight","debugInterval","videoWidth","videoHeight","vw","vh","realW","realH","rgbData","getImageData","alphaData","rgb","alpha","nonZeroRGB","nonZeroAlpha","sampleSize","putImageData","addIceCandidate","getVideoElement","getCanvasElement","_this$pc","EventDispatcher","subtitleText","subtitleVisible","dispatch","_serverFrame","_this$callbacks$onSta","_this$callbacks","_this$callbacks$onSpe","_this$callbacks2","_this$callbacks$onVoi","_this$callbacks3","_this$callbacks$onSta2","_this$callbacks4","_this$callbacks$onRen","_this$callbacks5","_this$callbacks$onWal","_this$callbacks6","_this$callbacks$onWid","_this$callbacks7","_this$callbacks$onMes","_this$callbacks8","_this$callbacks$onNet","_this$callbacks9","_this$callbacks$onFPS","_this$callbacks0","_this$callbacks$onDow","_this$callbacks1","_this$callbacks$onSes","_this$callbacks10","_this$callbacks$onFra","_this$callbacks11","onWidgetEvent","onSessionId","getSubtitleText","isSubtitleVisible","APIForwarder","client","speak","changeAvatarVisible","checkSecureContextSync","supported","isSecureContext","severity","checkWebGL2Sync","failIfMajorPerformanceCaveat","debugInfo","getParameter","VERSION","VENDOR","renderer","RENDERER","gpuVendor","UNMASKED_VENDOR_WEBGL","gpuRenderer","UNMASKED_RENDERER_WEBGL","checkAudioSystemSync","hasAudioContext","hasAudioWorklet","pcmSupported","pcm","mse","checkWebCodecsSync","hasVideoDecoder","VideoDecoder","checkWorkerSync","checkCapabilitySync","fatalCount","warnCount","checkWebCodecsDetailed","codecSupport","testCodecs","codec","isConfigSupported","WORKER_CHECK_TIMEOUT_MS","WORKER_CHECK_MAX_ATTEMPTS","probeWorkerExecution","settled","_worker","checkWorkerDetailed","checkCapability","syncReport","detailedItems","all","OPUS_FRAME_DURATION_US","ENCODE_TIMEOUT_MS","buildAudioEncoderConfig","numberOfChannels","channels","bitrate","opus","frameDuration","WebCodecOpusEncoder","pendingEncode","frameSize","isSupported","AudioEncoder","_support$config","support","createEncoder","pcmCopy","startTimestampUs","blockDurationUs","endTimestampUs","expectedFrameCount","AudioData","numberOfFrames","timeoutId","failPending","cause","handleOutput","frames","encodedChunk","_pending$chunks$times","_pending$chunks","copyTo","nextTimestamp","durationMs","totalDurationMs","EBML_ID","EBML","EBMLVersion","EBMLReadVersion","EBMLMaxIDLength","EBMLMaxSizeLength","DocType","DocTypeVersion","DocTypeReadVersion","Segment","SegmentInfo","TimecodeScale","MuxingApp","WritingApp","Tracks","TrackEntry","TrackNumber","TrackUID","TrackType","FlagLacing","Language","CodecID","CodecPrivate","CodecDelay","SeekPreRoll","Audio","SamplingFrequency","Channels","Cluster","Timecode","SimpleBlock","WebMMuxer","hasHeader","clusterTimestamp","writeHeader","buildEBMLHeader","segmentInfo","buildSegmentInfo","tracks","buildOpusTracks","feedOpusFrame","opusFrame","cluster","buildCluster","encodeVINT","encodeID","encodeUint","encodeString","encodeFloat32","setFloat32","encodeElement","idBytes","sizeBytes","encodeUintElement","encodeStringElement","encodeFloat32Element","concatArrays","children","opusHead","audioChildren","trackEntryChildren","trackEntry","timecodeMs","opusData","timecode","trackNumber","relativeTimecode","simpleBlockData","simpleBlock","clusterChildren","PcmWebMEncoder","opusEncoder","muxer","generation","pendingBlocks","trackedOperation","finally","MediaRecorderEncoder","workletNode","recorder","isRecording","nextResolve","dataQueue","MediaRecorder","isTypeSupported","AudioContextCtor","createMediaStreamDestination","audioBitsPerSecond","ondataavailable","feedPCM","_this$workletNode","_this$destination","XmovAvatar","networkMonitor","debugOverlay","_offlineTimer","_offlineInterval","_env","pendingInvisibleMode","replayData","startConnectTime","connectSuccessTime","sessionResTime","charbinResTime","isfirstReceive","maxRetryCount","retryRound","maxRetryRound","isRetrying","isStartRetry","incompleteInitializationCleanupPromise","captureAudioCtx","captureSource","captureSetupPromise","captureLastSpeechId","restartPlaybackCaptureImpl","captureEncodeQueue","captureGeneration","pcmCaptureLastSpeechId","pcmCaptureFirstChunk","pcmWebMEncoder","mediaRecorderEncoder","pcmCaptureMode","pcmEncodeId","reconnectDebounceTimer","mediaRecorder","recordedChunks","_isClientMode","_streamingClient","_videoPlayer","_eventDispatcher","_apiForwarder","_clientOnDownloadProgress","_pendingInit","_pendingInitConfig","_clientSessionId","handleBeforeUnload","enableLogger","env","boundVisibilityChange","visibilitychange","renderMode","initializeClient","initializeSDK","NETWORK_DOWN","cleanupBeforeInitComplete","offlineHandle","_this$ttsa","NETWORK_UP","triggerReconnect","businessENV","_this$ttsa2","getSessionId","_config$layout$avatar","_config$layout","_config$layout2","internalOptions","_config","querySelector","CONTAINER_NOT_FOUND","_this$el","_this$el2","_this$ttsa3","_this$ttsa4","_this$resourceManager","sdk_version","download_speed","enableAudioPlaybackCapture","oldState","_this$debugOverlay","_this$debugOverlay2","_this$debugOverlay3","handleReplaySend","_this$ttsa5","_this$ttsa6","proxyWidget","_this$options$onMessa","_this$_clientOnDownlo","streamingUrl","streamingServer","_this$_apiForwarder","_this$_videoPlayer","_this$_videoPlayer2","serverFrame","_this$_eventDispatche","_this$options$onMessa2","_this$ttsa7","capabilityReport","errorMsg","INIT_ERROR","_this$_streamingClien","clientConfig","initModel","scaleDownBy","_this$_apiForwarder2","invisible","socket_io_url","connectTtsa","setAudioPlaybackDataHandler","handler","onAudioPlaybackData","restartAudioPlaybackCapture","_this$restartPlayback","_this$resourceManager2","setupPCMCapture","setupAudioCapture","audioEl","createMediaElementSource","isFirstEmit","captureStartedAt","captureSequence","startCapture","_this$pcmWebMEncoder","stopCapture","_this$pcmWebMEncoder2","processorUrl","firstChunk","blockStartedAt","_this$pcmWebMEncoder3","isFirstChunk","samples","_this$pcmWebMEncoder4","_this$captureSource","_this$renderScheduler","_this2","audioPlayer","webCodecsSupported","mediaRecorderSupported","_window$avatarSDKLogg1","_this$pcmWebMEncoder5","_this$mediaRecorderEn","_this2$pcmWebMEncoder","_this2$mediaRecorderE","currentEncodeId","webmData","encodeTime","_window$avatarSDKLogg8","_window$avatarSDKLogg9","_window$avatarSDKLogg0","_window$avatarSDKLogg10","_this$pcmWebMEncoder6","_this$mediaRecorderEn2","_this$ttsa8","hidden","setReplayData","frameReplayData","client_frame_number","_this$ttsa9","event_data","_this$ttsa0","_this$onDownloadProgr2","_this$ttsa1","_this$ttsa10","_this$ttsa11","_this$ttsa12","_this$ttsa13","onTtsaReady","_this$ttsa14","_this$options$onAAFra","onAAFrameHandle","reStartSession","_this$renderScheduler2","_this$renderScheduler3","_this$renderScheduler4","_this$ttsa15","setInvisibleMode","_sessionInfo","onSessionReloaded","onSessionReloadExhausted","_error","restartSessionForTransport","_this$ttsa16","cancelSessionRestart","resetRetryState","clearAllRetryTimers","_this$renderScheduler5","_this$pcmWebMEncoder7","_this$mediaRecorderEn3","_unused5","_this$ttsa17","_this$_apiForwarder3","_this$ttsa18","_this$_apiForwarder4","_this$ttsa19","_this$_apiForwarder5","_this$ttsa20","_this$_apiForwarder6","_this$ttsa21","_this$_apiForwarder7","_this$renderScheduler6","_this$renderScheduler7","_this$ttsa22","_this$_apiForwarder8","_this$ttsa23","_this$renderScheduler8","_this$renderScheduler9","notifyEnterInvisibleMode","_this$ttsa24","notifyExitInvisibleMode","_this$ttsa25","_this$_apiForwarder9","_this$resourceManager3","showDebugInfo","_this$debugOverlay4","hideDebugInfo","_this$debugOverlay5","_this$renderScheduler0","_this$_apiForwarder0","_this$resourceManager4","_this3","stopSessionPromise","reportInitializationFailure","offlineMode","_this$ttsa26","onlineMode","_this$ttsa27","_this$debugOverlay6","_this$options$onStatu","_this$_apiForwarder1","_window$avatarSDKLogg11","_this$ttsa28","_this$_apiForwarder10","_this$ttsa29","_this$_apiForwarder11","_this$_apiForwarder12","_retryImpl","_this4","_this$ttsa30","startRecoder","_this$el3","_this$el4","canvasStream","captureStream","audioTracks","recorderDestination","getAudioTracks","mozCaptureStream","getVideoTracks","videoBitsPerSecond","stopRecoder","_this$stream","getTracks","exportVideo","click"],"mappings":"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"}
|