From 6d29ee148532961efccdfe7e8f150a722afc26fc Mon Sep 17 00:00:00 2001 From: Kibi Kelburton Date: Wed, 30 Sep 2026 23:28:43 +0200 Subject: [PATCH] Initial commit: mumh5, a modern Mumble client Electron desktop app with a Svelte 5 interface for any Mumble server. - Mumble protocol core: TLS, handshake, channels, users, text, plugin data, client-side pacing of Murmur's rate limits - Voice: WebCodecs Opus over the TCP tunnel, voice activity, push to talk, always-on, devices, per-user volume and local mute - Several servers at once, voice on one; server rail with icons and ordering - Chat: channels, direct messages, side chat, file sharing through f0ckm, inline images without it, click-to-play YouTube - Profiles with rich descriptions, registration, rename, nicknames, connection information and moderation menus - Identity wizard, multiple identities, PKCS#12 import/export, desktop Mumble certificate import, certificate pinning and viewer - Tray icon with voice state - Unit, server and end-to-end tests against a real Murmur Co-Authored-By: Claude Opus 5.5 --- .gitignore | 6 + CLAUDE.md | 78 + LICENSE | 21 + README.md | 198 + THIRD_PARTY_NOTICES.md | 43 + docs/screenshots/main.png | Bin 0 -> 233156 bytes docs/screenshots/mobile.png | Bin 0 -> 107629 bytes docs/screenshots/profile.png | Bin 0 -> 251917 bytes docs/screenshots/voice-settings.png | Bin 0 -> 130918 bytes electron/certs.ts | 39 + electron/identity-store.ts | 161 + electron/identity.ts | 73 + electron/main.ts | 152 + electron/preload.ts | 36 + electron/tls-transport.ts | 50 + electron/tray.ts | 97 + index.html | 13 + package-lock.json | 5823 ++++++++++++++++++ package.json | 89 + proto/Mumble.proto | 639 ++ proto/MumbleUDP.proto | 85 + scripts/build-electron.mjs | 17 + scripts/dev.mjs | 28 + src/App.svelte | 95 + src/app.css | 81 + src/core/client.ts | 482 ++ src/core/emitter.ts | 15 + src/core/mumble-pb.d.ts | 2 + src/core/mumble-pb.js | 8465 +++++++++++++++++++++++++++ src/core/mumble-udp-pb.d.ts | 1 + src/core/mumble-udp-pb.js | 639 ++ src/core/proto.ts | 81 + src/core/transport.ts | 42 + src/core/voice-packet.ts | 121 + src/lib/actions.ts | 86 + src/lib/audio/capture.worklet.ts | 33 + src/lib/audio/playback.worklet.ts | 95 + src/lib/audio/voice.svelte.ts | 447 ++ src/lib/audio/worklet-env.d.ts | 7 + src/lib/html.ts | 167 + src/lib/icons.ts | 30 + src/lib/identities.svelte.ts | 27 + src/lib/menu.svelte.ts | 25 + src/lib/native.ts | 72 + src/lib/session.svelte.ts | 678 +++ src/lib/settings.svelte.ts | 100 + src/lib/storage.ts | 23 + src/lib/tray.svelte.ts | 80 + src/lib/ui.svelte.ts | 35 + src/lib/upload.ts | 118 + src/main.ts | 7 + src/ui/Avatar.svelte | 19 + src/ui/CertDialog.svelte | 22 + src/ui/CertViewer.svelte | 73 + src/ui/ChannelNode.svelte | 116 + src/ui/Chat.svelte | 58 + src/ui/ChatLog.svelte | 63 + src/ui/Composer.svelte | 87 + src/ui/ConnectDialog.svelte | 105 + src/ui/ContextMenu.svelte | 64 + src/ui/Icon.svelte | 10 + src/ui/IdentityList.svelte | 83 + src/ui/IdentityWizard.svelte | 178 + src/ui/Members.svelte | 52 + src/ui/Message.svelte | 80 + src/ui/Modal.svelte | 35 + src/ui/PromptDialog.svelte | 29 + src/ui/QuickAudio.svelte | 77 + src/ui/RichEditor.svelte | 166 + src/ui/RightPanel.svelte | 239 + src/ui/ServerRail.svelte | 127 + src/ui/SettingsDialog.svelte | 105 + src/ui/Sidebar.svelte | 144 + src/ui/UserInfoDialog.svelte | 149 + src/ui/VoiceSettings.svelte | 173 + src/ui/YouTubeEmbed.svelte | 42 + svelte.config.js | 3 + test/e2e/app.e2e.ts | 561 ++ test/e2e/screenshots.ts | 137 + test/identity.test.ts | 70 + test/proto.test.ts | 26 + test/server.test.ts | 141 + test/voice-packet.test.ts | 38 + tsconfig.json | 15 + vite.config.ts | 8 + 85 files changed, 22997 insertions(+) create mode 100644 .gitignore create mode 100644 CLAUDE.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 THIRD_PARTY_NOTICES.md create mode 100644 docs/screenshots/main.png create mode 100644 docs/screenshots/mobile.png create mode 100644 docs/screenshots/profile.png create mode 100644 docs/screenshots/voice-settings.png create mode 100644 electron/certs.ts create mode 100644 electron/identity-store.ts create mode 100644 electron/identity.ts create mode 100644 electron/main.ts create mode 100644 electron/preload.ts create mode 100644 electron/tls-transport.ts create mode 100644 electron/tray.ts create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 proto/Mumble.proto create mode 100644 proto/MumbleUDP.proto create mode 100644 scripts/build-electron.mjs create mode 100644 scripts/dev.mjs create mode 100644 src/App.svelte create mode 100644 src/app.css create mode 100644 src/core/client.ts create mode 100644 src/core/emitter.ts create mode 100644 src/core/mumble-pb.d.ts create mode 100644 src/core/mumble-pb.js create mode 100644 src/core/mumble-udp-pb.d.ts create mode 100644 src/core/mumble-udp-pb.js create mode 100644 src/core/proto.ts create mode 100644 src/core/transport.ts create mode 100644 src/core/voice-packet.ts create mode 100644 src/lib/actions.ts create mode 100644 src/lib/audio/capture.worklet.ts create mode 100644 src/lib/audio/playback.worklet.ts create mode 100644 src/lib/audio/voice.svelte.ts create mode 100644 src/lib/audio/worklet-env.d.ts create mode 100644 src/lib/html.ts create mode 100644 src/lib/icons.ts create mode 100644 src/lib/identities.svelte.ts create mode 100644 src/lib/menu.svelte.ts create mode 100644 src/lib/native.ts create mode 100644 src/lib/session.svelte.ts create mode 100644 src/lib/settings.svelte.ts create mode 100644 src/lib/storage.ts create mode 100644 src/lib/tray.svelte.ts create mode 100644 src/lib/ui.svelte.ts create mode 100644 src/lib/upload.ts create mode 100644 src/main.ts create mode 100644 src/ui/Avatar.svelte create mode 100644 src/ui/CertDialog.svelte create mode 100644 src/ui/CertViewer.svelte create mode 100644 src/ui/ChannelNode.svelte create mode 100644 src/ui/Chat.svelte create mode 100644 src/ui/ChatLog.svelte create mode 100644 src/ui/Composer.svelte create mode 100644 src/ui/ConnectDialog.svelte create mode 100644 src/ui/ContextMenu.svelte create mode 100644 src/ui/Icon.svelte create mode 100644 src/ui/IdentityList.svelte create mode 100644 src/ui/IdentityWizard.svelte create mode 100644 src/ui/Members.svelte create mode 100644 src/ui/Message.svelte create mode 100644 src/ui/Modal.svelte create mode 100644 src/ui/PromptDialog.svelte create mode 100644 src/ui/QuickAudio.svelte create mode 100644 src/ui/RichEditor.svelte create mode 100644 src/ui/RightPanel.svelte create mode 100644 src/ui/ServerRail.svelte create mode 100644 src/ui/SettingsDialog.svelte create mode 100644 src/ui/Sidebar.svelte create mode 100644 src/ui/UserInfoDialog.svelte create mode 100644 src/ui/VoiceSettings.svelte create mode 100644 src/ui/YouTubeEmbed.svelte create mode 100644 svelte.config.js create mode 100644 test/e2e/app.e2e.ts create mode 100644 test/e2e/screenshots.ts create mode 100644 test/identity.test.ts create mode 100644 test/proto.test.ts create mode 100644 test/server.test.ts create mode 100644 test/voice-packet.test.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2aa68c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +dist-web/ +dist-electron/ +release/ +*.log diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..6d14157 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,78 @@ +# CLAUDE.md + +## Style rules + +- No rounded corners anywhere. No `border-radius` (a global `border-radius: 0 !important` backs this up in `src/app.css`). +- No emojis in code, UI text, comments, commit messages or docs. Emoji inside chat content from users is fine. +- UI copy is short, plain and honest. Don't claim something works if it is not tested. Explanations go in tooltips or help text, not in big callouts. +- Colors come from the CSS variables in `src/app.css`; icons from `src/lib/icons.ts` via ``. + +## Project overview + +mumh5 is a Mumble client: Electron desktop app (Windows, macOS, Linux), Svelte 5 + TypeScript + Vite UI, Discord-like layout, responsive down to phone width. It must stay compatible with stock Murmur servers and with people on the desktop Mumble client. A browser build (through a self-hosted WebSocket proxy with a server allowlist) is planned. + +File sharing uploads to a f0ckm instance (`../f0ckm`, `src/chat_upload_handler.mjs` there) with an upload-only key; links are posted in chat. + +## Commands + +```bash +npm run dev # Vite + Electron, restarts Electron when main/preload change +npm run check # svelte-check; must report 0 errors and 0 warnings +npm test # unit tests; server tests too when MUMBLE_TEST_HOST is set +npm run build # renderer to dist/, main+preload to dist-electron/ (esbuild) +npm run test:e2e # drives the built app (needs npm run build first) +npm run screenshots # regenerates docs/screenshots (see test/e2e/screenshots.ts) +npm run proto # regenerate src/core/mumble-pb.js and mumble-udp-pb.js from proto/ +``` + +Test server (autoban off because tests reconnect a lot; SuperUser for channel setup): + +```bash +docker run -d --name mumh5-test-murmur -p 64739:64738 -p 64739:64738/udp \ + -e MUMBLE_CONFIG_AUTOBANATTEMPTS=0 -e MUMBLE_SUPERUSER_PASSWORD=testsuper mumblevoip/mumble-server +MUMBLE_TEST_HOST=localhost:64739 MUMBLE_SUPERUSER_PASSWORD=testsuper npm run test:e2e +``` + +A reused test server keeps registrations and channels from earlier runs; tests must use unique names or clean up (the E2E removes its channels first). + +## Architecture + +- `electron/` (Node, main process): window, TLS sockets to Mumble servers (`tls-transport.ts`), identities and PKCS#12 (`identity.ts`, `identity-store.ts`), certificate parsing (`certs.ts`), tray (`tray.ts`). The renderer only gets the narrow `window.mumh5Native` API from `preload.ts` (context isolation, sandbox). +- `src/core/` (browser-safe TypeScript, also runs in Node for tests): framing and codec (`proto.ts`), the Mumble client state machine (`client.ts`), voice packet formats (`voice-packet.ts`). No DOM, no Electron, no Node imports here. +- `src/lib/`: app state. `session.svelte.ts` has one `Session` per server plus the `sessions` manager; `session` is a Proxy to the active one. `audio/voice.svelte.ts` is the voice engine (WebCodecs Opus, capture and playback AudioWorklets). `html.ts` sanitizes incoming HTML and serializes outgoing rich text. +- `src/ui/`: Svelte components. `App.svelte` owns layout and global dialogs (`ui.svelte.ts` store). + +Voice runs on one server at a time (where you last joined a channel); background servers are auto self-deafened and restored when voice returns. + +## Conventions + +- Svelte 5 runes only. Comment density: short comments that explain why, not what. +- The protobuf codec is generated static code (no eval) because the CSP forbids `unsafe-eval`. Field names keep snake_case from the .proto. +- TypeScript files imported by Node tests use `.ts` extensions and erasable syntax only (no parameter properties, no enums). +- New features get an E2E step in `test/e2e/app.e2e.ts`; protocol logic gets unit or server tests. +- Privacy rule: opening a chat must never contact hosts the user did not choose. Remote media only from the upload host and user-listed hosts; YouTube is click-to-play (`youtube-nocookie.com`). + +## Svelte reactivity pitfalls (all hit before) + +- `$state` wraps assigned objects in proxies: `this.server !== server` compares proxy to raw object and is always true. Use ids or counters. +- `(obj[key] ??= []).push(x)` pushes to the raw array; assign first, then push through `obj[key]`. +- The Mumble client mutates its objects in place. Session getters return shallow copies and read `tick`, otherwise views don't update. + +## Mumble protocol pitfalls (all hit before) + +- Messages or comments longer than the server's text limit (5000) are parsed by Murmur as XML; anything not well-formed is denied as TextTooLong. Always emit XHTML (`
`, ``, `toMumbleHtml`). +- Murmur silently drops own UserState, TextMessage, ChannelState, ACL and Version past a leaky bucket (burst 5, 1/s). The client paces these; don't bypass `send()`. +- 1.5 servers use the protobuf UDP voice format (type byte 0 + MumbleUDP.Audio) with clients announcing 1.5; older ones the legacy format. The UDPTunnel TCP body is the raw voice packet, not a protobuf message. Sequence numbers count 10 ms frames. +- Long comments and descriptions arrive as a hash only; a new hash invalidates the old text; fetch with RequestBlob. +- Renaming while connected is not possible; mumh5 reconnects with the new name. + +## Running the app in this environment + +- The shell has `ELECTRON_RUN_AS_NODE=1` set; strip it when launching Electron (the dev script and tests do). +- The desktop is Wayland and Electron picks it automatically, so windows appear on the user's screen even with `DISPLAY=:99`. For hidden runs: `Xvfb :99`, `--ozone-platform=x11`, and unset `WAYLAND_DISPLAY` and `XDG_SESSION_TYPE`. +- The user often has their own mumh5 (`npm run dev`) running. Only stop processes started with a `mumh5-e2e` profile; never kill Electron processes in general. +- `pkill -f pattern` matches the invoking shell; use `pkill -f "[p]attern"`. + +## Commits + +End commit messages with `Co-Authored-By: Claude ` style attribution (the exact line comes from the session). No emojis in commit messages. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b47a350 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Kibi Kelburton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..aeabde0 --- /dev/null +++ b/README.md @@ -0,0 +1,198 @@ +# mumh5 + +**Mumble, the way it should feel in 2026.** + +mumh5 is a modern client for [Mumble](https://www.mumble.info/), the free, open source, low-latency voice chat. It gives Mumble the kind of interface people know from Discord: servers on the left, channels and people in the middle, chat that can do more than text. Underneath, it's plain Mumble, so it connects to **any existing Mumble server** without changing anything on the server side. + +Your community keeps its own server, its own rules and its own data. You get an app that's nice to use. + +![mumh5 main window: channel tree, chat with a YouTube card, member list](docs/screenshots/main.png) + +--- + +## Why mumh5 + +Mumble has the best foundation of any voice chat: tiny latency, strong encryption, self-hosting, no accounts, no ads, no tracking. What held it back was the desktop client, which still looks and behaves like 2010. + +mumh5 keeps the foundation and replaces the experience. + +- **Works with the servers you already use.** No plugins, no server changes, no migration. Friends on the regular Mumble client see you and hear you like anyone else. +- **Feels familiar.** A server rail, a channel tree, a real chat with message grouping, profiles, right-click menus everywhere. Anyone who has used Discord knows where things are. +- **Chat that is actually useful.** Drop in files, paste screenshots, share videos and YouTube links. Formatting works, links work, and everything stays compatible with the desktop client. +- **Several servers at once.** Stay in the text chat of every server you like, with unread badges, while voice runs where you actually are. +- **Private by default.** Opening a chat never contacts servers you didn't choose. No remote images or trackers, and YouTube stays click-to-play. +- **Runs everywhere.** Windows, macOS and Linux, with a layout that also works on narrow windows and small screens. + +### mumh5 compared to the Mumble desktop client + +| | Mumble desktop | mumh5 | +|---|---|---| +| Interface | Qt widgets, dense dialogs | Modern layout: server rail, channel tree, chat, side panels | +| Several servers at the same time | One connection | Many; voice on one, text on all, unread badges | +| Sharing files | Images only, pasted inline and heavily limited | Any allowed file through your own [f0ckm](#file-sharing-with-f0ckm) host, inline players for images, video and audio. Images still work without one | +| YouTube links | Plain links | Click-to-play player (privacy mode), optional thumbnails | +| Chat per channel | One shared log for everything | Separate chats per channel and person, plus a side chat for any channel next to your own | +| Descriptions | Rich text editor | Rich text editor with pictures, and a live size counter against the server limit | +| Identities | One certificate per installation | Several identities, a different one per server if you like; imports your desktop certificate | +| Server certificate trust | Remembered after a warning dialog | Pinned on first use, green header for CA-signed servers, full chain viewer | +| Fast actions in a row | The server silently drops them past its rate limit | Paced to the server's limit, nothing gets lost | +| Right-click on mute or deafen | Nothing | Quick device and volume options | + +**Where the desktop client is still ahead, today:** UDP voice transport (mumh5 sends voice through the encrypted TCP connection for now, which adds a little delay on bad networks), system-wide push-to-talk, whisper and shout, positional audio, the in-game overlay, recording and the ACL editor. These are on the roadmap below. + +--- + +## Features + +### Voice +- Opus voice with voice activity detection, push to talk or always-on +- Live level meter with an adjustable threshold, so you set it once and forget it +- Noise suppression, echo cancellation and automatic gain control +- Microphone and output device selection, input and output volume +- Per-person volume (0 to 300%) and "mute for me" +- Speaking indicators in the channel tree, member list and your own panel +- Bitrate automatically limited to what the server allows +- Right-click the mute or deafen button for quick device and volume options +- Hear-yourself microphone test + +![Voice settings](docs/screenshots/voice-settings.png) + +### Channels and people +- Channel tree that starts collapsed; channels with people in them open up +- Single click previews a channel's description, double click joins +- Side chat: write in any channel without leaving yours +- Profiles with rich descriptions (formatting, lists, links, pictures), local nicknames, registration status +- Change your name (mumh5 reconnects for you) and register on a server with one click +- Connection information: ping, packet loss, client version and, for admins, the user's certificate chain +- Moderation from the right-click menu: move, server mute and deafen, priority speaker, kick, ban, register + +![Profile with a formatted description](docs/screenshots/profile.png) + +### Chat +- Messages grouped by author, direct messages, unread badges +- File sharing: drag and drop, paste, or the attach button, with upload progress +- Inline images, video and audio players for shared media +- YouTube links as click-to-play players +- Incoming HTML is sanitized; remote images from unknown hosts are never loaded +- Messages stay compatible with the desktop client, including picture previews + +### Servers and identity +- Server rail with custom icons, drag-and-drop ordering, connection status and unread counts +- Several servers connected at once; voice follows the channel you join +- Identity setup wizard: create a new certificate, import a `.p12`, or reuse your desktop Mumble identity +- Password-protected backups of your identity +- Trust on first use for server certificates, a green header for CA-signed ones, and a certificate viewer +- Tray icon that shows whether you are talking, muted or deafened + +

mumh5 in a narrow window

+ +--- + +## Getting started + +There are no release builds yet. For now, build it yourself; it takes a few minutes. + +You need [Node.js](https://nodejs.org/) 22 or newer and git. + +```bash +git clone gitea@git.lat:kibi/mumh5.git +cd mumh5 +npm install +npm run dev +``` + +On first start, mumh5 asks you to set up your identity. If you already use Mumble on this computer, pick "Use my Mumble desktop identity" to keep your registrations. Then add a server with the plus button. + +### Building installers + +```bash +npm run dist:linux # AppImage and .deb +npm run dist:win # NSIS installer +npm run dist:mac # .dmg +``` + +Installers are written to `release/`. Build each platform on that platform for the best results. + +--- + +## File sharing with f0ckm + +Mumble can only carry small inline images. mumh5 can share any file by uploading it to a f0ckm instance (a self-hosted imageboard by the same author) and posting the link. Other mumh5 users get inline players; desktop Mumble users get a normal link plus a small preview. + +f0ckm keeps these uploads separate from its imageboard, respects its own list of allowed file types, and deletes them after 30 days by default. + +1. On your f0ckm server, create an upload-only key: + ```bash + node scripts/chat-upload-key.mjs create mumh5 + ``` +2. In mumh5, open **Settings, Chat and files**, enter the f0ckm address and the key, and press **Test key**. + +Without an upload host, mumh5 still sends images, scaled to fit the server's limit, the same way the desktop client does. + +--- + +## Privacy and security + +- **Your identity is a certificate** that stays on your computer, stored with owner-only permissions. mumh5 reminds you to back it up. +- **Server certificates are pinned** the first time you connect. If one changes, mumh5 stops before sending your password and asks you. +- **Chats don't phone home.** Media is only loaded from your upload host and hosts you add yourself. YouTube is click-to-play in privacy mode. +- **Strict content security policy** in the app, and all message HTML is sanitized. + +--- + +## Roadmap + +- UDP voice with Mumble's OCB2-AES128 encryption, for the lowest latency +- System-wide push to talk +- Whisper and shout +- Rich chat between mumh5 users: replies, reactions, edits, typing indicators +- Video and screen sharing between mumh5 users +- A browser version, through a small self-hosted WebSocket proxy +- Release builds for all platforms + +--- + +## Development + +```bash +npm run dev # app with hot reload +npm run check # type check +npm test # unit tests +``` + +Tests against a real Mumble server, including an end-to-end test that drives the app: + +```bash +docker run -d --name mumh5-test-murmur -p 64739:64738 -p 64739:64738/udp \ + -e MUMBLE_CONFIG_AUTOBANATTEMPTS=0 -e MUMBLE_SUPERUSER_PASSWORD=testsuper mumblevoip/mumble-server +MUMBLE_TEST_HOST=localhost:64739 npm test +npm run build +MUMBLE_TEST_HOST=localhost:64739 MUMBLE_SUPERUSER_PASSWORD=testsuper npm run test:e2e +``` + +On Linux the end-to-end test forces X11, so it can run on a virtual display: `Xvfb :99 & DISPLAY=:99 npm run test:e2e`. See [CLAUDE.md](CLAUDE.md) for the architecture and project conventions. + +``` +electron/ main process: window, TLS sockets, identities, tray +src/core/ Mumble protocol: framing, codec, client state, voice packets +src/lib/ app state, voice engine, sanitizing, uploads +src/ui/ Svelte components +proto/ Mumble.proto and MumbleUDP.proto from upstream +test/ unit, server and end-to-end tests +``` + +--- + +## AI disclosure and credits + +mumh5 is built by **Kibi** together with **Claude**, Anthropic's AI model, working in Claude Code. + +Kibi sets the direction: what mumh5 should be, how it should look and feel, which trade-offs to make, and whether a result is good enough. Claude writes most of the code, the tests and this documentation, and checks each feature against a real Mumble server before calling it done. Commits written with Claude carry a `Co-Authored-By: Claude` line. + +We say this openly because you should know how the software you run was made. Features are covered by automated tests, including end-to-end tests against a real Mumble server. If something is wrong, please open an issue. + +## License + +[MIT](LICENSE). The Mumble protocol definitions in `proto/`, and the code generated from them, are licensed by The Mumble Developers under a BSD license; see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). + +mumh5 is not affiliated with the Mumble project. Mumble is a trademark of its respective owners. diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md new file mode 100644 index 0000000..7dbc45a --- /dev/null +++ b/THIRD_PARTY_NOTICES.md @@ -0,0 +1,43 @@ +# Third-party notices + +## Mumble protocol definitions + +`proto/Mumble.proto` and `proto/MumbleUDP.proto` are copied from the Mumble project +(https://github.com/mumble-voip/mumble). `src/core/mumble-pb.js` and `src/core/mumble-udp-pb.js` +are generated from them. They are covered by the following license: + +``` +Copyright (C) The Mumble Developers + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of The Mumble Developers nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +## npm dependencies + +Runtime and build dependencies (Electron, Svelte, protobufjs, node-forge, DOMPurify and +others) are distributed under their own licenses, found in each package under `node_modules/`. diff --git a/docs/screenshots/main.png b/docs/screenshots/main.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe60491ce499c387ee1d0a32ba8557513c2e257 GIT binary patch literal 233156 zcmeAS@N?(olHy`uVBq!ia0y~yU|qn#z}&*Y#K6FCL!YsgfkA-5)5S5QV$Pep>@kmNs1`{k|k#QDjnbR5-(+$SCBY!05#GXTD0u2_caqA8Su@*FXN*>+|XN6G@deQDIw= zGaW2iGrJfno(Oih2u*BZ0D%L0U6q0bvhwqS6d4Y9C@6r$z_@{3hD8R<0udDt91k#p z7$DrhE=P5#iC#+=wl_&0>~T?9cyRH>jN(Pl_k4c0TRVJThUa#X&Q-H!&AOo6bZGXD z51ljR#7qx)O_ghGZ}>JBH%s|2OkhXIi7<0n6znp*maZxlc=eLDvvh%ivGJemzrXlH zRz(Y4d+j!F-n_J9OnVo$+kF0J+*YzUw4mhjve@UX9l`>FvX^E}xERUa)e1@O2p>|$kl z+-J}mG-F44v|5nYls49~d!HBYUFmU{i=)@YYiY=mWtO*%qoz99#b?}Flzd&v(0=iU z##O6fzJ2hJ?duKp^LhpI6xkfsTHZF#v5Ls>PE1smJD>)!cJ+y|2;PQ$c3?zuxoP*Y(IO z|F60Bo~fGbMmIk%w*IE-cVkPiWq$0M?S*2?wWaUMBhr`{9QI)IdfUgo@57e)CEPO15?!t$W3l7; zgPp52-Gfuwdehsb&UGe<3rHR~u#o3}M3=y-e3+Ye^xN!WZ1+o-Fm3U9x0jE*)#cjj zEqn7l(}Q_JHKvq4lIu0mnA4z*81cWeRW(@?{7mM~pPT9N?|pQ%&f8SQ<#<>u zDmdi0k-LX0K~ih3%xMAVeIGeCY}&N!^2^$@b~PO=i+1j01*N?Mi@SW5*_b%{Fn!3V zDq-epb-H)w&Y9xU*QINJzqq(GHFalah16KE=}> z4K>LXXJ-FDQvE*P;d}4O%S!j7zVB;oOI+zkTi7 zt=rSi&PtAY@$B8dd%xvv|DGwG^OztxHlJNkOezDO(iSQHm^|J2Jp94asI}YH#XWoaRCs&R(wEHw3=a-|@?e*-|M%nZ zqZ>#6{reXy9u;l;|KIoP^}o)4+qdmfhp~_mPp-Gc=eX+9vh;dMkzKNL7fs}BIp(Lg z$7v7GL-xDcM=q>jK6#`mam|+nfl|%_ZL;mIhGvsFA1t)KG;>}+-ZMj~#77%_RQ)WT z9e0!X+{QU&iZ*TkzvJtbmHWTF`}y?3!N2d`$t5NVpZ4Ti)zP|qd!*+RPB_$v4 zIdkX!`+fg^+}TrB1rHqN&(2igj5d?rb$-FFv;QBR-@?7zKi1>)sa-X{ULUnl@wBYC za^ZOE?MM0lK3~4}|Ie?po7>b3Qajn(H(qOYQ!^=(_2R9`eZ9|~@9)Os*cT2_^S^9b z+&4{sjpgh5TjeheQ8MFckk=* zh0gUdx3(6_tv{_Uy}M)kws*!l|KBd(uErNB;h4C?)poOmnVH!wX*;*ZiBHayRzAPW z|MxF*^}3?c(!;B5Z1-N2RW!(3V1LB-_3v-j+k=6ypVVAm)l?P z@X)bd`S1Iux>e*Hj-D@P+G}|zVI$Ao$P+*Q7}dO7f9lS^f4|vTyyn!kxV7vGOto~k zkNx>**_4MqtRa8)&i?j9V)ogBJ9jKjeYXDoWXrvieXoMb@;n8~-yA>Nmz8yH(Zm!v zZ$ll|wM|D@8o3%5etI(5-*=YH*=y%a+zgD2cc;FcvNF(newpD_RSQnd1m-IsP!LQSgB zT)w;du1kB_%LJhNoEyWySH z>%Y{lZ+hrx@cP@yoEaA??=|MJH3nW(G;f#Mz&%4;_F-Z#9K@I z^!&PKKl3En&!4TWytC@nt5=_j6n80KSUhi`df(A*@%%eG3Y{u`oC?+6Y-G&7X=+#f zhsQgb=U=>Olg}5bsVD3eV!ms~1eLmPC1>tUVBlLN{DC{aZ_A>IDtqj$AO4-a`^2A| zi#yI+rJJ_yesrk(?u^y9H?3UJ2SKr@WMTutr-b zWc9_43!dDUE?xAH{hRn{!JWxJo^DXPc34Df<Penm#^>gq)X0*0CH^8IKF|5bCz(~&Sr#uv4y`en8glXbUB8rF zKQ~NaJ-W%d?hwxtjf5XlxLbd0U*8`;b;YGEM~+T)UmA4!l$Y=3g9jgfyl%5p)%C@^ zBo-IefDR8cj;*B_L`rkZq0fX`~PphTXj3Hg2DrX6>Ha4zFcaW@xesP zGjZ9H>7rVRX{!Y821`wyV9#>=$nKLqf@Nm{ZZIyqXY>BWj-N6uDVprUEf@B_m@v~O zbJm76CXc-luM-9e3>2UF+kbk2O`dR;{A?}wB7 z|LFvM-M($k-y`nt^*%0Hz3%_}$@NF2zq=OpR(@an{FsE;-anpy?%LIUJbp3hXNtVu zsnh{me=lT+@#TBy!-Do5+ppAZk;*vp-v{^an>GGzv$7UEZ?uhU@ z-^Udowd1{@pt9%Z97C)&x;jnH}0D@ z?b-9*muztr$6vBFH86i^Kh$0KdiHfD-u$Q^bMr4xW09~+<*>B0mbb54^53ZP`cI1o z1rK*UiF>~IVf$z9KgqNBWUTqvWx_Wb`FbB?V}0D9tgXE`AfTa*fltov=flO@uWp$E z8w<#k)%99g7I%5x|4a8j-!8YiRsT1wEm8d6FZatn^~NjXHsAXj6#V_r{zQQHsf`bw!ZuyO%j0CIXY6pA7j>JaIOA z|4hZnFJI>HFI)F((w3_qa?@{|nJH*@u4Jpm|4TDl&b*5co3y5O+4(s#FCOPO2Th-M z=j-XGS+Z9xbI#3q`R^Rh+%*Q~y!GkPH@iH_9-f~5%cIq*yq>>$R#emkiTS?$GbCRf zU9|N?*JeLC`_Lqx;414mwx64%{2Ib>Ew^>t67UazuB?# z+oG&l?fur>SCoXGs>s0wV})FI*g4g?H!G*v<)4k=FMjg*TRZpGqwV`| zPhb0@^4YX=g2u{+Z7SM!FS4+Hn37b-yr`eAzmw-^KZmEP_G#PVCq9PCMNc>Hxf3fJ z8t!pNGB(}%ypG1R)}6=Jt~$Nxyo{$#*o&9*xF3m4@XNCfx%0c+-{p8=ahl)fhc_>m z76lfbI{8>LH0v?*lSX+3ae4l2iIt9*K2CmV+7|6r&K1AG;L`bu<)WHZ+0{-dtY;!6 zgrA&o=;}%m{Fj`w=fc6|8*^6a7|s=wl06r!{_e)KWslm<#|q?CFnM$p>(B9ga($)m z(M6t0mZy(jp4cb+b@63Iuj`~Ndvjy@y#>2d!(5AB?==6Tv1X>X)z0Mo z8{6bgWfaWZjRMk+Bnso~3y0e6_8ybzNv+?3}aHSy_#H`$O{CUwu08 z_2VK1EBk#$*X(ky>t7f7A$B3wd9m{0+Df0|*wRn$V%1MwHEDO8HzRKC3gKs|-OKcz zY;tX*;UvpUuka!)_EApQOQ@|Vx}^6v#|O)F3Nl2UJ;t`^k6 z^WJjiB0W==s%rOFuV?001c+@~{jvGc!$T^XtBZyC=I`l>?`(Uz-LBnr%RRX}@A|K6 zhFGOj7Gey+o?5FhHU$e_bn8*Cc54P0?A(x%o zo=5MH*IP4r>a(~m|Ep&!@|L|jc3LL#m;LTdr*&SvUF!0AzHND$L4W3s|HeYXMlD*8 z7yE2}ooZQp=F*OW(v_z!o1$4^HeEg479i( zke0$>`8l6O=11|*WBJ#7lN6RJJalL}lN*;4a->WD8t44_{}IP4Hz|p^Yo9hUGP$?# z9?y}^xb1S1X;b%Ha1gs%{qI$}kdgiFz~H&B!~_-2d7evPY1?IZ=h^!BaE*xF;U{+9 zRlJk*Ki~GBzowq>l&iP=>hkRT%nQmk{Y_A`RZy95&|jmagqi2ky1DkY|Nn4XJid@& zBIJ2>-T!|j=8%GUbzl9P2aa{C6^soHTjSYZ9=q^x*A69T)s9vFx-~_(=A>E`$G-PH zaB=F^t%(_1+T2<*ubBizB_9?DRoTcJx9QT1JP*B^-zWJqr+k=xzcyK_`qAn4cJqIK z;=i6hP5b}j$@OpbQ}lnnSggKx#haDh%intc-n?%9*7tMz_U}8QJ>!+7?v2v=K*1v3 zd1h?s3Ts`LU+!vq^7FQqw$RFt>=sqam@KPrtZwy`)OzM5UtYD%=j^8>MbD(Ir#{TI zE3-OfyXo;dYqvf6w|>{`(_(XP{=d7<%e2!k=yk`M4L6o<&a9YR zn|h-1)t%PU(=XQDto2OVaq02Ti~e%A3S&-k#S2)gpNpJPQ*&KV(zf8-p_j(aKMxsC zU2*-e<`%8Fee0ypw7b{T&J*1KxMFMHGqGI-o=;NFKWeTqRk|qiw*%#aIyevWsE`0_iutbe_*EabLb()oMesn8og&O~l8 zIrr?tI_K-vwp-$+RelgpyR*43^LACQ8IMPwWAQSpuD&-`Gvb#ozWp%aXu;zvMv12$ z_WUiidiLUkDtEe{uE4w#=cci-vRb8ugg^8yKhD5E%VhC`YgtcJ+LXP^|9sfitR?;5 zvRmo7i^v;`!r9XoEsWc%^8HNTf* zH1E1_3=_eEE~ zX?~^?C9(S6-rpgi$1nTno;nwNl&!*GGtXDS7cup6o>L-jG(4WSbnlzB?{6JZ5z;m= z(s+4h-+Ml-E5G#4FPnEh@yVUvas_-VEQ(XE7jo7m>Cf4nvM%fRLZ+yE{-PV2 zzQoB(H}$8u2R}Xa;q9Bf;gjygi~nev`?hD-{6zPED_;LAdj0tCb2pWRuYZ10`C4&T zR`>l=J6ZGeOq0zC|KI7obPJy*XZ-BPVsG~Sw^f5C&+wV`>e@H`y?d1<^PKX}|H=BZ zV8b4pl#lJ@ZvroT@a^lIyYg1y9*^s9Eqi3tzkYh~s>&|Tyqe?U%IcjP)9Y@!$6HSq z+5dRK!?>gGe|lH%<2;?QI9+ev%*l@J))1p@H=_|_rPFne*w%jG{!I_!wRvGU$d-}+FLaXqSswsL`bU7XwvhL(^ zo+?wnZQYNK57Wf|>*}lS`oAc(_~xO>_VwX+4smrw?kG`x{h;qhl4xD=>s-rwbKbp4 zu7CMq-DIP-|94!Cr|TW$zrSy7>Ir4FGQX0Fyudvjm9xeFd34y86dF zSLFmwOgP?`JJ&b--NLXsFTao%OByutcf0gXU-+-hNLAHY(t3ZgZL6?=Y{zE4)MMMe zo4*mwdQr3G@$&S&&WoAf2w64H*kqe;_rFw)tD^L{zV@E{Gg%eg`~K(FYD|56EHS_+ ze~-dZ_xsWR3X^1QA6%VZ7xmEhE8oX$)~h5BC{B@_9bZ{2em~%Lv-t0(M9!%PH(i#w z{rToS-Ga3Y@6H_c?tHh{Jy>JPnI7%(nRyG`Yi2|gNYC1J#(B2g@2b-aT|CU&Bo3bW zacTF~&#RK%|NnXPx!3m8EI|(C4_0qIO!BrwY}~f(l~wih7jePOH-G%Uwx-tl-x)1^ z|KG*O<#(=antLyDc#l*ZYnyKt+y&Tg!|H^R;`@|x}E`RS7@K}(hj@$qD1P|>w>m# zny=M&w^Z@e$RIiOM|a=tcw1qxl*gu$+GjDLGAq&!JbBXOQ)X@ z;XU-lTTQiL^9Y1aJx%4a|P zUAfH~?F4}CxW_FnW z!qT2UQmu=$zUQ=g_@*0nw6)Jzt!GeUd8b8wN6!+b$nW#GSFB;+-}U6u%r8Z)s~k`G zpV4^zD>6Q?Krwnn#?_Y|eUEEqT=G^wKlMZi@1oV}=byZmIbK;ZM{l2~c+tnZ+S*>$ zlU0(des0JM6UkhA?qt{vmY)(;W?M`6%G{<(IQ5K1d|tfc z{qDEN{svF3e&@sZ=;!XpZ~p?yuAXLgDdpiyI(7Mjty=IE5tXH!6F2kUzEske<>@9> z_x1rt+dIKmZC&S8pM{xeoZ6)SbmfQa$ydMg?)h2tBg0o^@sA*{t-Izk-@S6Xd(r7E ztK0XR)x2z)=KuLomwi;dZM`~sVUmiFaluQgnlS0>M}3!z%G{hDakD&h&As+6YmcHeQVY)Z}(doGWm^d&7FvnE2}1y{x{m+U%q7D zyq|6Cs)F`eKX%TodlsbHEB+$KX7#%B5AVs}iIZFJc=v|gy_VkHqH1a}!jgWX_A-m= zZu8uG=9#LqNW;(Tu)pF|p9vL8(W&p>AAGa=eBfTcm4_17w2Sw9US6G2`s1%_=*-wP zWjvoYsYzN1d@K(Ue_qBtZ`YnF0(XB%_1n+PwTSVIs!1}HO;-vL+Wh^g?DFZ8!UB5Z zx80n6N@Ufk9`EqgJo!C8cm)i3r!LO>eMnw1YwNC6t2SjjC#(&-Ju`2H9rs;rDOG#d z1ukO6UNz^(-roX9pe9WS=Lfm|}R_;{JUT#yP#tR?pkM0)clPG)mnl=6(k1=}t$Ov!=i*E^ zRYRYEkM{$txprOL+3t1oV|i?({=s^?w*svHQ{Vl$eCKtP%E3gpyGJ6+l9#boKg(KH zDYdWtgwfkK`Z*`j%&R|Ut@2sH_xa<4t~oEe?gagryW4oOqj}G4 z!4wP4 zPb{tAle9~p{9>;>UwvA3;P*EI8x~(~jJA?|8{zu6Z?0waCjRNJ<}Pwp7kj;&+xSnJ z+fA4L9i%F$cOcI;ajIXAdH6L3=(>RGxjrmHy>3CLt@cj})fUlu;-P%^rvQW1(XGwa zAq$O_#P`_=PfeX;Gbv)h1!?VR=a2BWYvu)rD>;XDFUq;NW#+#--bQmbK647}=U%SY zTV8UEyL{5iWnbH0NeD<+zi-^W@8y+GS+4!d1NF~8v@36TKVO!Z*TuJt+%SOf#1c{fs6#O`~LD}(;x?8$|?W23UZyIl!;`!?L z#l08V+f`4WRWHd($&tCW_pQ*{^~|NVhv(^ct^3YDw{QNRuITtj%@!N`>@3)>EHBSr z&;7Wlv_8F}+wOk-uX~H8Uyt1`)aQ7yZ-wiW)vuOIMXr8vWZm6KCr(Hfu0O6(bY9ke zX57`UnpdA&2j!oyIjp^C>1VaoqD6CDE@UjLe)Oz($M(hGQqGx?|s{HAt%f1_y9)BtAxAnHP za$xyx@qe~oZX|!+v!`~(nYd%0GV}6;I$b^<@1LR6KRy0ub+c2U;>((QwkthWuRQG` zvZbx9&CNZSiRY`ikWuQad5=@JbxjryIx=^Dc2w)kAKCNzKIWLR{U{E5?&VwmSgY*I z9LLlE_F|5u9|e|WdcL~8dYam~_>GTdRto0vy#Fb^-|^H_X`zKvxg-qC&A*F>trH9l z`*Z!qd$&7Xq5k%N@5t@Fcjftuxsu-+nxA&p)Cyi_G<+-I*)5_}Vk-DCKU!L%p?y}^ z>WL?pJU;I4v2V&1|BW9Lg+JyOUbU?{Sn@W-L?_3o+Im;f(@mLWhgv>t+qO+R{E{{I z{ZRGATES+H3jJ$9JIbGZOv$a}d6n$>) zwO+dJ_3_AGz54b%^5+D5k18xY*Y@{^a}xI>$$bxv>RMeE8A^Jnzufz4-MZsHzf@Vc z2&XRp{&V79b)n)nhg2tOJpHiF`6`#F@t@XIyT4P8i6?BIWAIPm{$nnI`dzAq*6VC~ zTtArZ_gcRH>z~Xv|6{T1nFH%fx+ZOL{$cIB{DZ3Z^CKbQ@2CIN>EsQaYq>9XzQ@Ai zd3%c%?%g=YYewLz+0t(wE_}T3)a1Q=*9>l~x>$1Ga--pyCgt7!(@ut%{9l@V=(lFh zk2(Dxns0m*n0#iYt)5u#{aES4tcMT#7#(r+xcd1^f#Kb=Nk8I_#D{J#VPX5Rs;P6b zjD$u1capVS@12aj>ow`kuDLUu;$rvIAD?;Z zV2s7f58`iTc4mp?Tb`d;8F=G$BirE*PnO@U`E>th=iOc5SDvyu8SVe6QCc7SMl!?R zQ`TDI!*750%1O={>(}p&)+pkaJCk-kc8A8MDtD*C`GLOKU$3^*hMzZJex?^~P`)YU z`b_Cku3wd)5gUKw^oPIi{8;9`*w|y)>bKGRz2E(fbou`FUq$K8v&=g-*6!iFoZIuh zQTDskM7PCv->T;w);<2);GQdwn(WFh-j{6;Wm~QV3if*>Jz$=dHzzK1TIC*{&pnTC z>^%MK%*4>gmnT0>J$A1%Jp1L-x7g2@vaRcWEnK>Er&q{JyIaX0A1(d;byrhU zjme#;qmr5y4>@}3*xETQ?my@@oijVzG^sJ5ZBOKtu);&%@?<>xtR^b@tIbnfDBQwj24}f*6^bF85Ad9e3=d zTl)G%yUYGvx%vEsY`V||;Tx9A9u3gFWPIoJkL#fkS5hks+n%o}@V8pDgY7(*S=_NJo+{?Av%YQJ zX7~LJ>mOO^tM%8`B<%6`y!G;q;#=8peQn`Y5pw5N>~cu@vtZ>k(GZ37_-X4F-T2TL zxLn|wc7&jDvyAmV0mX;wKjrQGdMJjoSN!4SK*zZ*Dw5_4f454%mX@}%;8}EfQ!$&_ z3}^ZF#fFu3bvDNvuZyH^n4#iYxX@$Sg^PEa{@mPB$FC*)?DUJeg~!y?L!KWf;Gg|Y z{%+`0R;4F0QZG_&2%bG?e<(71ieiYwI@XesbpGV2X;Rni@2q|NdB5N4YZD{RnfG}o zSy>dX&9~&-HP`rbh@e!w-wGb_Cni?i3s;}h7CSXd;Ii_G)yD1_qOrPR#mdUIrH9s7 zOY~0iC@*_Q z%>sqTe;uB;mEGgN+x=90^&4mByF9)s9y;?2^e3&@e6)Ax=K2i_75O?}8e8@()p&DH zz%6u|uF6jrztWJWPox&_*!OK&us5$R>m1(rG$C2$!?ihi<%-unTi!_z6uNAD;>VF? zR_(su6g!Jf&#J1_$gh9e?jN_}nO`5zhJA%IeO14fC9w+a`v2yGbnl@K73Zg#O4&%5@>-hA15X^)g5*`C#3vQ{pf zbX3@sJui|wbbd-GlQ+QiNMwP&N%*1ls!#-@EQ z|N2I#Y94#v=-9}olB_-LLc;Uiz7`%OaU1#{PE+>oH;~`8=f;I)$F96<&bAS@(ziKt z^GldhvZduEUUQc8Y_2&uQtxBtuCdrX>7BgnsVQmqmwjvbXxi7GRMQ)6)y`_Uii^iL z>Q|JVz+Rhh_Rm5RQi=-`E$-g(GMceJmcop>R-PwRg-G`3G=lp&4xZnQ% zulcp@d~bhOn9Xi_$D*9{SHJ#G;h*jLJjtp`g=tQHbF&KC7km(_mz`hoYWv#x^?T}K zW2VebG*7LOTq2#|FlX-0(~rZ#LZ*~U8?&a%R9-JGJofPE)82O{4E8O*Px%FKARHJRrw4J0mr7Ej*GK1PCFO2eOt<%6&e>$9=uq1GWhhAQ^)@P z{tb{$mf{+Z%@PFj&rMv+&)O#A7395>H9lk zW>i_NmgCi&yCq`DET8EjcXpKItvx5cvf0+fbs4u$ZRxLvhck*Q-rTZmd&aZt)oJ!} zdC`)a`xL*Q@O-XXd_6BFW5(3DTN~f5(RlhGF*c>*&aQ~+Nl`%sndj{eub9AGRsZg9 zLEE&q^L$!;qdp$EW%*j`^0}0=y)nDgWa|4hPwHw+viw$mVann5m)y_S-A<7B*ATBT z<=cvvtA*y=@#mgzm45d4xwdoPHv7G^4o%u|SnIOTXIrs#HToedgHE;{`jd5;wb?Ih zLZFCA`psSa(Ov!dzk|gDcVAJhzP|0rt8)wGGtNCMM?ABS46hGb3`OBs?#+i34i?8o# z+TR-bx7Zj)=v?$2B;tD9GHDoeEb;V%D3m9>dFoz2fz?TSAq zxl1aPy>+GD)6$qV-?nalwdP37{Toa3e?NY|J#^|(R?#!JRg(AGv*Qam#@N%WL-rL*7VJqHMCb4@4AAY_j z@_kRT)LNbIC-xl<5B1TPm)Fz$edlW)yV19UiEDZmhlYx$%HNxtu_AlHtG5o#zxJ%t zva3|FF1vW@`y$@rt~Gb9`KI!`I#P8xpg>Re#m&}i`#CFvR<7dyIQi6tcPpn~Z{@pd zc4N=ir`z-wU;jSe?zH@i*QM9z?$UZ2pp^e~&d!5Ze_wiCb;m{Ma{0SUrpx9Tg&g8$ z*Drm!cJci3CHLn2bV-&M74Eg~uCj}B&kNBB;I7`k z@ztw0B@2(g+3{U%WzqLs>l?RcZ}1A7P;o6i^35#%V4Pd7dS`zYviwc zG0w+5bq^WuPm#DM7kYI1Bo}Y-HIe4At-(tlU1FNq{qfvZ{;pV|Q%2X`1c=PDnUVME z;x@+_sxFOki&`Gtwt4!&`{f14OJ7cIeErPoQpu)G-tFbfCFApIb(Y`#_oupg-6R{f zk3tecG3&gOn->)y*b%ofZ?^QQ;!~Xt*iUT!nAPhT3%lL-c>rP z&Ogla^OrnPPkB(&T=;tD$M1XotKHgBSlUv4rRMR{_|+CaBj!Hy+jlJU?9I)w5+Ba| zarhIqNJQrDmww;nJn`(AY^5B%L9Huv-g{nL_Bvqcg9p#vYL*8c6t@X-S#;`&x2L$! z`LAz6OU}=WHBNKkZgnbgKcnS(b=gX%#)OB$+*P_FlHaaI%%7SO;E{2M>r0A))7cmO z>n~o7Dw!^%w@y#v_ulzT;5FN>hg;I#OWT;<=ywjj?&Vc{dGor{Y%yPd%PCp9?cXw` zvheu7H+J^j7cCeME-r0d`O|#g+=UyDx48C{D_?!SJpPQ<F8yx8HTB;lQY0dWj z{KCSAS654hhAO2lzI62H)zi1rA00Vaw6o^@z4#-cN+upGN*nj*hp->GcJ1BO>-Y9l zd_1&s^YRaC=Fa_lD?Hxc%gd(z-4}&#PKC9P;;rw^J@I1O4T*x7@W7b#eg7`*_WyN1 zV(pn*-%qOBt4RLab*pXv=g;N-n_lbH?Dsc*{WG#{m+aa}S7iVHDyo-?yZirEp8GqC z8xDTr^~=2$UDTNs;(U4HtHmwvWOt`6dv~JmuxqowaFy#OzFNaGr8i+?0cPj+=iGnS z*i(P;x15aH{tZ`}?=OCO&f&rA%|=0`Dc4VKQru;E_(56otyuw;pC5}E>AjVjS@j^+ z{otBrd))+&FCWkBPwk1jz`yJLq8%A`Ps+M?$zObbV}9(mIe8~AAXJ=XrNE_WHUhJzk%5YxeB6kABN;R91dovG$SCLYLC;sUeyra{Wt1 zxT^Wo3_dsqyvUiieYWf*(NElo0Zaw<65FI?Ql7j?_z@r3bE@sf@5_n@VxD+zdN;2v zW2r9h@v4^}Cm!L7{c?wC+aIs0Ye&U?W$3@tVB@p6u-7q(O}}&5T>B|X`+lEqH!1tk zDyb-CX*(v~s0o(d-8|Li0H7-=3eST(Ex2wpI0izdr92RzExU zdrNzJ`1R21>p%0$-s$IFFfrk-VT+ghR9@}J0$QgI_6e@m{QtQ(vi{rNZ)c`!U;ftr zv3#p@>7-Ae^m2n=UEWut^vC=1m;c}XcfUQAr>no}I#0%0&ZAcf!?NGKmkSf`|R24-*9ReljqyeYrR}{XC@lc zD?D;#apkwG=S)k){r6w|W-@orCWZYzSudV#5D^I#pIw)x$^Je|_|~1|DAZy|#NTa-`dK87XgW5)^#)xb4DYvqy_g zi+@h-IQQ*aiS$tiFVDohi@kl1XXgE@i;6l`zG$#eQE2gPhQYcU-?S#-oc)1{!==xT58 z;_Ejb=FewhkdQhoR**6A+>He@QvN0IyLxZp=h`xHnT*a$vHVMSo~@60wf@Y`8Orja zV$!11_B@_0VtDdi{V}Hexm#4US2xM+NI1LY(_j0y`a#A!1i6MhZ<@Ms@zThZt|#o%jvm=lYd?3DOP-;=?d#=dc1>9QVV11$3CGsjJ3@26yjmz5 z?m1`W!53}^9MvwKi1O^#yb$1-9W9~v&E(2W^MK=LSMHe?cjHiRgqig&*QGk=PYM|; z&6_J%lXd)^iRkZ-PdBccbUIvX>bAJL#oninT%AyGM{sSJ_Np}p>|gu~2#&7(alY9+ zJv(pa-ughE+NwQ*IjiP`mM0$XTT*nwysdqg)#nfAXTJEiSg-qkUad{ljg?(}Id`v| zfA#wJz8!sTbJpp-eZKy(0E6?g{`7ruB}u=_IllOYPyhINxg^JvCn@|(B4%z7`Txa~ zn_ZYu6FPMW10%3b9!@r9X5?BY$)x+0T$-<#A=*<8PW<2&bxQ??Z4 zO^H4?&+BkTwFU3Z`FfWZ?y35`<7S@O7Nz8+x}^_0|9)gLRhs%LO!srq(&eW!8-sUz z3byWBqFE3bdS_OLLReV$-z^GLwkEGG-0pU1jllm6mp-cp9kH5pcE`?px+iykQ|~N& z(KY8=l+T9jNpnP=xu3J&^WSBn&_ov9p76yN4{Y@~{Yo-1@L;NX(UYD79Q9^vzg<&r z`S?u6zA2y2H|bp5vq_~H^^;uOwVd^JWOMz!FW)SdxOFSoQZjW_&uWea!R0H3&qSN$>k@;mU##YG2Y zCT{tjym+eJ%MT}wJnp_%Z?lz6=ijnl+$R&1=7 zw|c04l{JrAZrazIdTvAdjU8wEs!LZTDxPgymz@}4bi+sG?8>)$rC2%-ZcE&tt{W|# zG-vVc38y5cnG{8-IFyO)aq#uzlCLBk;xAlO8vlGQv7+T$)$iF}AAQDdStdIsJoZ>~9x? zBXTB>cRXr)tyo+vm6e%k*n4)_+rL~ZtIwZ~+QXfBZlY}auAUDLk2dUnx9zxGi0-LP z-1dJbU0o_4khX$vV#brcx4r+_N`waI2_?G2Z8iBIy|q9Z2s?r|~N;kWYYrAu0qepi^M9na(4 z*tTw8(4ypa-;~Q%Vv9%73^yA;Qu4ki^pItj*G$cPhAkEPE1f5q{-Rf-#$cfECoS36-yN9m75=lpR~BWA*9s#1}VSgzt}7l6U3e8jnj$=9kN?^|7DyXj9J5-@?4T zrXf4s%a(_|zOZ23`%u^ALR{0&MSMNS|2tul{*N<};MvV+{m?k+l|e7h`G z$NPL=gw*zHzH=sT_$?E++d%DIZ>N>e;dzapzSVA4cb`-DWXj(~s;}>bYd<+9HuusE zua<*+^W@yDCQU7!U94c}JblfK-2Tmiv(|k&v@h7TS!!qV5uToC>DSFqzGew|hF2w- zn*@Tk!GJtx;Do(}>Y^GG6C3cY+MX4%Ws4YW~#TOc%97@`-THd?|JXDw0`3IEoX2~*J@`3J) zI{3dla0R)QfnQ}(qROpr&z2nweaptcGu8czmPfq#kJE*7gVbKm6MqqM>DBI<-AQIP9^2yWyTQ9uKnCwP{vi8a z`$WH4^Hm`hF)%P3P)@e6mV_%|*rBfQ0HhX-4>0pH!4fh9gUyF`i|s5-wx}(wb&bzH z%f!jUzWm(HWigqvy_&(w!9>ADxwK{Rw(nb~*|fiEODj7kw%+n$ zjqI*c<1rbZ@zSE=Wg1 z`;2wI>1^Su3_Ww&pKGmH>$^V4Oo2hJl0_+S{bfav5{82OhZ)ZOC1-uLSQsQYSr9J! z(9qn#3|0an_-!~WKr|SCI3OJ$FY{BidiB!q3kJsADifXu2!drm!~q3fjRz}M?(V9; zV32HKv2)?fWtms6zS_ipu3Y=V9CdiSF)-NPS-yBhM)s^<(t=_jonXA6`?uZ$gYVK$ z|2VI z^|^C;e??|k*FQYcaq`8xGjk;WKAG&laQBB}v)}L9U0o8Lk$(KvhmXsl&bYuFGxPr1 z$j$PrHN?4CellzO74<}jN!xJUe{XeV(UfamT}GFRy+o{77+zfceE$F1Wy`D-AGTy( zyEyUhcJZ+MyMKHaZxXyaQ9E4kbjsGhA}7wDmR|PowX$-$#ipCT>u&dg{K>$;;LOX^ zXPusx_wh=we|6>Wf4@$jXTINc@Y#mksG=gRs0=ebJ;%7@vl1 z&&!@UKT0~K7z_M2ym1%oG{0~A#cHjOn(JZZhfg}i!`6EG`30@yS$KF&Wbvg-LGLW? z9xyV#^jkk5D5m2b|Jxt;H*DOnq}_i;NK}}Pj`qu#7jKP^U7cF4rMNHK(`crULD`(8 zt*Qrm6xL3D_B8G=_s*E>3knx5W12ek(3{mW=RUpbUcGa7^_CUU9xjtsY}&KrNI`vD ztLu#$oBUK|vh&~X2#kx{ch9aa{k$4a@El0mmNOM7xT6>@e(&;myYmSVcViyC3X6*~ zn~=M;=wRy);bSh%N4UD9Hy0#Hn19W<*;~c+-{Vq(+gZq}Om>CevKjEXB)!k&LBPCL_MSM)=m|M{~AC+=-O zAHdv{nlCTB`M}AOJ9jOUN*BAnY4e9eD=#maGiS&Cw|}p0c?*iX4IUGw&AL(}R7S8J8j%vjw$Tk_zUyR}=~ zR_p5OS(Uxn@bZ_9LP5@r9|hK8s}=13Us)-fwe{iG*QbiB-)!7zX0~ms=~b@QMW4O) z)tgB1-k)$$F78L(ne+SSl|0-NcmLzBZ(qL5GgfDNzad7$rs&B6%|{orwi>6q{bui5 zI$`C`o!9;TmCEGrE_gUOzV_$LOl|%A`K{dIwR>N3?~S{E{rShu?_pyBjx&8`Z%lR; z;i|mes;HQFR@Zm0Xuf#pl53|7vLT%58gimP?j{OQp#IxkB93w6Gz%Hx~q zb8M$uvG-;dokQHwQL}Eys25H>5yEC4q;+*JdnhEmmM}B2fBMWV!12jyJxkB#pL4|} z?yiaXIq9Ljv9Y=N_eYBkz2E=;d-eO;7IA|YJ>uc}i~jtWcx6g=hCm5dXT;K{GcKRt zc*w0XEBVHy9j*U(9$T&5^5D+Hzn-aH!GXJ?uS`lceE00w%xSmgwA8v^(w^{q(N=A> zTMAD$y_zp9Fe(0D;p>S)D^4)V8Cg_SeBElUuQs=To^bKMJCZf6`H7i3la8+X^5yjY z_xB&aITQQCWzEi=mD?2_Z(HU+|K;=N^&h_17PZzqTk~S7_Vt?of75!GZOxYa-*8~R zpUiRlb?f%1i`$0A#7vn!{d940{hN(H>;HY+?Gn^FdHPcC>2GgsZ9bS_^Z871XXo?v zX|WG?eGt>B*tBIyg~IZWUyRRh-LfU;{=Tbo+-95q=VWJZKWC;Blm70aa{a54s5!HB zDywdux6gHM`z4aX&D|Ye_Rr*0qiy=R$Fr_Qrk_)Ju_a1g{(cjabM(#w2Nq;s-}Kwl ze8aJ0ZQbJMfB))zxog7t{cYPH6;;mlR`c%^5_#ge)YRhcfz3aBq(pdsuzWD_Yn_!B z{+Y=>C@6C6+TOLA4-S-zU!R%IWf4*KjhB~8J3AYa2@eQVUa^)eePr?b7b^>U`^>cC zJ)B22+ibtMS4>T)GwD(Z1~6AAj%S|T=L=44hiv-C+9}n-Tra4|M#Y-nB~Xq-g%l&OZJc4lw-E|!->9pv$}sz z``tfH$Uk#wWz4KyFD{hZ&zrpEO8mcnDArH zw9`*5s&>>^nkpy==+<+Mwv@%U9NX`uKJFwQEzp1irlW ztwrCvavt029*bG&tRmeve|fJ;V)!(k^EZC8_N#>+llR=2_o6stYN1lyl+&j!7?jUm zB%^9wpcJltL%x3FnGd}yjcosQEUu18*pMBxl;M{;Yd@2WjL$rquRnfXUKUy7x^}|- zJs;LhzaBkf_V+uh?ylMYI-RXqasB&@#S5>$p3=)J_H5eSQ(H_-%l)!Vqm(*3dQ7+d zsX5-_%ke%Y)${mGwZ#h;E-dye?mpFZ&}DmaZtmK!$5WOaHR=8=^5^!ULyNXvoe;We zw)M2fZ=6?OeOTa_n&Wc$(xt+%MO|F0UmXAFl6GzC^|)&8=Q?rs_L**-wD6VC(nU@; zEPd62)mr>d?VPssa^}Z3Ute4PX!lULd2{2jc3+$7XDQct@7}eIjlC=SscPa1r;y0J zn6!+I%3|RU9NaZ@Hg4T``jn5naheXK^^wrwAT0XlY`WFt%;x=nuDt%Ld)7BIbNVm+ z`g@?3m54CfR+fu4P&2znLAf>SAnLK&sJ9-rlx*GPl0u zsw6XW3A4?;ciwLHtXXSjoRLa?%avH-^uD@e$;C68BCA$@W4U~6+uF5jKe|n2ZwqzTx3}1-Fxj)0mzSk!;Vs!d*C$1X zS3Wwi_+rFir<*q-qM~fd-t4$2H}7U-WX6h#9!okpR;nIt{ra^ucKYLl6IZHO?{m$$ zQlh7?tGjF7?BdsUJek2e13H3*)`n?|b)Px2;1?UX7Lf4juM!qb`O&b>-`Dd{xM7Hv z?%SfG^Io^^y0{--6Z7-ZrRDP%-``PYWPEMYJTXhz_-Rw7-rYApFj;+Zd!O8`T8-E| zd(Bgu@8?(c3WmsUHStK{SaD$SN{0#drw%rz^N4&nS|1SLk@if~rdOCNT|GV6+t8n1 zzxsFJ-*+ndHZ_YfEoNN!nCR>4l^Cfh)o|zap9vET*x9#bUb_=fxn#wPhO>o5Wse?Z zN=rxU>)&sDvufKiHg~qkYW}8Y{kmq%nOwa2H;>GoS$_ICPAwr?Q%}G4J^fL~h=nap zQSmW%x7D$llRGBKS(M4NA3l3>XIC4??8iQ8!Dr5JBqj>By0R`>)pagZCCGikkxiSA zzn?$%X7K-6vu76sJbn5$_}rZ@Lb5llb zrBfP@iHF&`Zzgj?7F}5=)*8~eV_lBaq?uYd6Wj{ldcL}JYc})R1InE57VddnqxAAw zv7dRz^1l}{0#4N5{=NTW;zNJiuWP)P9$6oMSwrh*<@M%cZ2$j$EwwP6aP?%-Ps_h= zo|GIq*(t2Pw(6s*+T~?25#RR5|GRzdnps1$be>(W*Ie6bzUxP)x+uk-J!Mn&#(!r_ z-Mcq0#lzMfWX;N2wLUHO<<@kr{QUc%<xYF@m`Iw@Z-W1y?AC3I%~ z|CGSQePOFzosS&9{eG99cY4I_jc-2kI|+YqTDe6{_v@t@hK+rFGBOccwryJyzt7~u zD+#5**3Fx>d3Zr*1x(0oUcBu0j8`?+KKiSOD)ztZXE&I*>(!;7r$x`^cD%AlE!)xi z;!u3}(!2k52kPd>65>0ai}_tV>3qPLc`jB+rO@C z)=WKnjNc;V_k$IgKMHiGYSu69_BB0xa!p~sue7hbuj}-4u?M3CCFCZjw@vsgbdFmj zS1d1hvHC6Hub0;B*PCj#O>xuV9mmzIuP&YAH*JfOR{Etk9N}Kae{KnhvzZsyEaUXt z@7cI~sc3ah3uH_SU zm%n#nZjRs3*_r;)fBRE*{x`y{IUG{-ETTQ4+Tz{DC%gxU86a06ETDK}>joPISsjqMM-&KgV-Yn^{*zwu7 z7_m^DT}!X+TDn_*eTdeI*SXG%_Qp3jmu_0J{nRY4#9v!asnyPQTYDhg!R@cojjG>; z8m5s=RflhGGg&E}&BFS%ioKuV`^MzxCC}HHnoM~XUhVVc^R~4oC-L6=Zu;P2kvh*R0+xzEd|97eQp>lbW<8o;>tH^UJmpquh?6}YK_ZEROi!h?XG^9r#3HN(rF)=RFVv*m(*^|su zU(UI1H>-Kd^|HLX^|JdUSQqH?upPd0XHnqI205$X<-Xyjn%dgh;6sGuIC8U6YZr@I zZqa=5L)ts}Ib&6A@Zwo%k6*oytXjCBe>L~4=5}r7ldR9rJ-Jri$@uGibwkeK(k<7t zyG~tMckkP}Z6Onv7(cvVqH$}@+da%X9xXYQ7ya^U*3zysCA=SWCVhNrTej-DM%Gf( zUgp)gjtNC`By%^}1aEJOa=m#q#bv?8x0>gomIRth<#$E}My`HlRXnq1ric(fqp1?T5CF4}8rpSG4h!{4y(#f5bF^4JCIJZ^pa*ZaQa>Qv3$W=ki$ z(2<_xwQ9##UEk2MN6*juUzqW&WNyr|SC_Qg{m$8cNxjM1$2-Y8#Y-ZDwPBx5)SKqnP=eBxH;H%iRYjrt;ShoZ*mOq$h5}29)zEq{D-TB*9MfnX5 z%U@M@xNmh@^{#d@*NPpC4*$Qszuzn8_9He!;$8=+0ykjlV5yB2j6X5+)aTE_+#jyi z$3N}ZtAG8x2Q|Y>Q#XNPw4T_ ztLHlJWR$z~DZ1Z7<(0JSPS-t|cK7Pe?X(q|D(xE*HKonZ_?N{}>E{WaYOiKTSykI) z2aBY~Ot_#kr}p?SpE(Qc>Q5Hj%B|YEjW;st+kS0^Uo4APfSd*zS*&%|72`M}N^I8T`RtR6UP}cFi+1{~%Gg_5+HKZ*Z^r48 zxQ1;HgV(NIDKf?UMW;`C^sLO*k7E3L>TDRcH~G1NhJis1^E=rrv$n1^T$*sp;6y2} z`TAG4L#Ezj3U6ny&Tgr?b}4U_re3Jk&kDa8U0hz$6Ly*ghDKe9&&|`ieD$JG=Bmxc zT~Bg5G7fU{J+swwj7O<-V)dpBAaKk_{ko_N zSMij+%}X~9$Cnnx4Hg5zVK$zO_M81dRkMjcw}X{ELv2gy68rc zd*q!ekChGj?-s{jHcPFn%RKMrCfF=)R_S$ROJ?xj9P8DSFYG)R+{?ZA&zsEHQ>&y` zrB=;iK3x&AHfr6%jeDEb`<`y>=zSVFeRJ>OWdb^HZirP?mO67YJ?NWZxMs$7U6-Yo zKJZIPRBh3oSn8cPJH5svDKvP|ir0s(?Wy{D)$z;c>!4A=uh*xplbq z1Dcr|CYpW;cf2*J?Ope+TVHzDuC+7*r7w`H85j(B7EBI=Fd0C@=5n8^-o!1Re`x<} zevXv?JKNw=A0{+O;XHZq-rkHwL4wsxptK9o!6UumAe=|;(Tw-@O1QGl*kI`=R45AR zH!;{8I+5euZhm}m;xdbv6<%V>405Uh1$VebxGc*)8s}F1-B-K&qQRmMVzvKo{|ZQj zo`tu4&0_XFzb@DRdlp;%VCvKPORp(HoOz(bz*s$!rPt}O&rGKKYn$BpSY!^LyESX) zo1daG+l1}as|98UR-DhdyIn7&xbE+Y;eGvV<{4>)>Igyq0u zcBa0AiUJ+ExmA}bH4mbAkUgkG@UC7Eym-W8t*d+gY z({MoHa!Jyoo0pgWi`rE(GjrP6XDuyle}C`x)zvMZbN$lZXKO2U^{kHcwoXZH>Y3ua zyG-u!{hTtVt=%!-=U;bXw(JRu^gHzIyqTb4=Q0EStWt7lOXg+& zc{Y9TSZo#E-Cn!C)o6mxgra?Y?_`C(zBv|f;|^37e11y>*^5~lCb#y zf8WBauw0LTS=S2HT#Zi|8BIPKH<`(K{@+L0U7wEn9`8#%Qq}HuhC6jR_!Ptwe+1Zq zmdW@EI_>(Hp&)RQC%UA6=0O3-Op9{!x$eHX>BsFW3^t!%_Ccg9B}d1DSXK)22Q9_*mJ-X0NSnZC3VbZr1A;6*9NpTD8hcJX~&e zudl29c(i`bbj2rTnpO>pHuVOsZ4nDUD_MxRJaj$By+A4Q)IpvKeaPIygNM#fAAU)y zV_98oFIzTI{!iJTeQl-uHfc&Y7>bTDaic20!Iz>S9vc9^WvWpz=5&Nz%`Ak#a@Zy~&IA zu3YivPvAZlXpWbYT>HqW(LrHKX4?`8hVSe7xw{UNHk}t0vn{ch{yP>uRf@SyHZU)uCqj{i(A|;vwEEbvG8Q5a3f93SM2?0qN4&tYh6;#BgUCo@Zl1;K% zHsQF1+8XCFMnOiMIj1^UE#guouixDH(V`?|`Jw_Qr9C{iJ6})v(d(sbQK|8CX0Kr2 z`3)9VuJt5yGKn%hm{{=O!26hWr<+*0v$Ni9h!X|*=0J1zq3(YVUVjywl$*bId$`Q6 zpZd~wg|4l;bI5$nrGQAm_5U^%)-8DGwP@>`7j5SD)~Ojs^TcmP^5{t&_{(Y~xmWn< zp-YU@L^`#$=ly&(Gxc=kx_3r1Mf6|F=$9o(-1{8&Tfrfd%R9Q2b2r~7epws&y>?nv zcg3f0G){UYCiS*0ik0)Y(W?OW1C4jY^8d`4xG<&Ft)-}-ZQ{%W>vszl1ndp3|I=z7 zf4Hy1Xiwl&RrMLGvNBXOj|UwI{Jhul!d?xK9~c<=S-7l|?mmCLcnbTyI~&B?Ma#CY zOD$Nm$nyW)Eq`q5R!4t%^>wv*-kR0bsorWWQV;&IG9KTMot5<~^EZF-b6dyd_dU&R z=3KD+>}Na-{iGLN4svUnDF9gTVawhU(K%6--garSt~r2Ii5OmcJ|SU z>yNq_2CTMt{$SgAGj$J>6D2u?hr+9)pYON2Kf7znqbZALo8|iLy(qG@Z~g?udG_;_ zy)C)!b~m~Er7IhO+}+^LYFqGib-c^s$VXnG26yQw;kV)e%QNreX!`fTc7@|)ZLp?oN;xF^Rbh$ z?Dns>@z$TdEbKe`&E4OH`qo>yJ4~*8*RZZP5Z)!u`hB{(n4O@l`mMu(|cxZ&Uo$7z&ATLtM8sR|MLx-J?ug=?_9YvW%}v-te{8HhNZW9{``4; z)RlFak&9Ad*_S=DvOL4WtUy)jfeA{x+-!f|x6pH*v-R2JBWu!J=-y6*R}UgbMG%Ziian~!e0*4etL&tE}m=7u$Vm4y*JTuu7U2Wz>R z`l{Wv*1CRI-gSMC=tjjn#=t-s6~7z%z!4`}^Y!1k-S0!f!gB6zntF1JoPA=`nr(}@ zrTz8&C$4xUHUIsw$G$x?UOYP&z2gJtWi73#n`(cX$wW+nUkB^Vne>nJS&+E#mi%#wHJ9+o6^Wr?; zJ(JSX+&X61=zjKE6_xv9X~*kB!l7Z?wrvv==YI8?SAWTckHVHY>4BlH1sOL=>-=(a zx89%Ops#;_kB#%;Fr|qp*~d?vJGWuerel^JK{roq*fh(=(kn(aEBo@}H;coff+J?! zKR;JkNa)&~OC_i89xW~}dGH`%X?kLB*yMR-o~y4uGD<$iqM{zZAYkQ>DSFFQzi<72 z<%+k}+-oO0rLFA#I6cbTvt*&;!Kb@Q*kp3}wqH*MRSyXrfot6NZxUKA?NRaW%=YO| z%I6yfMDjfS*|V#oQu~=Y$2T#)2k&=&oFT$;pq7WJ&t0zdq3lizv#y0Y-uFJgeD-#^ z%7hb5zq#5En;9Ethpbu`zdtS{X3Oj8@mAq$|0mQw|FW<4cZJQo$->K5dF4bcy87z* z`T6SuG<-Ino~CQ;yCI_Nc>nR=zkZe3o~r-<`~KbC<&Qhh&NgpvZEbDqeXsstLzPws_|3+1jDKKkAJp=19rxTC}I6 z=7vk~frn3?!~`oJlzw#Oz?SsXWaWEvJX8WSM6|PC-wx}3@Ok~quT^@}ukUnGS|>DZ zs!#Wvn>$Fk=P#^Qwm*@eHv*}YVvO0JuDIUc(H|Au$u z$FJtub`gpd+1~oSAuGyc-T^9`RB*ukM8}lM;A8q_MTn6e($T74__X78kA`goalXew(VV+ ze*1ef^Lk{hzx{lA{_&)~z8s^OJ<}h&Sok{dQqW}|VWvg~cA2tm+y2fG>Qj94=1q2X z_6O7bYuC=*wUkwV%XayzOF}YD+AdzXk+b~5$A`JOxi@c0a<$Gmxg|3%(=2y&(8>%G z?#m|AU(cFdz4rCIkM}~noR1w$>J8G8uC4jIcFmf?7$qI;cR5!tiQ36b^mw(6#a$?N zx`veK)2G|NbiXc)@;XRT3de#JwBB8A@*$PLsN6}*I(NX9y-g> za_SUU%`=M!8#ZiEnK9GU)D&{8JdgIO@H2D5opb_&Z*JeeB+Yd3!r96=_&g8NMk%nSw@_wEGhpPk)O zfBEdntz4mnQ@viOIXzJPu}{wckL>>yJ4mGa#8uZABxjY+kW`nxaiTMwqtGewIA2#xd-0U zxMS9E&#k+g`#4*xPxqXwmoBX_c_w&bLf8kb-rDp8AsC&@GH2R@&xsL{tt~B&b6D@sS;zhPaX)M<;I^IIW`^hD zrA8}PN_y}97#0#5`s>G!r_a(JKUf@OqQehf&A018#r~5Ar{`ML{aN~0w8~^lNGrQ} zF6YmG&84q@9x@lsk6bF4{>JjY)L+*>**u3eHa_3J|NGTA330JI_dzSbc=)c*+xd9y z(h#GS#bW;-+)U)MFxVScZ}d>*-%O*@SK;w>k|Hua;%qEG9^a4Ne?KZJ$ZKhkeMNn3 z{OsGeZ$BzHm1)`*Qr=ixnxKo}8HU=+L=)CRV4nY~QXeEv+gv zk@xbtJ$t73y!)}L*=_OGvX>hcZ{9O?YiUNtji+CxTnjrKwKb}DGymLk0&_#WRqoxZ z%h1@d<3mj4yXksrWw9OpTLtBP0{ff$^B9kJ{!p&^dv=y`+6jTP4^)k2Ub#5&@tY&Q zJ~nS39B>1*K_vW^`NuA4SaG0p`nk9ahw`<0AOG&WoOdRp<@mj>mn$yBRuor0yYBs5 zN`2dfN}Il*h=}DcON$xasS6Y^FtDYE`m|`?wU{<*cBIOu(!v=pj{p9AN%orljY%gkk^ZgHE&Hjdj97hio@pz+|zk*S{9KFMbv%~-H=r|0UcLL4oD-}rvKsEAsAHOe?w zN~9<~{rWB|XZ4jbeZilWaxeQkV|Fx4FSqaRId?4IdDhm>y+6Z&sj=fS3%h&Y%0=vY z$|BRs_-+|FSOjfMyLBz3+r78wNl|R@B>e{s$F_92D9tt!kve%Ju|cIzfEmb{S)8P{9C7ByNOm}q9W6SMg~T9hJ*sQ z;x`}i9aG<`@AiM#DLno2g@RSnLackFM5Tn1X8HR2|9^N~{=<>;_W$3!ef#&wA@wA= zeosHYf0@VoLbb!cZ57^ga@TeqDQT%bdHZwE3YeIWFS1TeOf*!indEeFL74f>TU8Gl z7H`?|;#kz_51o^vujqZ&*fF-cbD?|gB#PWNG1S;rrc++dFH^wM z-lINQv)^{#fh~V79sSJHCfXM`YgWkH+}xVFZwHP$uUxtE*hBAB)h+&@+V)-JGq*(7 z!dHz=52n{vOjg(5uk&-;0#QbWs>EX(k`}c$fyT1R-@iZh`b+SS^1qCYZ|tuNF!Zy5 zMz;8rcB{-VmPtR#yXVidt=)%eV{hNO{eSEGH?rY(Cd~P>GuC)YY>Mrd7bUy4Z;ww) zgS5N;cDXE5xN@&%_j?|Vch~m3y%;w2*Gy^Y->kUwnPqtm$W#T>Vq9_2GFXmII5QB(6K?s2Hr`uQp@Z!pZd?HXL$v zp1ex%u51kI1ovM4RXPm%CSs zH80CwHCg0&nwa<17v}_YBELOplWG-XG&rR2K*BA}hwEf(Ut5PHvz$(Wd}dBqzWuyO zQ-VLO5B)5gD|zv8ts-QEuR=jU;-0Y5o8y`4Xd&+}`!;{$j!DE39 z>`XVW-JKg#`t*{i=kZXl;>8=!2hIB2qLEj6>FK9sW-iJ89YxdCmQFKM6W3a?}Z-NZTjB)d_9NOxfD^Y*;h-7vu5;j$3?`bI)jQqh6n%LH*DFes=@k+ zv6kICt%`+xg7@U}OR^;7Cae9}*|pB3vg)>n@i`Ig+b2S1?F(J2Gr>aP=hJSc9a)UZ zd`x@{2Nt;Y6dtypyIE>(-S3Yn&{)u5;qE_qG4Y$rlIhFl@6vd+wt@NhywvAA4%{`l zza(wT)al_>ENuQsA=9UGX-f$xDKWeghm@oGJU-1$VD;@;-IM?6Y%7>&H1qo2E4??GZY-8_^R6m}4S<9L6{*)`1ZJGGI=cn8MeZFPV`ul&ZLi-pP zzW18nuPMH_r}E^s*_)`xU*8gMrvpf30!$+?^eZL;(y=#Jn4`ciBjQ*R&i|*dN zQkKPi{_=H>iSi5|mCKnfp{4U2ZZBJ_uY1+6Z`Rv& zd0}R&qOZ2;nQobMhsW_o%S^+2QnrGoPgIvq3t~!l`*?!4l-KucY30t+DBX=Kwpi+v z{K|0+ymj@H+lvn79t92yIlHKft@-!#9HyE^rQA$kxNH*h{Ms2;LYQ8%F?^rS`uTbO zuV=55-TM_U92VxDe_;QAn?LGOOP0^8I(6uhlBw?0M9=sQ1&JX~wk)3)1zI59;2s`b z+^ewJ?LzIwO%`9*KYHi-n)PJ;-5{gS>-WywJ|$pEtX*gugG8l3L669$zn8X)?LQ>6 z=WqY!oofo`?-PF-Us!kc*=pCbFZd#N`B&F$b3VKB#}cW$gp>tp8<%a{l05b7i_ZR^ zKP(o^YMOK94AahqM(i`+*_AEw-@D2vlqEOhK=Z+~z3J)M<+l3kmo8oU{MLa34xKJa zQ~6eC3utR=>-(So)YY}`)c39C>gnpcRAUtc7Feg|<-L3UIyxd|NlwVOnAcB^EWDIq zdet;mJZNP||3$gCD{S@k*FRTFOG{h0aG|QI>esJd?}kl0nWFEnZ`>4FSGO;2y?bqO zK|x81b=>K5W^XT??M*+t<>bDywg1;vEecr4n0${e-J zbN#-5{I+iO`qyi+8mH@Y#g-Uqu6*uTTU+bh)m^>z@59HB7hl{`_w8r;TyHKe?)|^N zMN3Od@01aWV_;xV_VmxoFHl;LxM1OIMFu%ffr1_j?&Iq7XIcbC|2cYZjs zkt1v3_DcCb2tK<1|G!_ar(eF*bgcLHpUwWcIXNGNR)&0gy?+0UJQ2Iw{pNojf7bu^ z^_}(mTQ_g!-P@GfGe%JO^NziH|AxocwmLIDj=fu?_3+E{_?mn7?$zCnZa>_yIx_O~ylTGV0za<3 z{q=PE|9^iruYB@l#moOUHZ-~|ew6a6es?*)%HtnD9`~o8o#m<`CH47H1iQS)!T=e| zq9d0sT{?U?`RM(BZOXGnwZk4Tz2E!&-bNu~wPz&KgMv=E9X4;C_aRgejb@v-jPbQu2^#^2wM@DV*mt`{XQ>cJ&>detG@=f8TxMYa>Hq_9Pr+ zs&V{%W6tq^RzI&Ved2ww_*n^?%*BfrpFVwRareN^1JdjFZ+v?^S6$f8%F=p$?bE6K zcE1Wf278+vTm5d|x3sjhZ|AJvdoA7if%S2En8;u^U0!XVW#u`?*ISW{*Uzi!%sz@8mFJF`?+-bsZ(C{x3|CFwmt7q z3+In(d%xYv*3~_`IzDEzlAhkbiW*Yj1-u{11cJ}8>-ui_*&uzbZ z`{w5K!c)rAPapr$`}4{C`8MD06k9~hG)z8raq;m-{qnc}&Hq26>+F2<`g3z$=+53g z$J<8S#4O|PuI(QRx7YpOoB4Kj{+^B1-{-ZoumlGr2}ucky5ybRCvU$@vLIH7fq^06 z#MZ5^t}boXFz4dd+YSxh<*e&~Mf@3p@(zF(RYWHi$z_tuuZ$6g7YxBKk# z>*<&OZ~w^~g>*~+m2K7E-^{g2JvGxf{nyRgKQ@WiocuB+ndMsK3=QV;y=T@ zd|jq?&E2{e4;DUol45grbCk>Tzrm4_jrpJM$5kx6?)-pv|Bpx9!Lq#z3fWeNtvw{k zHSg~C+xd-+jQzI%emF4oZQHg@f8USr(yc81`G4!OQ$m((?>FbOm>2V9$*$19SC_5- z;Cmq3{`Z^B_Wyo7-d4T4;$zbB-dl29u(5!(JLb)vKL7cfJJo7N)!)`kc{1fb|DV3) zAC)D9q=f7WlhO|qe$6UNKa?sYAn@Vn{(q$}FR99efLbjHPhPAF5nb)C$Z#N_xgj|v zFoWmM?bI`GE>^m-mWyn>v+9$y&W_P74(nP~Y{|x$xct04jS16cMFj@_JJO`S@87f6k;dr{*Yf?( zd@=LV&6(Bz?%X{0$>Lu|PRK54>3Lr^o0rd9c%b_I-rGC5;?HlklrfR8SZ26X`hBUU{^r`FIE;frc4Nbkmrys4jV@{uZmmST{e*EX>XH^vyw{C7;vv!T= zl6%MVv~`4LT;ff6@$`uA`s?Lt%57U)T?K{J7cova`O4=do0?GPhkWkj*AnV{%U}CW z@KE99-Twd3spHqh-96UDh-+tS^R>r@gxtwCR8L2r7fq+LJtv-0QN zQ~&?IuirnXuJZA*UQpACfx)In;ekZtrPtE@TkQ54{WvM{K3LV#wfw^U<*S~Yug~4{ z;Lj`j@IBu`ULKqKN6t1YASWkBBjrlVci(L#1shyeNnM?LO^oruy~8(;_}l+ol96%Z z^y%GGYBnxgR`z>aZY=kfE!)2Adf53x*k3nt)6?H;H>aQ9SMzhzN`60~&J?#7_hwIb zTmHH}--78t=P~{L|8A8g?%W{rwcF?AwYWFa-tD`^6Y$?dL}=mhn^~sj_cfwS_wJvu zch8=E|Npgji|dPsip%!fzkBs+SJKh0IPX^`=K0oB?|A=M`7&t1>b&iKtKWWpyV}^{ zrNyFmX6DuJ_Uz2x^N-E$t@cdGraymNyOUo|`?Bxb+2_wy=2+deT>rjE%GUqn$8O4JK<>chLlf}ckv_8JM zl6jeJ$3yvgxxVO++chVvxA*bi-H_Ovsd$g`UUa(T_lxhs!g@Asy7aF+G%BpCxvi~@ z?Xrb(ZQ$yw*TT$qa}}2szTI{0+_`B-H%&hIYQo0fJm%)xmq_y({%SIw@^N8eh}P9B zOh?b0$=P!JMe+0Vi*I+%vyEOE^6&ot+N4>$e4LKV0YOntDniHESX1NoW<@=E`c!k( z8VBYbrL`-Cx{vqsFAZ3^%uD8n+=i`NU)E3l`T3c;`tq9JXSXlAIX%Ae=#~3j7j5DLaa9vx@Aj z`kM1SdVko}kYzC|dMmPj=U3O?|NfM#y~*~!Z7kPMwu*)my|R^UZN2Wt@*m8P-j>rK zZDwYsqN=(!?(d?Qbr$9C=43v6zyCcyCue8$#-`NsTvF!mn!np?=;-X3P%&HkiFWw9 znB8S>7xUZCGCXXMz;4vXb7(_SiFRA@gu;Ud?dItCB430|HAOr;gdHx=j%2fyz%|^+v+13IXPRlZvFb{ z)1k`?7cMkjcHV)xAwTWj*Vp-b{#9joaNMhTdD-88o=N5V-i2|$_LtWF{M>K9GUW62 z>wDk6IPp#X@&3fa$8BFPDQR9j^WtLn=*Y;2FVpAMUR&$Uth6-f>C2~AZ)U!@XIp*f z(4l)ZpMAr_<>sYszWLW=g(0tiv2M`bu{M+WTHlc{XSNe_M9m zIN|!!tCr`zS#MT)`c-9g&*i26D}J?PYS!P@ZVObu_-!uVyK~cg7oD1=7QAbruEmF6 z#_R$N-}mm>V^bsh``fP4_xnEgxhVatczmo^K40R&Hurv+dA7fQ->?6_cXKGyIiqcL z|NnB=|Gquz>S|M|vq!r<@7I2R-}vU$-|zSTKezw?^Q8Lx8SBnRM@5P0MqOEZMt^tR z*Uw*XZ_O5;r>CKDV`uSmZ~eVjc5Yj;WXr;ZiNC-74_GJM^zu%%w7~b#w ze{lKyf5oS-t+i-fxk{-1*URPRyW`(}zxK6Q_+I7rx!bSrE&cIf{@SdsFOAbT|6a@5 zocp`*w)p>F*H;EFFR{8Cum11X$K&$LeP$*_l|J}>|N7p&dX|%7mL z)qT-3Q6_TMx1QORJ;ew9rJcWAZt4>J&G^~U%bC8ryG)no*C#T|nO5!Hw{P9H*FxZd zHMQL;lXQ33y||aP@=W%1{-l&Afs18iWZY)DeV4HK^Y!1ev$N+{ew%q|Qnb{<2dlqt zbaYfzJ$lMbRf?xg^ziZ9?8k+RcJ5hkG*52cFSFRp%*gAl`g{L;>Un9Llq`PnWr?`B z_?%k{4i=O?-TLzDGB+#c_VY_3@5ZREa%xV=&OZIHVAnUZTcz`D^Y1#au&_M%&CBl0 ztm&g7^!M-I)2CW`dwK7M70%t6!}t5tRPET^mp**{oSmJoucdS4`|l-E_H}z46kfb} z1zMyaQKaJB9`+Wxr5Lo-%za+mZ5^4If`a!~uU&f}Z{l(K@uLq@3$~XqOYYwL=1p2s zK!HM2`HlLSiykeCoBlY2^?%sPkY-==4WEh>rS|MQ_hj3v-nO#&&0Nb1{0iUR+8P)B zaLV%Z3&sa_f7#YA3yFdSpxK#<8wP76>VMzn-sUrV!N%nHn6FBpd0&Pd|04u5FX!4^ zG&m91>3y}7qrsh@MTViFJ$SFvziYcnuYX>*__u>!**AvhbdYfm1RYf;)ab}wFj$cj zs=#4!K$#OXXmr@^=88Yx%kMAz?OEi-_0JKcl!2ikk@@fuur(n5gGP2!i?+EB3ZrhC zXzk+8(l&++E`jzh?{hq0_{M~%sjU&D5{wOMK;wF^k{4Yo7BX?UCA}3=BQr3xakZZN zT(GK_nkfj@bb1}R#<}W^Qu`eJxT3X7HckK#BMuR=K zpu3Zq)5U-O)PF6(S^e56>^#3on3=xyk9+BVCX~JwtCmiSW@W!$T^ziKrCm~Fz3cq? z-FjWgSw;7?EPmbmJzq}PSn2xTFO^FwPT%_eO>C7wt8Mk;zFtO4>1%lwsx1sGJxkgx z9|UYSc`Og}*#d5^^h;f?>gIdDANgIn=f?GG>pT8Fn%%JYwz*Da{E4oJz3;A8W+(Nh z<~&?I!EH|Ehs)yTsUKcz>}mM9KCdRX^v=&I{ldcA^R2`_oPAaL+4!E#iq5LHTRo<1 zNGw)bBAu}0poSJWv=|sZtO#88=2o3SsD`G`ot@8XB3Dn^U;g~y5vPR)Pam9XX6lvg z&wb?{pz7oM(A&ggvCyaU>ReNK_}U#ESLmhwUe=uS-c)`~^!9gGS6pjZzfD@ZhQT00 ziq#y7Zyy%&Jec!(F_v@#MJ{4A8R#919JU3Qa zTH0l*=t|A$Dp!+CJOm1Otl1`Jc`jM7`@)J~^X-oOiy@x05$aeM=>M;rb$VlR$D_~n zzyD-Sd>Pe{v;WKA<@diFm|n2!%-#RLe{24XP2rMizCCRb`<`Eaucb#c9Z9J>C1}BxgOJDX*d|XYRdI>v9TK;9sOk`+34Zp@9*uqFC#DU<&na;-?wHz zKR3^=+AJ}^x}_ocMsNC#mdM?Ub{DK#r{JyX1aVS>JJ;2t$}Mw)Llz#tEVAvh$@J=~ zzi#E-JsOK#(mvUs;4Sz&3WY^&_fU(G*zTKw+^A6pmyJ*utXu;Gg)<~xm( z>t)N!$~JD^{JZq}`MIHH>r&H2#kr^1?cK94uIy{pvjgARY6~FtF&wBpVbIn2_sGSt zW4{Dl!sYq(xw7`QYc{!QhGj|Y3COqRT6ClJ$hvvQU$0p0_|SFlwmd$o|5v{ybKW+W z4RG7DEpMK9$YX}`gilj4b;Pu%*XLe+HGS^fopVofbF*@)_uI;CZg5-7TaynOzXe-) z;P3KvPD*Yj{{_ru_Xyn7QaCbi;mWgNKh^3<}}Z_|9$^FU9;r}|DIs8w`W&4 zw^bzHTm4!o+CT4R-is>dsXL1=AKcY&{a&3~Lmz{Liv9kE;&lI`$K`#!y*r~nE}A^K z`1z{S(}S;OZJmAlMdN$kS%_ukD;y_jr=2hR_+gWn$B8?cdM2r!aSN~IEA8?w?Rd9s2 zF1-xP&E56vSsEl)%f;Thb)~88=H;80-J&^l-F`=};x=xb&`hX&fCL&A!i>!-7GgGWmF`#;eyq z|K$8{*m%xQPh?f1&I_?p@0}aIRJ}8W+Ufc0kj%u2UlRWX?zwQAE%vNhxL~EJ0ON-X z2F8c??}!nf_IJg!Y12-f>Iz=|FDpO)xMcgzovkiP+YHR7U%SRrQ-6W|xW@+G4!b|E zXTP)-vp=aO^-On8{Ld$6zr^3a^LL7}Np!VJtd~`K_VFs4G(|p5{aCB|Cm-G)?~~m# zr>ZkG-9GzU3}_k%oFe+==B`>~;oW6%Fwvj=(iG7qpP77&A3hj7lg@ab|6e#Xv_#LQ z_E(CVo0SpYhDoze=exhnIIw{2ILD$JZT;J9^fH%hxN$J2gx!N@`vJo(T#a|^GA^;m zS9yo}UDDh)=b@O5?V0X{dS`b`n5S#}&Cz91aSe0x4l|XhF)@*9E2e0awgt{V)O_>R z9-UxGq07Zd3w(3^ra3UapY?r?+v3dZeC3HAR&)LI)|=~GTDU9hWh-~OlhdK5=Hts% z;vK;5e=zZ~g0F7oEa|+=_L7-1r#_8((#lZr;$a5!|F}(GA`3&O#su1b;9bae+~eYk zqg;!oueY7+lk)q6#jQ50vkRJ8C-vqZX>wg17i)I7z0Kpz#^B_~VK&m+wbUjwdTe7X zp0+kdAZ3l9)1qou*B>`0c%*E*K1DVAUZh-F|76{*F=yv($#~gw(IlqHHZ?FuBs_e5 zQ%SPQj@^}8Uf=GMw@%4UmX@mW-X17r#ApW_3%Gf6=Cx}+?(NoH2f#i!(CmAA%4|); zo|r`wV>B}Mv^yVRDmd>m)8_2CbNg-|I&eUNo7O%d?Kx!G=(`@WmQgY zuJ5jbvZyO(K6D0O3euky_VVkmtj-&CQ<6)2AuC=R+#B}&`O_%*JpW9r-LD%@&xL;a z;cI_n@ox96rJui*ly6Bl%=op;%Cj&pZQ~ce; z-CCV)E_ktP)uKgn@*>?8gl5eOVZN`(BBQ)qFFr~9ET81rw9SDJce=H4?`m#vULEX_ z?R!> zjcuF~{{8Lgwqu>tYo=3X47FEM5KU&`;yw#c94X3|@YEnsWJ88(ZsSVR2sRV&fo_ z&vD^pf4l>4+~V^Gp9<3;=#Wt1-|@k1>Yp{-o?pFmH*Hvy`QGHN!JD%;Z_CC`*4mQG z(cpM7YpZqHpBt}N)$aex&nw3wqwKCM{LHL>o<%K>tY`h&j5%%ZdbTZn9lGe=>zS^{7<+m)ERu7e}MO&}EeRg==lqXZQopU^=HhE>tH7ep@F|PlwkgspQ(Iq5C z#o)^08D_;!Kb}l`mNuvM!kNrwDe24&9%(M+vt)N|?`U3`$p%hVZG1@cnC@qu9ZNf0 zZ}OZo@Xo6xr=R-fb{v~0@Kn#&OE=d^ENA~lMww-*j@sI1y|mX{zii3KIFC;(WYfNd z7SDIh5q|PK!#~BRe5#mAyr`+;DMmK|P|R%IY3IFYzVxBcXY(JLFR(1^El&87a%$3mA5q{PbDX_Rui1 zY5wXLUXzz^?=^YsvvE_e&(fFCS5Gl@GEa)%rxD<|jnPetMMin$N`vKLl7~doyi{%_ zzHz>EL89+i$_(Y1la5FUKTGwVBsG2Vo95?s@6_zKDl0mNpNxB=N{{6t28 z#+ghp7om$Lx9{AUGozv^>WR)&ucg;tf>zytoafw^@X*lG>dd^3FPFXqi@WX>EqHKa z^BWoQ9kZX!zS6Vp(dc7U`P${_ z-0l0BojKEGdQY`2SRh~%8z0{eau5T;{H29zaZVyl}+=iBeU zVY&L$&9AQRDN26#|3~^Y*~Y3*m$bfRks3AU(_?YXxzeY9{>pnbUaW~q;tvd z08Oj8eJ)CZ92b%y=Tu1uWo2fr{eDA%KQk=SH+lL(|1Viv=lPg@d*r@#nvb)!-2rp~7d8s35i93tbmB$R-vM6+5&veNEs z=j!J2srP<_6y?X0c2q-~Ef~6dWhU&Fz_xi4so@RCJmYFTn zgNZDR>?!84i+S-5LpPMT_ zd6G}-<42E{`OSRvre{dw!H zQExw=x4*vmzOXPiclUz{oF^{WdCV-IyZ&Oymo-lx9ooDpjq7yR-#<(%O=kHm&&~>Z zig(4c;Y5d$Qh8qkwiRl8`S#K3l}C&A#urx4>Hj=P+9qb0Q_it%n~eHQGm zdu;l5#()1JBO_UuF5bOcduvN(@G_rMPvgT^M<45v6gIQ_^5CHJGKa*E!QIj#yq14t z)`l4uK05N@1LyB=Z>M`L72#s_FTOFyIQ?AB-b~@yhyT61oxeUM=H=@JkDCskYF&DL z{c{r&tz-T3Z`_PIalbyNa3X`e_;abICY!)i%j>P}k2~E`osT?O>Dtuv=TFSCUR^%c zC6}UN=6R_6{Kfj=XLzQ`=SfM9k&&E@9$zHhMn*>V$uIMqtn~TQ&!wua7524rJv}^T z_^m(s($mv(VrHlI`MWo7iq^kXo*0s8GHYFH=Cix~O_zm>i$52q3v;plOijJ3J-4c& zDt<=+-+YEF^Diac`9^l-GP?s-T)8zXD_AmL-abX*WW>D-3&2gQ7t;TJch^7WSL9$Y z5L&=?d_(YyD6OkSCE_8!!dMP0?)6do|KacV{cmr(s|X1T3B4%!wf%n0?*HHaR$M(d z*SZ$8es1sj*xhaE*XuXzD_&ju``gC~8+CQR(5V&2`(y$o;f>pmD?ZtnI7xb znzk^BK3)3wu-dbyl5A>4MMdjYPTaD6`|Pm9O}C=vtxnXb8=2k^#@7lFKTF`UdKx;20$|AJ{|2Z<)JW$)e$s*^c&E+rq#Q*u9*&iw1 z@Yep<%l~->zUgo5CT^*emtqTFm-68LkDz!Bkzc=mPoFYv#0zc384=>CG)(OM@4w?X3 zKRkEG9j%QIZ5uO_S6|)2#?rSqaHXl~)!MI`t1oU5%3nLLZTbU`MXx8l$}-&7xL5Az znVy97bo=Zwo<2)1?$4@^;_meoOlZuP@+0OZ5Pv`nko}KM}c3Ih<_ibCVuiO2*@mNz+ z)4gAA?bK`g{#-h}Zr!@M*_})J7;l}OAo;OO_g2xm)IM41M{jN2E-K__1!bB_&0#8- zGiQ>1oPp>Bk5zs0znjk`{P@j2^RiA4uT|c>PR)iFQI8KFxq9{Ntyz_-wxW`&mrn3F zvN}@Ir1*2;W2cY0t5!~2U>&5sduf~N^~DcruOU|NuAb6svHNAzkB>80eSLi^_@`f< z)XUAY-AP5Oy!i70Ms_~Cb!oAZZy&-MCi{68Ewp1`*z%I+D$9ejEvCVs zjw`j#+Zrq1HR(QmVu_KA?Ssx;R+5KLN%6Mkxxciz>L#;A<5l5@i);UM{!o5?Zr+|U z-OVdcUWquy<1S;de&eQ1n-Xt5x}2St2Oadd^Bq(#@i?t@=&0ZP_s-dwJeP&q7SC;7 zAKfhz|Kjuo4{iPR2lk8W$JvzMyYqhE-)pyStt!5nUH^Y~clYb}HyZEz&$W^j5fKp= zFTXAODCWTN^qviCSmK{sTNbWfWp#;5MtH)>6dOkc0k@mh8X`q&!&YC;TH8CZYx8Dp zKAi~*r}Hj9ch4EV=5@9h(*3)W}n-^}Lx1eyLk94$&M}=^k=;rH- zCwQb>X6a4K%T89`Z)oQA|HIq0LZNLv^8;>{zh4filJA5s=;UHZ5V-Xv*R(Q~uP*Q1 z>Z>d2 zVtOLos`h!e+tT;{es}xBhYzCK|E87wEOM-?Tfe*L*{)9&?|glIzm{J5^vS5^;Q3AE zC(fQVT)TC{2A=sAJ6-Q4CFTW&sv7nBO`1DbP(mc>+P!;s?wolZe^jw!+19O_kGU6| zs4$xO>BeJjpUu__&jK)fhRg3E^82XKvCR(ge zoGi)mN~?XtZ876gqp0YJxOvm8|NWFWxN^%6{`v!_#dGU!o7y~BU!ODk*Z1YRZ`ZKj zIQe4Rt1ZvUbeXmNf9skHL0N$1oYOdAi;wA;Z%N1|83Mr2n7HkXUi*^VO|Rkp0Ms?x|K6VvjG_eIZJ{ zv4Qzc_$mG8j~WiA?wP;!vc{EraTULeAS2q%jtc_be==IAzxI<9hsA-#oVU&}Gq9~y z(d2$E^@f3;J9_o4MO>+G8{Fg|En9w5F6&P-!yhYEim)8$XaMhYIQzACYg1p8>(iAr zkZ~S{MFmbt^E-Q!j0G5!nLs1!b61==VeA|6Gtd+^79gUY3Yz2xg^)z%1$OowqMZ-L zWKK;#IS3}m%ogEE?dstQYruMWz>V?H`gnGlrnrsSa9K{O}?1WbWT;Rv%21Q zEkc$CD6F~s;; z<~dg8?g!R~yb{<^?x7MCaYIF0`*qy)u#hQFpE`PjPbXn8VA0rfqEvo;KW~cU^QhB8 zcD31u4HZ8{efhcl^&*Rq%RvV(p1=41%Zz|#jkv=9KkX*%x4oQuw2Omp(%hQjpTBGF z?OMOT!feB0%`TnP&(+dpsn<&1%oE&I_4-%kmNFa5&gN$0-Aq-JJX=G|f8uyAYXU;qAz=VX_u zi+avz8%4@Wu^Ac~hH!oDxBm}ryD)rb01eQ-&6x7x-Y4768qQX6p)7SVX(o=sX9xY` z?@T$ke(?vUXZv@3+jNJDpa<&(x6%YioqVG z$N%#Gc3oc-9QIb%L}Y2vqGuof?S6UG_fJ^dmsi`vkFT3ou9Yqx-^w6SCs5EMvFr1U zt$}i7u95degqrVuSvAdirGew3-7G${g-&d{bn<2Nc%vda8(aldHwn|H*0Hqzf5LMj)U{TYuC)4eUy-o&tKM? z8|nG7bqRO)x)^XSli&{MGRB8JL*UjQvmc04#F=XkiGL1?Q^Z)N`^YzSJxhL<)u{)*3k83}lHCI(t{iyyZc8A{S$J5yRcw@Hb$x3krtNG8A zFf=q(-MVt6W?J5vJwHEBxBZ>7bcGOTAHoB<%O26k{uCCU;W$LGIM5RMux^Y z?p^OTzkbQtdMIyo-Jgf;^PWF@_s-2gS!}w<_n4z8MzNK9_PoBnHR>(Hd9KeNKVHm; zs=j9|d`SIO$*$>fRi10jSY{QqCcT`r^zNw}w{LI0`R31`KY8vh$F_yo-Mi;{RCSq` zJm~1xV|QL(_pP=r`oi(gaH`G6>z$L;g_)R`Ahl**bBd^(Y2{UsxCYs^TX!yu(Xgp| zcS`>o3W)ChwN<~aa@(5+)!F8$8^Y@Mf0dl3U^sLBruOseAFsKw zW7ehA+1K=BCvIA7{%?z+)660}<>w(z%NShiHq-@8UnG@L!SBY!BBSiKSfpqB_;9tVUkTjmj_SCJ|D{msrPGL36C_px>!d-Q8Zv89f*wBF%6 zb1r_=cs)f`(^53Hh)Za$?XBL^iMMax+I-g2s`yfGlh(?JRITN!*M}*Uw^_z9GqOtv z{{Mad|Ebfb?f-mmzO3_)O~KBt?*G18`?og?>;C*Ozh86t>{(v@_3Nhn`Mvw>bK&!k zU#icqC_3w{9~o)rbNYVu|K_GYfA)Rr*FU{I_x7`wFEeM^mcII8|L^0({`K$K-|v6_ z=FJu*J-+{M?rr|v+3NpblAN5J_P=lDHI@65j&dnY{Bf`P{rNeThwt2xiGRC%$&!Ef z|L5jpWz7l z{eDjUm&g6~*REa3`%%F>&(F*2*O$xw^J_kx+?ag)(alSjE|uS_bXO6Y*%f>Gq-5&( zS*F=$GkvC=er^Bz4|nj7OV=Z3mi@SBZx^+*XzB9y=dIkH@Av)o+rE2I;6;ap0Us>G zLmzsG+}s?ob*t%I^=b2`KR@%-Z=TIe2L+F%oBaR%^!)Yobj4L~{rx?~ymMG=x93Ps zb<57Zy64lU)05R)b!vZQ*6>**{`|CB-(Pjkt15-+X||m%IT-=qI{Hhyl#KEJ)i)Qf zu!zeDQP$4Zw}0PxeN)?t$9laj^EW&_EAwyHd;9(#-oJYr#UI|C_333B?{S{1mM<9B z-!cq%e^@K%4bvj$H!bYuf0DhIJzOpF?M(z5D`SCuLqoDk=Bw8I@1`sfbIq^2RXJ<+ z)sI>~A8d-)YLWVV`_g#}C#&g3NjG;1mC1Xpys+``be-OZlU_Z&bn8@*3frlkoVQm^^;GW~hss|gkV zem@Bc5ie$%E+b%j?~owxgKqO9BuTD$w`|KI!SL6LXa->(lh(Ml3OYWMfc<(Dt_ zmVfy8Zuk4Vf8Wz;b~`mYf9$P#xAVE(|3Af-SM7Lu`um%Ed%wI~>gRWE{oY@%W?jwp zVRW}oZ{7RznDp-Q_nsae2P{3#AD;W;wM&7=iSzdV_vGLI7r5B%>>SJ2d%xd%8}s|j z=JW6F?k<0LNc~36ar1i>j}L#9*Nc<6eJkrnTiT%(&Q)qxH>IB6X!&OQ{krG7>+7da zn)B(^t?bA42oYnbxHt=Jyhw4_f^Xm^!d zzt_vX{nfp0nwJ+`V8}PGQj@QAT^}cSYLS*8!*|9VMY5VMWgbte6*a!j;@Elf(!{u% zH>%Y0L#|dtr-oK`*@akhj!{2qkdC#Al zXDYp%&D8X2qOe-Q&U5lL9~=WGEAtjz6WJ*58(6 zivKWMO;06m#p>0?Pj@b2oMBrnwy)>^-vjR}ew~?Vthi9|p|JX_MJzJ%GFBBDmX?xV zE8eKJv{zSDtclwCs_I^;&F}a1|Eo_;Sy?N~q^{fEFLO*-UD(gf#pMC7b$DpVl>D2! zMEyfLSMga|uC0EpYczAs)vVu^+HYQ6eZ$Po_oaAo*}Gr)85tjDnPz|Zvap$becaw# zJ6Ek(k@5N2*@{KmwmoZ?ufOx>eLXuH+bk=ttFOPt=l_yA?lX1KsmsfS{(U>dJ$v83 zTUP>}o_MHi@pwVNN~y$*C#63brWaiHWb`%*iL__Ih|c>V>M1DUXf@aG{xbVN%OCCvVXieOy?E(T(Z8BUb6#Y~6l{nndwi_-_jC3CM^4|Z zY@4PTyINw))~y>YW#)vvxwEtQFT1=>Rnf(l#>@SW%s){5;=e%P#K4Ebhhuld)X3(g zrur)JzUaMpa^~xnTlN2breD^vGcPVaeQxXZqD|Fzx!R2^_)eTX`!+^NWLluc-tgBt zntHG1tebp&cfVY1aj56Zv!SJ>7D0yQ+b?8E|FU2GXOG?NR|?7ZW$xGiuMG>kroDcT zQSz@dqV>^@|R@bSn+1vH3ckkUh_iS4EJcsmjrLSB&qwZd^{KjRMJIDOu z3X|YD8*^?NDNX$FD!YFA>GnsTL8H(g3ND*2n|JC_wI64}x61dW{m;4A|1bFvRC6`9 z-g$wbTvg#KL#x@(k1f<{WlEg;a`E!E{pD{byI1~D4x5{K^PaS+0eAUP-@B!!yj@-Im`>LH znG`CV`Ke0w?6ig2`(@N# zy`-oxHLR0Yx>2xYJ?Hs(J8NT`-7n9t|MT&4ef_tOU*}pBF7jG>WFu=_hyI4bMITSE z-(RL1si$*%|MvX*`>MacySX`S|BkAwr^MqTw!U%=zAm~qYX85(3l<#c7T2F^Gjqc9 z`TH|3A860Weg3&v$nUNUv*-P#_s@p;&esgR?q|*u{qoC-{pf*8l&#bwR*}pZEXU6+Ow=wo#7#U{AqkiDkCiU*^C0HccjU zeg5m$0x^2x?tVrqc|fh}1cs19+WNVZ>?BR!oh&e)cl`!$_SzNE?01Xf*PCd0D#l+b zUb$gHKbza-+k6ZXkpcxa2d<>Ho7EPyoRe~O_nP^}ZM$UGo5j(^=QrkfXstYS;q8ly zeMc>=_nmmTX`|nqeg8MlVX5Bbr)ONIaZB*RD=ojAzbm{AGk^8S6}niU-3Te#mVC2?0k6Zo48kACZ?u;D}S8VmJI**`}6sW#n1liNp@df zy)0m5zpdHxyS1;E!Nvk+=kNddc*4Tndd0=XVyE}L7v8BlV}(fPixRg>t=t&~TH3BE zLYZe~7|xw)u|qFrX3hz{AMf9+@j0WbqotL{m)-Qf_|NTQvodELz3K9N6=z~%T3VXu zQ_+kGJ})^zg9dDV!OC~G`~Psa$-nyQ=jpq5=FLCn{U`opN3RzDfxo>C2bz7CPwHHq zde@5eD7Wv+W4S9tgJyEMxij)NJXU|S+-K&i$B&D@M7XDwKRq=y`}(@tFAv>~(~p|j!kQ-L%6~kE)A@ThnFXgvi1lXqEj={-3d0x1I2i_; zS5dc1Gfx$jI z+st^g-T8+H-tS*uT^(CgRFs-}^wClOhn@QSf4y3Ib@lwJSDL|%_v?P^s+x-4Jy-pH zZ};Cn_vhcfb<4=u_`l7c<-*4~c_%i`nfhMh{>jPe@%w6SUb&d5F2k^M*RHzncgvSm zuiqB-YrX!y2`8=GKJ1)Ok(iT^aOcz03M*CBr>FJzJ2jhUKhv4$u_gPtAGoD)+i3fI z>D>wI=K4imk7!?!WBuoBuU~}9+Gc$X#uv?!hr2rExF9!zewUx!;F0}4phW!DrgIwJ zn*|w|ofU+t`wo9vaQNnti;Iu{`~A7^{urTluQ}$CEck{QUXT z*VlKM>JKaXmyeFh*Z)}f{M^fuUG2-$8ls`#eNx2f9UyS^=c`26|xYxm+p zA~Le9jUDpxY^JXA)RJ9yulBd4_MG^Z_V(pVmwv4}^yA-`Z(p)9GIaDb-|d-cVZ3VP z%AY?T_sh!2Xo`5HK3yQad`3lewYmBBJ0G7hFfbgb?E`Pszq3TjBXN`I>CCX0det*; z=f_C>^?IR^%o?&aLS<*cyHolz7yY`;DpPv%`IMuPpyjlnvn6d9=GFiExy|hE#>dC2 z*9Dnr`8H22Q#E-tXX~a-Nt-Q?_sP92eXccC>-VdMsy}N*LLbe~<1RF6Vq3q)r=u;{ zKE1V=_p-pYy@$T1yQQU_f0}k8VCT|h%cSnIHaawbGOB@t?j`%OcmI+rwCsX%@9wd^ zEBiK*XV$)zenE3)N9xEr2!D?gMAI@7P6B7uoU6}|vfGjxl$+m0Z3wJM=cwLD>E>UXkyWjHr>`OifFeyKIvvc#R zW7a;?L9Q&AuXuac?#Zjy#q3ghnKAeFof|nn`k&b-c16!E*|}#W@5LL!i|#D-T)EWu zMAKVyvxdW4R5DVRMrO8tt+G;AIB@x3lh-wKk>@efi<|z)yzT6Hx$aWalhupVJS-1z zG&LmO$dpd`!OqC=?!>zII>&@1vNi<*pyK|)LkH-V_-lGu@= z6XO~_%Vuxx63O(gsktdyzV}y!iFwFO`18rNk!usL!6itKAGAiw?&u@wcALE`ve#mp zNmIn#YcX@aq;G8fJmut`cT4k*h#fIYtvq!!#q;_vxufEfk1W2!e9V9DyIIAWkv$AM z;sqchs|*Yc?yXT#QQl8jDlH-==0~mzU;Q;@Q=ueyBl`b*(7K4Sc{bL;o=lAizph@3 ziLOzNypWUUeb}=@PB0^&pZN~|0ycI~Jb+Fvb&AS13SM9NtIBVdppV+5mnMr=S@|!> zy?kx@v@CV^vt{At+R|6oW;sunit@~BQ^+}VMk2p=UWe4DNkQJ4jmC>Bp0w?1TlQ?% zo;y}+r$vO^k`c42-L^>MZC0gn$q`1k3CJ0r!R8Z(i&7`YO;wQX2ll!t1q)>5=Sf|- zkere|?eZE66P{O_&TDpW7GUU?+rb4%eGCoN>-O&TUGIE&A#YY-gS*I;2MiAqnN7j# zsuNaC@%>OiSf0Y9;zna#W&rvFF0KHv-bV{uU(c(fzlMnJ_de04vTlK z9iG8SNn%f8c3Z7jD{%6ddD_)UoQp%2hF>b)#C`R|oVTxDK6{kbyy?`1fD0>^h6;5? zSlTQOhMV!7hehUax7SkLxII^{pO^QaEy%;$^rD2V(8iPLNnxBb6K z0ha;~Dyb{)t=1Ikwd~4V7wWlm)jUhq&V!qlue1&?o$cx|vA)Fr-`j1kTs9}(oN#5Y z9C!u>5+cG^zK6Zat9vWj)v~bD#XUZnqk5AX1`|gmzSyM5&`&;do zI`w+oc@aMUDc8BsqGkS{4cDzXe{;Kaw{7*r%&_R$r7xB%TNce-_+<9!zh2+|RIKp1 zyD`-1;R;FPKe;D%#CX4KjjguYBr2p`;TiMBLi+Htua)Wko_poWweNf^o+Pn}59EFj z{?4p4)ytWm)woHr)1s%6x6@~yRVmx-vx3v6Z`-={=8YSEvt%-J&x&w)SBvrS&p)zd zqo9ab$I(!CKKV5(r?IfG&73*&>9c1iQZ~&rUVQZxXtC_SzI4;7sww;J9%lq~Zd%)~ zWEC4+dvT|7y_~PlzNkJMrDYW>K5be(YvR`9Pdp$0k)1V}|4;t^n=z7yRaFX{HUvB0 zn#kPlw>*5poTjEdXHIYWENa!X_4pBmYD@dWCb>7dZcnSu`G4<6isRze=z;~&#erc< zSM?s7`}vRYKZ8a9_(XeJg#u% zT9~*<%=eFy#@Wx3pNUPIt~WP7FYn#vEi)tIy=7!%v`)3IsJB|nH!)+b^66JmOO~oG zEh?^FuVDUdMc+~t>FozP57x3 zS|g&3H?L3qTCXs7p|Ssy~^ z(!)+%n8CX7pSijDG2!iR1n$P2U+d$c@@c_$Ryi3F5PUW|mF)i2G-r}u|xuRSU}ZQ8U#?XbDFvm1DRwkbZ4c>18?saKR^o!qPW zyIy6*~fnFtF1x3HFtI_4pK=vB4b?J#@~FWsjW3? z(qwJ!*+R0y>%2~^2r;x#_boM7ht3!>FfbJCZ)ixq!O8OT_V)VyH9x(!M%nJry(;Rt zyDmsS!sPeP^5vy^IV*L~XoX9E>i_)l<+}5FHN}seTBfjaw)dx;ozc|RzU$MKcXu-m z9=c)r{>Y=q)R$L-EDy^d3R!OBHc??)5y(ZL@4|VsUr(6uvGe))1=fzqo7@af=z8sp zS-5ZMPOi?p^NUud8a=grDc0wYm2%hUMp3KF_;Ksz*SnYK4M#1uzY|Fw)c%1n_K_PIsWXS?SvCgmOWdxC#EiVve5mmm6y|=JdfAc z(=wQ!XWvd={R}WX#J8|Zg!7$eQ=pNb?w@< zM~^oB`ek)k@tFUU4Rc*XMGr1ayzZ7G_6;@`@Y8bZ)~j{NOndj#eE!7K>@3`=5^Wt; zR@OFks_8k$DW}}pre1w=GVqaBVDxOcbos59W*s{8r|z7JiprXuOIN-Y3ZJ)oG4t}3 z+vQH1MEO?TQe7L?eY!_dc*2~TMyI8Zf_KfCcIW!P;9&iiB~j|?c`tr^;O<=haZ(!_ z>-5)`BnviJ-cfrY3t6{elL0y;|3LG>ONSn=-1+;2%4vJyuxlrZeruH(y__rDx&FP4 zg}2I1r^QA!wqlDKH>Me7XC0|nw0AG$2+@lcch40T358C3%yMu_-h~X4;^N|^s|5f1 zt4%7L(jXo-WxADx)vRxipTN!!WmqnK;==I)WzY$t4}90GS?e2W`Rm~Gcx@4mU3wEc zR$scLR~CDy?1@j$j4t&LoDb$c=8VkM?Q}UN9Kz+g_~Ms(4r62EjS)u@3_e6YjP%Xc z{+DQ!>zf@LQz5jG15${5aA=g0VQ6qH;Qb!IiAra zS(lynZtJ@0W7WZ$yprtQrd;lFcKiN?gRy_q1-UiJy>r^BZuL((>gRd32`&FKRWD3<&EI8y{7Ki+ z=k3%8*m`k}`nkCY`ll@>hn$^bVSOla=HKw3!enWs8+~)7pLTZX{h6wKRf&81%8SBp zJ7ueLw7e`z*Y-WLNp-WhULn#O6s33KoL>HgZ*|Yk#^y^MJXCt=3WL|jqo0qS4LkSF z?%ld`-@-(E7w>oz6&2SzE90$sW|w>Mx0^hH!O~0#CmaqiGVIV6Ts{BDOSX9)_r4wf zuvGd)Ky&hxRi0Mo$|Kh$%wM!|(fXt%(#}g)L`(DhzdMWj%iMlXd+kw^r`XC9i&Lw12_Vw!eOY<=I8smhH-JU$%^aX*sit(aMF67kAD%x#jD3 z`RboVTt+=Vot8x#txHXR$ZNZI&)z+MKdpPd!1~gqp375b&sUC#y}M@Z%NhnRM-CT`F_s`Xd`YcU#T8a;0bK-3skhtF&rs{uC8&F8mOvxeC0F zWruszk(=ROQ>*rF^IYlHal@N)RdT=vb@%wGb3>iCl`c^3-B&y{Xhz-IO`i9c1!_ml z-fFb;USnpqr$BbbnLr;UrKtX-ODtMzm+Cez3cq%3Wxl-Hi`QI6pHyy{)mVKxcd2Vq ziDUEB-TVDBSORPH)-Kz+-S~ainNQyyFIctYQ=3^+EARDEkyYnUYi%w0`uU68YjwN% zq4xu3#lJPYc>eY_wbyBV%m-pYw*VJBpL49zzhid0`l-uB#%1#z4!?ZRnHt9P?$Po3 zx%S1k-yP<@b*t)s@{0ppCP(Gp=>`7S9usJF;P3XWFW29D5nPP##8Hmm43ntr>3r5! zr=ugI+uPb={rod?P1l63zH0IN!b_g?INgaA)xQ@meDLT{@zb60yJp-dRkXY6R%765 z%V)QXRYv_$|BJ8Y*?ltX1vhK~aezU6HMPX5wZ*1Hc6trIMaZb9kvPq=%Ed}51wv5LI7Ie;z z+%|2+&MnKfzWrt^^5UvdX77@(*HUk>b?yjRvb}uk^IH*@In0^*qR;Q)-n4c%^V+3u zDQEO%oz|PLnV)_5_%@}YyKi;Qu56nepskgCH6~qevi@YJLyT=aEHVrY)-I_LM`}Jz zlAO3;)ztYvj+>dB*|O`|r&ZmOf95+g$IY<)xp}f@{`V-IqC@Q8%J#hpd>msb9DRlN z=h60y3L9lDqvrCpGx_<&{1KN^XRT1|Inu21Yc{3oukDahHd zXP@8t>)<}b9p!8HE>Ev|{9k(geEa&f+xb~?&tAGDwUt?2p=#UTuWPa^g;LX%9JX-J z`t2gnr;u{}+#Jm?GcQr8a%=YN({AqBUAvZfWWLW#&re+_aa3X36_42;(ypwFF5R&- zy|C-@lbsuX)c0DvT^|ydzW%w3%hoOFGn7l$UJBrCxp8{t{T@vYF(2t!`z}^EJm$?X zZczwvx97KBv@GgQLd=@bYZ_nIUAs1oWhGP8%7%qZpp6-PXKU>H>`pC5UzG?9#`%V_Fd3Lk^OmwrpaM3|WM@Oy2 zKS)FB$}6?tXnvW3DbvL6Mr2Fc6&7{xI(q2NqE%iYVQCpXlQ9;FF5K?tdwjYSBctQB zurn)G++23Esp++AE9=o#*5Kv7$LpU-OH2Q-4F6cv9+-3a$buWUHr}~wTW~;7#%P|; zGMjHdm@a?v7C&z+5oY0*nH98k`__*?Z!*jCgN7R0^`}m~UtxMR8xudPW{>EuHf zcDw4U-kOp+-QRpCd+U#)<1QAvrp4KmZe6z6_e8Inmadm`yqJ`0Z_N7>B_##hmS(>C zd@7q`UE{Z$>RG(5%IgE~ylK9(Mf9Ae#Jk7Gt?m}-1PhCn&UU+dqbOPOqFu#1;e!=( z_k8gx^Uan|uM?h_38oZ|rRL7w_5|`~UUA<5ubBf1g~l-23@~&t;do zj}!B%H8d={>I3!{cohD-^KzZ{rOUxq%T*_7{kfbgymXV{&qqJc-E3oXE&9|NXZ~Jg z)v5#bb2pb*#j34-8JX;~{`y?6j`!OPULLx6F0*hd$NvYNlj~()hxzEOU%x_Nk=+-a zet&CIRZhv>f|gSY_9XvLnkc~*1S&(`wc1Hnm0Z0R6d{!M2QTh)Ehv5SQE|z1H7$?8Ns*o( z`5sK-%>A|P_WYgq0ybVT37IYEXRhYQx9NIVT8x*tY56pDsZG2q%(&V_z@6gBi9_8A)ZR@^eQ;pg>_fK7EQgXmhz(wlx zJ;&@fDIsC^1>GcmJseD#r*0Nv8yKA1vA3LQuYQdZ2P8}zyXQo+^W56RuoO)?>D}7S>0-nf+8;{ zSQ#1|ji0mlK3#AwF{$@-#+(L@!$wQipY+-husFvlroYg}N-&-M>dot2d1X-tAGG>D zQ+#Z&@%ZKJEgso#+73@z6n3J(YGLlGwZZ*~7otSw{!P5Yckx{MArbkK=$u7(ca;Ypz6J2Cn%1$Z-gj@PZBqUxh`0qNK zcW-svkMH?E>z5w+`;YbPsi4T%?ZqE=@4DvrrD5+{tF1d_tImM7Z60uLbvZWu)7!Jm z?-*V$blp%g&!AeycS4Ec`i0k}q*AQ^pA0;AHuJfDca$K5^RsP_Sr{1{^tb4)J^Qsc z{9pPD^`?gz;`@peK}|gd28Qfxp>);fU0+S2-d~^1GHYkloSE}@U$RLgfzAVXcV}w6 zzlK)!2bT|*GM0VTfOH8PHilm@YFw~v=XW`?TT>P#IY!zZkxp0vjv?;1Z^ifh=Kb%# zXwve%A9~1qEged&CBmOxG&3?7=AKyar52W zU2|IYhHqHy7qxVc;kGS)(+V^GUtILA(Wvv>qYW?iy2PsNvhDVKt;=kjcWHAY=gDIe zbMNm|7veo%ly|q$a_&h7ugY%C^9y#jxw7oMFzS!DnVbJq)v!%tw z#ZB^Ln3})5y0w*&k4htA!sf4E!a z*52yIit}}yPbEQ@oi!Y6kdkpefBgFWySZOhURE!Oa_0SWQSM&cynEu4&Y78;e${#N z%8d^?|W9h<2f8vd2ixfcKtBv z**h-WT_kq&+_z1J$4pLrdUANT|I^dF)v7lu&P8ldIJ7+3_u)a=-Nt9q_v~t!TO0OB z*f!UM`KsFg9Y0%YzWmv-RM=wK6DRGxWhvhmnn-4Txw6!IS#{*Zi%sVL@*B5lExx05 zg;{>q=Uc}zIXWM2&#{i@6}3EIYnc3tr_-fI>!FC$p0~HR-Mn?{N!)%v1)X-MsSR;nVl;{}y$r)n#f{#w$_#|93ub zUX*UT{f(uGM_HV3%rSi(tIxtxiaysH4ya#W{%1$f@^?G5kJDyL_1fJf4`x3& za60wS}`wZZhWe-eZ$k)M&I|`*U)>Dt!=Dy(o*HvG--$OFBcx~ zjth#IUB7aj3Ns_afyKN`eG9K&P%z)Vfrq=>!*gFk?ol2tu8G>Os(sCQ&YbzMKDz3T zf!;xtNvn<=*&MvwjZfu)!pkSFk*bY`kN?h))HIqSeBnl;quHrD#iBfU^7rc}y2M$Bfk7N-D)n` z%lQWvafD}{dUyBa&Z}9)VzJ%)M_p5P-TorEMEhfO*>mr$9?RX9bglkqKX>(-0L8Y& z_unk-PIG@Ae}8iDq%GOqH7BLHC7y48w=2UVF(X`j@2;M?pD%A~;qov$z^rKU<^Rpy zd<>SWKK;M9AwgbUUl;!~7XtmxRgNTZ{nD`LYRR#umzY#mKO zOH{UqOmgt>_wd*Is(1bLx6JqdYu}$ebMD>SSiOZFhyK{~-@Q50JpbOFn|Hof?|=XO ztc-o#A6N0%J6EoFFzs1h*I*jxVU+LUWOl6K#_O8fs$kg<|b zoUHdRtorV(x!!WCCCpME{fyU^wJ5rJ*nD!ih`@*W-_F(>-M;tllyk4NxZ5dqzS&oDWa;Z+RQDwfN-XzsJwmK7HM<_xJ7c z+1vCsU-~$4dEF&tiv{ydgU>e|Pyf6B{U+bJ1yW4AcKx%rf4TIdZN8oD$3yvke?OdE zE&qGpjiNip>*slveKYf3S@Np)zm~L7;qBA)cecKX_u7&1;KyY3dH=6|{r~UfH1YT9 zj7%&X9~j*xEc$eA@xr?Q({!cTd8KUf{w#U?eBPSZGp|qAQ)+LGEwxsj=uuf&8DExn z|7Tk4uK!Os|4!V>#cx;UE2nrgElf&`s6m?_XKRUtH?LM^^uIU7 zucecg%{(SNYvbP1>ICtM!i3jta|^dF(UB_1WW1Lf;N{-4VyGqeBMIk&U(NobR)C%(W0q++#Z~uaHwcJZ zt#n!RueTt?KbI+`?)N71sEZ3&f6U!}JMoUx4C4zSg;xXexeY`X`|V$Me*shQ#`_aE z4U+C|pDt^BQo8s@U1Y)cr`hv=T>KY$e%=4`u>$$wSNzo5xo2#&uz&hT|IEqhHPZX^ z;`jbG>bUp%`nmfXAFSuDD|NlzD0_L`4@OIujH7?kYIuJAYt^?Livs;mb`f{#vnHSze#Ro6aT zWBNGF{>tS~YR$Pz!tIKR-+G20Za929u~<)E+Nkd8{r!*cv#T}N^YvIgeLVH>a^30& z#nSWsX!iVhxAcG2psZ;DEMLb(w&xK{hhi@%Iazt; z{kLD2vsc?weev3|k}c2w2IumgU1!hk$!NTAL42E#-g=GBFZ1huhTnF)aadwbn8e3<+G-k!?KYWe5a*F4o0k1Ywbkg59n^?GTn{m&Vj)<;J^jyt_wWDT)4ea8AHF8$XK#Lu^ZAqqUki`R zvaiq1&OZ9}-~ILVpIDl+yDRH#l>?Q(*OMt-~az_^xk9d_k2FbU;pE9@N&P_ z?bhY*{(RfMpSOHT|MpG=Yk|Lq<^M69Y5HGKQG37kyQ!(!-Ll`gmD4W=t5-7#xNW~% z$IhcXpK~UA-G2t2wC{KK{Wz*0S98&I>EB-mU#oggulX!}|IF=&-)`sIzh1MMC6euM z-DO{MQ*-mfuk-Jh2+L?}%fGkh=dai6+qv~EiWB(eR34i-J@#8--PNV{|Gq1Ker6{3 zXZB@J-^I&|8Wdz!a%f5SzMH$U&#t!LTk?lBezk28 z4AW!RX9!x9y?tzdXXlIe8}>_S&iy;Hn$7P(Wp?zlKG*vA-{-9rYHZ*4g_r5qe>&T~ zPtPyb_^nLGy4Tmwe6}h+v&Q?|+Df^3OS|iL=3TC@-}`o|z2F(I8KtkxmZe@3*IS9rOQnOF2|I-R|$%mDBqE%gL7CU4Q5=o6f(lS07z=3_dsO_fGbCyMMNX zxHsQmN;Z0S=Joua*Gg_1waqU$`ek*U%Ev{4vcJvNR(+}7aKO(X`|-I=$!Z5OI-DE4 zc6>a^4+d=Hv8e5kwj{h4WA%!{=L4j(=D=f~au|0W&YcQEKr3->;|Z)?t< zin?(|WxCymoy&Z?kGd=S{krkv^M0w9?Z#`j=AHf2zHe5>y~*YBjrB7N&-!OAo5R_D zxVAm@&szO|a!g+(!|#VyKN5Z9W|AAX>ruY>GV9q#J3@J8-`Z6B^9O&eWZwMD7wi9h zndBIJPNMqT^D6}#=k*+%_ci;O{IRu>A5LpWZPT4!`SyJO%-WSl()GVoo_ue&_V{hT zKab|K`&zMXi>Z^Z+i3G~>BTcf4_CR*E6QELay|Uj^?f_O{5#)eJdJ;T)vMI)V&RIf zH|Agcyx#st>mKj67q>jh{QjHqp111te*=wW>mT>Wuaqi{xu-ZYBK!Eg z?GKI~@LVoi|F^bF%;-|5@A>=5JAX-|JU@ z#@&sVJdXbEx89g-e`+h6kImM~*PAZQGHhNphtq{8XQiCA`OSM1G7fFjl{64aQ#d1e z+N4akl1Fb(&5tdr`~RxclqCE;{q=R6)jQ#G{XbW)2J8L4*Op#4^IeY6^QOgVai1rj z61==p<)BK<+wJqSZhkxVLD=rrhQx!7yz76s3#r{OJRWQF=ZN;hB98_JMy8qoK@E$0 zx_kZ|o8+UmxAJmyFS}IL?SA%z`8)q{fB5`#eO)n&PUbF_<3Bhj`&s?G^7HdNqGnCZ#v~*DHb(V%6-n;y&sPL4 zZh68OcAA|>Vn@l#po+iE@(--;iSPf=%B^Sd{~vo@{kzKNag|3!YI>`R~m4T;6a0ui{`Hga5~`>udiu{+8eI;SjgtKHue+x8M6^8?jXUcfY(n-d^kXyS%)-*8M+|p8xybT7mma$)9#g+m&Cv8vggkI{EmrpQ-wLzkHe+ z9&1{`vFkaHyxkw~_-T=UweP;# zf#dccJJaXYslER&?}E2_wbR{ovE~0CzqUSI#0 zyY0o4V86-_-&uXc;_7~;{t!t!ly3KT=BH0Z7yT1b#?ur2M2Qh-j4sz_2!sk zI^Tmf={$yKPt)yx-;_+BQ+QH!`o0f;K5riqa`Kb~h_|NHyg@_mMqNy~Zt|1;gI`e?(l`sv|i z`#x>CQi5 zw?C188Ik>;Q+=1MrR=xHA2EAcwX^R1ayz^${Ln?OjX}KKmqL}(mfYgM;#2HXzuNtL zW|j8p$~E!dlU8jmJhJkpXVIBA-rx58G%4X{3QRD+X8ZB+^8KcdpU#gNb^H6;s&6~r&;4@B-=61x z!TCMU((m%mFSuy_yWcwTXMEnD^Wn$-eqR<@J?(#cK_A<(l$U?aZGQG@evob}fA#eK zcRopzmsjdcA4l{`2g1ezp4}}wwz|At*u(jUftz8^rIye8 zH@$sof8fTy-`>d$?jQWPWGg;IoOC%k;lYxm9O|JQ5tDz09LoSswv^}My% zKU1p&m!lstldLbWgev#n-ufl};iXla&+AR!Kc8{agXs{D{l8!LnF>Fg@!cG^_xGlM z$`Tg7V_rJgNuYb2A^4$JSyI+;<`|zj!enqn6OXEw`*K>0E{Vblo32vKpJM7&H zg?2{cd-tZOt-7?Y`t~;6cjx<Ey3Gj_vze|2;%9AfqrSA_NpI`ND=hD^p zvN|+XAIk9?F!2U9G$+2il)B-J-WMkI`6Wgymv)!EZ8{-+PtHC)&)xm^Ez|5}vfV$9 z>ep>7y1HuGv}^S?zg}c}$63F3mj5IbxwnefWpiw7>^!+s+fI6_&n@|^YySVwyZQQ2 zI|R11I462eGMdTrhAn&T`TZYkKA&94^(Z+!e(#^&r}e*o-%rS`Kl|#cgTI4H{U=ZL zPXE=bwDNcV-Nu`r+fjPdD8_JN`~JUg*I!7C*!%zY{eNuSzx{1K9(jFw+S~iv|2ML~ zo17}i!F1#KozLf(H$6zV|NHXY-Q5Y#kIPl_v^`ponXSL~&m->7aSd^I|Np+PKKZ1m z_WhRa21X9iSFW4)NLUJev&_4;W}$QYpI71g za;^3j96WUG+O@>P?UlXzKb>0bZ}&CDyO?{+&XSWs7timzqxSy8@_BVypz^U=oqN&R zwZ3;Q^!4?L$In@>(G^htqwwX@>FXjkK00Xshp~+#@9eX@8kU5QkB(jtIm5W4S=v08 zMU2@@%(Y8JYwOmnpn|dXr)Z3w?Ta&cd+Bt+IBEuUEPzk z1$Wxc{?u@kda=o8P3~L!_a58cW#8Ufb=sRhq<`jGH?P0P4`p0G_mjhA)$efIY)OOU zs1~2(Gm`UfetPu2aeGsNNZ12&`~T4r?E2}9=XU(s82yp$ZN$dvo5E3nC0~=bm%qEu z@_1YA#rs~r_`iG1ao%hCVOQqoY`0C^ZlY2-cXw)86}TK+Em!*LIDbyemY=Qn58hy! z&NBUd?Us)>M#EMyL!I-YW~|B+cPE7^?nq@t~-9a zab45TKd;W~pZ+Zv)hW0R^-j{jGh8tG)F<1U&Ij1!F#g(oJ zA8lS7QI3fh#vo%zas%a7-IZ+Y{%oO#*t zcjo_O-`eNA?%x0XkE53R84dfiORL=TGFiL2HdZ|5yM5)TYP!{|U3aY}z0Bbf{i+Nd z_HroL)BWPjo8YWY1{R_E$`}0HakZIOUKl2MYfX*WQ^9DdGUMy&Fw<6dAE}hQ$WU?R z_STZSo0e8DzO29h*^`f^d!A+QSXGuHx+ZkSTkGprwUy89`_a=GdLpuAHCt%=?(%~@ zM}3#>DKn6hUN^Jm+{>-DsRw7TEa{pe+hfT2f${jZx3_1_lIpj9XAx0g{qM)k)8RVt zo6FvE7JuZAj1Y=H`g(=~OLpY7HeTsHi?`+7Ejwd)Q{}U-wE0t0>y#4@tl#e`KDe5D zUga;zjj6x;-tyaixu9!)zvlnn@9||nQ`xuXKj`JTyR*3cd)f28xv{Yu1@kQKUb(`O z`(gIRC!px!T1~>+8OH-`>W4^-9NGKkKhs-q(HK{r&H|@(+QT znf4Q#l{X|;o88LH&F60Yki9^E`^xEutDWA@)#2DtDF63_d;N!IdAkn>n77|8vwj)2 zeRhGqX#KGO#~x|>f7$W>f32_kscrH8OLD)cGQ*j3yS~2u|7E%T{mSS4Hle2-)6YFn zZ0_#vHWytKSmm^8HRmCl=cfIyMb@t9KfcU*_8uuQfw{-{-e~B#n_f7UUZ=QvA^+W< zx2E*h?2kXYqv<%G{l8Bk>B=nIAFX|T{A2#dZHb3hFML!t_3-kq(l&B8TJ~zsdwFMn z<%g1(!|kGP-0DIeKfAuFat(*0b<2+5VRq6l!+DRe%n@|j$Nc)D@$SsilU`l)c*;Mo zs_gPL)!y0S{0*$dTD-F=xC-Q*UcF~rRJC>q&$TC<%S9LXKHMWA8^FDO@7+gdcPn0d z8(z%erd#W%b}dU~?op~HKnZtziF}fgiEA!-QC2bX!lDed2e^1A)Dw+Tnh)Ofuii zu@qRT7q`ViuKRxJb^ip_`cF$dzu*7Q@J1kL>pS`c1%=u_>;@{L}f@X*rU|94Boy z+V!qJ`&QZa+5}$Vj!FCfd|m&qcX#=F#l1@JtKK>ViDXEgX!!B5^3kzl z%h=!9&uL;3kEu9#egC(w|LuO?HxFNTV^ikkRQa8ImPovnYwXk9 zI48gN>$Pa}I|a-op90d)IVQf8EV^-G?qrLWGfH!qDt@lxR=g)&{4M?buCG6R&;S3n zcKQ2r)?a2sPJdJTSu+1?#E-%^jTfdUU)^SZZO7)UGdZRqm$tm+<Yq+?Ujb#3`y3GZ!J^J~8S|8rYNx0fi>(qjP2)9)a$`Xptlq5aRj@&=ncD=pb&q=cv z@UPtVYtzBUarGa(Hv}$O@kI7^)ONRuf(du>wbCLVxrQ?r#Tk@Z7iCVbYd+3o&ay`M z<>4dJX3syJ61;r-^);VeESGB*F}nqLwq4h~9oHUc_2LC%nEfx?AA;-IeJ!~w*birJuv?icaq= z*O4hd_uPE9Z)tn(D}%pY>}8)@mx`>*et#<6qd}QHWa`#e<*p^kWh!f)-2Sm##i2o2 zjPc;deTS#%&VKj%?SI)*f-iIZ|J*2kWgZ>(|1tk&)ytPk`|tjB&fkA%{m(=PgFCOD z+Rpx{`}zNe=AREgH9nnKQXTAmtM~GmZ@%a6ZGU;QATqRdQeIZ)=eM8hzAdi&_iu*o zYq{TFk3C;?YD$H>wcM^Ry34z4JJ;5~VSoL%TJQhoyVBWguEA${-!kqLT%f)tV&5a_ z`+ttjv#kzW7sDy|?9wa&bcqXcsqap%RSu2itOQgGTy;m-&g-zD|Ai=Kgm3x#xOh zt;;?>I{M^o&pycXZn91xx3hZ|2ZG^+1quOuXq{3wfb-9 z;&gEx{awi)4;SbC_$BYS^I@ecn80n?W0Sz;g7%lo3ZD^uH0`PHyk;*1ap3FIO#h( z{&T*`rOr>uo20d~`&$DnpLsLCkL|xq^;snRL;q5HC;OMn(|+=Qx$?icFHX*F z&Xc$wN)>b)gC60Hwd&8{-a2AicgE!V!& z;5pmV;@5(OoAuh}?Js!kxou+P@AcMwzn`rCw)T(y2cwP0WD7!`e#p$-U9^w6eE-iY zFD~2feYx|0v*OurubyNlTqxWBQC{f5iN>HXn-{l&PwZ~EHvQVsuy+cKOf??_maNz# zfAP*8mwWsk+vPJ>oZlq9kKZclm2BB!^%)zdP5V|Nf5-J~#ov1kcR4O-Pt%L$O8mBR z`Mhtpl6W|EPDgD_`gt>b?$+AhWq}*No;AOJ=f}0^`2V-Ar=6P-7#LXiG&Fo}#i7oA zn_n6Ixy&f7G z?rZ(+#_avopRcWr7T1gLxMyke^GR^e#@+AtNxzVOVbXJWX8K%JyI-fK@8_|9Qoz`} zt?ccs=>6rdCDZ39Zqo9zfBPjPGvs{Aq|PH(P6j_Ld06n{+3bAH424Uw?0bFRC#XL> zswy7;>A3yBz&+nC+-tme=uD(U2CrO9@mtf@s|DQRy0a{cpOw!4HAN%QIQ`t5J+es~ zZ=9H@?Co7x`}&-lU*NYm0@yZ&1C(* zdPmmnp8i*O+jsf$MNiVq10wylCaNc%e&c`NxZ>AOmFt%qMLs<~;C*|?ia#?tQ;+-H z+t21H%yIS7+}`77c5TUg9h5Jhpq=%+&gAAU^J^Pq?_FCzGu$d8(TKuac$i>UjB+oliqw?pK=qweP7f#B3Z99-1zlL zenIu(^LyfSwV1Qgo*jRmcYCkgx0ZgZZ+Si6Wb>{pNfLAM3-+5D_(?^MR$+4o@myw%z91r^)b z+Sc8_(CNjoT;oFY(&kNj`X|28c^R+$Cz$bfxV?G7qm#+!eyzC?Wc%z#bJ@zIBP9w8 zKTRr0Si|OPm3(63^Y?MzemF+o*!dzcQhVOFi`EZb{o<9gf4%GekFSNR<#z7ek@O*Q z`#EX5?~9|hY)X4|Q@#H0#f6vcx4io(U+H}P_mS+I+iDI^w*Ol9ZCyp%O|d-|2cG-H zt8HVrkZ5fGvHO+b=6h9Ir}>!<2Ack=NQl^TNqwz#_{^$RSyu`#Xm4b-VzBnv|H}PP z;`Cy};G^zYfiJI|&SyOo==1*X>iPNi_ljBYG6e24tY=0v3}fR9AEWPHGls5n(xo7-~YL2`~4nwqNUD; z`<2h<{`0S9a+zm-zv%P)e?J6tF7Dq}@v-*%UG-D-uXg==GTGnm_nXao<@sWc?cM+P z?Q;9CE6?98V3yfb@o`c7|6dcHgtNORKW@yg|Gg|a|L?r%Ss$-O=kNWZq$f15?%2zM zjr(^#mn+)w<6Zgw-;3q{zG%1qv+xLWXNXqm&D0$`s=n*je|(!?TYYm=>c@&d|JdJs zKYDKOLVZw`_@rm1aidO0>C=?i`FD1FoY*e^?^>_CFIjEP-B8QM zCsA6yHv{LPhT_w!`!@U^q7%g<#lpZo3iefxk5 z>01kYc`G4oOiObI^eCx0O|L(aPjdMT0JFrPm_P2TZqqocJ zzwhr_<+x)1hyUxu0)+**)a$?IFOrRz9``SO4LA4ey&I0@-F~(&^gQ3px_i<7{|{MT zzc5pr%bxH5-~2mUI64~oYV(&`&C%~|<6Ylp^E0_AQXu2jj*K%eujkfYT>aKVRCIUSIZqmiUp|wc7LN)_t9uyZhQK%{>dBZVhJlx0Vij=6cotkn>Yd z@%tPXbGE7H>&ARuFYmMKMRc(K?wdwmYFE#X|Gi$mqrXi5KYz^W&iE>h^Y?bupXS~_ z`^&@kUrZWi&)dH|>BpAM`};+0Z@;>Bh{I>+pXz&&35IiSZj(6k%~o3M@2{-H2@^ZF z>g;$A>(Qa^cc!pp3^Gw;Im&f1sx+fLZX8eP4)=g0qbZ@*Y(Tv=aT z`0J{D)~y-33@(}-lDj;%kljGp;LW{x z+W-E|E#7Be|77L-8yg?!d)IwmDH;C%$CueM`=?%iw^#3C2s<-(zu5&UlGVhQ*>Ao~$?_AMkF|qD70AEj#w!tZIdX zT}?%3=+$Muv;Syv?q!Z(i@0%rV{&!ehQH^M9vpCVX1l&;YoW5skEGKb6C)TCpZ9H_ zEhwzp+b3hSygxQHRH3jTx6w0cryS#wd}DTrnVrIF zIXAb3`b=H5>Xf2$f8^#WQ%jcvzs!=So%nw|?KGQcC|};qjZ8_aK8n}8o$*+2Uit0J zNm6<*?RCy?2o7`JP{ng_XZ*D|yPB*;mD88^RKz!2dSzI==azhnx^j=r&s*vHieuz% zAKS3yREPwZe&hk>HJ`;puZYB)JtytJu&&Ek`(lj6df#hGN3R}#!n@32#g<(=iad_* z>)n>U=whvns%c9n=Wp}h)}7MqpS|X@ufF!huj$gJg~E@0cmLU`%T&-iRXJ_TyNb)j z%!0|YGwv=w9>sre!}pPK)34q#mXy%g-siXX2Z+D5&z) z+3)uvtl#gB|Nr^dzDaKwnPdbxIQkeE`^;)4aP~3C3rv|d&F=3PH*SCVwDL=% zu*~!`yWfTsi8yjjpY#22Yjpgt!_z9iPh?=MSUbUZ-(QspF5GpMuB&qGEtwdP9I3Rg zS(|rqalY+m?@xXYew@E&UhpXMwA_!J#r_^b59*tgTOVjh7XR!u=ZP=)o-bx1)AX~v zf#H2UOJD$K42H$x(1oj4OJA*g-=!Vh@Ld#C`F`2aeX8Bx^y`&x;s0EiSRNPzZ*1Ma zujoqVd?|~6OLnRLS8(U>`|-&6mS{zzr$%}ynWvv_D_5dzq0SQ__s$t^qOD( zy-jZ>=)^MBBnaOB_2cdRGdCAa<&lbuc8=PXldEy$Tt@S;p59}x%1n=Z-E+8&Up`tg z>+Yu1@N?=>Pd{utym(`5blFxm9So{yX>;76Pvc}x~l#E zTkdI&SF&s;l6g11H$I%|3zrv~ruUv_#@?4Z?@wT0 z{MB?0w;D4)p51@XwDKjh zc6)sJS5DIvQ~TFe|FFKlCtXur*GsMblluOG{zLwGzt7qJS#dJ_|ATM(^TV{aeAU&K z`}OYn`$$QZLo5~j0s=COpkhJcKw#6dwWse1%C~&ywECXkBrl|JAh0pz^}dE?jt~1< z%>Hb$ezz;}&ARq|pU)l-Ka%D5`$=#7&R@sY=iDs1T@xp~ChOGkybJRCes3;cf1bzw zd0YP7f}gzN=i-mgwSM%~TYhKm%Utd4#}*wY4POrp0hceH+mV~%QhKpgg6WwtSlTK8e7c%T;X2ca?QTvJM-sj=3CxH{rqva z+&(tm^7EXTrn7D+Zhktk`rZ8fb>WAvvG&`1_#n17?UTZCx9Zo|mY&|W?UhUZ-K|OY zE?Mo}w9IIgpf1b*<3+)Re^UN#S{lteI+11@5t?OQ^urR!1F4LE^`#y*J{7mbzin9wcwyZLnRcY$t zQSg@xlooT7pSI7*==3p`-%jQG1w%+{)A$LxttTV|a+ytwMHVV(Z}#!lBr1a?SZvYF_tq&dFx2_VYXb9Fx{xm0A1sTO<^N~Apl23QZL9@ME6~#ijct6Zj{P3V+zr#um$%307pX4fBzH{}{ zlOiFoMKI6QHtl;o(>j0kp2vOCb)Tm9AH3~zcQt?g<9Y1UOc^vUdOP{loL1gnnexeh zUG;~huQ#~7+5c|e^Z14SNk?zI_)whp^R0WG_->f0i zu5@WsN^dY$;}m$XqFKe$^=RV;Ly%|h#c$Bnp6N4zfssjuHzW4vbN$#49w!$(RK70` zKReKL;kDR(cc%O}6<={a{* zR(>e#Ic$C7b>Er*izUA$f4WxR{(Szeul%j-a?NC;9+S~4 z;!kh-5XSsNnPI*Y_m#A+m<$Web1VOB`>8+q=9&Zl{>lB`eR%!O2esd}zrV{-lre#$ z{sPyQ-th1Q>xmKmo0lI5dolgYZ@1m`4psB_-krx2mB4>W<;TmFjZU_Q0=NDCqjM=a7?R(~&rAB)7{*j^kiu?u~O9_wqYhCHdVxaq@B4alh41u3%dz zasSbK={U*as@Gdxeu@=7+_^v3vDo8=x#08N7ww(~7Jl2_5xr7+&$p-M`{T{tD!y2B zw`0m3-G8$mebN3O=gI1Pab8lg40F$kA6Jdb!+Ea9gtb@oO#RGccZ$>FsQ0~@e;x9RO^jd)NRNIuG5gguL;D7q32&LU?^8I)sJ=;K|9e&r?n{Sx7QORd=>LnS zTl#!QDyf^7JC;ai75mm8Yj1U#6GjJePsGHUU5<` z`=W~sjC~1rYJSTePCwVX&1UaX(+S}$7PkZhWaLFORG)h7vX%YgDD;4XWzFteKjXt< z79UuW_xhMkit>~%0)HnSnw@zsTJYxH=_p=J9TUgH9|B>ow!o z9rx%y*tGA-AGLG&lTYrD>(1UGQ0gR-7yZXnT}{Dm@}B!OEDyHNxqD8NuUvkel7J%D zB*j0baczf=bZH-LXc2sFF6_wn#c|n>=ttK%+;9F_WZ8SDQ^sBM(0%b3WwC{VCxiQL z99bOp={@h~`|9tfec2=7w|j50MB;5$>GRp`R^KOiT-h&ulK1G}Tg>N*EsNFb(>x1` zcYnQn?DY1O1TLK&(^s)PVeM$Ix{ z8f#jWE>srk6f#A63KS=C?>`t4qdDJg!zuph9hxIy+z^LhJ@ z>!)8hx^9j6p#$!lEXxJe)fXESKXsa=BfZ@4>^J8LMvwkg=1iO4ooM&1`>CJ!_ohF8 zi%ZP!PT0Nt|4Pj*_Te8q_I)huFPouxUvN>P-rmHYSELoUw7)mCliaiIZ%nUC(Kg}q zTfyzKRBry`*g4^NUr`ZHx`I#o6)si|fd?M0KK*a2zBang`+0p+7^n@>*6`p*g2PI? z-@n%P-1za}@8@qUBJK^!0zbQN?0aGHKL7WO3&-xPri^t`!G4rEH(F@Na10Y23A+wNmMdsEByrOy{J6UrxtX#06;kY*Fr<8d7ss z@v}|IK}#~+r0XR$!)&E*b*1>A>2m^Z@7w(HW$8BKqKuJ*_VHeA;@w?(HCnoBPErYV>#NpbkFTR=*GE2 zYQ`GA#cG~iX%RDCG)?Ku4VHYtD*0?-YO)hwiI18Rv)38xIVY~{%$+CDVBs=pfsG4a zx3Y!8qiF&8egW-*r)Kj$s^gkDZLW3g9M2Q)_dU3mlfT>f<`1`7m4dq!6jscC;4tlC zph?MMmkj+iOeg(>?U+~o|8lSW(cZJ0oF^8uUXe7i$D|X!*!k|~Pd(c0ev^EH!>2spKLIWzK0lV9%)rDBVy+@nd1w$;}V9xY#`9oOkNk>DO`f2Kzgoo|bS4<1C!q zHbJuZ3)h^}kBV8!7`j}i&T#cruw1cja>(w9?@ZoInfua5byjamd#b7_)0B=o`cZ}% z9}E{xxGH*jiSe?DFHACHdPQ7KcsY1(`bC>*b4gEHbjWo{Z_hjDIda)_|MXrtJlUx@ z-neeB&lA~F>vs?0OV+Hv-+EX2{9Cc`FBf9+m8&v(**OFryjAiFapDpBqbaX&;2@}s z7ieMcm5jb75WUy@*!`wv?SZ@?qZgS*Mquool=D z&W-(fFIT_*e(Z>N=8mjKQzVsFi)>z;c>LU2YrZ3Q&pv)W$0#{w=B29}N{@aDjgGpc z;?STh{^jl8v-6f~emETI`Bj^*BINCMp)>2|>vt_}WLqM^pEB+}+C^b4>B0Y56nx zpwrvt=zTmQ*114j^SfYctnO4}g#&pSS4<*jZP=1?>{q7d14|v-nTC%;yf#i)c*4lg zC!$b3Kreji2A4fYy-HSIn3Ai0OKNL@hgRn_H}7tfRkPc2RCJpqm(A@eRejXy;b|Bk zooUOwzjKwK?je<_7X+r7wz_cio^UaosiU39oT?zQRQt~9D;F=Mv`=`}*P*f{ulo`_jBTNeLLBCYRc`zDI4xh z^_5$BP+E{{-W}!_)!%&|&fRqTvAlvq!*{kQ*S9m0eyqPZ%X4Bm-@>k28yCCttXbF9 zw$>&4@HbxV?dJ0D=6?z*4BdL`=8eP@^Od2K{Uijdi;uo*xf`wCcE;-UlUX-TO&81W z?EbstQsDAA=B9goZw-&jpO&5Or+as2Qf{~7J<%1ZTZ7YkG%oi%Gu1Ai*m3d3q%EEe z$})@xKOSrllC*#QW#Q{>3WNPx9sB?&WAbef&Jm z=I@-%XG^M`i?ysCJvqI+Px{M){CTUJ^LJ&u#x_MS!rdnVn0>{TTS&`eraNX%GJEvs;Wm*3M^#If?if= zO+A$&bTTB{-Q7lR{hC+uT&<5zE^$!}p7wTvm{y;dczDa9za2q3Cy%ZQT60qHbW%o# z_^p&wG#D=eSCWP;bx|0|bQzpTA~sN<;Bqs|$Zjo*js zFF0eK_GnAwtCjKlR~76y@!O0eqmO~{o^;03&HL;B{Ve_!?)K0(>Gq+vb>*i-Lc03q z+Lr6w++BC|kZZ1Cv&hu8-oyWm~?gLg^Av0je%b&sdMEwr}Dc*e>6eH#nQ@xX?L2R{}# zuAKF6VdT@@^84SPUmfj}pyw9<=cl%xMdgcK>aRHdee{ufcK`qP>(&n@f4I?YSAVu+ zp{Q5vUeBc2^LFJ=&QPd1({A_qWYmp&2|Q9!g7IIUx6i*TxIv1sPvpzQ6BWCI`f_|b z{*)DoHF}!eN^V`1w$J;;>8oG;(!Xr^SnFLZ5^~`Qr#Y8X&8eF8vi)NHCW5Cwzj&;m z?Aw^O&?hOV?5UmlrKk7Q&IDFfEO$7{+%K7%R=xM>>py3Nrq)XY?&Sa+y@pu zy|)r?PFdTt^7xsO=`Lpi3MVE?A2Ac@bZyvpL222#sH#(!N+TyGb-FBDym#fs()06d zV>eoCT=Qv?#+T@=t9t5O!)BS8Z7nG&QM>#yL~HK37binb`IMa4G|4CZ!6cp?RtW(j zp`qQ~-dc;6hN@m%<*_7)&-L)bpvf!PCg-kN6svndW`=swXCArwf9y-wNppVe7TEKB z?>$$;x_vH-9JNB7Yv`o{;%T_ zP;ijDlCd(u{MEdO4_CV1z7Of^iZV=U+4cYI^=oD+N7_=th5if68U5a}kX>wVUQTfHRh)02zLT~4d6?yS8V{nqrd8qb<( ziZcfh0?A=#6i^wl08A=l;E$S;AX$UMO6;Hl^>8eSJ{Lmo+n=-k!csZna(FwE)|dp{~wCCrxrA zw-&|o{9CIjYgGB`2IJDin;G{ud@V%$9;ACm#)rg zZ;QTHleyL~=~c_D6+T~F{!ZKaI{J|EGC#Q>Ft3vg-kX$s zd$-$4mI{7Q-D={}-lu6UJ?-k&j`zoJ+$){^IM|I(H~iJDhrf@$$yiao$^XnYW~cUyq73 zv%NiA0$0AZ?(VRxJ?*G-n|FWH;n|#v)@g5^nSJ14)pmyL1nDWymnE!~yFK9yiy@Eg zM1#w7t5zw`eYNO}Pk9F0D$5ezsj0?Enpdt|c2k?#b6j$B(#CZuMi;MMEnV=@LG7%_ zOf{>dsi}WgX|H~eax!I?@QdDa=eDeSEy>I(G41ZXYpbNEWky{%*^?W&c9Y1ZLkp8k zuPjQsJ)Wy(Q8itS!g3N$Cky6`RbXV-t2m3&oEv1wwAv50!=Ve`U{30z;C zBED4kbLSSaO3ssN==*PgwJ<+_A{1D>w7}m(=vFIaj`%e05G$ zU-$Cj#eOqv6L0J@7hZgPn)&*Q%<3~?&WYNS`*QOn9B$qJaLMOWv_}6jaowtwCpma$ zmR@R^^=sO$8TIz7bL*2ozDP{9j=t@2b%WR5y6Et;Hy-_wo8G!zf6jJ&&tJW^Z*K&K z_O8DD+t)6yW$VAK(`R`+yF?BZQ8fne=eOm)^OY6k)VK# zyn#m7sugKEPbUhdNp)~;)p>Jtahj3qifu$Y^yA7tleIrw%i?Y)~fqx7{O76h8aM2WsNR|tv{)zZ6u zC{R^oX;#D`Cw(F1E2+{m(r0+xJuz=HzshXBi_c%a7gE}CL46TJ*YO>J;U^V6#FjVZ zf0GNiE@Qg<;GLOsrzc(eyJlzY$C|Q?JlofAOit&WRu`yw(=~bO`FTo?PgVfh=kBu?;X3TK#dMo;al-OR)56xAQrZ4!_r;y>8*Gz3A}tp3y`Fw=udd+A zm)F_^vojw5)N^y1u6<}#RFrXoL+Q%~?qi+jt+l%kFHxFgcR}KFvB=3~xw9wUZFtQw zoma{z#UVtk$Yjm7OvjC{7mG3;{K&}sLGta&f=X5aDW{c!daF4nhj{N2Pg1fex%P7F zu}$`OKHp)SynMx(8NqM2Uf-DfbF=j{eVOWuU$4(G{CzgpQSuhUd)-~H`F5!*iyXQA z)QHQ}m0$H(LeJNb#|q~^E)=(|(LX-PdCxJscQqI0^v$z!-j&)>5zYUS>3;5p81bNs z{QslpEjo0kXx5cp8`m}GvOnB%QdKBZjw=+Kb~eAzLH3x2`8QXt!>mUpY|BZ0DkNPu zBRA+Y16y;HWUnNb@9nZfUfYgGe=FZ=s`hxU)d4e3{TEpuwbni?@R+E2C0Sx-Km>PY z*BU2pv#D1KSiTuNmb@h9f2{0n;CFMOdC7~jq~=)6Jt?s)SE4O1(r1yt;^;*!6Lclp zQfIccT&>EDY@0meLO^)C%k1x(3xn3~un7th)qNcwX1QX?nkZep$yYe8`=1ba9=+{^ z|3_OR3$<>ccews%`q zzp`7-PyG_ddg;}w`|Hokn5C?Uk-EKG&AF}g_TggauIeokH)SYOe*hT;2z2coft(~p?w-hTGAKGKY{le6#eGgCJeoh?ca zC;njKD?DTOpqP6m@1JHKPQFv|2CYUjqpqCsD05TWm7^Y#bt)`qQB`P&cYB7r*1T75 z40x6WCnd@o?eg>KKH=pRxMIzTw!}*=ywqm;9oua+ z>-MZ~Q$u)G$=GblIuO8lgIBWF?_%+kRePSScydiJagyl zOyJ&=Q5)yv<##UiT=DI>n(qL51SMiCA4IP%tww#my{WzG=gr{pV^Qkbo;vK z<`cJFs@^|RpZBW%Z0hy;>~)SIS69S;yD?e&!bInnKRa5_ua&AgYI=X(mALy??rf;O zdu&-$Q)=q*IiH_?ZeMom@scGrmo^su3-)IE>DIu&&Y1lF_X-7l*~QCiPuzC9zg5m% z;Ex^mBc@!rok9POi<(z$F!cKFlyfZn!Dc7M^$TW4 zc|xZ(Ocs0XN?NYFxckM*4Jjeh-7h~4G`@K=Q{qC-F@;@@KEiK3C3VVEA57WkdCexXq!)4Wt$U}!u;JQ?Hs$j8W`N|jC!@Fua&i}`@)&-6P~(NMdvtw&Yh$iZnw|P zJ=VE=uC3DCp3u`aqH%-nI7Bn?p(-{ z__S^A$w*^=``yX6U#~7NmvvJWvc9-seW_DnReCgASm5s>mtA#dXQv*QuYY#*vW~ae ztnhu`j(z*FE>v2(Z+`VNmIa@C_paBwGw<&0jJunbCjXietfv*WHo|D(KMVQ^+)@tPYut0js^)>tFRa&39Qg|Kr`?%flvp zxfcKL_xJx67m|Oz_HnL094{{N&qwqBh3ESWOYYXz$Ar8u5_q_271z<6*DpN2_f8G) zT6Jn_MX`I{Q4!UcxKKII?dD&%&SZFRmr&?Cv0v_;ke>T%^JPnv+)F9~>M!hz^p<%N zk$!d4?Z&e0%yXSpZvF23wCL{}qr!LR#9sP-a^UhX@X+5~ntyzy$E%ys-xi#E@w0?A zsIf-Z;GO8fs+a!fc6#tHb>zOQ{7lwq_xlO*g|UkK&L?YF zl#}{ZVO0z7WT^|2gp&NqI*&{?blJtWk=6HMT2jhq3maaZOFI9Svu!o@ThyN~_hI7} zt_`xblO*3vc*0?OvCKx=Q=)GNo4LvF8ms%#`(CPOFgboRU>>XyBJ)Vms$Fnm?!W|Mt`uYdTdkHg+48{}H$*8*?@L5vxbnl2cI<>!dg&RhJyt$`q}% zdc&dsr$(`ZA;O(nSy~fAoEH`Zx&(c7G0L1ZZOyDnXF_hi%gWEo($Lb>)6)yhxp72g z_Qy41^V<%cUX!5re41?4EaQKb+mD`i>)Ja}@9|5=eS0@ezIxwl-n?gX15_?Fy%S;o zy!At$+P-jBzM|S{K0PMOC1=(vHfQgvd^}yfM}Bwi?Y{VbpYHA2b(h^*DWHIbLjW|~ zsn68(n8RUD?d{k3{mvG@=U86$o;7bRx7JQJjt}+@`wAY{3V(Yp%KNgCUH^~DKJlI> zJJ7=b}@zk1_bJ%QW!jWftw;8vk-rS^6!gg2lUse}CySHBad*;e?o=5Fh4zHYh`rK5LuP+bIvMBs>*Z%** zOR1;d|2nDvT&Dic-tYHn|9*{Mx8DB3XF<7O5zvC9J8Pf-*UbF4ca0xBNDZDbdGeu$g6bktn|No=651@1rg3J<4pH@*l$XmUo}1Cux85lB zV@i9TT3~IWca_!Mo06Avvpk9pnFy;%RTy}hT{zQxgN4^OG_-AB^c5C2HeQF1x-s3X zYm;Ro-L7otid(*H>Fs4%vxN$z?@XL*_+zu;8QlQGLdJ9HLX)TG2J)n(`WW+sc&s=v zjVGb{!K$E6Jy&BPL*1!83)$P3Fr*)v)3hN{pQpWN!QIO{_{p9$+MC`A=sZSLo?_78yET&C@oY~C2)09$^y@vc^^1*6DNuaXK*iDDJ65hXN%(urOZD{ zAKpo~@m*iOwaO~loBKY~@g+*qSFKMe z)t~c}pP&EAt~a0irhc>Y6UHLrG``nbhktBsj{EF?{1xLk*Z=t(V`(MpzwZ`X zYkWO2Hk?S-7Yua#;pv*_b^W))mKUyZM{HS(r)TW+T;eikYudYGC#2P+Ha8lD<+eRl zn-Tpr_)vtXlh?<`-y(Ntd7bObm5W@+slu|MA};caoOIKSD{6ld%)1sViA~ufTL13S z3H_)=d#)ySFlAMc8L6~)R|_g|0LK40$JsrtiJ{}fGrFZw>&_<8xZs`cG(PVV76Fz3Nc zi~SeRT-xUQ?$C*)64P=I_Gfl`E&X%+oR`R-PrSFE?{M7lmUVqt)779E3yqY0dN?jB zmuaP_{`A*6V)Q|HS=*sYX}gTC-Mn)v=Ki%?H*VgX=#_R!bF=oc<4KvJp{KNdiB8ps zSj}P~)VV}A$>5J+;;|sju#EVv20%T z_H(@Nmw%tp{r~nm|FY_Hm49w;D!%sAH0EA+g{AwujrU55)FnRq>i<(Q`p&v>Gw)_5 z{bKp)PH+0%-;4bEBx98F!N0!h_`ce&@_Qdm_P76f=lZ^1tT!yGzMSCJxA}fjeZJ~V zeY;1e`ieND%RVf(0s7#<4toms6H&>bu!P<>*POYXC|eg7TLGi%)t{VS2ny;pcfVlkj z8;hRgm0r(&lG{i4fYdw(+Y_5o4PDoKzpdodaz4@j_BKU_X`I`8rnts29-Fb_3ZF=u zQafj;WXp7(s?(?U6<2$vm^XMQiey(ih-Az(P}ZTTO`5;uP{h4L_TD)*S*qtBDf`cO6n)(8#jMTs=l|R)oAUH+qkitg=#vv_l&)xQ zVM^TJ`JFqG{~ohna$wYlg+qPPB2iJ%)RJI-)yo_Cl<#SZx*yJ(=*uHJk3%c^ zPKl@=@8#P@JQ;D0`FzvG1z4tLzi9fVrjfX@b45mX@jR|~ekUw4rd<^1nK)NeiPLLh zg{k)kHV=pACoH~*y^7HJz9gdM=-%s#yu1&doHV!X-%nRtrKa+W7drx`l7kczr_Thduez}VC`E|ekeAc)7@gV-t z!wZxB|CQg{GyQmv+|SkVcfT&T|6BU>)YaBo!nXuweh^V_f5i=IOffLttLNb8`_A2S z?Z&;|aSHkD&l0c9;S+dpg2A@ssnZW@8C|9a{e{vRtX;0fxzXwo?M_8g_)e&uxZ-w= zIjK4#<=6?XLzZdQ7pJ~`HmgJIsFYflvdVXn7!}6*3yrqNJJ>U&2q)Bs3Qkq?@m(hH z4+wj? zOrG$fF)=7~YT||L!&3VyH$40{$BRE|!qXKSpAkiW6|E9(_~_-E>T-ppGLtl(KfCeHY`?^jmG@sw$U1ZR zNx*lNB>iXSH-5UmV_(D5srnDU@4jvJ?E0rCbM8LAo{=|u$?{V!Ce|nJNp6;ZYCB2aDG9Yp4U6K82j`MpVl1srM=3+z+tnO-X{{?T31v-}%$lT#I z77sbHN1|JK;(-)DqZMZ+%+!n23~4;za?M(FlF3(zf@q%Cj@0wvWp9qU<=Y8dG@KXA?uo~x=t=Iac67iDVnHtft# zdKtm#s-ZSrWMROeNiLznDmEWX4tU+z^QAkQeR^S`K#;Urz7u0p&&|xcEi2nLiQGOT zAvs(8Qm?wzYw2$%XN84@E_V54==u0&ve~jqPUp~x?roEpU#ZQyIIn%`uT}F3;x=5U zi&W-+wl}p>&hU`twaqSq)59h_ez7|3;8Wv2Ded2H<%Vpq>ie}=`s~Bc{2#X-;Ci7J zu`n<7c4Cw1r?+;=zpm8%^{W4UoBiS4`~SZ6uU`M}gzok`GkliSeeAA|t4p1D-AV84 zl)pkx;`Lw~F7E9IZ&hKEu@%VPduXNLWIdN$?w%JuJpXi;Sk2kdv|>fsgodLA6VExM zGe)y6atu=OWHV!w6`uKa%@-^06G{<9r;gc{S(;NELRLsic7<^s$YGFOsC4n*^-|v}OAQ|0T5)Q}B)<9W z8|0RE@K?TL{GjHrZb29GIqv@#Q?pKnY@OkH@sk7NFQ+y=V=>NlpECgmD)dBx*7``< zHP<;$7kROk^*Z0&2`LNwG9G@KsU)MKa{RC1YoiIqkHm}78U#Jg_iytzLQ zU(>mLkZa!A^}iKXtUmBKbjt0BBVNJE>o%B}8Vmf)4)WUc=w!&`iRTX7H56%$TsG75 zSn}F4=MKC{5c6IhEGavKPgjO>wvWGR!-q+{cfF)t^e#C)OfpT5ekro_fW?O%<>;0# zG09E-%myM3^Cdl!47|-7v>)DeIxV*3*o7@jlb7V2KJsaU*o6WE{|`4CI`z7@NMC-C zn%5|CSVdgrq*2?t6(4vM8#~TQsQvlxkZkMoQ)>1!{s0qG9|K12w7o}+^*4lio-z_U z)A`A={Nd6b0rk%(Pns4kS3BLO_jUOy0sZgIJ3`v?-v!E7RK~01sZ1%glwnVd>}nCP zzwT6f?U1GM!P=*Rb#aThzGn2yahCYFO>{}fpS`Mko4;IK|IDYZw zP1byI-KbTse?9KEcjfCluvHh_Qj%eWrWf81(s~Ql&ATkn#UsLUHYMokU#E#1mPB;% zXg|I4zrldxuIg;9Z7Et^v%Hpk?V0Fxv@v+Xl?^Sos>T zRhXN%huY#r_DxB_JB??)^jNmC>;5_krBvm2X0WjUqb(8zoI;&DUw#P*+0wu;=_8Zm z8J^6d%q>eSZuxTwa`PI6SeQ*Uyezp|duCVp(Z(80z0Oyeb7yBcIIta5*`$!C;kGl9 zy^8CE$hAw6k(m=!5;^^6&z^g1Qki@BGL1EcX$$@{e$dR&^2~9Tx7iSsB&M@+b{psP z_0dcAZM~dw#X-t7sHNIteS)Q6?76b{sc{uQ;~Kvvvd{YcD0iOI6(7w#Cvu;+bxxTa zl(9E4U1gd{P;SV3t!ohxMk>aOCzNR2oZ%(ouy*32TWvY7ByA@fe9`OTlsi$Qsiixu zJ4JJfpLCcJ^BNI@V9DDJE4fRUTQfU7qc*wjT+H%Z(899e+kCV0eNE>M-BX*D`9kCV z0m~NK%@fKWzYG?!&C`8gSHZ_!a{JLs?P-tapFHWjfNe)=cY;d-`{8XWr&$*9&-MJE zp*itQ(%C6liBejt^fZgtm;|P~T;RRBP~YY)^S+N3jMF&^gneq9XC!w${3P4Qz3g}i zhd587saNeGe)-*v{+#LNpC&nSc{z7H-r!WVNLEI&2MmCs-WS(n!&fAFmS;YMJI2$yT0u+EeQspv-^uhsq4GS+PNSe5F{7AO*_dSt;F@%)b))@_OSeWLw5!?db8=hAljxkunzLWO`o4e1gjKUn zCLg#b*}3>!^Wo)eFXYZ#%#)Tp-Nj;2d+;lV-0p|@XB*F|Gn8(3^3WCbW-QXYo2q*I zkcsTVqK>p2?Zj6bLl#{BV-KUAi{Ab#HJM`IKLpNySJuQCqoGq6Zh^-gx%+Fn;eevqdd;8YD+j=x#FLv81?TH&b zPxLygmODx^vvkNCGPmkq;a{=N=J6Iu=HF92#O7U1P?=^FzAk$H$pt?ci$gDLyS(w` z7tK3~cV#ZSsbqzOik+Wp`*e=6zoc!}ik3(%9K&--ct~T(4iDS+bA(N9S|%#3yS_=c0&;`#YDXUX;#Gu#}JU=KA~KsG-j51PAV=&z`J5 zwp*X8$h?nH^K9kp+zw9Gb|0RT9%{FwI`4&rE^JMm{4(}HHpA1z^hqM`rYwCmv&3qq zq3>Oj66fm=b5?nU_%_Oa@wsSRa9U%}2FY2ypL{eYzqU1!WUdsK{9zTR5-GyF(ZJd@ zRQ2>D6P61yGuT^Yox}L&W^TB?>B*CD1@1$KOLRm}Zw+h`+|aU!+1DpEQgD^(?UfaW zR-d~SBgR<0`p(2y+pP#a~)YIO&hc7+uMyXd?id1?k+OZ_U_^m9R;7T?KLew$P{KL0Gaa40sZ<;z>o zuNHm3-~CqpGhusc!($GC2eJ$`xnG0tO)b#LjGU>Q5UA+TP%Z~)?kwh7Vf=ilG)+=jOa-e=*&B~3oo)b?V&=G!T z{h&gAQJ<`=VqjC^%w30+jRm>1GNdvicKLN``LO6D%65HQrgWKkd!iKQn=~~x{&joa zEHc)&`Y#gdc--Cf7}s1a{;Ua=8#%=;g?NOhDrfzweJCtnSNo}jUA}6`O4WlYqK8~K zqIbqJw58mvv@eUc(ld|CO(@;`ewv-!{Pzwl5+O(1aPlmk4?f$y^N zvsT_0UBpS+tGon&=_g@G!2e1Q(CCxIjwQ>#IEk{?yhdtXRV(z zm=3iRroNLsc~0z=fyYhD=Tf;Jp3i-9RVJ}7OnLT8$Etl_(*JDz*RSc% z_sVE$ZZ}Y3Q*)WV;<3Pk=V~mw4{BdYNmhJS?DJvU5BsG-W_q9g>vhb#(L3+LWxJh@ zA9wG3c4nr2+&AXSGBWAzuei%xc|%SuHRGGk6vGglcu#fm+p}M*HpPYp$?9@0H969= zBR5S)nfZIj>;OFnP5qKnt0+0PVJQL;(oc^h+RqDP^piA*1Z_Msnpj(y?sE4Xn- znti4HE7!N%w9^F|w;C8cboFm(Y(M)sKIP=zy>o&Oq-?ASYM7L>S4dyCb;nALI%B?9 z&1ZK%Sho6ubeHMurSra6x!m|Kpx)n>@;Q0aZiDUNYnEp|SvK?MwjJ)@9Auwus<`LZ zDz|=~C#PH0<&+M6#zK?rnU35_ps7m+My5Ug1t6*Fl|!X%cu%XuR~hCX@y|D`;Q8;X za_RN`TQdGL)s7jM<*b$rFx|3jnZ=S$Rlkn^`ukq2F%Mf8yR}Ywp`c&wjT77plny(* zY~lDD5bi(cOhwkiQx;Q?oT^=SRK?U+n8|V9qui`jSuZ*l3GDqBEI*g^4V(VglRv8J zwC3L2viO~Y^P>ZeX1>$3w7uGSditbowS?LxTza%^!KEo158D+URkh#$+&_fNb45U4 z#fGOM3q*sMo^LtOv*LoYx6?hgMRv{JVLGQxx|B|>nHj8a@xEkc_wR*`Tjs@m`nBtM ze9VC<0y6HZqSY?Ga+@YHE#%kr5&!aHrv}sByf?=juQzUGimT+PcUY_}I!m>?D zlFgMNH)lxXU0#xVlPf3PBzZ}&S=)JXQ6NlgfFE0DO*A^j>VoMs%w5o21ea6x1Wb~iotL%Zo z1S_7$N`iYtmu03J&GgvFd)#16J&z9CnZ(Y|c7FsX#@u8%dCmK&4M$SbW;Q_E<6 zHqY36SN6fxucJ#r+xJ=;9&mu}$6C{CwMD8NKDj#m>Q#ZdoV)uYGrP zdVKW0#p`sZCMiCUTjTTgLgVzff^V+R=SBtbI4%^=B_xB-g;e2<=kKL};JxZQF#Z~mw;lnOo@jKHlC-?t1 z&vkktn=q+*J+KHH>66hezL;ixr%h&{6%Ri zG7Gz!{8_z=I1R5%FgTgaymL0IoyncN$y`y5*0(rhnbTGaWOzE&vOPC#Fh26vCxv_E z@$vY+V|uiut2_&*`#ug4zkMSJJJoZDn<@c!sZCKiqldP-K`4oU9| zvd(`!so?=f!4$~R1_e_NPR!nYadpJ%X>*K}ZRCt{Z*Fp)GA+Pzk=6#WyfrafUmp0! ztlTFVWRP%H>=UKP!Nt5xzJ5tZM793riH?iK{`2V~3`{9NOGeoq)Q&(kb85;S@&WykJ z`}nF=uP*z~(-MqqX<9g;>R9ITyuXi?Cr(;1{Zm5-*RK`}RhxpZav7o}6eE|0F6HTQ-mUw7Kx79e(~|r*ZjApHT{!gnU!a_Fge9XT6*pscnDi4_s#k%U+b&9%9OmSS6_>U{i zBGLOmlg6BH4zCWj+`NBtn!%ebnzG96tJvKt%q zB(xv;Dahj~kE zkV^fNMaF49>qNsRY<&B+TKfObFW%9wzqNO11z8msM&vRxB?-2A-$=hMa&Y})1N3yo$@VVWq|zntf=$I@UPVb2MtIb07-Qc5>^Ib~*>XEUqkj5S`f zq_m#R;^t1<=I9|YtL>Z0Ri&;>Z?iKtk(!6R)F&-a-@rE^HDcMkjXX2F#Wwp?ux;?u z*~ELO%_)?}?$sh5{!$B`lI@I}4j1%TS_U8L-k`8ui951g#rg}ckm89cf~-6ESj!fl zC_Ny0`(??Z#e26Z-3vX*vnIaV&*I028;^eKm~_m^UC{IFjMDU30{`@H+TLxR^JmFB z8TWfn7VZ?=wyoeD>md)PzrteQw(`#uDA*@lb@$QhbjH1Ijch6K#GAr&H}}{5 ziqn+K3bIaF6^aUH)#q(dj9l@5``O3ozV82-qTgs7_WEQ0|0mB>uhQK!G-s_-5AkhX zR&sjURe{SlmdSoyZT?P=Pw`;WI@XqBm)n-OB^26CHMCGXJV!)S>xs;tH+ycVhiy@~ zv*)0RQ{vY%{W*V4MGyDUp^Hb2ud367iGeC;6( z&ILhSzfKiae9XA_{$5^6-Um;IVT5f>h|i+nbw%GYs(H7HLJEOV%l1XyAqce7v8;~d-qYM)PcMdD=Vv>GLurp zMVt7A3N|guobe`casKi{Yh63n7%qx5GZ2%S8q#&8xye%d&P%bhO}s4aE2Af6ChhC) zoWee>W~=Ps*!Jp2X_Q}T8hP+8Bfu= zVWhTdMc1m6Tm@BPcDWxeJTyMyZMJyliW4D%LIQ4{eg^s0$F?onvTnm!(QoscCO#0B zll5JBxUyuw?<2pfN&hUA*CC4}W>(~WM zI1sQX`P_~lPrlV(xw@4-CA(p|;t~zTH91O}8P^U5OlP=!aYHZ99KpB)|34ge z5e`15e$7w4%>s-N}aSwNhg-@~1e zKNKZwDt#^GtUgmz5 zDiOME`u_a=ikhRpVyjBdtepSnpzihBr*oEGx8G!1@P*@py_-Y9p8W>jTPB~g|NqF@ zYROF<`|59n&f#xYdhecn=y0EHV$RQNsj}~dE8BwX{`Fj5{CZyOy$NcJOfpsyg;^E? z(Mo zZ11@E|8I)dw;fL1#yY*_X_}~vua3M{reZ>a#+q&2k0kT$3!8Ty;(g@(vQqj)TM1up z=mZwWx=zdFNxcfL8K?hz%)hqZ@lyq-T8fol_)6o+ccxW#CsnX)KU%5kCR^D3Vy4HW zqW&Y|5j?E#I?k%A6s5UN4Cr`~c((1w#WN9H2f0?i?3ve7di0UuVZVcOcv_v!41-^W zxQC~^hllG-Z28Hyhk3EoQU{OBo|O@8q1QzIq{nthOjzxl<=i^oz$ZDFU{O&uZLNcTVSe!SuRdyvrGGSwa0Vo8 z+wk~+int6{g7*X6UA>2UyRBl|9PLkGA%VdwsCH3-Iciu-@Q4Ly*|7)pmA+$r_jV*?m5>(oIe?B zuX#}HviEImNCGQ|z=ICQlOJ}b_p55x7oS(=E@QOb_{pQCtAC;#-Y;#xaOKL4_5T?+s0wLXz1wlKTWs&G-;LGRb36Sdtt$g|oJ+Mh*XE$eBCm6d4KMWUpkxu4+<_;uWI=JzVOu2cXzxErS%uI$ffd2@OX0d zW}I5`aq%jx-6mU4Z2FoJS@CU6=JI((HI-Xfl#Gtu?5$;=HGTh1sqnQcHIwBS)OL9A zI2*_<{3JDRo9D{b(|2EJc7~?xY-04~^J$yL%wj9QvR6-xW%||14vPh=n4J7stx_UA zx&v-qxx;4Y=CQbNukf{vsfzXwwf}0VstHcqvZn1<;)jI?b}rm#V#w1Gv{O^%pa^5! zX4Z4<&lu+{Z8%yW{8hbRi)7HvD}{%1r5<)~D7&@AEN}Ji=a2o>gSRblQ)zk{vf%m( zpM@@AsXPLrtp083=6|zF)nkeyTj$(<($Z(yIN|%P?|nh$VNdq7`&OT@)hyV}Z|L0c zUf*&P=RMoPy#GOV@8_RRm@vm~caqGjH94E-9IZZBDByp|KPK(4{PLhzIN-(7mF(ghnDN97c*UyW?pOT znV=#xDZ?eKYsH#K7o)}ohc0i$rUwUjgxJyjv~*Yb93N9sUDiPd&;yYXMEOu zousm0c1oJzU9$;mro`J$uRq3%C4^5|D%m~dj*=Fa$ z#A3lSr{K{^@3?4{xcGk)SG)DgUB7s5*N?5O(%06jw)ZtW_#vNsX^Ccd?BBwVRuen^ zf9(G*?%H)^+C*iydByL3`kw8bZJzsPY3rAJrqR}EeKU-7Vz##$OFdi|>^7|=C!)WI zGxfn8|GH02g?>dbS>F%U|Ec`9Euv1?>+6&5^}CDQ>i-?fxWDtw&ExZLUr9XlZRh+w zb)WA2oW1J2UAhx%=h}atZTa7?{dYlqoy}i~(GMLd)7R;7M;IE=gzWKKP0teE1t4*${J=QC%<0YeG2TkEX!S$1sitSzIRW(&=ntk<~w)Osj5J9=w1yu(wgu0$pxtusv>HR_P2&=0c z6&FwTozvT5xnbtAOo4c<6|Cj@o;R#sS#@ddn8>oOJ6WOW^qEy^%KS+cjB}1$Wr;Co z(EjIOlx4H(xRB_!Gu@esm|7Px?O(Xia;{gqlWQC6Mecvm2SU{+ZO`#@4Gr8sxikOF z=VSMmnsKdp{Y`|!^7hKjQgdwY)PBsHA^T-v|nU_)UD!q=ClU| zWyx3e>b+Vw_wf_Q?@@UP*(oLSnw+extX_S8yLx?o$I&3R2_du8GJ{q`aJ!puJb&D| zB=bN?FN3M#N!Lv>i6N!C5*Bx_QQlghP<)obkInH)MWSU`OfxNZ)( z#&|{M1JebLEq$fAJI@_vyTrgLG^6pTtHEU5e_swphNN%X`Gw)^={q0Z3Ap{bQ0aOw zL~7<|{TqgBrgQg;#C6QrcXPK(aegG@hP*q?zf*z_9xn|~pOE)^_va`9DV^snmBK5^ z+YVH+74N^xH8-Rt=)vp_?Q=C>FP!MKK*jy1%8z{u>Oec_q>WTAZ~F9+U2gs9Wz$n$ zZLG=Rty?DUWp$BlZt?Nv@-w}T}IXUTmnh z`L+F{uv)K-<*S*?=S##{KYFwIJTFI|vP6Bwhw=~7)7~U~ln9VZdfc}C+WS?vD-W_x z|K?XP;mg0T(YKfT&oDFDlPYb%u6lS`Pe)l!%;C$9XZqHzxBGT_|Mjg)4yP(FkN>oB z^Lfk6*t^B-MScB!`+od7t#)MEpU39j+qbo6`&<2=bXkAjf_)F=wXHZ#8TQTmtyp@u z`1}7HXXiUAKlYn`{=YBh{k<}wb?a=Op3**NQGeqF=mC-==U0Pos z;B#TwMO$tEUdO$yXG=uidM*@S@#2A1rQ^;6uPiy+oj2sHOM2DaqsJz&bY{doCMIv` z&#Vdd++r6KOJlE@T>liHw29^Qql}aXYu22y*%W4Qmi4@L=BCG~4DJzXI!@jjW}WX| zGGUU^&z76PSA592bRsG8L?AGTA_gsVLoj&+Cv-QmZqqiGzMubo{p2U}czu2SemC#xT&2C` zciX0YIHBnr7#3)h5tX|m^YJdVgQ`oS%NTYy>RXlN-@TFJcIx!uo$k|n=a{P9+Vo-N z&)45dmL#*AovnZMRMzWlVe+Y%PpcoVO`jjTal3MF6yH52E2|PE zTKe6jOn;VneXw)&p48Kyri;H-ed>H#NyVYzJIl_c!hcS*iJggMY&Gbv=A99-S9Fnf zmSCDd8q@0!m;PL@`+Iu7&G$QtdiWN`NbGg}X|&_|tRwYvD(3%~o<1|d%ZA%UT_z#q zSslxZhn%Oc9T1XIN@PmCKV!R-XKL!sqi-cH&SX@IQj*-k_cl`NR+mqXab`5<>7K~2 zGh2il$^+izDR@d1a|bG<=N{(&pfqFqA`idH=r2(lPR{$=`?dG&p&(|9DW^7F^47OW zzO`gyn3|^ne_LUc$F_e)zPd_h+oHUBX~-lWqR0O>8-h%RE0EyTIx4y0hi# zwR!JeoLR#AV4;)Q)fGa^yaXqjHVHd0&SIWxy>Z5BYst!AtXx(XCN&u@=jr6wBYVQa ze4>m%p7b3y=TJj+*M~2|?pR$vwno5Ym%+^38-I3gG?;w4?3uNH^+eG~ZB4zm*Vpe^ zv}RTO7N@C)jY6HHCN?dZbv*2W&zTo5Q>+;GH?lZB=R0=WN!kAm`$vDy=Z1^so$mbZ z^H6O4i%#p^HFi?A_jKGgozMGsY>#hW&Ed?O#?L-{v)A}I)i=EA_L+vyQv@$vcKQDP ztK98Ba=+%h4Qo2DV{l>!r$$9{K_&}%d|%=ZH`rP#rm4ob;qMh zf{ZJ3aygf+np1qZ)OdB%pD7IO-Pg8VyKi4`{=-9MKZ}nk8(aU+b?hjy_eQl%9FBrYsXS0ay(^oVg+g@grm{oSN9QzM1}IcT;f~Kz*ng_>#M?ogglQK^-7cEpZxz>t zavm1j1uAyisE5vSk^|au?|G2!4}Tv3`MBs8d_wtG1brPrKfD$gh~~ z`E2gx4;rf+ z2LI2!4{Oc)|7m+&^||dwmhC#ee_!3xb#c?qMTgscnVr7uPT}Kt@w*-#r@PwU{XBbl z{+?MZ90fZx^g922U0=WF+pX7K-VG+F)l&InEHq~Nl$Dl#+q+WXUrqdjbMp6j_m{t4 zSN-JS{wnG0tTvw+7Mb_nx2#S(8hVkw?*e;ie*+t zZ!UfQs<-;}WoP|;i_V`cjLbT;{;TfHikn}r_xR=Bh}fR|^OUV_%A=#x{ZD;!@~~lI zso+0Yb;9O+rvZncV9(-aM9e|-;M~m z1*)*bhNiG8?O%0j(M9F9H~BtB%8Nxsm+Q{fkn)e-a51%ElaH2N_OUIS&&|oc$@Yvp zAkuuve)~T@)zxm-OQValJPMw<7Fp?vz5ck#@Z`~HPh5`GJX-nluzQc?`<_fi-k;(> zOsgu6ZViw7@!S4?cD;9x`2K($axMW39@98>yIspY^ZA&4|ArTT<(|H|*35oN0~rOx3Ox=ea$e_g?n~swJlQAjR_L+RW)|lzEbL>L0j6k4>Q#k z%C}1`^b)*!h^wwvXgFF zoY&*l$Yp2>ahSQlYbJV}TJTb4~>xt7lt$!@n{>--Eci)x#KNIgx znyh^J@YAoHwRJp9EF1+-7L*<=*S9!YEgt{>gt=a|i?m5vj%en}+gAm|cWUjP_w&-t z^FR2y^nZW+Sv==D@8|lOr%mn0dU}t&+Gdt8>y&Z-WClh)@$lHvxBKV+c)n|Ewx7+* zDW~=KznYo;PkGz?;(I@%x93D|D=EA`n~S6Gzu~J_WgN_X1xsEm>el;vY5M++b$7Eq z3jRsmT>1H!D|h@mXXCWf$4t+v&oQYDE17UdwI8-JXO)fE*z8u76ua>HH? zrTChMk>BtA-@tWd(b|(jhJm?C$pW3HpGn$^TEFj^>^H|+PVb=8rN(XLOY8sN7Rzc& zS@lRv&V5&;kau=^i250G8yR4 z5{gp~E|onryXiaQR$+_D3j-zhdT%`Dxn+k<+!UW>!ZG(4<&z@i&z%gA{J}rtxsllG zz>t~Wd1W(mZaX!KezmcPSaE9bYui4M|^hqy6`q1W_4-s1~PF)eOP3)B5$$Px& zhmW;di0ht^-;r>W>%f`nTYr1hmd=wpa{t^zVHV3L9shr;rpv$IsP*H-k6hnBS$#U3 zmwDOW)+pTP5O}bn<=%$U+QYl692yvG4{Xu-!F|}EXW6o2g39i3Wj{q(uHWR13|iwH zaiyn@ru$niTccuC@aLxZ{KB5d z?K#QrjWbi0C1(Z&T5qwRrld2w;+N#(MOpGz)4L>9tTF=r8*mCdC{W-LyK~)k+1%aT z7gtP6-^TG+<9bAah|tp-}B?qrmwHd95OmfeJa-7k93gjIU>G$|<-k<`A7vT^Qv}R9Cd@pq@AGJZOQ^{YgLyusB}X51 zh8QiKZKl6yb(WWg%4)?5#*(Qg^S5>0ncB)Hy>3=hym{(6I~HvY<5zZeNsEf+Isf@F zPcw1;$sgM8uT>;?XNR*0ol?-_e7HI8nF(uEnMVXi3TBTW76{6k24oq>EG!+7jouq zZ^h)xFa7fEZ`Kx_3*fjrpYeU<2V2c0>JvlmB|L4qoc!l^%YJ1Yjir#ai}x%|%uT0F z56`)|OH)Ym*3RPNM>;2$zr8opOEob$`EsLkmX?CWJ$H{I!u)nWtk-jVSa>k!{;qZR z6pr01ogJHX$Y#Tzo#9fa&j0+=|L)I6|9xd`oBrH%t-f@3@6*erpXI8ul2fitjsJP= z?DpE9r!t?d+JFClzi8_Z-bwd(yY}{fKi<8MG295c*yUZ55bIyV+|J*E27=#`1vt2$dL%8-I`rhJw?yErTf+Y< zi!T1F)!iU`OvkA6Td>~lKWjD>T}|`!;`J;_c2?|7u=#MjHOF&JQum4G%j#FYF>z-2 zPIJAXsyVAQh&RbV_>p7uG_if#O78zt<33%bb)#u%c(_RIzs>Tq4NFTp(`J24JKJ@+ zgx!0a>yk5DIF;>xzg+FrwLwYeX;mEu$Mn4$qqtpDB29f}?>6Ro#`?Q0rmH~GHIm`h zgsvQxx(z9TrGKa0?YIBy{ z$#nT(g$ajseq^xP@4BlKRIvNHQ{3+*?Dtwqt#`i{HW!hoe`k4oaJW)0-<%3% ziO|L=!JUf|e1$#5{%saZD^IJLT3~s^s-ND@}WIy+R@QGL~y4OxOc!HGE zqDSi1ElMrV=Xv=2$WzF4Q*k^UaIZ8jW|~3dlM@S^S1eiK#UW?A=6bUb*G`QfAzjVp z-mWzkx0LL7%-*x?YrMVil*<|abKbY|G~V@1%ZPdMZb7rwthNbndWE+Oa|=Iwobz&7 z;)2M0KeaAzYb#@w>Zv!lZ#$h1`Lq9|;=NZHj%P~4m9$-Jx(~ceiF`QWqJG5FHoLlq z)6UfTAL-wG@uRTdm+8u1PQ@*l?RxEZzx!_)D=wMqcjc%2dNE^8bL}nh`hJ^99gu@< z7~YGRt%@3?Ym0yMJqyL6% zS>@ANzGeB@H{a&mE%45{z4`l}jKtDVi@TQ&1xJ~!6`22K?)S~|XFtEax$%*{eau6- ztNZ?S&cCX=MpOMQ@1qqAjQ4yy5;&cNC(rCs-X;EuE#~gl!lO4fa7LNGN)wtkf4WYz zVfD2grx^csbsavy?I2@XeeKBO{`sHYaC_%OPfuyJOsYwWYJ0Lo?1UJTsMIuJRWGF? zL){($#XFNECyPd!>vC4|@Hz!}P7J6^oE)L_dA)l4uS@Ccbh_IN1dq1W-I}b{^W)WY zyT5<-h?l*&#lLY!W<&vFvKz1E+bfeFnCs~*W?sqT{p+{%?fBR)Z9;ly1#TYGI9+f? zj&--=UV-U1&J`4J2kYHz&^EvHPeD z)o>LEa<)l-BKEc>KYx+1SK#>vhl8V^yz{&tr^ao4CuT;Id*JjJC*Cg+ma_8VKDo6} z)c!>HhmvL2wp}|Lz3uJo`;*Sy$auzCB2f@3<<&PwOIhOl;*zEh5t2LDZ=dve=>7W7 z(iwkRo-9dAVCvBLc=)CE^|WA>2NsTNoUa=gswF+^@W0djph@MK+gFp>?;d{W(BN}0 z7c4m$I%UGLwh&X6^U|rBcQ-XKKFH#q`Moi?Wzw4$MjBPU0dw|EyDZwS`>09hi@mF@ zh`EKTob}O9Cs(}TK2}r3{_3&Wo%{cG?QA+GAb#$ontpM6$0IW#`Jj`E))U(|=C)fD zOMmm={l8)|Q>H>q$V}rS@6B48bp%;>Kc-oq_6sNzSae8s!<&Cka#ij?(`)O-s;{R$ z3ai!rI4mFg@7ZfY4=tl zJM-n~x`_0r4s&Fb&QzS9=WM6p&~TWkMdN^m!TLpAv$-AS2=Is<;q^3J$rR)0HYsH7 ziXZmpbtDYG&Cs0eo+b5|iTCBH{mh!p>d|&*E@%H)t;R=>7OL? z>#CwA=IVpNq6zM^kDuKmrWqP|#4+XFGDpR#C$Ha6baAVHv{Jl{=bioU8-bfzN; zm9yF7N`JO~|Nk@o>|D)7TDwvMSdBSUI0Eihw=J%IarD0TlxGo|a(U-jYMqL;cN!ey zb9%NTvGm-wH{7?XKRovlC^@%f<%BCcWY~|o1n=Ft^`}E{bkz1#(UlrLag#cQguK|N z2zW%4PJP}MvCY|4A-ZX4g5=kefh{R4#daG^xX)!S;MXuwdz>fqTs)`Kb5Y+0W40#g zf)f9}R|niVo-Db$BZ(#N%EKF5ITkig*qsp8E5_yOlqGS@RCoEzh0)7=MO_0#4wS5T zDBx4uzl$k}v2RPxKX)E=Q@?}PQeE;DiV^n zgAeRrKCt=zfEnbl1|-y8JTa@4vtL`)&U3c>HY2*VPrTRyuFk!2541mw>{7i)>mZ@6QM= z6l0mRY0W}whJ`a$KDshFLBN^O^1ueI)w|Z_z5g@)UdH<##~B*ITc%0cta$b3^Eo~J zUZc}T3?_f_5;)+0qh_VdV^24YuT1K;1RO zO&P3{I+!FBb6;Hvd_K2$Q=6CY+?`Sa)1+Hdn_rX*uMzOL_vpv%cg&xkx_se#KTGp$ z_-(sycZ`<@V@nJUQ?Sl04c%I_cJKDH+1;@om%hK1{3m@FHGhc4^LJefeWou0zA514!L#-74bOkIHfGYCoV3&dR1GG;xfLIhXM|# zs~!4lnDg;*R6)l*WA(Ggp4kcfoBdor+gm1Uar7(KX>BK@vMhG0cQK1rt=HJIrT28& z6Cv$)!VayoyKeK&QnirySjebn``CYerFyAAt31oIiPn}}Li+M2YiECM`Ff>i?)Sn8 zi-Z&oRQCn!Pdu#s!~g%q!_HEi0uNps-n6v){m--dvt~=jS3JDA|L^?Pjof9Jnr zU3KQh=5u!I-}ka`^)WCq$;2-3dA6yXV^)s4J)dElTj!x#ftjspixm&0$Ypdk_+0Dq zj*H!sa%;=2U_Z-sOEh#oKlnFAxG#Ed)#*j5`OA!UwM2dwT6O&=litzI2QoMCERQ%g zwPH`^!&xhI7D;t{-0(?tmA--5BuiGsLVcFgP2U!=OFgdtak-w)WXt@jS5FR_GMhyH zaQalW*(YV6z@kY!{)U}P&+Lk=7T^2tTK)X$i6>sjoVoCP%96`7C!9L0zPx9dflh<= zgpHczj@LTvWf>WdO>Rrgy?yn=`Q>rHo@|{SGSxM=PF3~dqRr>$Z2j)=x@l>)A%_Aou6U3t5NLJr;6E(;q!|^xil?0CQoznj9U=7z&RrC$Vq?4)xL?Vl0L5yJZ(_w zIkADuAJd4BFr{^=L`NIQO_}?+S60!OCDCb}O z?X4{iMMuhmbK@G08{RljtFe8TLu2O=muX!WvQmUwYZCVq|J3>3Bzw%|M(BYfdRkhZ z%C(c9w0bvO4(RIY>hfOnLm=@~@2MGF;v6i^*_?-p*WCFd`OG5RLd;yO@YErpKuL4y zdB%0NE(OIpuUF1|JAMDXj$~FHOG(=m+6S4o{fR7#@bRwL)AdAT-Q>aw7r(d&sCuKGPW{_ow%PwqObSXB1rg&_0l)r%6fFW%Zv zd-&Abv$d0I#T!CmLf4j=mHoK$@5(Aq^`4HsJCn*6nTJ2RFd;I1Zj5mB&r6SV3pdUW zv3fP-^Rl+`{ohW#?v*V1U@U(1+?=Rg#Yb<6HM3Y)Z76%2wdK+|#2_pv<+e)TW$Q`{!$x`i&^auq*z*r!?ZeCfP?;+y*F&*$Zy zhJP$BW2|KG|2Kd4o42RTEoxOx@W~yGHWQGMe9^OpNz);hQ(e04Cf6C6W8O0g9-TS1 zV9t#n@=9}zbPwh&;5fm#apn5zkPl2(boZY+;vJs#@QeSIKM#377&qq<+{!&(&~%}0lX)lV~jdt$et zFU0AC;X18TfzBMU?c%Z4AspA2T1-Eec-yjw*?;L_k85>@rarb<{NUQeLc78qo1BLn z+AVT@vo&X}oAn|0LDZI@XOmkd=xlwsC#~{{bg`|4%%kQD-y5_Gg0nKFWfs;y@AR4z zqcH1u#LwAEj7%&RRtm1i&&{)*_9k|J*26{HW;k|v9X|GOlk|;S6E-TJxb=)r**i@_ zH#+Y9mP_pGcP=@8+0{8~(d}(zw-&9GGM)OuI66_ie0`j%G~@0<5ykb-+>B-_v^T+$ zV2sdogJXsgw*n6=Dt~eI>FZhFOj}GNkLObN~N& z&i(YSSL&*O$mS3CCZ!xU*^wqM6%_EhVXIt8-qyy8PPNXTh5y$Xt~qh%+JQ|oc4gNu zZ(Sxj<@KwL0h8pp(W#5;To%_+H==HU^)~~+_M(gRVJfP+q(PSQ~+m!ZzhC9h^`*rUYB zBHl0f|0mDm2~P;-Xf)oobN|ZTqLa3-I38%NV5)at!t?m%Pi|?c=oL$|?;H`jmoQPN{G`q7 zDG#!jJP$5&m(S!|?zo?`V>jQsIVZQP+zT$g66%_;G33jMghhAwyez)(EE7Dq|IDN$ z!S1f~k%k>hyNW*vb(~mHlvMp^qN+QC4c?`Hc*6j*Hy(|pyjfkAKSszs}2wXw7>;`$tT zBZ+~%bK4HF>7s>9t^9hA?aZf0-!TYpRr(Y%VdLXq$7hGc4sV%zMOw+maqc1QJpRvH zRQonBcQ5SFR=c@luF!q~*B*Tt)#A0{>$!V-78-CB&e4@P{VDIC&b&R7f7k8a;`Z%q zHRJS$pB4(}p7?Y>^{f7t+si=p?9Kpfx1NCS`+wfL#pbRu@r~D``a{lX^Ub~-SY#eh zCMaj}dyC-N?rCp*CMQ+ry^w7IL}?%ztAdc|j+O_f8S$5yND>#JAqO}o|7 zc(v%um&CKPr?0uEt|I-a!EQmm(G*Fy@Z#lW z1qnaDoeP`2BGs9F;^TyWg&T>s!G!TXKgGW8=CdSzPOV zIa@poSt`_aH7;Uhc0M1FCVfG;C)d^GRQLx`!97QVU;bRLRAEGczNbq1q_IFT7#fM48E4IhV_9S!FC4_#gOaS^oT4 z(A%^Aw)dVMy|O0G)gF)5tT>`5W>hfrEo-&{FC|$$|sz;VN#kTtjY5j7e;N5K>VX`bO?me@9+R{zq{t+l*W#B2Or(% zt-FK)^R_*_+^o+zNzFw#m#=R0)p=ciGO~dzV&Usj-2h9 zob+tzl~Q3VujjvBB^iCkIsXvzv0m=?v0pyzYgy9va6a#&HyTrU?DL8~?n~9reaUl0 zMm~oHeAREC7Dpp$fj2AlAYABkn2{>wIcm$MH|LWhN$M7bY`GFyCIXP@vz_dDfDbRwfCI_6dg0Qty&ESfBrbRF{8UjODL}T(4l~9F0WYsy5aZl6r#wwPchFq;b zAr@PYv|MjfP}I1mB>7y!<+Z^3*IKRj-K_3iy?1Ad$B~^E)wE0{(l7EfCwj3P#B6FZ zGw5?_{knL5$j(#$dV^C$n#6mBts-&!9Z7E!*UV|U zW^f_*!L|w0H&`5R%n?0fIn&<9V{f3}njLj3W3&^yRisZ<8at+b2oXB7z)3&gO4JFl zGle<@-oB@ujJ&QLnkb}|IVEFSYx(r}c1P7&OWR^BTMUFs-ERvme_+g&eeRIx!38t? zWMllM8=n5iaPHotoTsw-y+{5o6uaI~aLHd~vB$ig=IP-RR|c;VTU>wo$g2wn>_6#9 z?DG!${O~NF|Ha2CDuV410>-MljpupWXzWbbXZd_G_s%}KyE9mit2U=DU;4ds#-XMi z#X4py)~}x@-&xKiU;I3vKB+1_QpwY!A|oM4Ug5w+rj;32I-j3eHLdgNo|=D;YFo=B z0)k^hEk8UGd{nC>yS4oNJ?pGfUxXL2m%YEUb-D1$3vr36x1?@QEZY$5>8&01^iGrS zkr#K$56m-MqBAF;{j2x;d(%3ue7O;}t1|rW2F~N>SKZlO{`_3qjC9duuG&g3nR_=j z-2HJt8GH|U!Ip!)Ih7j@D`%TK#y{iUYjh-pOV4}pvV)xa0@)erFKRDKE$(LOnHI}w z`B^KWW09cEoWl}=)B7(@3^>{`HDN9L0*)VwNt!c0eog$NF4LrBVwxbZarLg1k0nJq z*MIw5Am}X5ad%_20E4vHLoF^*Ceyo4b6Yv@boB~qD*ACW?cwY%-KnY4#bMCVW^nz% zvR*E?Nq3AKmKd+lxVB(f%PZmL>k||O>VocNnuHw*k-g!+^{&?p73~e>Y*XjYw60Lt zt;k*FIMKQ1rNma}|GtSDiky{9CvRzSxwWOgTrelT>EeUNB`Pw?JNcM*@>m=?@@l!! z!#%=c4HF;6Sl#1`G~y9nl%~`Dx^4BHyi3z6E92JO@Rq%GxLg13ZTCN`AMV{<`lI~x zR`nB>J(t#eZK^oWU2tMj=Hz=Ve|m!R;@DUpGqK&hc3D>T?ZyaknT1)i1pS#+)iMnj zB}`UpDgIzhcj)qXlqc!qqpNmlk-~#*I*I9ya}y{0*mGP`!}HLbDc3bFPEcXIbjC?j z$k|zPi}6wKwmeOn&^GUYmes7!nN}9aKix8Oht5sYr4Q5;Jf0P-<(zNPm(sYazpwXc z=0i29ZHY6T{x^M{7C3bYV_`F=`Wbiir+2&mT=$8Xu6=PQK<;f)ugja%dhXe`IieVRLHsE`?7vb~`p5F1x)fa@T?1zOsodiu<1ZOe-^xbjkZ9^7^OJjN6l& z)uTC=&VIYfYSR|~bzCa#`d{Q0*>tHmG%&bpyeTpA&C)s)RC~)WFaFE?x3129R)rP+ z;`DMAZ*RQoEv}#W;kE5H{kV|(^+%pO_Oq+KvFrM@EAmfjrX_y;R~i1duJ+jmMdzoN zZrn4KG&*zl-TPjxk8-I}*Yz^BWlfS^UAgRbbxlQOX%7p>19yi4@D|Hv4L8rZLeu;< z`mB36EpR2{M%l3Lt%i)vM#3759A^#rLUfD|&*j@O?{Hw5^_7n6W`bS0!q=A^-DR;( zw0Nf#OH9P|$p#Sx&$~aU>6AKou=IA!5ueTQH^J~|S+S-XvDSSpTX2sgui^Ny#Y~L=>plReXw@atUEhXk#n{Pp8K~ci{sUtu6FN9(l@iIt`sp7J9Z$j@vx}$R+eq`fl)fE zyY;M7(`PQff57mh?-EAXSb*a>&u0_YXMU;(Kgv5vE%={b(2j`4Q(6Zt@I#k=ZSWDn1|j9m)-8~c;;7}zTkT>PvDX9 z+_R<&Uvk>*IXS|L%iZ>^u`E$Ue}1^`qbB zai`deKZze*1J>|!`$ni8dD1fLK%RsfoB#S%%Vs{@RW8bGciXq=fXCr7AC?J~6E7|Z zk&sNP6N+#TpVW% z*B;o`=Jb#93kp@#q%c_=G zA%{oPPnNR8_%?{CSWI@g#n&Xv_h;Gzy=4cJi{3p@Tv+FPwI|@lh0ATznm8jvVq7-V zb$XddUR5xX>opfX7CFVpac##LjSZzn!h5)<`H4ze8~oMXUZq{Aw!yhfpkK9l*^JZH z2NVv@F0q>HwY1^cgsBsbJlA{t_nq^bH=1dCsvi~zZ+km;#y6ps-A4m9zx0qh{!mCD z@>j!Uqd9GxANn0UW4d!@rhnFgcUIi@*%k&qoHFOL`S#TeNq0Nhp4l1i%lmyUDcw}u zGQC7qa$acr@x2wYYJ3NsI+8^Xefl-??sPGwggM7G6D*lnEVw3Q#_Y^_`{Ltbe~aW@ zTB}tPE$b26k&Z`qo+%8i~KWp>%O<(T%_4n?UN?d80n{ng1)k2HCn{}N#ybEre zY@3_AIDKAeoz=t+)ra%-eoVKGG5)>hCbK8c)c)UQdG9uDWlXw{xKPPd#_-#|U$0&* zQ;2@r%qgX-tL)CYL1c-P5+hU11IEN@CsHk}7^W|Fb)Oz`rHntSiYK{cvhuTE+}du6 z{SBsB5p3ZGPwyFV>`F-K$Q3yG$Z`A0>D#+SOmmVatl2SBA@0e6|H>tbAs!z@Z8}wc zu*({MnfPYGvc|H-7dTyA-TNw(mT4^PNz8mGu%`cXSDV{Hsc9RYx~3bxSiUHTnal8E zEMrsLl*tY+I)3WUSbfM>Y{ruvo*d$Q+m+a2)?_}&=UBIO!jcx>*{`-KW*3NBtt;Np zk?YXImAK^Gn;ky9J(_`!6cfwXzpyujUk;j37PzAN=C{F| zr%OcUc*p&Dle>JER_WgR`P*9mA-m2AKq6J`e>MRujIqu8~Y?D)%L2Xc+CE^YulVzNlyLFpE>#L zy{A~e{OL^y?Ud- z$i#A@by3!b4i({#``*N?)tqmarcf#VA*uNIsdIK;6&)HD^E5VrH`&X|d}S=QvFO-5 zEoY|Bu}N#g)F#g`$a~Vj_}4_#OnQ$6r%Oh}_R_=A(ZZb0fue`Ew0frGUA9@?TolUM z?`R?#CsC!=_SLSV^vngtzrXq4ghxfitZ`G)I`V#Fg--5-2&35e`+FAW&0llK$ik&W zEWE0K)Bfn8>3z%OG9`;I{ZRb7`t$|fmfd+u(u}qnD>rgFxnAgFY*&SD3@WJNd(m-o%unJpmoQ_GMb?78`oJk0pIQtGoL(KZ81xqrT|sz3&bg z6nk~;a&_h?yliv9LDWhn=;Z>%tIcdvgr=o!YkaD`L_qbzgr2hHE>D(z*d(*(OIzYi zcB$Flu3i@oS^t4Y{LIb?h8x?Xm{+ZKuvV&Ts0>;KYrB;J|9{BQMw z@|C$vy9IeYo3q)bPMcm-#y+`d_AKjfSGQYjWApi>&9TSz&AdgX<)=hCUfVP^2hI0R zHD_fPFSl^qdd7Q~kXN;ry}%;bf3u6&dA~67x;vGzt)4bTMBLrG+qjHLKjzv4V+Ey# z(C}Kbv54yQ_(-&*t3eG)sY+mLDNSo3lP~7+stf{Bh}X?+3zWQWsgVCG zt8naT;Pm9guDZD)o94O*9s6t>VUxV?!>3Dcch6()I?$FN62TT%%#sum%H(xO%3#5l z%k%dv(P;7hEO4^y*yZ&)Rh#p^=W(388X$2_FKo5u$zAy!<=Zy2Ebv>&rnB;p4#!b{ zyTn^3)qSRFoJ!1D)1;Ja!zZ{s)4GKByN@V~d%9D7=EK*#yuUAQV6l}E(W!4*sX60| zLBWFs{PDjQb|rZh^Y}jDo&8F#{@2sH>`^Pl4i+hBq&xNtoH{e{aC_~GJ(t^g)*2cb zwx#%3y?=WB+naoqIjjXYbkvS0Z(IFeKVe_QgewzbmbTgNN>=J9kALpn-cqg>|0KM! z%)?(&YmVNgox(hF%`3eocBr@;O>6tNa#GT*G7X`3?jmYA)tF=JVa+`L)KRw?e0j;RU=ib;{scy8b;JJ~IvZbk&xkqeDHfg3NZ z5>?}I7kSOhn4IeQVZ{qIfncAB3ARRSvX5?(nshiZ^;w=d5;h8N#9XzUbI6f?19YPm-`z|a0onzbv?B$yj0Z#dYP3wh<=}-qWVXHI`O1)arwI&lf7>Dg)Z7HqVJ-( z=Z^~8S+jVH<2>9+v)o?IP-H%5Q~S+T-m3gUgHb29eMOG%j`)S4Yc3_TeUUcH_%c*&XAy=I9L-O8U1tV&XheYkc}jpL@7&(`n;&r@@$e8d}g zILKr2<(Do?R*0P5ZSnfyeSa*Nk#bUMAA4ijBthjRRt?ca&j~;EA$=1d$ zZ2hD2@G6_cHy=(uZqH7<`sCZI?EAO&6+bVFb$91H=G_wXyzZ9LT=yFXo^!rgssC4n zf6AppI&J1hcdfm5`%Gt}t8MfpXP*<^c~LbMf$JHAJ-D-{WK}sa9aEU>cjQswjn!MW zm`pSaa$|Zb9l>x^cv3+tgFWy0e4&>D5rJawIPA@hFJ~UxD*duVO=e?gsOUbSi3Jmv z&FoT1Hxil0l=r){Z<|AsLwCfj>z5v8%w+n1D83rO@X5YrICgOU$5AWIC);#sNfGgv0qG25G$!~1d-}QFJv&n2zK3kx{y5`#<`K-9< zM^mFK{!P)b)LZFi{Ajk~{=aWJcg?>vwW)wVe4eaw+LYAt6B=c8pu3e`4Tdbut$_}RDhdQ&s} zdJYA%omlgDnSR8FDz(e5oZ_k-R)T$t9AjI~!Nvj(YV$RH;&n9lIMS7IYN`1A>W{3; zot`{zF%}Ya6u1`G+Q55)RYh&eC!wE{xc!WDfBm+%n|0-~Pf#lBqv$miO?*>BHuBsx z;O)95JxRCA$79agjk59nK1l~TW={7$sBv`T4uQ~^4bQaWLzYM6iY%^WedI5E*GNO> zw6XhwM#I?)aul@O>iv!dr=`R{vwy5I@j=F%(9&nWCMNvkxy+`-_9#ih;b`RQ^dwC= zXP@mntqKw>(-R%lD;T;a39qSqsFQNo+Vxu0tlRf%lF$CQ<#?QDjX+>(<^Dw{g|n~c z-r7`KzE~$y$(iBB{96;9m-)!V%7p3G&Ax4&tR24o=GN7I(+UfjmKI8WuEj^=K&`TR@bbc8!})C!mTP5hq_J+oxh z(v>ThZk_89PEBul?Ts1c7PV%_0#jEIua7A>2oOXs)w+p-D#SSIaU`+)J9%JQaqU)=ej<0m# z%v`w0KuL(}pnt^Wkh~463NA4k2j(od>r-x8aHz4#t7e`yi*Uw*;905GP26#~K8EgJ_&Y{l8^YfeT zmtF}xGePdM|E5Kz57j5lFIBR8vSG7yk=@zMbrDe-~wx`~z&sNyq+3Nc* zZlO`jr41L>22JxSnOpVfjIqD%LJJ`?-n>GEiF>POZ_8WVtuEvs9WvE@dC%IlYhJLc zUuc{);Uw$xc{|e1{<%#m+T^90Cb9K+ zh+ua*%M6F99+Gpfm~RzwHD2KP<>dm+!yQL?A~`=U;Cbs;x&30tm{!7$hBVQS|Fh z*lxYcXk&_7m?=kns^<)|8%~N%g)4o{^KWkbbN1`s^OlN>9i!b0x;ClS$v8XacdB*PlWmbt z;Erd9pG{)QTXZVBCgD-fvRj<9H;YE79DVTB*2#zM9~7XIg04dDoQ>ru+%o zG;h_4lHD);@>#jno<3XHG1(~JKR&!VbJ9d66ZX$@Hx#gWeOIe`wdsBNy<-gEvhzW0 zFJ!65MYdPb$Ddqj^9d~JpDDTFfOSs9*^XO|0#hD7H_Ob+($v&EmNe5QLGQh|oPFMv zXKQ!!Oy>N}koV%i>E#x2d`hJ)S{i-^DVJ^j&)NLTwL3ub&~%^jclZAH*Po5vUKbsm zKHc#~!>1P?gWck*zqbG8*ErsqG`Y>R?BLJzy&s=Noo-m*zVO8452t3YxV%9%wD#fB z>*4EeDizlI>Ud|)oLTXE?)F;A>DwkcOw>K}O+MrQ<@^8FicEESqCZ<;!6`Q5SKr=c1|_ zyJoJKyYb2?)7i)RW$hBr1jvPO(~YdJUfQ72mMSJmfvLcgh}N9`||f&gZh__dn#(d}(OUV8Oj*{f3?E z*jgpRIBLzEHP1yF=zw4tW)@z!f5OHuLh~G_U7f%-$5msp zXVFrD$Es-`l}#8HuJCrMoy=H%>&oSoBGZc*Sc76>RE&~bHt|T+FfcBDJ?+R;YY|o% zk97w`+nge5rbW*XddK<7$NDzgvNnq%-GvF0T&@cBHw&~dYfbeCJAEKHJVyVKRod6{TH3A@+%VGRu*p@v8nyrRx7+)A zv~P+{H0>#zeQVdex&OU(#EV9mM@g+Qjy|$s;<3Pr+VF>S9PbviSOqTne9cp);2!5n z?n}&d*^JLFDfBEq*0D?Q3b)+M6`_r%zw9{0`>-TB`uL`$+Ovf^dk&qh>e$eGoyU=j z`Lb?EM_%B8gl;A2IU0|Y_(HTVTsU|4tM~ng;Nalcpfw&g(F@8v&TbSwZt^DkLhj-v z7DlCyPAE42zWw4N*THRDzO8+``g*RhZtE&R9dWN%b&h8#N-4&ie5|eF|Eq5uG>rP7 z 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

  • B^tOH+@n}-&_}5Brcq- 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�Z%v1n_xsOF#5YC9Hexs(tf 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

    9mYQ0`JkHM%%*iU3vG=1EZBI*ldH? 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

    *zj{8-F+Q_tv%@XL4O#9E_Zw7>TruIDD`8Z` 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�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

    Y5DSfx^~Ju0UWLO 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

    _zS<cbW z>LxkU99QYOsZ4+RJba0Nmrgu414BY9=m>#=c@0NkV*%Rpl*$%d_f_23G|Bf;s7ArD zz^89+e*QJzU?tC|Bvs2>e&^Co?7j+`^2!chZx+^RJn_rE{Jo{`riRBEs~Y)!s0oes z+Q}u}?Y7^td7`S%oldT)>U;QGw+ig4TpDzFfB34c#_8u||NmU+f4|0gZ`{V$Z;!3H z`t4e}eevg?#m~Pik6ik$RWSUgl1}&Y&h!62z4O$0UtYOBsm)WfO4cUH$8Ej5OX77; z)zFK#zul=zwAi@xh!L}f4$JC-Aj!Y(A#bz<_kO%=w$yi`p>z9XS(iX_CyUdSH+eRm zHE~-zMM?i$=KG}|j6DAMezI}1XEjzwU zr10~R3|F-eIqwU=3SG-}1Yh--2SojKpB9thB6InW{HgQ5E?rhk zHInU4{JhUQtXlMB=$bi?4^2+DmJ$c9}?C7aQXO#uQf23}) zHj4D@3EqBopH%RY=(TB;TmBT+>*l71X_clfii&Z(dFSTCf1d)6d{}?&@7>xNw{?2d z)~@8uxyaNNSA4E`@2Wp{^!@yNdg5!(riyM~^-lcp)8~1=&j{E5o$I$ebzR0;t=GCq z#@*IVMuHR7DxkDcLmTIPLnRmyDE z$F{dVsJc(wVYFw@+=mwRj}|d`TX;>`?hzUFG0e7HDEH{0p0HIb7#B|BRu@eddfzNz zwJ50BPj&U9pebo-nPsX?ZZjWkGWynS;;E^veE9I;J2`<bm2(pzE9bwcnfUo~wA*HCFu4<+C}4v3I9c zT|MD^c-Q7Ox2&(bG{cunm3q8Sb@ir2IkGYJ)#q+6in@CD-n+7;;>Io#k%G$iQZlAy z&k}VgvX_5c-c!%}P9X2Qf%TTErB|me4GUhav(@Wv_)pzm*LHS@@cT?u)ac2%F`+`P z^GoKbTK?HNYbt+U)s76?{&i}JcUOARwntVUKXu-lWK;Ien`I(114Eb+WTS`m*}u=~ zj!0BYy%zd$_wT<||GD(<=yQFx;eWPHr1kCdbNQ>>XT6wu<|NOhTY(4fc*Z)!v~+C{ z)&FyKuB+zTjko$Xd4F+B$uxQ8Z~ynpi4)>#*Vb>$-kDba_u{Hh=lMV1r1$;%d)Y3x zX5m zSPx&*)e`f2Lsx5U(^w;>*YdUd<&(gWvVtRLGX6fugrKT+}eWrXUjo!8B zhuVjD_I)nBr5PWzR{dxCWLE#|`DV??*X;*czdu zbnzeW_e~4E!oG%X+9Odu;br{)AhGl=_eysD-}gcuh3uQPj4PlL6>Mr-vg6Sy zZ}a?pFK^EOyC=%yWz;V$={Ry|;`^tyE0Uy_wkG9<=|nGoyK!R5ro1;* zp{~jy(^fgP2nx2!PSp$QexMn=M8C&bXfOYyiC;tW|1NWB)qLkS)ot7TI|X*!_jDaZ zs?KiedlP!ptNW&smj1zfrI!y<=7~jD1)M%2DgH6h&}&+O)vWxEtJ{q9ugxq!rd7Ut zYNTPX_O%x#ZF@iQnO*u>ZxQKqCB|K2ewy+3?oZpaKS$gT(Pp~4P1tfus6|hyT#eh7 zv-eN#ZCk#5W&z(*+o@gE{&GiFsK&n8dfhK<<9@HQtP3sL-#n@+_TH-U{N64nM#0Ye z?h$5u-+bhs_ink*b$jLYt;&U|9-q9Xzt z)dkkxQC}n!a%NFdlt}h9*FF6@^VbR-pEOe}eX)J&tNjn!S8Ul4r*@U;(AC>-x5YhP zKSN9ASNzqfz9-*ax$IW8`tGKSerfM!o|%5|UFfOx2X?c}dZ%$eZQ}1OJWioLSFal+ zw@!6ile(^zp@UjQMe8x9fs0 zB@eCN248u>%hb1h)m#6I@1C43Tb{RS<&5rd>8lq*7l%&v*|PF>+UsYt`ZjU3Y`*TB z=YO|2?0SLI^s@}JPG+rL^?&QF+|~6djt9He@hv)WOE@}DUt!Iu$E;@*PFUFM%kO?X zKeAqY8QTWU8=F!Vg}hpKELiQ4kG2;3Pf5{bK_8dgn5gr}Tj=P9H?g57yj#Dwzgg)f z;xhHqe>)6+Z{eBT_pR;}Ttrr^%HKQi2xF+o!wasAP+iNdOma0uPSMM(V_4>rbiJ|xZ z-hQ9`dwtTK$9p3!Ol;=Ntl^5Cx^vQ;TP&uH>b=K4yu7S$|NqbW-m?=t!+WpksA*f8 z*d%2~NXS>qwF3UWU_G*pSEn+v@jPdfkR6&CwNybk6wLkb@nT*l&TBWrPgy>TU&LyUn+Fj zZMU>ry1Hu7^IX;9ohn`5+5)C;TK4#tjRpJDN}m@GAIBM$iz%<4dB^yixJ$Mo@9Jwi ze<^IcpHnL)on08Xzo#yyWd5dik56)+J+Uk3WZv@ISzA9voz*g`TpM>?eBS)|mzmm4 zI!$|+r&#uCo}Q)oyTN*;8h=#p=f@XrZ`o&fCF6zp*|O*zr!Iz>7Wy}CDwmfpzwa`? zDrDN0kZ@;pwi&Fvhn~JEvAvtOwO8J~c1P68ol>S|oBM+tvkUB`^n@pzzBjA-sgl21 zfMBE2B+2Mczdx+s>0!I!Qf1ti&Gjo%KKVw^acnVe_k16G@|HrTr&Oi z>J=@br@y@amk}|$&MC^3VX1TYjH{Z>kvCZtw%saJv z9A56)Yo~UycIuiE)n6+VPcK!E46}79O0zw_#o^kzE!Wq?J#IU}5>c|-+uJvLZB@SV zd_yJEKh50jCofO@X{qw()ZUJHOh-4U%Vurm6hHECZALJY%IPk>?qeIbEOp;iDVQnL zWZ1I)U0?;*5j(-Z0q-ZIZ@Hsx{Z4X#}JJ<9pL;0s&nwqkc>R4L!0yTst9;^&iF|MDv z-|b3V*LvrfTp|zmhOFGDHhpFO!*0cj0+pzUk6~(_*$fN}VRGP-o^y4(R%D~dq7Tsala(~j4#X>7D~x?8l=I3{IYbvu9V+Zi&wVaqRs1&FPkc*yUY zQ=_MCM%lUE|E_7*o_syD%WU(Rz-#YJ(qG*2zw5O#a_!V_TViKlxZ>_{DKOwloo-ncZVEmLw{XWV_6aN#R2 z9XbzpY*B5Gxz;Ul^g(dLj9ChmI{k0HSOl*5pkAr1Z>M*ZH?Adh*YuZ#^G{!{7Ll-Y z^Oot&a-C%`Gw*cDg+Rwy6T>3TtQDRjC=?Uy8>(Es`jV&XGS**=S8pXPza5#AcFAI8 zOFrYwU+kSB?i}UsS_J+^6@Hx>6a0CBtJvquzY1^MGYL)JZMLz~^UA6myUVHlNju}K zzVHRk%BpecYm$=I(5UfKI^TM&Yk;Q|2X<~(2>+9H=0rugI$eJ%m}#D zC3@>mp_7}B9kZCV!-*rW;;h5At-J#|@ zd$)PboAs&ghTpqHdI_w_fYAu?_CWtv<$8>6TSMb#HZkF!8)VIbClPV zMY8Nw{j~VaOrLUdF5Ny{AlsGGOFUF{C-o6n{{ z(-lc`rM{JQATOMbo?e(yj${Y#+%JI_MG|dQjvXm{_*>sMsbTgG$f67 z?)o3Jb>8}t9ZeYyQ=mf0N%DM=}@eMj@+BUfM5VoP`B zp1ot?YrepJJOAbA)v1JER6M->MB3#K4>h!Aa;SsjfWlyz`M&%&KWdJ)Td zBlTk4J(u&YG!Sn2%Ca%hLDqcQGG^^{YU_HoM_hY(Dp@=_?uW3b*J|riUsg@#$hDm6 zcRb|j+OX`hb1fOWVqD*^vPl26Z`l{W`kVhX?yuf-{^hiv7pFYSeDnVSlZwl$MWCfU z;DvpR4x-xM_VzKJ{>HQV^`Z6V)B3r7e_iLWYKNJ0&!b7Z1o?xH29^JK9j|Mhy6e#^ z@t(ixo-cL@W&S&qBL6*eqWO{!jvVhp`~L-1g}QF(+jAp(lbLoy zaf{2Z?9SQ0qTY8$e4vKZCX;Jrrk0U*{CC$Ttyc?m{k^Ar+1d~5wKfJ$R_v^r?6o)f z&+KR|(wQByFB2d@xC0Gv26zkwaAXp;uVs)~u^1E_7&LPJBIomcsI5 z0nWi|!|voos&>bTdQF+47R+$sSiZ*8Cs#CXMaoRoa(`!@|MGcks(0OuC;VQn-uIsC zm4=(N|J0d#j9q23A6H>_p+dkk=E90 zw*?A(+IIS(T!?Ms2erCSw;u{u_w9+zceavr>3o!5rP}%;@`ApY z)#GZ(e}BI37JV+b>AIrx$}d0Sw3RZ8ZiKWvpMKr@?X9)jbr)$V9{zjkP*!MRx!~z? z75kKxrHfLwf2rhsA96lj{OeSYuqx-6w)c`7c_eG(gBEXyXn%iMMzZQyd0AN3G!8~p+mCG7mk7~X-eCgD-`T4HDyA(Z({Z;->zSZ4Y91PGo=7St!%O9@G5cLad0R|NW&Ey(I{dz6Zd*BiDi~eVw_daM zrSct4SvAR?Z9kjcn~T{6KPJsA`f0gUU_oljHvbcevvSjl)nej=RHu1%yq6RW<-Kle zC#Pj2WA@<%XQ8RT1 zN7R}>zn-42@JKrL^Lmh5+oqZYRZJg4i;mXC>8^?w_`iGas&3iYJg$~v$v-6z-Hm_p zXRoqGmqSOAK{8w8lbpZ(x;HP1SL;_*2OV(?O6~7?)U4pU!(_A8z1_bjuGzkOikjp8 z0!hgl?nyV6KM;Rx7x1*p*r>x*Ei!F)=w&arrO(byxGlqbjzj!zU$NGQZ#y|AtId5| zIWbt-&;I2ct~aJJol|{&@lXE4FBsx(tO3lvCsS1j+`pO%+w>IEYTp@3Xl5>B)w}J1p zpL=$EH+s7%snY6d*rd0MUfjvx{uw^?$vltss=wwg+|lI`zjx}5@0&dNr|&6xw8QIW z{OVVg?|Hu5TYQ=Iy-Chd({&toKeUz2QQpUWmv_gq$lV69_rI~XhPB)jQkncn&ef*Z zxUYEYmJKV?Pu+MC@rF^@VA0!eW!8d+xyqYLvW`q{U$k-N(d!dLomAEzObFjNyLYu) z-s9jY#ghwe&-HFr-_9C#xHzSML;9(`<&D<^T8d}x0@@iV_aiiAD@^fWVh>h z@7~!=-wvj`PJ)rPaOYqu?Bs*ba>Sv zj_I!!id-&>j2Alfw$&#Y-rq&UQu>nL3feIK>@RPsO8 z*ShmNzr5;v?(|a4OMBhRvp>0%Jtv3WdiV7GTfNRR3a2JHSK8hzjoHK@yM9GW#J!s< z?Q1@D>Uc`M{Qbn{bYHKiXu!Jo7Sa{Y;9i;m*jv_JVSJvn5S@{|brrZmA0h^mMOqyz+DQj>_OK zi|fv5m)$6`UUp3Wc=;sGw!n39`HOTcZXV{IbSPUj&Q)`=Pi|xvU+~K{+F!WkCBsjx znWHY}xvJb{(U~xtsH~sn;6n=-!E@_cyNcA8Eq$|j)%<^*a^ZG+E8p$iJ-u3N$?5MO zT|1Ow(|4qBxCEp|U%x#gkWHX){sQ+MC7c)g72;H%d@Xq&TC`i0TfO$Z&z*U{b#K1f zcXU(Ax$m>SZ8~nb_e$z1^{*ipITc?%Dk#5K7i@dTGq*dr7^=tJy|uJeXW62&@$*Ceb?rftIJXC%#6atbh?SF7BT zlg`d+)0`iDGN(4C+%)*SX?X5cPgM!=;|u5LJ$}CGrf>?8U2VeuXZbD*t!)wTxS_ zi?3|4sx-G*ZRmA$XISg8&QIYU27glL7%T1TdgO3_|2n^}O*_4#=9by!duZGJtU98o z+6AwWqa)-&uu?COwAhQDRyx-&JH zw%uC!n#26frm*}D9b-j_w4e89yfCvnAUDBt;ia7`CLQcde)YB{a7yFXwWkl;Ofh@k z?2(f^^F_uYlb0?=%m3Q_d$@^FXH|IDl=oL>AKrSTY~nOCEhnDP?8nK;*>1;QMIPOv z|K2OmX7)8n@Mwiz|9#iM~-5 zW9PAn^VVKTyZGDgWYDd}E+TJv(gl<@`aS-ivVu?X^xOV2zy1E94-FoiEeF+YPi;WM}%Yez)tc(?8We zv43KrYWUQO^{?EFRMz>girlv9qJ*s6s;r$0FHf?&x~$mlWQ_8slAPA^$w6_SH-x6d zJ`zwb;gH{u^!U({XhI>N z%v|a*g4=T&(Nh&2i{i`ny-;|hGN)+U z#G-GPH)$XHbWY>xBb}|qJLTKUEj6}#PSg3bDe~2O=gz0^j85j+_P#FO|IxH!zDV-* z`s0^8R+JCuLCW5SZ}|5)+!JXcHxjm z>&=Ht7-#=pykT|dmWQ7;maTA#m>4_1cFTuZf{Q+MSH72%3H)cg(p+om!i8;O%2so? zoe2$lVObcIy?O8L#c9tTUY)*otDMXswR;~j4cDHSSZ*Da8ga>}nfKpIvAZv)YHD&V zR7uM$4e#6;RlP6wlFbpLO0&y8yDm+8mTNZKySw{q)!h_N!MugRbk zq3fll`+jGwq8Gcn^RgXbiQQ9*T1E7f&utM@ow}?fz3VKBEt8>Bx5*?;u)7LvR@UN zySwX~yY^LW52G8$))n_0SU9KLMQ*<3>(&P;yrC88Hzuhpi^@?y?;OAC$RFL_>(;`X z_Iqf{XEZwVXD`1ibazjfp`Ns#=7y(%yDo(*2n7ZOZBzBT`SMql{=35M?R$1{Wtes(9QpSRm+M$+0FFs{N6ryliOp1%H-%}as{d~ z*`K$$?KSQfbUyms|5wYh-YNf7&mFthxi!b_)RmvA|2jlNADz=P_L#SaUpG=Ok%<8| z=_>qxOL*(aoi%Iseb~&w{!BQu)zmJ2u45IPoyI%E9sB&IfhcIll`&-V2SI_)C9<(xYYP8Bh1e?pt}kYQ0AK zZjEi~e+8=bFY;B*5xZ2ln4$djGR%t?w22`%dGfcPP(}@U1Qv!yh(pNZ*mu zUmuXQQGF+m%a=PZH>$ec`dfId^O1)Atg;PTEZ^@Dh>7E0UcQ5A-Oe*j4GS(QmP}h! zbg0?qQr;22DTzky#wmHp9%irRPb)~9c=M6nwOD7?^SqO%96Ht!A-HVOobzqd1$%Z} z2%Edd;N@fA{rhEPp4~b%-!ebDbn)a+Uxgmc6^{;C#QgU0Hj-R6HQ4-5edRl+qBkeC zs+OPmxnzcg$lBZ|mAjKK&)gBS_~WCnNmugABPS93h~Kd1co+k(v&-0FtYr|&&>_4bbb z{H;AsfjRveVV#SYOx&Y;xB8RT?_7Tyqa`u-wteboVVF|xqV{{W%k-T;_I{5EblH7( zd1Oa^x12{A?|fESEt%Qx=6_qa+F9z`#FMK%{AT}q^K+^DtCPNar`)-___N1_Z9gvs zU0*3^H2LJ!V0)(5ffLmidHU<$+9PquO1WhQ_spXS>h|8wz2S@FR_r+T-e|KF??JZu z2-Tym`8V9!RO=;ma+kWSTHpD-Lu*Y{t*x$;j-Ki6$T0KPgw1E}PRZR_{CR_<>75T6 z@dd|BZ-@B==G|Xsxj4{#*WGP(TQfaF{nyNVD;cjJbu>3oKH9)+`p-`qq7!}8cIxc* zvfB4D`RTGLd6$BUR|c*RUv*Vyb;}jWoxitD+~mH+W8c3?+jgsOujqO_Z`B_Empt!( zXoY6BsrOI#{YvN8^VoS&pymKOXz-L_k$scSqWAYJ|7)Z!S+bA$s9k4sMZ{=Ki7 zdE?>HQ+tG6C)vn)+MO#{RCKj@&Gx^C<|}RsQQK&I+BW#kMWZt$wS!K76e`(*#&z)Y|S1)Pu6kscg?E4m9_G;2zk=#R{eh2X}1!icx|7m(g z{_^=%DZ5V2`^|NIYU|V2?^ILTLl(uXKHA&&Y3{4vv1vgXU)NnWk#vldm~`pc=>nnl z$pX77?`3Vx-R&#g^ij`c%G9FJPtQ7p=IZ=1m}t_oZ{kgvrI%JqpFGl&)F-MtW%u4Y ze@mX#SIF0IoPO2U;A-rg>z;`hW=DSCXKQgt_{Pg;-j%yon|66E&D=b>!t>apIr_Uc zUiESn^cLA?S$6)xwTr&5IMeMOx4u?=nI*EjOFMH;+wDksy{Xq*gG!x6{?1Ez<$2uJ zW8uS%ADE}jl+ufReE4GCb?Kd)YM<;(SI(a@-OqK-iIX+GU+hdb{iypOe{zxFOXb*e z!ODxf0ne(W%e^^4{Pg|m+1DxsRIasgrF;L+ z(&q`Dc&z8kJfmy2rS&&gUy{mP7$y?!^2c_~vC}WM3hL(k4nF2qxm3l{|I1fo!GJ?UH!$T{@A?Zm`?OZ zJ)NsA^@YE`_ayHKE}i&xU9FvrnVy-OZ^}6q<7U$`ydf>-xWb>k}3&-xLd)`un+s{El^+PoEy0YU}bzLwMyp@3xte`-;0d zHf%a35Ne=bUut!?k8|2ZCO_4kMLnyu_o+P+PMp8J;H%SqV`HuGkF!-cTPH2$3py#@ zt5tjbsJq_ZqDf1WU6qGa{{6h!8r7ZOuQ7di|9RdS!PEY6 z70v2tTa0^``h=yXiU?29(Qnmy7}i|7_KX~V)0Op#TWh||TUOP8pE;-WeD;LfF9bFp%8y#{KRv5P@5c`p&I zscQSK+_Aa(9fV@!2JxOE|Tg0zTa{3P47Hmqyy;V3c!uht@W&b~qV-%eJ8Dk) zggL1s%6?P4@chcF(B-$+Jy}-JSLC~q&s@p2{-JczmEI>!uF`XNO+5ZyW9Bu!xIV3@ zd3AHA#ySY;PrCGdvc|q%&`hfgC?Y<+{HC)~D#b)=uH}^F^(#*&1g^-4jd}9^V?z6p z_^xo#>&@K%xdYc6+$Dc-Xiq_rR6cBXC_*l+Mm? zoaZ`fMYmhmI<_>;+f-wo^|MTK+U=ryPLn%50xQ~1tgCpx;>r|m=NIvl89jB%@?&)6 z8~&|V)NS45DHA&HNBD}T>reU~JLs`I>V3e^pUHX3(>KjnzI37Q(s^4>`A=jFUurd7 zOt{ncnz0c+Faos0F` zF6%FOQGU6w=%sh%`n6wfir4OP@2orD?P0e2{hTM-E1!od7BVm#=wbnl!dUe#j0)5I zH$(4lr0o9_VJG8Xh&%4P9RH-&Uh9mIrqJrANy}#KdC~g2ZraIi*+=WY#pyal{+hTz zZHszmoz4IpZKCgJDm&cD) zMYhh?$4VEz{?m47Qf-yg^2jGoS69^cpP9zDF>H&BoLn9c?@brUt5u69ri!l33(>mj zwKZ#fMwwXToS&Vgs}>3B&RHO+w|v)Kn;4z%oX&3p*XAvcH;+kqRjKOw?XL0mZB==f z(|5UfPOZxQGTCR^-s!Eqb93HLeErLO>ka#h@{iI!D;Ia#OnNV5zir>*ly!TUR9wz% zP!1_fi(Hvv*VyTCSLex5De2limouG0X}kZe3|;+jq2lNK3K#y3clUk}7Y^hVJm|dq zzWK?btD1L@&h=gSG<3qRXKOrJBr$l ze&lT*es>+jT|Z9doYBsG92hiEBU-`Z*|$-eW{n9L==Df(wXcoXI=5(M9FHqt$)|q zmcPHVtMKrV88c>EmOZ(cU-S4vr|}}Y%IEu<^q~`|eip_iw&y4}br+IlrrZ zL;Ci6VRAS8Ah${qIvNAM2kn`}?dk+O9nLwYYtLT^EjQixnx99EkN*|Cc|vsiy|SNYg4M;=-`n$3_;s7n#n@SYzZxH3 ze!ld~^2OmX^_Q;-EAw8gd3kex{ll7j%T;flcxry{+sczW=l{8TIsaGKi^F+;-%Q(@ z|L?_#&dqOAuHSmKI{#kH-6I~Vul43u{@gj=&i?k9u>4<-rrU2lR=e-RYxzHKjW^HT zP@P=#db*vxqFB+yQt`O@e?LA>Kfiso@b-HjTm85A*M6@)Keur0$+q>s?o7Ae|8DL6 z|L^+a^1!j%zz-hYxY(0-_wRwd@pns}tvoJQSCW?W_?oV8@#kW{nKNz}nXYQ>6<&LB z<=XO`yFU+HKl;Z0e*Fpq5bMJoK z`gd{qH=BZrTd|8bCLRx0|Jvt&Hg8w$g{dUzx{h_miD#h>urs-&EWZeE|Qs+b*9bo9fW)0@xcCBIvmzQ6iS&2GbuPm8zb?flcb zJT8wfw)Azne*Np2^0wuA`y;NWEDpc>>nHC`r_C1(v$E|AZ=aq1y!&k4_VV|6`#yXs zwy${hHZAq5dfx9ly}|i^9z1c%)tGPj?d|gTh&R=}-)5`Nugj|1x9Qib=qIh&E(Z&>+klv-uJE4jaGZD?zi=qnTE7fY$x zuBPWn^3T5YJpRu^{y3SP@3uuJ7q_qf_vZP!n&0a7HkEbXO6zajEaskmeX~zUmg&Up zpUZc(**=e6e=gqK)N0Dy%k27lD$OpJN6oI?y!QQvNhfdp+%D#(4GB1B(7wNW`cpsh z&i;S&f8p!t>t*M!=zR9G__F@|f9LO8ep~ze+_od{=ly)#KHp~N-_^7C{rYPE|J9w7 z%lYJgJ$u~VpLunW-PYRk^LB5~-597|cfV?{V1Krp{hzf0EkX0|Y&-3;!pB!~qsp7? zvTuo^#>e~pq}zM1-8u7SjexY9`m55v(f8S&zWw?0U0dhY-s^GsX4hhN<%KTJee?U+ ztJT*`;%g6fNF@E}y8Zsg8&T83hg0YO`|$H-nc2ow*X9-1iT%73v%6^KGy|8sD~+3% zpDUSEY|=KS^xh_+lTDr zud{s3Yk$RuoVO``^`^xA&$-OGmcK5{+s*&}M(Ou;vew(~)O}~(ouY{p)4%ug<+nq(pU?I_+q!O|+B%u&inlu}S1ar6`*kJ$ z@AF$9Ui|XEQ*(RUMEQRodh>32E}C>RL~?q1zHRxs01YYO=xuTHeeM6g{%IqG@`^SFc<;D}Jw{^5v)1*Lmk> z#urxpJLdoV^K2GSFdhIO@qLf~YH9qxQ(vXe>^}E$zTEF?=k7fj+L#t znt9Ict=Z47%&6O&{Af{n##~EFTYWR%yt}2}*Kux4eSU84rtWPA`wI`xaCF zvmocg*5s$7=gyAzdQdvbmnK@jy+oIcGZ2~7XRmb{r6il z@6UhSmYP?#%<|(^+2}v(Hy@X){_tSp%%9hU@7I(ZU$!1pht^upT0Y1Xkk-)^iwpUM01OR@g_n$NQF=XTBgtZ)1M z^Yz`Y?e^-`-?es6Q4Y`l`Q=GP>L>62H|{>Yv+})M<-4Vm*TJwZQj>9j)t&2Wh+|bVuxio0) z9{#sR(sH|Nj{pB^`#x^wpEGm+&#&M1lk4~CJE!;mi2wKZyIl3VKfitTtv-j>uZ!Yl zx@UZ~G}_Mi>$lD4_wD&{n{5>XXt82<)Y^3|Q9BIu86F&7a4CbQv!BIi^83>(n18HL zGCutK#{O#(f1l{SuPisU|NQCW=hgPLhktDqy%@3g-?rO%{~jH=bKY<7&wVkL&*s;= zmE4bCarF3{nwP!dan|<(LCz1;ncB5-?X|rBc3P(y5A1F}!1y8X@pqkqj9vMADqh*w z{BNDUY3ux5WoJ81sI9y8LDTT>_5E||-~UhVI{<1g%i9WAFxbW1YZql<5Xd~cx9o@h zzOVOfKHXh@?)Cjuv-9>P3ZIk!=e7rjnH!lI?(tte_M}2t<@1|)l@G(~{~nrDX>DZG z1~!Xd|0>g zemB==>!o%(3opB5KfCc|&kqL4ySu(WNch4JN<8kYpsB!{SB{(K-QAb_`q;%?EBgKN z?(8c4{3N6Hr(f`|$-VDyKXshFZ?<{do0{3?eaq#0@^4mtmyI^>iTfkw2U)E3f=OaHQW_9Va6UzK=s{b6Rd4JP3w)u3;3|^jY zf1xM;vwFYW{M%cSrMcKaPG@KJbYo0#4W55vSM~qvx7F|V=WqY-V3OV^Z};Ot*u_`{Izetaekj|cmH24d*7KGpMCHCJkT6}f9Jt%zi%Y>+nJVrKWEJU{%-w~o)!6b zw*FsO{eFY*1z-Eh9}8>w<*p?;)jqam=euM3`@y{0`}5}B`T0P(`q}=k5!uJ*&7JKt zd)D)E?d+o#=M@UnA#?##+B_YN=j+3%CPKl}V$>+QMs0y z@qV4D?ssn6tH-y$*=?y$|NCJdJD<$l&TaLzS;C#%#UC!*o$Yh`o2=EQ z_fHmAf0wfeiz%u3eUH7&Pj27$A2WYFi{-C*t5>^_)3Ey2jmh_IHthNCZvOtx?&s^Q zxA|@Jvnl*=G5GfTyQZHn+;i`n`dw=7t$o$+-^oUsUrX<^Df`gbY5Uz*cGvet=gYem zMwi#-p4Y2wz4-I;@p%`vf6A?Iyx3d*?q2ctzO~V6uZ@rQ+mtn@Yjm6Ku=`P;oEnn^8&uz_o zeEU0->$hw!7MHJ``Pg`^Y_z$rjFqXgQ7r=lLjym9jRix3Kt|55SK;~V=i8LMd9vnT zZqn(y)$i|FWUaZfdy7QkmEN0^{cTI%e2GaeIvxJ~?fu{DZi;=8{FXEG-?4kU%kCEc zH=j4>{*LVPe#Lg>hjy#=)js}LUG{d@^Ly?6UAfio?(Z%Ab7tb-?{8|~e7SSx;qU(? zx3}f)_IlNpR`=}16x77*HZv^+x`uz8EyMNxT zzgutbU7!fco(tK(zq`bKxAOYE_Wr)RJJZYexAptIyRq5(wZQi`yRzT^%bz>z#>VRJ z+n(;zdK~@!=H}9OC-dzRMJ9dB{cgv)pl>&9EMQ0d`C~Vo`QPlze%}}zTyDFey#1@n z21c#V%lqa_-hOwb_pfTHa|LV4wuyZg_X_cqYHB$`j=#`felKN^3(tNpOD)0W?^;P?!~zuwlF zrO)=cf4jdm^IP=qZ}2>|6++V+x`QK#7)K4eOJBx`uv)L^Y-;GZrs>*_xqj1~CXw zch(FU`PJE5AN0veAKmEAFJtoD`r}(>e*3C5kuoOswO?Lv=JIUc5>oKw#LJ%-PoCUZ zckRQQiOuYMvbLtiwQoKgbnidY#Fx->hG^_SccN-l%D_Ecg81SNm)8%gbs8%LBJtot$U;Eb7_2FO_^Zvt_@RFJ}*X zAC%7lirF6y3NEY+Y|WCp=jGR^o{6end{1I)+w&Gf`Sj&;J#Wr3v{W?f>Gku;%Kmr8 z`UtDZc_07ds(-^)r@pyRwb#zj(sbGRG9#(O*E|z{PqDmv#@Z~uB@e$n%9D~z~_M#i)HZ45HTG|9jx= z;^T7nKA)JFx={G*MqX+4EvotJ%&k(L?B~sSH+fgmm9(uDpRVL&*L^#A_;}g9^81a< zv-xa3^&UQc?n_l#&hBI{nffn=@703jWiLA&-1zcR>+8qSW%mp#pPgt_j`KF`oooE7 zZJPU*2PJO~9`9$r>2iPHg;UdZKFnQwxm~{Y(sTBU&NtSWf05|RyR)x2`|p*56|TCH zrswBag%v%x@Oamnn~SBlf89Ur<+iiZ$7UVpw@b73`F`=rk{R_$Res(|*4w+DM19@p z_W4X_@V?`3&c0$)wqs>rV0h5X$j`?h!7=Oe=Cuirm(RZ2|KR)wyC%k{TH*9>cenn_ zdoFvw?Ek^$-|ug&2%VuWXaC{C;r71YS7!5GKNhzCbYI@R>IWCwzvoEKw*GqMF}r-# zhl|PLo=rDj-M=QX+*M}#A)nfuqQfl{tD0Qxtr9=^_?$np)lGeSo=pCXf_aydvTjea zvy60KZsy;2Zk`EKORtlq@!j=zyh=V_kUu-W;!k7syPxv&Gji)69GGvvVej)fizmqM&XeYM-$u+gxOC{t znKk>SuB^&__GIRdgHN7BWPf{drlvM&^0m0W`5%N%y=cpgR*zoZfBwszqo2~^|3n>| znp*SjitzE6&98%Jn_qqI|EhY^^;y2_w^r`iF)j1*ifLQ)W_=I^rRTcs3Iz-Y9xOWh z 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 AUjP6A literal 0 HcmV?d00001 diff --git a/docs/screenshots/voice-settings.png b/docs/screenshots/voice-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..06e470ef0653a5e30e0a141314a31f5bf4fe121c GIT binary patch literal 130918 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 JS?83{1OQ(|E*}5@ literal 0 HcmV?d00001 diff --git a/electron/certs.ts b/electron/certs.ts new file mode 100644 index 0000000..fe1057f --- /dev/null +++ b/electron/certs.ts @@ -0,0 +1,39 @@ +import { X509Certificate } from 'node:crypto'; + +export interface CertDetails { + subject: string; + issuer: string; + validFrom: string; + validTo: string; + serialNumber: string; + fingerprint: string; // SHA-1, the hash Mumble uses for users + fingerprint256: string; + subjectAltName: string; + keyType: string; + keyBits: number | null; + ca: boolean; + selfSigned: boolean; + pem: string; +} + +// Plain, IPC-safe summary of a certificate for the viewer +export function describeCert(input: string | Buffer | X509Certificate): CertDetails { + const c = input instanceof X509Certificate ? input : new X509Certificate(input); + const key = c.publicKey; + const d = key.asymmetricKeyDetails; + return { + subject: c.subject, + issuer: c.issuer, + validFrom: new Date(c.validFrom).toISOString(), + validTo: new Date(c.validTo).toISOString(), + serialNumber: c.serialNumber, + fingerprint: c.fingerprint, + fingerprint256: c.fingerprint256, + subjectAltName: c.subjectAltName ?? '', + keyType: key.asymmetricKeyType ?? 'unknown', + keyBits: d?.modulusLength ?? null, + ca: c.ca, + selfSigned: c.checkIssued(c), + pem: c.toString() + }; +} diff --git a/electron/identity-store.ts b/electron/identity-store.ts new file mode 100644 index 0000000..1b26428 --- /dev/null +++ b/electron/identity-store.ts @@ -0,0 +1,161 @@ +import { promises as fs } from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { randomUUID } from 'node:crypto'; +import { generateIdentity, identityFromP12, identityToP12, certCommonName, type Identity } from './identity.ts'; +import { describeCert, type CertDetails } from './certs.ts'; + +export interface StoredIdentity extends Identity { + id: string; + name: string; + createdAt: string; +} + +interface StoreFile { + identities: StoredIdentity[]; + defaultId: string | null; + setupDone: boolean; +} + +export interface IdentitySummary { + id: string; + name: string; + fingerprint: string; + isDefault: boolean; + cert: CertDetails; +} + +// Where the desktop Mumble client (1.5+) keeps its settings, including its certificate +export function mumbleSettingsPaths(): string[] { + const home = os.homedir(); + return [ + path.join(process.env.APPDATA ?? path.join(home, 'AppData', 'Roaming'), 'Mumble', 'Mumble', 'mumble_settings.json'), + path.join(home, 'Library', 'Application Support', 'Mumble', 'Mumble', 'mumble_settings.json'), + path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, '.config'), 'Mumble', 'Mumble', 'mumble_settings.json') + ]; +} + +// Client identities (certificates), stored with owner-only permissions in the app's data folder +export class IdentityStore { + private data: StoreFile | null = null; + private file: string; + private legacyFile: string; + + constructor(dir: string) { + this.file = path.join(dir, 'identities.json'); + this.legacyFile = path.join(dir, 'identity.json'); + } + + private async load(): Promise { + if (this.data) return this.data; + try { + this.data = JSON.parse(await fs.readFile(this.file, 'utf8')) as StoreFile; + } catch { + this.data = { identities: [], defaultId: null, setupDone: false }; + // Earlier versions generated one identity silently; keep it, but still run the setup wizard + try { + const legacy = JSON.parse(await fs.readFile(this.legacyFile, 'utf8')) as Identity; + const id = { ...legacy, id: randomUUID(), name: certCommonName(legacy.certPem) || 'My identity', createdAt: new Date().toISOString() }; + this.data.identities.push(id); + this.data.defaultId = id.id; + await this.save(); + } catch { /* no legacy identity */ } + } + return this.data; + } + + private async save(): Promise { + await fs.writeFile(this.file, JSON.stringify(this.data), { mode: 0o600 }); + } + + private summary(d: StoreFile, i: StoredIdentity): IdentitySummary { + return { id: i.id, name: i.name, fingerprint: i.fingerprint, isDefault: i.id === d.defaultId, cert: describeCert(i.certPem) }; + } + + async list(): Promise<{ identities: IdentitySummary[]; setupDone: boolean }> { + const d = await this.load(); + return { identities: d.identities.map(i => this.summary(d, i)), setupDone: d.setupDone }; + } + + // The identity to connect with: the requested one, else the default, else a new one + async get(id?: string | null): Promise { + const d = await this.load(); + const found = d.identities.find(i => i.id === id) ?? d.identities.find(i => i.id === d.defaultId) ?? d.identities[0]; + if (found) return found; + const created = await this.add(generateIdentity(os.userInfo().username), os.userInfo().username); + return d.identities.find(i => i.id === created.id)!; + } + + private async add(identity: Identity, name: string): Promise { + const d = await this.load(); + const existing = d.identities.find(i => i.fingerprint === identity.fingerprint); + if (existing) throw new Error(`This certificate is already stored as "${existing.name}".`); + const stored: StoredIdentity = { ...identity, id: randomUUID(), name: name.trim() || 'Identity', createdAt: new Date().toISOString() }; + d.identities.push(stored); + d.defaultId ??= stored.id; + await this.save(); + return this.summary(d, stored); + } + + create(name: string, email: string): Promise { + return this.add(generateIdentity(name, email), name); + } + + importP12(bytes: Uint8Array, password: string, name: string): Promise { + const identity = identityFromP12(bytes, password); + return this.add(identity, name || certCommonName(identity.certPem)); + } + + // Finds the desktop client's certificate; returns its name if one exists + async findMumbleCertificate(): Promise<{ path: string; name: string } | null> { + for (const p of mumbleSettingsPaths()) { + try { + const settings = JSON.parse(await fs.readFile(p, 'utf8')); + if (typeof settings.certificate !== 'string' || !settings.certificate) continue; + const identity = identityFromP12(new Uint8Array(Buffer.from(settings.certificate, 'base64')), ''); + return { path: p, name: certCommonName(identity.certPem) || 'Mumble certificate' }; + } catch { /* not there or unreadable */ } + } + return null; + } + + async importFromMumble(name: string): Promise { + const found = await this.findMumbleCertificate(); + if (!found) throw new Error('No certificate from the desktop Mumble client was found.'); + const settings = JSON.parse(await fs.readFile(found.path, 'utf8')); + return this.importP12(new Uint8Array(Buffer.from(settings.certificate, 'base64')), '', name || found.name); + } + + async exportP12(id: string, password: string): Promise<{ bytes: Uint8Array; name: string }> { + const d = await this.load(); + const i = d.identities.find(x => x.id === id); + if (!i) throw new Error('Identity not found.'); + return { bytes: identityToP12(i, password, i.name), name: i.name }; + } + + async setDefault(id: string): Promise { + const d = await this.load(); + if (d.identities.some(i => i.id === id)) d.defaultId = id; + await this.save(); + } + + async rename(id: string, name: string): Promise { + const d = await this.load(); + const i = d.identities.find(x => x.id === id); + if (i && name.trim()) i.name = name.trim(); + await this.save(); + } + + async remove(id: string): Promise { + const d = await this.load(); + d.identities = d.identities.filter(i => i.id !== id); + if (d.defaultId === id) d.defaultId = d.identities[0]?.id ?? null; + await this.save(); + } + + async finishSetup(): Promise { + const d = await this.load(); + d.setupDone = true; + await this.save(); + } +} diff --git a/electron/identity.ts b/electron/identity.ts new file mode 100644 index 0000000..a61a293 --- /dev/null +++ b/electron/identity.ts @@ -0,0 +1,73 @@ +import forge from 'node-forge'; +import { createHash } from 'node:crypto'; + +export interface Identity { + certPem: string; + keyPem: string; + fingerprint: string; +} + +// Self-signed client certificate, the same kind the desktop Mumble client generates. +// Mumble servers identify registered users by the hash of this certificate. +export function generateIdentity(name: string, email = ''): Identity { + const keys = forge.pki.rsa.generateKeyPair({ bits: 2048 }); + const cert = forge.pki.createCertificate(); + cert.publicKey = keys.publicKey; + cert.serialNumber = '01' + forge.util.bytesToHex(forge.random.getBytesSync(8)); + cert.validity.notBefore = new Date(); + cert.validity.notAfter = new Date(); + cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 20); + const attrs: { name: string; value: string }[] = [{ name: 'commonName', value: name || 'mumh5 user' }]; + if (email) attrs.push({ name: 'emailAddress', value: email }); + cert.setSubject(attrs); + cert.setIssuer(attrs); + cert.setExtensions([ + { name: 'basicConstraints', cA: false }, + { name: 'keyUsage', digitalSignature: true, keyEncipherment: true }, + { name: 'extKeyUsage', clientAuth: true } + ]); + cert.sign(keys.privateKey, forge.md.sha256.create()); + const certPem = forge.pki.certificateToPem(cert); + return { certPem, keyPem: forge.pki.privateKeyToPem(keys.privateKey), fingerprint: certFingerprint(certPem) }; +} + +// SHA-1 of the DER certificate, the hash Mumble shows and stores for users. +export function certFingerprint(certPem: string): string { + const der = forge.asn1.toDer(forge.pki.certificateToAsn1(forge.pki.certificateFromPem(certPem))).getBytes(); + return createHash('sha1').update(Buffer.from(der, 'binary')).digest('hex'); +} + +// Read a PKCS#12 file (.p12/.pfx, as exported by the desktop Mumble client). +export function identityFromP12(bytes: Uint8Array, password: string): Identity { + let p12: forge.pkcs12.Pkcs12Pfx; + try { + const der = forge.util.binary.raw.encode(bytes); + p12 = forge.pkcs12.pkcs12FromAsn1(forge.asn1.fromDer(der), password); + } catch { + throw new Error('Could not open the file. Wrong password, or not a PKCS#12 certificate.'); + } + const bags = (type: string) => p12.getBags({ bagType: type })[type] ?? []; + const cert = bags(forge.pki.oids.certBag).find(b => b.cert)?.cert; + const key = [...bags(forge.pki.oids.pkcs8ShroudedKeyBag), ...bags(forge.pki.oids.keyBag)].find(b => b.key)?.key; + if (!cert || !key) throw new Error('The file does not contain both a certificate and its private key.'); + const certPem = forge.pki.certificateToPem(cert); + return { certPem, keyPem: forge.pki.privateKeyToPem(key), fingerprint: certFingerprint(certPem) }; +} + +// PKCS#12 with 3DES, which the desktop Mumble client and other tools can import. +export function identityToP12(id: Identity, password: string, friendlyName: string): Uint8Array { + const asn1 = forge.pkcs12.toPkcs12Asn1( + forge.pki.privateKeyFromPem(id.keyPem), + [forge.pki.certificateFromPem(id.certPem)], + password, + { algorithm: '3des', friendlyName } + ); + return new Uint8Array(Buffer.from(forge.asn1.toDer(asn1).getBytes(), 'binary')); +} + +// Common name of a certificate, used as the default identity name +export function certCommonName(certPem: string): string { + const cn = forge.pki.certificateFromPem(certPem).subject.getField('CN'); + return cn ? String(cn.value) : ''; +} + diff --git a/electron/main.ts b/electron/main.ts new file mode 100644 index 0000000..bd83022 --- /dev/null +++ b/electron/main.ts @@ -0,0 +1,152 @@ +import { app, BrowserWindow, dialog, ipcMain, shell, session, systemPreferences, type WebContents } from 'electron'; +import { promises as fs } from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { IdentityStore } from './identity-store.ts'; +import { describeCert } from './certs.ts'; +import * as tray from './tray.ts'; +import { openTls } from './tls-transport.ts'; + +const devUrl = process.env.VITE_DEV_SERVER_URL; + +let identityStore: IdentityStore | null = null; +const identities = () => (identityStore ??= new IdentityStore(app.getPath('userData'))); + +// ─── Mumble TLS connections, one per renderer request ───────────────────────── + +type Conn = ReturnType & { owner: WebContents }; +const conns = new Map(); + +// ─── Identities (client certificates) ───────────────────────────────────────── + +ipcMain.handle('identities:list', () => identities().list()); +ipcMain.handle('identities:create', (_e, name: string, email: string) => identities().create(String(name), String(email ?? ''))); +ipcMain.handle('identities:import', (_e, bytes: Uint8Array, password: string, name: string) => + identities().importP12(new Uint8Array(bytes), String(password ?? ''), String(name ?? ''))); +ipcMain.handle('identities:findMumble', () => identities().findMumbleCertificate().then(f => f && { name: f.name })); +ipcMain.handle('identities:importMumble', (_e, name: string) => identities().importFromMumble(String(name ?? ''))); +ipcMain.handle('identities:setDefault', (_e, id: string) => identities().setDefault(String(id))); +ipcMain.handle('identities:rename', (_e, id: string, name: string) => identities().rename(String(id), String(name))); +ipcMain.handle('identities:remove', (_e, id: string) => identities().remove(String(id))); +ipcMain.handle('identities:finishSetup', () => identities().finishSetup()); + +// Saves a password-protected .p12 backup where the user chooses; returns the path or null +ipcMain.handle('identities:export', async (e, id: string, password: string) => { + const { bytes, name } = await identities().exportP12(String(id), String(password ?? '')); + const win = BrowserWindow.fromWebContents(e.sender); + const opts = { + title: 'Save identity backup', + defaultPath: path.join(app.getPath('documents'), `${name.replace(/[^\w.-]+/g, '_') || 'identity'}.p12`), + filters: [{ name: 'PKCS#12 certificate', extensions: ['p12', 'pfx'] }] + }; + const res = win ? await dialog.showSaveDialog(win, opts) : await dialog.showSaveDialog(opts); + if (res.canceled || !res.filePath) return null; + await fs.writeFile(res.filePath, bytes, { mode: 0o600 }); + return res.filePath; +}); + +// The renderer picks the connection id and subscribes before calling open, so no event can be missed +ipcMain.handle('mumble:open', async (e, connId: string, host: string, port: number, identityId?: string) => { + if (typeof connId !== 'string' || conns.has(connId)) throw new Error('Invalid connection id'); + const id = await identities().get(identityId); + const owner = e.sender; + const emit = (channel: string, ...args: unknown[]) => { if (!owner.isDestroyed()) owner.send(channel, connId, ...args); }; + const conn = openTls(String(host), Number(port) || 64738, id.certPem, id.keyPem, { + onSecure: info => emit('mumble:secure', info), + onData: chunk => emit('mumble:data', chunk), + onClose: reason => { conns.delete(connId); emit('mumble:close', reason); } + }); + conns.set(connId, Object.assign(conn, { owner })); + owner.once('destroyed', () => conn.close()); +}); + +ipcMain.on('mumble:send', (e, connId: string, bytes: Uint8Array) => { + const conn = conns.get(connId); + if (conn && conn.owner === e.sender) conn.send(bytes); +}); + +ipcMain.on('mumble:close', (e, connId: string) => { + const conn = conns.get(connId); + if (conn && conn.owner === e.sender) conn.close(); +}); + +// Parses DER certificates (e.g. a user's chain from UserStats) for the viewer +ipcMain.handle('certs:describe', (_e, ders: Uint8Array[]) => + (Array.isArray(ders) ? ders.slice(0, 8) : []).flatMap(d => { try { return [describeCert(Buffer.from(d))]; } catch { return []; } })); + +ipcMain.on('tray:update', (_e, state: tray.TrayState) => tray.update(state)); + +ipcMain.handle('platform:info', () => ({ os: process.platform, osVersion: os.release() })); + +// ─── Window ──────────────────────────────────────────────────────────────────── + +let mainWindow: BrowserWindow | null = null; + +function createWindow() { + const win = new BrowserWindow({ + width: 1280, + height: 800, + minWidth: 360, + minHeight: 480, + backgroundColor: '#111214', + title: 'mumh5', + autoHideMenuBar: true, + webPreferences: { + preload: path.join(__dirname, 'preload.cjs'), + contextIsolation: true, + sandbox: true, + nodeIntegration: false, + // Voice must play without a click first + autoplayPolicy: 'no-user-gesture-required', + // Keep audio and timers running at full speed when the window is in the background + backgroundThrottling: false + } + }); + + // Links from chat open in the system browser, never inside the app + win.webContents.setWindowOpenHandler(({ url }) => { + if (/^https?:\/\//i.test(url)) shell.openExternal(url); + return { action: 'deny' }; + }); + win.webContents.on('will-navigate', (e, url) => { + if (devUrl && url.startsWith(devUrl)) return; + e.preventDefault(); + if (/^https?:\/\//i.test(url)) shell.openExternal(url); + }); + + mainWindow = win; + win.on('close', e => { + if (tray.shouldHideOnClose()) { + e.preventDefault(); + win.hide(); + } + }); + win.on('show', () => tray.onWindowVisibility()); + win.on('hide', () => tray.onWindowVisibility()); + win.on('closed', () => { if (mainWindow === win) mainWindow = null; }); + + if (devUrl) win.loadURL(devUrl); + else win.loadFile(path.join(__dirname, '../dist/index.html')); +} + +app.whenReady().then(async () => { + // macOS asks once per app for microphone access + if (process.platform === 'darwin') await systemPreferences.askForMediaAccess('microphone').catch(() => false); + // YouTube refuses embeds without a referrer (error 153); a file:// app sends none + session.defaultSession.webRequest.onBeforeSendHeaders({ urls: ['https://www.youtube-nocookie.com/*'] }, (details, cb) => { + if (!details.requestHeaders.Referer) details.requestHeaders.Referer = 'https://mumh5.app/'; + cb({ requestHeaders: details.requestHeaders }); + }); + + // Microphone, camera and screen capture for voice and video; nothing else + session.defaultSession.setPermissionRequestHandler((_wc, permission, cb) => { + cb(['media', 'display-capture', 'clipboard-sanitized-write', 'notifications'].includes(permission)); + }); + createWindow(); + await tray.setupTray(() => mainWindow, action => mainWindow?.webContents.send('tray:action', action)); + app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) createWindow(); }); +}); + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') app.quit(); +}); diff --git a/electron/preload.ts b/electron/preload.ts new file mode 100644 index 0000000..ad21dc4 --- /dev/null +++ b/electron/preload.ts @@ -0,0 +1,36 @@ +import { contextBridge, ipcRenderer } from 'electron'; + +type Listener = (connId: string, ...args: any[]) => void; +const listeners = { secure: new Set(), data: new Set(), close: new Set() }; +for (const key of Object.keys(listeners) as (keyof typeof listeners)[]) { + ipcRenderer.on(`mumble:${key}`, (_e, connId: string, ...args: any[]) => { + for (const fn of listeners[key]) fn(connId, ...args); + }); +} + +// The only native surface the renderer gets +contextBridge.exposeInMainWorld('mumh5Native', { + platformInfo: () => ipcRenderer.invoke('platform:info'), + updateTray: (state: unknown) => ipcRenderer.send('tray:update', state), + onTrayAction: (fn: (action: string) => void) => { ipcRenderer.on('tray:action', (_e, a: string) => fn(a)); }, + describeCerts: (ders: Uint8Array[]) => ipcRenderer.invoke('certs:describe', ders), + identities: { + list: () => ipcRenderer.invoke('identities:list'), + create: (name: string, email: string) => ipcRenderer.invoke('identities:create', name, email), + importP12: (bytes: Uint8Array, password: string, name: string) => ipcRenderer.invoke('identities:import', bytes, password, name), + findMumble: () => ipcRenderer.invoke('identities:findMumble'), + importMumble: (name: string) => ipcRenderer.invoke('identities:importMumble', name), + exportP12: (id: string, password: string) => ipcRenderer.invoke('identities:export', id, password), + setDefault: (id: string) => ipcRenderer.invoke('identities:setDefault', id), + rename: (id: string, name: string) => ipcRenderer.invoke('identities:rename', id, name), + remove: (id: string) => ipcRenderer.invoke('identities:remove', id), + finishSetup: () => ipcRenderer.invoke('identities:finishSetup') + }, + open: (connId: string, host: string, port: number, identityId?: string) => ipcRenderer.invoke('mumble:open', connId, host, port, identityId), + send: (connId: string, bytes: Uint8Array) => ipcRenderer.send('mumble:send', connId, bytes), + close: (connId: string) => ipcRenderer.send('mumble:close', connId), + on: (event: keyof typeof listeners, fn: Listener) => { + listeners[event].add(fn); + return () => listeners[event].delete(fn); + } +}); diff --git a/electron/tls-transport.ts b/electron/tls-transport.ts new file mode 100644 index 0000000..e9eaf9e --- /dev/null +++ b/electron/tls-transport.ts @@ -0,0 +1,50 @@ +import tls from 'node:tls'; +import { describeCert, type CertDetails } from './certs.ts'; + +export interface TlsHandlers { + onSecure(info: { fingerprint: string; authorized: boolean; authError: string | null; chain: CertDetails[] }): void; + onData(chunk: Uint8Array): void; + onClose(reason: string): void; +} + +// Opens a TLS connection to a Mumble server. Most servers use self-signed certificates, +// so verification is left to the caller (trust on first use via the sha256 fingerprint). +export function openTls(host: string, port: number, cert: string, key: string, h: TlsHandlers) { + let closeReason = 'Connection closed'; + const socket = tls.connect({ + host, port, cert, key, + rejectUnauthorized: false, + servername: /^[\d.:]+$/.test(host) ? undefined : host + }); + socket.setNoDelay(true); + socket.setKeepAlive(true, 30000); + socket.setTimeout(20000, () => { + closeReason = 'Connection timed out'; + socket.destroy(); + }); + socket.on('secureConnect', () => { + socket.setTimeout(0); + // Leaf first, then the issuers the server sent (the root links to itself) + const chain: CertDetails[] = []; + let cur = socket.getPeerCertificate(true) as tls.DetailedPeerCertificate | undefined; + const seen = new Set(); + while (cur?.raw && !seen.has(cur.fingerprint256) && chain.length < 8) { + seen.add(cur.fingerprint256); + chain.push(describeCert(cur.raw)); + cur = cur.issuerCertificate; + } + h.onSecure({ + chain, + fingerprint: chain[0]?.fingerprint256 ?? '', + authorized: socket.authorized, + authError: socket.authorizationError ? String(socket.authorizationError) : null + }); + }); + socket.on('data', (chunk: Buffer) => h.onData(new Uint8Array(chunk))); + socket.on('error', (e: Error) => { closeReason = e.message; }); + socket.on('close', () => h.onClose(closeReason)); + return { + send(bytes: Uint8Array) { if (!socket.destroyed) socket.write(bytes); }, + close() { closeReason = 'Disconnected'; socket.destroy(); } + }; +} diff --git a/electron/tray.ts b/electron/tray.ts new file mode 100644 index 0000000..b4c171a --- /dev/null +++ b/electron/tray.ts @@ -0,0 +1,97 @@ +import { app, BrowserWindow, Menu, Tray, nativeImage } from 'electron'; +import { promises as fs } from 'node:fs'; +import path from 'node:path'; + +// State the renderer reports; the tray mirrors it +export interface TrayState { + icon: string; // PNG data URL drawn by the renderer + tooltip: string; + connected: boolean; + server: string; + muted: boolean; + deafened: boolean; + mode: 'vad' | 'ptt' | 'continuous'; +} + +let tray: Tray | null = null; +let state: TrayState | null = null; +let closeToTray = true; +let quitting = false; +const prefsFile = () => path.join(app.getPath('userData'), 'tray.json'); + +export async function setupTray(getWindow: () => BrowserWindow | null, send: (action: string) => void): Promise { + try { closeToTray = JSON.parse(await fs.readFile(prefsFile(), 'utf8')).closeToTray !== false; } catch { /* defaults */ } + + const show = () => { + const win = getWindow(); + if (!win) return; + if (win.isMinimized()) win.restore(); + win.show(); + win.focus(); + }; + + const rebuild = () => { + if (!tray || !state) return; + const win = getWindow(); + const s = state; + const menu = Menu.buildFromTemplate([ + { label: win?.isVisible() ? 'Hide mumh5' : 'Show mumh5', click: () => (win?.isVisible() ? win.hide() : show()) }, + { type: 'separator' }, + { label: s.connected ? `Connected: ${s.server}` : 'Not connected', enabled: false }, + { label: 'Mute', type: 'checkbox', checked: s.muted, enabled: s.connected, click: () => send('toggle-mute') }, + { label: 'Deafen', type: 'checkbox', checked: s.deafened, enabled: s.connected, click: () => send('toggle-deafen') }, + { + label: 'Transmit', submenu: [ + { label: 'Voice activity', type: 'radio', checked: s.mode === 'vad', click: () => send('mode:vad') }, + { label: 'Push to talk', type: 'radio', checked: s.mode === 'ptt', click: () => send('mode:ptt') }, + { label: 'Always on', type: 'radio', checked: s.mode === 'continuous', click: () => send('mode:continuous') } + ] + }, + { label: 'Voice settings...', click: () => { show(); send('settings'); } }, + { label: 'Disconnect', enabled: s.connected, click: () => send('disconnect') }, + { type: 'separator' }, + { + label: 'Close to tray', type: 'checkbox', checked: closeToTray, click: item => { + closeToTray = item.checked; + fs.writeFile(prefsFile(), JSON.stringify({ closeToTray })).catch(() => {}); + } + }, + { label: 'Quit mumh5', click: () => { quitting = true; app.quit(); } } + ]); + tray.setContextMenu(menu); + // Inspection hook for the end-to-end tests (tray menus cannot be clicked by automation) + (globalThis as any).__mumh5Tray = { + state: { ...s, icon: s.icon.slice(0, 22) }, + tooltip: s.tooltip, + items: menu.items.map(i => ({ label: i.label, checked: i.checked, enabled: i.enabled })), + click: (label: string) => { const item = menu.items.find(i => i.label === label); item?.click(undefined, getWindow() ?? undefined, getWindow()?.webContents); } + }; + }; + + app.on('before-quit', () => { quitting = true; }); + + // Called for every state change from the renderer + update = (next: TrayState) => { + state = next; + const image = nativeImage.createFromDataURL(next.icon); + if (!tray) { + tray = new Tray(image); + tray.on('click', show); + } else { + tray.setImage(image); + } + tray.setToolTip(next.tooltip); + rebuild(); + }; + + // Keep the Show/Hide label right + onWindowVisibility = rebuild; +} + +export let update: (s: TrayState) => void = () => {}; +export let onWindowVisibility: () => void = () => {}; + +// Closing the window hides it while the tray is there, unless the user quits +export function shouldHideOnClose(): boolean { + return !!tray && closeToTray && !quitting && process.platform !== 'darwin'; +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..57d7b98 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + mumh5 + + +
    + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4bcc2fe --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5823 @@ +{ + "name": "mumh5", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mumh5", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "dompurify": "^3.4.16", + "node-forge": "^1.4.0", + "protobufjs": "^8.8.0" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^7.3.1", + "@tsconfig/svelte": "^5.0.8", + "@types/node": "^26.6.3", + "@types/node-forge": "^1.3.14", + "electron": "^44.5.1", + "electron-builder": "^26.15.3", + "esbuild": "^0.28.2", + "playwright-core": "^1.63.0", + "protobufjs-cli": "^2.7.0", + "svelte": "^5.57.1", + "svelte-check": "^4.7.6", + "typescript": "^6.0.3", + "vite": "^8.3.1" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@electron-internal/extract-zip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.5.tgz", + "integrity": "sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/get": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz", + "integrity": "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", + "progress": "^2.0.3", + "semver": "^7.6.3", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "optionalDependencies": { + "undici": "^7.24.4" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.2.0.tgz", + "integrity": "sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz", + "integrity": "sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz", + "integrity": "sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.12.tgz", + "integrity": "sha512-TuB0x50EoAvEX/UEWITd8Mkn3WhiTjSvbTMCLj0BhsQEl5iUzjXdA0bETEVpTk+5TGTLR6QktI9H4hLviVeaAQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.18.1" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@noble/hashes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.152.0.tgz", + "integrity": "sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.10.0.tgz", + "integrity": "sha512-GhokD41lV4gQrrLYm3wCkHfBOnJrnhDMgt4XeMW8gzfE1UdJqIuSwsE+ggf82XBjUXRJylcm+KIGQFa4utIVLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.12.tgz", + "integrity": "sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.12.tgz", + "integrity": "sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.12.tgz", + "integrity": "sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.12.tgz", + "integrity": "sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.12.tgz", + "integrity": "sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.12.tgz", + "integrity": "sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.12.tgz", + "integrity": "sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.12.tgz", + "integrity": "sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.12.tgz", + "integrity": "sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.12.tgz", + "integrity": "sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.12.tgz", + "integrity": "sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.12.tgz", + "integrity": "sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.12.tgz", + "integrity": "sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.12.tgz", + "integrity": "sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.12.tgz", + "integrity": "sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.13.tgz", + "integrity": "sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/load-config": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@sveltejs/load-config/-/load-config-0.2.3.tgz", + "integrity": "sha512-VT3qmUb8pRV2QrZjd8iAmtg8lf4W0TIjZbvXtz5MKei/q96teWZgGJyyidJzOjzZzvdq616eSRVeMYIQChUTAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-7.3.1.tgz", + "integrity": "sha512-ZPsLN8B1e/En+Ak5s4V7srFDT532oS0qieLsQwu63NGKsS+iAjoO2Js1BochlHlglcU+Pt7WAO3C5Ee+4f6gVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1", + "magic-string": "^1.0.0", + "obug": "^2.1.0", + "vitefu": "^1.1.2" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.46.4", + "vite": "^8.0.0-beta.7 || ^8.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.8.tgz", + "integrity": "sha512-UkNnw1/oFEfecR8ypyHIQuWYdkPvHiwcQ78sh+ymIiYoF+uc5H1UBetbjyqT+vgGJ3qQN6nhucJviX6HesWtKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.9.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz", + "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-lib": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.3.tgz", + "integrity": "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.4", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@noble/hashes": "^2.2.0", + "@peculiar/webcrypto": "^1.7.1", + "@types/fs-extra": "9.0.13", + "ajv": "^8.18.0", + "asn1js": "^3.0.10", + "async-exit-hook": "^2.0.1", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.15.3", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.2.5", + "pkijs": "^3.4.0", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", + "which": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.15.3", + "electron-builder-squirrel-windows": "26.15.3" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/app-builder-lib/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz", + "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/devalue": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.4.tgz", + "integrity": "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.3.tgz", + "integrity": "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0" + } + }, + "node_modules/dompurify": { + "version": "3.4.16", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.16.tgz", + "integrity": "sha512-sqo+pNp3qRhCIpbgRi1y8Tgk27Bo2Ry7w0dC1NBeNTdZChWjz9Xb/KOoZbRP/R6pQZ80Qw8YhXw13hWWBbMRnQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "44.5.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-44.5.1.tgz", + "integrity": "sha512-lx7AYoFIiyvEvgvpyWO9kOC60xtNPpiPZAth6Fmg9NutzpCAMLwpUlaBY2EXfZyIgUdzEmLMj9KvK0Vrokl1yQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-internal/extract-zip": "^1.0.1", + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0" + }, + "bin": { + "electron": "cli.js", + "install-electron": "install.js" + }, + "engines": { + "node": ">= 22.12.0" + } + }, + "node_modules/electron-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.3.tgz", + "integrity": "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.15.3", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.15.3.tgz", + "integrity": "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-publish": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz", + "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "aws4": "^1.13.2", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "24.19.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.0.tgz", + "integrity": "sha512-zY+5tKxXdhGh1PYI0ac+7juvEu4OI6vWtVVoj5i2m42jxAY1U+zHGt6QCyOFwykdP62sM3MJ9stoYYUw5aCWew==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/electron/node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrap": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.4.0.tgz", + "integrity": "sha512-CQPcneEHw/czj32uwQC52nYnax8H4SXt25FCM+LIwGZ49cMIxpOj3bP8wmzcI+Z0HIy5KkClaPhRLfCySzwHPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "peerDependencies": { + "@typescript-eslint/types": "^8.2.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/types": { + "optional": true + } + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.5.tgz", + "integrity": "sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdoc/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/linkify-it": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz", + "integrity": "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" + } + }, + "node_modules/markdown-it": { + "version": "14.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.2.tgz", + "integrity": "sha512-sHHjZ5fJKlgrG4qns2YwVcdNep35h5fERrfkD2YNsb9UFk0UIHarbiTaHKVMlPuWAoiilyK8Fv/jAm11slsY7Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdurl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-abi": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.35.0.tgz", + "integrity": "sha512-ymk4aIzxdPopw2giv8Fs1Ec6vybGkjmyxUwVqhkI4MCy2tVfXdkOGGWieWVjL0THgH+7a8lRdevyupoYj3Js/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-forge": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/undici": { + "version": "6.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.29.0.tgz", + "integrity": "sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/obug": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkijs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.1.tgz", + "integrity": "sha512-Oo/NZcSWccq8KyoG7gLE9fnltgHns+pNCjCAp/WmjsUySi+sX7y4z4Xqu4fVb42CDHzRPl33fjzT15V1wvcyhA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "website" + ], + "dependencies": { + "@noble/hashes": "1.8.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/playwright-core": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", + "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/protobufjs": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.8.0.tgz", + "integrity": "sha512-N3xhQ5yyBx3vQq4gubBfASzYhJGNzeDbjqBpu61g7UVylsN/qyffU96TKWD3GbbLOKF82VGNRNvv1+BFgE31Eg==", + "license": "BSD-3-Clause", + "dependencies": { + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs-cli": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-2.7.0.tgz", + "integrity": "sha512-wjrZPibf/U73dDJMh9jCqjyeDH7t6+OMD16vKp/Z1CY7yyVE/pX5a9EvCq89p3ADHo+KyaLknA5lxyaaM252KA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "escodegen": "^2.0.0", + "espree": "^9.6.1", + "estraverse": "^5.1.0", + "glob": "^8.1.0", + "jsdoc": "^4.0.5", + "minimist": "^1.2.8", + "tmp": "^0.2.7" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts", + "protoc-gen-pbjs": "bin/protoc-gen-pbjs" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "protobufjs": "^8.8.0" + } + }, + "node_modules/protobufjs-cli/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/protobufjs-cli/node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/protobufjs-cli/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/protobufjs-cli/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz", + "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rolldown": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.12.tgz", + "integrity": "sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.152.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.12", + "@rolldown/binding-android-arm64": "1.2.12", + "@rolldown/binding-darwin-arm64": "1.2.12", + "@rolldown/binding-darwin-x64": "1.2.12", + "@rolldown/binding-freebsd-x64": "1.2.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.12", + "@rolldown/binding-linux-arm64-gnu": "1.2.12", + "@rolldown/binding-linux-arm64-musl": "1.2.12", + "@rolldown/binding-linux-ppc64-gnu": "1.2.12", + "@rolldown/binding-linux-s390x-gnu": "1.2.12", + "@rolldown/binding-linux-x64-gnu": "1.2.12", + "@rolldown/binding-linux-x64-musl": "1.2.12", + "@rolldown/binding-openharmony-arm64": "1.2.12", + "@rolldown/binding-win32-arm64-msvc": "1.2.12", + "@rolldown/binding-win32-x64-msvc": "1.2.12" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svelte": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.57.1.tgz", + "integrity": "sha512-Uqj49lWKB+iSSnneuwiYYJ7MZgkB+eXr0LXBhv4uDuAkXqnWmq65Sxflfvp0Lc6MdKjMUxGaeOKWJqz5SNiVIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "@jridgewell/sourcemap-codec": "^1.6.0", + "@sveltejs/acorn-typescript": "^1.0.13", + "@types/estree": "^1.0.9", + "acorn": "^8.18.0", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.9.2", + "esm-env": "^1.2.1", + "esrap": "^2.3.6", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.7.6.tgz", + "integrity": "sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "@sveltejs/load-config": "^0.2.3", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/svelte/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.0.tgz", + "integrity": "sha512-dkrQXeHSaoamnItlYbmzG0wFYrM0ZwDxCIg0A7aKjTyyhh9svRzCNFEzV+Vm05/yehjCzjDZ31KXfGEjYSztDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unzipper": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz", + "integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "11.3.1", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz", + "integrity": "sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.9", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.7.1", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.5.tgz", + "integrity": "sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..51e3272 --- /dev/null +++ b/package.json @@ -0,0 +1,89 @@ +{ + "name": "mumh5", + "productName": "mumh5", + "version": "0.1.0", + "description": "Modern Mumble client with rich chat, file sharing and video", + "license": "MIT", + "type": "module", + "main": "dist-electron/main.cjs", + "scripts": { + "dev": "node scripts/dev.mjs", + "build": "vite build && node scripts/build-electron.mjs", + "build:web": "vite build --mode web --outDir dist-web", + "check": "svelte-check --tsconfig ./tsconfig.json", + "test": "node --test test/*.test.ts", + "dist": "npm run build && electron-builder", + "dist:linux": "npm run build && electron-builder --linux", + "dist:win": "npm run build && electron-builder --win", + "dist:mac": "npm run build && electron-builder --mac", + "test:e2e": "node test/e2e/app.e2e.ts", + "proto": "pbjs -t static-module -w es6 --keep-case --no-delimited --no-service --no-comments --force-number proto/Mumble.proto -o src/core/mumble-pb.js && pbjs -t static-module -w es6 --keep-case --no-delimited --no-service --no-comments --force-number proto/MumbleUDP.proto -o src/core/mumble-udp-pb.js", + "screenshots": "node test/e2e/screenshots.ts" + }, + "build": { + "appId": "dev.f0ck.mumh5", + "productName": "mumh5", + "files": [ + "dist/**", + "dist-electron/**", + "package.json", + "LICENSE", + "THIRD_PARTY_NOTICES.md" + ], + "directories": { + "output": "release" + }, + "linux": { + "target": [ + "AppImage", + "deb" + ], + "category": "Network" + }, + "win": { + "target": [ + "nsis" + ] + }, + "mac": { + "target": [ + "dmg" + ], + "category": "public.app-category.social-networking", + "extendInfo": { + "NSMicrophoneUsageDescription": "mumh5 uses the microphone for voice chat.", + "NSCameraUsageDescription": "mumh5 uses the camera for video chat." + } + } + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^7.3.1", + "@tsconfig/svelte": "^5.0.8", + "@types/node": "^26.6.3", + "@types/node-forge": "^1.3.14", + "electron": "^44.5.1", + "electron-builder": "^26.15.3", + "esbuild": "^0.28.2", + "playwright-core": "^1.63.0", + "protobufjs-cli": "^2.7.0", + "svelte": "^5.57.1", + "svelte-check": "^4.7.6", + "typescript": "^6.0.3", + "vite": "^8.3.1" + }, + "dependencies": { + "dompurify": "^3.4.16", + "node-forge": "^1.4.0", + "protobufjs": "^8.8.0" + }, + "allowScripts": { + "electron@44.5.1": true, + "esbuild@0.28.2": true, + "electron-winstaller": false + }, + "author": "Kibi Kelburton", + "repository": { + "type": "git", + "url": "gitea@git.lat:kibi/mumh5.git" + } +} diff --git a/proto/Mumble.proto b/proto/Mumble.proto new file mode 100644 index 0000000..deb6c17 --- /dev/null +++ b/proto/Mumble.proto @@ -0,0 +1,639 @@ +// Copyright The Mumble Developers. All rights reserved. +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file at the root of the +// Mumble source tree or at . + +syntax = "proto2"; + +package MumbleProto; + +option optimize_for = SPEED; + +message Version { + // Legacy version number format. + optional uint32 version_v1 = 1; + // New version number format. + // Necessary since patch level may exceed 255. (See https://github.com/mumble-voip/mumble/issues/5827) + optional uint64 version_v2 = 5; + + // Client release name. + optional string release = 2; + // Client OS name. + optional string os = 3; + // Client OS version. + optional string os_version = 4; +} + +// Not used. Not even for tunneling UDP through TCP. +message UDPTunnel { + // Not used. + required bytes packet = 1; +} + +// Used by the client to send the authentication credentials to the server. +message Authenticate { + // UTF-8 encoded username. + optional string username = 1; + // Server or user password. + optional string password = 2; + // Additional access tokens for server ACL groups. + repeated string tokens = 3; + // A list of CELT bitstream version constants supported by the client. + repeated int32 celt_versions = 4; + optional bool opus = 5 [default = false]; + // 0 = REGULAR, 1 = BOT + optional int32 client_type = 6 [default = 0]; +} + +// Sent by the client to notify the server that the client is still alive. +// Server must reply to the packet with the same timestamp and its own +// good/late/lost/resync numbers. None of the fields is strictly required. +message Ping { + // Client timestamp. Server should not attempt to decode. + optional uint64 timestamp = 1; + // The amount of good packets received. + optional uint32 good = 2; + // The amount of late packets received. + optional uint32 late = 3; + // The amount of packets never received. + optional uint32 lost = 4; + // The amount of nonce resyncs. + optional uint32 resync = 5; + // The total amount of UDP packets received. + optional uint32 udp_packets = 6; + // The total amount of TCP packets received. + optional uint32 tcp_packets = 7; + // UDP ping average. + optional float udp_ping_avg = 8; + // UDP ping variance. + optional float udp_ping_var = 9; + // TCP ping average. + optional float tcp_ping_avg = 10; + // TCP ping variance. + optional float tcp_ping_var = 11; +} + +// Sent by the server when it rejects the user connection. +message Reject { + enum RejectType { + // The rejection reason is unknown (details should be available + // in Reject.reason). + None = 0; + // The client attempted to connect with an incompatible version. + WrongVersion = 1; + // The user name supplied by the client was invalid. + InvalidUsername = 2; + // The client attempted to authenticate as a user with a password but it + // was wrong. + WrongUserPW = 3; + // The client attempted to connect to a passworded server but the password + // was wrong. + WrongServerPW = 4; + // Supplied username is already in use. + UsernameInUse = 5; + // Server is currently full and cannot accept more users. + ServerFull = 6; + // The user did not provide a certificate but one is required. + NoCertificate = 7; + AuthenticatorFail = 8; + // The server is currently not accepting new connections + NoNewConnections = 9; + } + // Rejection type. + optional RejectType type = 1; + // Human readable rejection reason. + optional string reason = 2; +} + +// ServerSync message is sent by the server when it has authenticated the user +// and finished synchronizing the server state. +message ServerSync { + // The session of the current user. + optional uint32 session = 1; + // Maximum bandwidth that the user should use. + optional uint32 max_bandwidth = 2; + // Server welcome text. + optional string welcome_text = 3; + // Current user permissions in the root channel. + // Note: The permissions data type usually is uin32 (e.g. in PermissionQuery and PermissionDenied messages). Here + // it is uint64 because of an oversight in the past. Nonetheless it should never exceed the uin32 range. + // See also: https://github.com/mumble-voip/mumble/issues/5139 + optional uint64 permissions = 4; +} + +// Sent by the client when it wants a channel removed. Sent by the server when +// a channel has been removed and clients should be notified. +message ChannelRemove { + required uint32 channel_id = 1; +} + +// Used to communicate channel properties between the client and the server. +// Sent by the server during the login process or when channel properties are +// updated. Client may use this message to update said channel properties. +message ChannelState { + // Unique ID for the channel within the server. + optional uint32 channel_id = 1; + // channel_id of the parent channel. + optional uint32 parent = 2; + // UTF-8 encoded channel name. + optional string name = 3; + // A collection of channel id values of the linked channels. Absent during + // the first channel listing. + repeated uint32 links = 4; + // UTF-8 encoded channel description. Only if the description is less than + // 128 bytes + optional string description = 5; + // A collection of channel_id values that should be added to links. + repeated uint32 links_add = 6; + // A collection of channel_id values that should be removed from links. + repeated uint32 links_remove = 7; + // True if the channel is temporary. + optional bool temporary = 8 [default = false]; + // Position weight to tweak the channel position in the channel list. + optional int32 position = 9 [default = 0]; + // SHA1 hash of the description if the description is 128 bytes or more. + optional bytes description_hash = 10; + // Maximum number of users allowed in the channel. If this value is zero, + // the maximum number of users allowed in the channel is given by the + // server's "usersperchannel" setting. + optional uint32 max_users = 11; + // Whether this channel has enter restrictions (ACL denying ENTER) set + optional bool is_enter_restricted = 12; + // Whether the receiver of this msg is considered to be able to enter this channel + optional bool can_enter = 13; +} + +// Used to communicate user leaving or being kicked. May be sent by the client +// when it attempts to kick a user. Sent by the server when it informs the +// clients that a user is not present anymore. +message UserRemove { + // The user who is being kicked, identified by their session, not present + // when no one is being kicked. + required uint32 session = 1; + // The user who initiated the removal. Either the user who performs the kick + // or the user who is currently leaving. + optional uint32 actor = 2; + // Reason for the kick, stored as the ban reason if the user is banned. + optional string reason = 3; + // True if the user shall be banned, false if the user shall be kicked + optional bool ban = 4; + // True if the user shall be banned by certificate. + optional bool ban_certificate = 5; + // True if the user shall be banned by IP. + optional bool ban_ip = 6; +} + +// Sent by the server when it communicates new and changed users to client. +// First seen during login procedure. May be sent by the client when it wishes +// to alter its state. +message UserState { + message VolumeAdjustment { + optional uint32 listening_channel = 1; + optional float volume_adjustment = 2; + } + + // Unique user session ID of the user whose state this is, may change on + // reconnect. + optional uint32 session = 1; + // The session of the user who is updating this user. + optional uint32 actor = 2; + // User name, UTF-8 encoded. + optional string name = 3; + // Registered user ID if the user is registered. + optional uint32 user_id = 4; + // Channel on which the user is. + optional uint32 channel_id = 5; + // True if the user is muted by admin. + optional bool mute = 6; + // True if the user is deafened by admin. + optional bool deaf = 7; + // True if the user has been suppressed from talking by a reason other than + // being muted. + optional bool suppress = 8; + // True if the user has muted self. + optional bool self_mute = 9; + // True if the user has deafened self. + optional bool self_deaf = 10; + // User image if it is less than 128 bytes. + optional bytes texture = 11; + // The positional audio plugin identifier. + // Positional audio information is only sent to users who share + // identical plugin contexts. + // + // This value is not transmitted to clients. + optional bytes plugin_context = 12; + // The user's plugin-specific identity. + // This value is not transmitted to clients. + optional string plugin_identity = 13; + // User comment if it is less than 128 bytes. + optional string comment = 14; + // The hash of the user certificate. + optional string hash = 15; + // SHA1 hash of the user comment if it 128 bytes or more. + optional bytes comment_hash = 16; + // SHA1 hash of the user picture if it 128 bytes or more. + optional bytes texture_hash = 17; + // True if the user is a priority speaker. + optional bool priority_speaker = 18; + // True if the user is currently recording. + optional bool recording = 19; + // A list of temporary access tokens to be respected when processing this request. + repeated string temporary_access_tokens = 20; + // A list of channels the user wants to start listening to. + repeated uint32 listening_channel_add = 21; + // a list of channels the user does no longer want to listen to. + repeated uint32 listening_channel_remove = 22; + // A list of volume adjustments the user has applied to listeners + repeated VolumeAdjustment listening_volume_adjustment = 23; +} + +// Relays information on the bans. The client may send the BanList message to +// either modify the list of bans or query them from the server. The server +// sends this list only after a client queries for it. +message BanList { + message BanEntry { + // Banned IP address. + required bytes address = 1; + // The length of the subnet mask for the ban. + required uint32 mask = 2; + // User name for identification purposes (does not affect the ban). + optional string name = 3; + // The certificate hash of the banned user. + optional string hash = 4; + // Reason for the ban (does not affect the ban). + optional string reason = 5; + // Ban start time. + optional string start = 6; + // Ban duration in seconds. + optional uint32 duration = 7; + } + // List of ban entries currently in place. + repeated BanEntry bans = 1; + // True if the server should return the list, false if it should replace old + // ban list with the one provided. + optional bool query = 2 [default = false]; +} + +// Used to send and broadcast text messages. +message TextMessage { + // The message sender, identified by its session. + optional uint32 actor = 1; + // Target users for the message, identified by their session. + repeated uint32 session = 2; + // The channels to which the message is sent, identified by their + // channel_ids. + repeated uint32 channel_id = 3; + // The root channels when sending message recursively to several channels, + // identified by their channel_ids. + repeated uint32 tree_id = 4; + // The UTF-8 encoded message. May be HTML if the server allows. + required string message = 5; +} + +message PermissionDenied { + enum DenyType { + // Operation denied for other reason, see reason field. + Text = 0; + // Permissions were denied. + Permission = 1; + // Cannot modify SuperUser. + SuperUser = 2; + // Invalid channel name. + ChannelName = 3; + // Text message too long. + TextTooLong = 4; + // The flux capacitor was spelled wrong. + H9K = 5; + // Operation not permitted in temporary channel. + TemporaryChannel = 6; + // Operation requires certificate. + MissingCertificate = 7; + // Invalid username. + UserName = 8; + // Channel is full. + ChannelFull = 9; + // Channels are nested too deeply. + NestingLimit = 10; + // Maximum channel count reached. + ChannelCountLimit = 11; + // Amount of listener objects for this channel has been reached + ChannelListenerLimit = 12; + // Amount of listener proxies for the user has been reached + UserListenerLimit = 13; + } + // The denied permission when type is Permission. + optional uint32 permission = 1; + // channel_id for the channel where the permission was denied when type is + // Permission. + optional uint32 channel_id = 2; + // The user who was denied permissions, identified by session. + optional uint32 session = 3; + // Textual reason for the denial. + optional string reason = 4; + // Type of the denial. + optional DenyType type = 5; + // The name that is invalid when type is UserName. + optional string name = 6; +} + +message ACL { + message ChanGroup { + // Name of the channel group, UTF-8 encoded. + required string name = 1; + // True if the group has been inherited from the parent (Read only). + optional bool inherited = 2 [default = true]; + // True if the group members are inherited. + optional bool inherit = 3 [default = true]; + // True if the group can be inherited by sub channels. + optional bool inheritable = 4 [default = true]; + // Users explicitly included in this group, identified by user_id. + repeated uint32 add = 5; + // Users explicitly removed from this group in this channel if the group + // has been inherited, identified by user_id. + repeated uint32 remove = 6; + // Users inherited, identified by user_id. + repeated uint32 inherited_members = 7; + } + message ChanACL { + // True if this ACL applies to the current channel. + optional bool apply_here = 1 [default = true]; + // True if this ACL applies to the sub channels. + optional bool apply_subs = 2 [default = true]; + // True if the ACL has been inherited from the parent. + optional bool inherited = 3 [default = true]; + // ID of the user that is affected by this ACL. + optional uint32 user_id = 4; + // ID of the group that is affected by this ACL. + optional string group = 5; + // Bit flag field of the permissions granted by this ACL. + optional uint32 grant = 6; + // Bit flag field of the permissions denied by this ACL. + optional uint32 deny = 7; + } + // Channel ID of the channel this message affects. + required uint32 channel_id = 1; + // True if the channel inherits its parent's ACLs. + optional bool inherit_acls = 2 [default = true]; + // User group specifications. + repeated ChanGroup groups = 3; + // ACL specifications. + repeated ChanACL acls = 4; + // True if the message is a query for ACLs instead of setting them. + optional bool query = 5 [default = false]; +} + +// Client may use this message to refresh its registered user information. The +// client should fill the IDs or Names of the users it wants to refresh. The +// server fills the missing parts and sends the message back. +message QueryUsers { + // user_ids. + repeated uint32 ids = 1; + // User names in the same order as ids. + repeated string names = 2; +} + +// Used to initialize and resync the UDP encryption. Either side may request a +// resync by sending the message without any values filled. The resync is +// performed by sending the message with only the client or server nonce +// filled. +message CryptSetup { + // Encryption key. + optional bytes key = 1; + // Client nonce. + optional bytes client_nonce = 2; + // Server nonce. + optional bytes server_nonce = 3; +} + +// Used to add or remove custom context menu item on client-side. +message ContextActionModify { + enum Context { + // Action is applicable to the server. + Server = 0x01; + // Action can target a Channel. + Channel = 0x02; + // Action can target a User. + User = 0x04; + } + enum Operation { + Add = 0; + Remove = 1; + } + // The action identifier. Used later to initiate an action. + required string action = 1; + // The display name of the action. + optional string text = 2; + // Context bit flags defining where the action should be displayed. + // Flags can be OR-ed to combine different types. + optional uint32 context = 3; + // Choose either to add or to remove the context action. + // Note: This field only exists after Mumble 1.2.4-beta1 release. + // The message will be recognized as Add regardless of this field + // before said release. + optional Operation operation = 4; +} + +// Sent by the client when it wants to initiate a Context action. +message ContextAction { + // The target User for the action, identified by session. + optional uint32 session = 1; + // The target Channel for the action, identified by channel_id. + optional uint32 channel_id = 2; + // The action that should be executed. + required string action = 3; +} + +// Lists the registered users. +message UserList { + message User { + // Registered user ID. + required uint32 user_id = 1; + // Registered user name. + optional string name = 2; + optional string last_seen = 3; + optional uint32 last_channel = 4; + } + // A list of registered users. + repeated User users = 1; +} + +// Sent by the client when it wants to register or clear whisper targets. +// +// Note: The first available target ID is 1 as 0 is reserved for normal +// talking. Maximum target ID is 30. +message VoiceTarget { + message Target { + // Users that are included as targets. + repeated uint32 session = 1; + // Channel that is included as a target. + optional uint32 channel_id = 2; + // ACL group that is included as a target. + optional string group = 3; + // True if the voice should follow links from the specified channel. + optional bool links = 4 [default = false]; + // True if the voice should also be sent to children of the specific + // channel. + optional bool children = 5 [default = false]; + } + // Voice target ID. + optional uint32 id = 1; + // The receivers that this voice target includes. + repeated Target targets = 2; +} + +// Sent by the client when it wants permissions for a certain channel. Sent by +// the server when it replies to the query or wants the user to resync all +// channel permissions. +message PermissionQuery { + // channel_id of the channel for which the permissions are queried. + optional uint32 channel_id = 1; + // Channel permissions. + optional uint32 permissions = 2; + // True if the client should drop its current permission information for all + // channels. + optional bool flush = 3 [default = false]; +} + +// Sent by the server to notify the users of the version of the CELT codec they +// should use. This may change during the connection when new users join. +message CodecVersion { + // The version of the CELT Alpha codec. + required int32 alpha = 1; + // The version of the CELT Beta codec. + required int32 beta = 2; + // True if the user should prefer Alpha over Beta. + required bool prefer_alpha = 3 [default = true]; + optional bool opus = 4 [default = false]; +} + +// Used to communicate user stats between the server and clients. +message UserStats { + message Stats { + // The amount of good packets received. + optional uint32 good = 1; + // The amount of late packets received. + optional uint32 late = 2; + // The amount of packets never received. + optional uint32 lost = 3; + // The amount of nonce resyncs. + optional uint32 resync = 4; + } + + message RollingStats { + // Rolling packet statistics time window as defined on the server. + optional uint32 time_window = 1; + // Rolling packet statistics for packets received from the client. + optional Stats from_client = 2; + // Rolling packet statistics for packets sent by the server. + optional Stats from_server = 3; + } + + // User whose stats these are. + optional uint32 session = 1; + // True if the message contains only mutable stats (packets, ping). + optional bool stats_only = 2 [default = false]; + // Full user certificate chain of the user certificate in DER format. + repeated bytes certificates = 3; + // Packet statistics for packets received from the client. + optional Stats from_client = 4; + // Packet statistics for packets sent by the server. + optional Stats from_server = 5; + + // Amount of UDP packets sent. + optional uint32 udp_packets = 6; + // Amount of TCP packets sent. + optional uint32 tcp_packets = 7; + // UDP ping average. + optional float udp_ping_avg = 8; + // UDP ping variance. + optional float udp_ping_var = 9; + // TCP ping average. + optional float tcp_ping_avg = 10; + // TCP ping variance. + optional float tcp_ping_var = 11; + + // Client version. + optional Version version = 12; + // A list of CELT bitstream version constants supported by the client of this + // user. + repeated int32 celt_versions = 13; + // Client IP address. + optional bytes address = 14; + // Bandwidth used by this client. + optional uint32 bandwidth = 15; + // Connection duration. + optional uint32 onlinesecs = 16; + // Duration since last activity. + optional uint32 idlesecs = 17; + // True if the user has a strong certificate. + optional bool strong_certificate = 18 [default = false]; + optional bool opus = 19 [default = false]; + + // Rolling packet statistics + optional RollingStats rolling_stats = 20; +} + +// Used by the client to request binary data from the server. By default large +// comments or textures are not sent within standard messages but instead the +// hash is. If the client does not recognize the hash it may request the +// resource when it needs it. The client does so by sending a RequestBlob +// message with the correct fields filled with the user sessions or channel_ids +// it wants to receive. The server replies to this by sending a new +// UserState/ChannelState message with the resources filled even if they would +// normally be transmitted as hashes. +message RequestBlob { + // sessions of the requested UserState textures. + repeated uint32 session_texture = 1; + // sessions of the requested UserState comments. + repeated uint32 session_comment = 2; + // channel_ids of the requested ChannelState descriptions. + repeated uint32 channel_description = 3; +} + +// Sent by the server when it informs the clients on server configuration +// details. +message ServerConfig { + // The maximum bandwidth the clients should use. + optional uint32 max_bandwidth = 1; + // Server welcome text. + optional string welcome_text = 2; + // True if the server allows HTML. + optional bool allow_html = 3; + // Maximum text message length. + optional uint32 message_length = 4; + // Maximum image message length. + optional uint32 image_message_length = 5; + // The maximum number of users allowed on the server. + optional uint32 max_users = 6; + // Whether using Mumble's recording feature is allowed on the server + optional bool recording_allowed = 7; +} + +// Sent by the server to inform the clients of suggested client configuration +// specified by the server administrator. +message SuggestConfig { + // Suggested client version in the legacy format. + optional uint32 version_v1 = 1; + // Suggested client version in the new format. + // Necessary since patch level may exceed 255. (See https://github.com/mumble-voip/mumble/issues/5827) + optional uint64 version_v2 = 4; + + // True if the administrator suggests positional audio to be used on this + // server. + optional bool positional = 2; + // True if the administrator suggests push to talk to be used on this server. + optional bool push_to_talk = 3; +} + +// Used to send plugin messages between clients +message PluginDataTransmission { + // The session ID of the client this message was sent from + optional uint32 senderSession = 1; + // The session IDs of the clients that should receive this message + repeated uint32 receiverSessions = 2 [packed = true]; + // The data that is sent + optional bytes data = 3; + // The ID of the sent data. This will be used by plugins to check whether they will + // process it or not + optional string dataID = 4; +} diff --git a/proto/MumbleUDP.proto b/proto/MumbleUDP.proto new file mode 100644 index 0000000..cb685d1 --- /dev/null +++ b/proto/MumbleUDP.proto @@ -0,0 +1,85 @@ +// Copyright The Mumble Developers. All rights reserved. +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file at the root of the +// Mumble source tree or at . + +syntax = "proto3"; + +package MumbleUDP; + +option optimize_for = SPEED; + +message Audio { + oneof Header { + // When this audio is sent by the client to the server, this is set to the target of the audio data. This target + // is a number in the range [0, 2^{32} - 1], where 0 means "normal talking", 2^{5} - 1 means "server loopback" + // and all other targets are understood as shout/whisper targets that have previously been registered via a + // VoiceTarget message (via TCP). + uint32 target = 1; + // When this audio is sent by the server to the client, this indicates the context in which the audio has been sent. + // 0: Normal speech + // 1: Shout to channel + // 2: Whisper to user + // 3: Received via channel listener + uint32 context = 2; + }; + + // The session of the client (sender) this audio was originally sent from. This field is not required when sending + // audio to the server, but will always be set when receiving audio from the server. + uint32 sender_session = 3; + + // The number of the first contained audio frame (indicating the position of that frame in the overall audio stream) + uint64 frame_number = 4; + + // The actual voice data payload in the Opus format. + bytes opus_data = 5; + + // Optional positional data indicating the speaker's position in a virtual world (in meters). This "list" is really + // expected to be an array of size 3 containing the X, Y and Z coordinates of the position (in that order). + repeated float positional_data = 6; + + // A volume adjustment determined by the server for this audio packet. It is up to the client to apply this adjustment to + // the resulting audio (or not). Note: A value of 0 means that this field is unset. + float volume_adjustment = 7; + + // Note that we skip the field indices up to (including) 15 in order to have them available for future extensions of the + // protocol with fields that are encountered very often. The reason is that all field indices <= 15 require only a single + // byte of encoding overhead, whereas the once > 15 require (at least) two bytes. The reason lies in the Protobuf encoding + // scheme that uses 1 bit for a varint continuation flag, 3 bit to encode a field's type and the remaining 4 bit of the + // first byte are thus available for the field index. Therefore the first 2^4 = 16 field indices (aka values 0 to 15) can + // be encoded using only a single byte. For details see https://developers.google.com/protocol-buffers/docs/encoding + + // A flag indicating whether this audio packet represents the end of transmission for the current audio stream + bool is_terminator = 16; +} + +/** + * Ping message for checking UDP connectivity (and roundtrip ping) and potentially obtaining further server + * details (e.g. version). + */ +message Ping { + // Timestamp as encoded by the client. A server is not supposed to attempt to decode or modify this field. Therefore, + // clients may choose an arbitrary format for this timestamp (as long as it fits into a uint64 field). + uint64 timestamp = 1; + + // A flag set by the sending client, if it wants to obtain additional information about the server. + bool request_extended_information = 2; + + + // Below are the fields for the "additional information" that are filled out by the server on request. + + // The version of the server in the new version format. + // The new protobuf Ping packet introduced with 1.5 drops support for the legacy version format + // since both server and client have to support this new format. + // (See https://github.com/mumble-voip/mumble/issues/5827) + uint64 server_version_v2 = 3; + + // The amount of users currently connected to the server + uint32 user_count = 4; + + // The maximum amount of users permitted on this server + uint32 max_user_count = 5; + + // The maximum bandwidth each user is allowed to use for sending audio to the server + uint32 max_bandwidth_per_user = 6; +} diff --git a/scripts/build-electron.mjs b/scripts/build-electron.mjs new file mode 100644 index 0000000..95199a1 --- /dev/null +++ b/scripts/build-electron.mjs @@ -0,0 +1,17 @@ +import * as esbuild from 'esbuild'; + +// Bundles the Electron main and preload scripts to CommonJS in dist-electron/. +export const options = { + entryPoints: { main: 'electron/main.ts', preload: 'electron/preload.ts' }, + outdir: 'dist-electron', + outExtension: { '.js': '.cjs' }, + bundle: true, + platform: 'node', + format: 'cjs', + target: 'node22', + external: ['electron'], + sourcemap: true, + logLevel: 'info' +}; + +if (import.meta.url === `file://${process.argv[1]}`) await esbuild.build(options); diff --git a/scripts/dev.mjs b/scripts/dev.mjs new file mode 100644 index 0000000..ce4ff2b --- /dev/null +++ b/scripts/dev.mjs @@ -0,0 +1,28 @@ +import { spawn } from 'node:child_process'; +import * as esbuild from 'esbuild'; +import { createServer } from 'vite'; +import electronPath from 'electron'; +import { options } from './build-electron.mjs'; + +// Vite dev server for the renderer, esbuild watch for main/preload, Electron restarted on main changes. +const server = await createServer(); +await server.listen(); +const url = server.resolvedUrls.local[0]; + +let child = null; +const startElectron = () => { + if (child) { + child.removeAllListeners('exit'); + child.kill(); + } + // ELECTRON_RUN_AS_NODE (set by some editor terminals) would start Electron as plain Node + const { ELECTRON_RUN_AS_NODE, ...env } = process.env; + child = spawn(electronPath, ['.'], { stdio: 'inherit', env: { ...env, VITE_DEV_SERVER_URL: url } }); + child.on('exit', () => { server.close(); process.exit(0); }); +}; + +const ctx = await esbuild.context({ + ...options, + plugins: [{ name: 'restart', setup(b) { b.onEnd(r => { if (!r.errors.length) startElectron(); }); } }] +}); +await ctx.watch(); diff --git a/src/App.svelte b/src/App.svelte new file mode 100644 index 0000000..2d8bd42 --- /dev/null +++ b/src/App.svelte @@ -0,0 +1,95 @@ + + + + +
    + {#if layout !== 'narrow' || navOpen} + + {#if layout === 'narrow'}{/if} + {/if} + + (navOpen = true)} onpanel={togglePanel} /> + + {#if showPanel} + {#if layout === 'wide'} + {}} onclose={() => (ui.panelOpen = false)} /> + {:else} + +
    (ui.panelOpen = false)} />
    + {/if} + {/if} +
    + +{#if editing} (editing = null)} />{/if} +{#if ui.settingsOpen} { ui.settingsOpen = false; ui.settingsTab = 'voice'; }} />{/if} +{#if ui.quickAudio}{/if} +{#if ui.userInfo != null && session.status === 'connected'} + {#key ui.userInfo} (ui.userInfo = null)} />{/key} +{/if} +{#if session.certPrompt}{/if} +{#if ui.cert} (ui.cert = null)} />{/if} +{#if identities.loaded && !identities.setupDone} {}} /> +{:else if ui.wizard} (ui.wizard = null)} />{/if} +{#if ui.prompt} (ui.prompt = null)} />{/if} + + + diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..082cbd9 --- /dev/null +++ b/src/app.css @@ -0,0 +1,81 @@ +:root { + --bg-0: #0d0e10; + --bg-1: #151619; + --bg-2: #1b1c20; + --bg-3: #24262b; + --bg-hover: #2a2c32; + --bg-active: #33363d; + --line: #2c2e34; + --text: #e3e4e8; + --text-dim: #9a9ca5; + --text-faint: #686a73; + --accent: #7c6cff; + --accent-hover: #8f81ff; + --accent-text: #ffffff; + --speaking: #3bd16f; + --danger: #f0504a; + --warn: #e8b23c; + --link: #6fb3ff; + + --font: system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell, sans-serif; + --mono: ui-monospace, "Cascadia Code", "JetBrains Mono", Menlo, Consolas, monospace; + --fs: 15px; + + color-scheme: dark; +} + +*, *::before, *::after { box-sizing: border-box; border-radius: 0 !important; } + +html, body, #app { height: 100%; margin: 0; } + +body { + background: var(--bg-2); + color: var(--text); + font: var(--fs)/1.45 var(--font); + overflow: hidden; + -webkit-font-smoothing: antialiased; +} + +a { color: var(--link); text-decoration: none; } +a:hover { text-decoration: underline; } + +button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; } +button:disabled { cursor: default; opacity: 0.5; } + +input, textarea, select { + font: inherit; + color: var(--text); + background: var(--bg-0); + border: 1px solid var(--line); + padding: 8px 10px; + outline: none; + width: 100%; +} +input:focus, textarea:focus, select:focus { border-color: var(--accent); } + +label { display: block; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-dim); margin: 14px 0 6px; } + +.btn { + display: inline-flex; align-items: center; justify-content: center; gap: 8px; + padding: 8px 16px; font-weight: 600; background: var(--bg-3); border: 1px solid var(--line); +} +.btn:hover:not(:disabled) { background: var(--bg-hover); } +.btn.primary { background: var(--accent); border-color: var(--accent); color: var(--accent-text); } +.btn.primary:hover:not(:disabled) { background: var(--accent-hover); } +.btn.danger { background: transparent; border-color: var(--danger); color: var(--danger); } + +.icon-btn { + display: inline-flex; align-items: center; justify-content: center; + width: 32px; height: 32px; color: var(--text-dim); +} +.icon-btn:hover { background: var(--bg-hover); color: var(--text); } +.icon-btn.on { color: var(--danger); } + +::-webkit-scrollbar { width: 10px; height: 10px; } +::-webkit-scrollbar-thumb { background: var(--bg-3); border: 2px solid transparent; background-clip: padding-box; } +::-webkit-scrollbar-thumb:hover { background-color: var(--bg-active); } +::-webkit-scrollbar-track { background: transparent; } + +:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; } + +.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); } diff --git a/src/core/client.ts b/src/core/client.ts new file mode 100644 index 0000000..a8546eb --- /dev/null +++ b/src/core/client.ts @@ -0,0 +1,482 @@ +import { Emitter } from './emitter.ts'; +import { FrameReader, frame, type Codec, type MessageName } from './proto.ts'; +import type { Transport } from './transport.ts'; + +export const CLIENT_RELEASE = 'mumh5 0.1.0'; +const VERSION = { major: 1, minor: 5, patch: 0 }; +const PING_INTERVAL_MS = 15000; + +// Murmur drops these messages without telling the client when they come too fast +// (leaky bucket, defaults messageburst=5 and messagelimit=1/s). Mirroring the bucket and +// queueing keeps quick actions from getting lost. Slightly slower refill for safety. +const RATE_BURST = 5; +const RATE_REFILL_MS = 1100; +const RATE_LIMITED = new Set(['TextMessage', 'ChannelState', 'ACL', 'Version']); + +export interface Channel { + id: number; + parent: number | null; + name: string; + description: string; + descriptionHash: Uint8Array | null; + position: number; + temporary: boolean; + links: Set; + maxUsers: number; + canEnter: boolean; +} + +export interface User { + session: number; + name: string; + userId: number | null; + channelId: number; + mute: boolean; + deaf: boolean; + suppress: boolean; + selfMute: boolean; + selfDeaf: boolean; + prioritySpeaker: boolean; + recording: boolean; + comment: string; + commentHash: Uint8Array | null; + texture: Uint8Array | null; + textureHash: Uint8Array | null; + hash: string; +} + +export interface TextMessage { + actor: number | null; + sessions: number[]; + channels: number[]; + trees: number[]; + html: string; + time: number; +} + +export interface ServerConfig { + allowHtml: boolean; + messageLength: number; + imageMessageLength: number; + maxUsers: number; + recordingAllowed: boolean; +} + +export interface Denial { + type: number; + permission: number; + reason: string; + channelId: number | null; + session: number | null; + name: string; +} + +// ACL permission bits, as used in PermissionDenied.permission +export const PERMISSIONS: Record = { + 0x1: 'Write ACL', 0x2: 'Traverse', 0x4: 'Enter', 0x8: 'Speak', 0x10: 'Mute/Deafen', 0x20: 'Move', + 0x40: 'Make channel', 0x80: 'Link channel', 0x100: 'Whisper', 0x200: 'Text message', + 0x400: 'Make temporary channel', 0x800: 'Listen', 0x10000: 'Kick', 0x20000: 'Ban', + 0x40000: 'Register', 0x80000: 'Register self', 0x100000: 'Reset user content' +}; + +// Human-readable text for a PermissionDenied message +export function describeDenial(d: Denial, channelName?: string): string { + switch (d.type) { + case 0: return d.reason || 'Denied by the server'; + case 1: { + const what = PERMISSIONS[d.permission] ?? 'this action'; + return `You do not have permission for ${what}${channelName ? ` in ${channelName}` : ''}`; + } + case 2: return 'The SuperUser cannot be modified'; + case 3: return 'Invalid channel name'; + case 4: return 'Message too long for this server'; + case 6: return 'Not allowed in a temporary channel'; + case 7: return 'This needs a registered certificate'; + case 8: return `Invalid user name${d.name ? `: ${d.name}` : ''}`; + case 9: return 'The channel is full'; + case 10: return 'Channels are nested too deeply'; + case 11: return 'The server has reached its channel limit'; + default: return d.reason || 'Denied by the server'; + } +} + +export interface ConnectOptions { + username: string; + password?: string; + tokens?: string[]; + os?: string; + osVersion?: string; +} + +type ClientEvents = { + synced: () => void; + channel: (ch: Channel) => void; + channelRemove: (id: number) => void; + user: (user: User, changed: string[], actor: number | null, isNew: boolean) => void; + userRemove: (user: User, actor: number | null, reason: string, ban: boolean) => void; + text: (msg: TextMessage) => void; + pluginData: (sender: number, dataId: string, data: Uint8Array) => void; + permissionDenied: (msg: Denial) => void; + reject: (type: number, reason: string) => void; + voice: (packet: Uint8Array) => void; + userStats: (stats: any) => void; + ping: (rttMs: number) => void; + close: (reason: string) => void; + message: (name: MessageName, msg: any) => void; +}; + +export class MumbleClient extends Emitter { + readonly channels = new Map(); + readonly users = new Map(); + session: number | null = null; + synced = false; + welcomeText = ''; + maxBandwidth = 0; + serverVersion = ''; + // Numeric server version (major << 16 | minor << 8 | patch), 0 until known + serverVersionNum = 0; + rtt = 0; + config: ServerConfig = { allowHtml: true, messageLength: 5000, imageMessageLength: 131072, maxUsers: 0, recordingAllowed: true }; + + private transport: Transport | null = null; + private reader = new FrameReader(); + private pingTimer: ReturnType | null = null; + private closed = false; + private tokens = RATE_BURST; + private lastRefill = Date.now(); + private queue: Uint8Array[] = []; + private queueTimer: ReturnType | null = null; + + private codec: Codec; + + constructor(codec: Codec) { + super(); + this.codec = codec; + } + + get self(): User | null { + return this.session == null ? null : this.users.get(this.session) ?? null; + } + + connect(transport: Transport, opts: ConnectOptions): void { + this.transport = transport; + transport.onData = chunk => { + try { + this.reader.push(chunk, (id, body) => this.handleFrame(id, body)); + } catch (e) { + this.disconnect(`Protocol error: ${(e as Error).message}`); + } + }; + transport.onClose = reason => this.handleClose(reason); + + const { major, minor, patch } = VERSION; + this.send('Version', { + version_v1: (major << 16) | (minor << 8) | patch, + version_v2: major * 2 ** 48 + minor * 2 ** 32 + patch * 2 ** 16, + release: CLIENT_RELEASE, + os: opts.os ?? 'unknown', + os_version: opts.osVersion ?? '' + }); + this.send('Authenticate', { + username: opts.username, + password: opts.password ?? '', + tokens: opts.tokens ?? [], + opus: true, + client_type: 0 + }); + this.pingTimer = setInterval(() => this.ping(), PING_INTERVAL_MS); + } + + disconnect(reason = 'Disconnected'): void { + this.transport?.close(); + this.handleClose(reason); + } + + send(name: MessageName, payload: Record): void { + if (!this.transport || this.closed) return; + const bytes = this.codec.encode(name, payload); + // Only changes to our own user state count against the bucket + const ownState = name === 'UserState' && (payload.session == null || payload.session === this.session); + if (RATE_LIMITED.has(name) || ownState) this.sendPaced(bytes); + else this.transport.send(bytes); + } + + // Messages still waiting for the rate limit + get queued(): number { + return this.queue.length; + } + + private refill(): void { + const now = Date.now(); + const gained = Math.floor((now - this.lastRefill) / RATE_REFILL_MS); + if (gained > 0) { + this.tokens = Math.min(RATE_BURST, this.tokens + gained); + this.lastRefill += gained * RATE_REFILL_MS; + } + if (this.tokens === RATE_BURST) this.lastRefill = now; + } + + private sendPaced(bytes: Uint8Array): void { + this.queue.push(bytes); + this.drain(); + } + + private drain(): void { + if (this.queueTimer || this.closed) return; + this.refill(); + while (this.queue.length && this.tokens > 0) { + this.tokens--; + this.transport?.send(this.queue.shift()!); + } + if (this.queue.length) { + this.queueTimer = setTimeout(() => { this.queueTimer = null; this.drain(); }, RATE_REFILL_MS - (Date.now() - this.lastRefill) + 5); + } + } + + // ─── Actions ─────────────────────────────────────────────────────────────── + + sendText(target: { channels?: number[]; users?: number[]; trees?: number[] }, html: string): void { + this.send('TextMessage', { + session: target.users ?? [], + channel_id: target.channels ?? [], + tree_id: target.trees ?? [], + message: html + }); + } + + joinChannel(channelId: number): void { + if (this.session == null) return; + this.send('UserState', { session: this.session, channel_id: channelId }); + } + + setSelfMute(mute: boolean): void { + // Unmuting also undeafens, matching the desktop client + this.send('UserState', mute ? { self_mute: true } : { self_mute: false, self_deaf: false }); + } + + setSelfDeaf(deaf: boolean): void { + // Deafening implies muting + this.send('UserState', deaf ? { self_mute: true, self_deaf: true } : { self_deaf: false }); + } + + setComment(comment: string): void { + if (this.session == null) return; + this.send('UserState', { session: this.session, comment }); + } + + kick(session: number, reason: string, ban = false): void { + this.send('UserRemove', { session, reason, ban }); + } + + // Server-side (admin) state of another user + setUserState(session: number, state: { mute?: boolean; deaf?: boolean; priority_speaker?: boolean; channel_id?: number }): void { + this.send('UserState', { session, ...state }); + } + + // Connection details of a user; the server decides how much we may see + requestUserStats(session: number, statsOnly = false): void { + this.send('UserStats', { session, stats_only: statsOnly }); + } + + // Fetch comments/descriptions/textures that the server only announced by hash. + requestBlob(req: { textures?: number[]; comments?: number[]; descriptions?: number[] }): void { + this.send('RequestBlob', { + session_texture: req.textures ?? [], + session_comment: req.comments ?? [], + channel_description: req.descriptions ?? [] + }); + } + + sendPluginData(receivers: number[], dataId: string, data: Uint8Array): void { + if (this.session == null || !receivers.length) return; + this.send('PluginDataTransmission', { + senderSession: this.session, + receiverSessions: receivers, + data, + dataID: dataId + }); + } + + // Voice over TCP: the UDPTunnel body is the raw voice packet, not a protobuf message + sendVoiceTunnel(packet: Uint8Array): void { + if (!this.transport || this.closed) return; + this.transport.send(frame(1, packet)); + } + + // 1.5+ servers talk to 1.5+ clients in the protobuf voice format + get protobufVoice(): boolean { + return this.serverVersionNum >= 0x010500; + } + + // Registers a user (ourselves or, with the Register permission, someone else) on the server + register(session: number): void { + this.send('UserState', { session, user_id: 0 }); + } + + // ─── Incoming ────────────────────────────────────────────────────────────── + + private ping(): void { + this.send('Ping', { timestamp: Date.now() }); + } + + private handleClose(reason: string): void { + if (this.closed) return; + this.closed = true; + if (this.pingTimer) clearInterval(this.pingTimer); + if (this.queueTimer) clearTimeout(this.queueTimer); + this.pingTimer = null; + this.queueTimer = null; + this.queue = []; + this.emit('close', reason); + } + + private handleFrame(typeId: number, body: Uint8Array): void { + // UDPTunnel carries a raw voice packet, not a protobuf message + if (typeId === 1) { + this.emit('voice', body.slice()); + return; + } + const decoded = this.codec.decode(typeId, body); + if (!decoded) return; + const { name, msg } = decoded; + + switch (name) { + case 'Version': + this.serverVersion = msg.release ?? ''; + if (msg.version_v2) { + const v = Number(msg.version_v2); + this.serverVersionNum = (Math.floor(v / 2 ** 48) << 16) | ((Math.floor(v / 2 ** 32) & 0xffff) << 8) | (Math.floor(v / 2 ** 16) & 0xffff); + } else if (msg.version_v1) { + this.serverVersionNum = msg.version_v1; + } + break; + case 'Ping': + if (msg.timestamp) { + this.rtt = Date.now() - Number(msg.timestamp); + this.emit('ping', this.rtt); + } + break; + case 'Reject': + this.emit('reject', msg.type ?? 0, msg.reason ?? 'Rejected'); + this.disconnect(msg.reason || 'Connection rejected'); + break; + case 'ServerSync': + this.session = msg.session; + this.maxBandwidth = msg.max_bandwidth ?? 0; + this.welcomeText = msg.welcome_text ?? ''; + this.synced = true; + this.ping(); + this.emit('synced'); + break; + case 'ServerConfig': + if (msg.allow_html != null) this.config.allowHtml = msg.allow_html; + if (msg.message_length != null) this.config.messageLength = msg.message_length; + if (msg.image_message_length != null) this.config.imageMessageLength = msg.image_message_length; + if (msg.max_users != null) this.config.maxUsers = msg.max_users; + if (msg.recording_allowed != null) this.config.recordingAllowed = msg.recording_allowed; + break; + case 'ChannelState': + this.applyChannelState(msg); + break; + case 'ChannelRemove': + this.channels.delete(msg.channel_id); + this.emit('channelRemove', msg.channel_id); + break; + case 'UserState': + this.applyUserState(msg); + break; + case 'UserRemove': { + const user = this.users.get(msg.session); + if (user) { + this.users.delete(msg.session); + this.emit('userRemove', user, msg.actor ?? null, msg.reason ?? '', !!msg.ban); + } + break; + } + case 'TextMessage': + this.emit('text', { + actor: msg.actor ?? null, + sessions: msg.session ?? [], + channels: msg.channel_id ?? [], + trees: msg.tree_id ?? [], + html: msg.message ?? '', + time: Date.now() + }); + break; + case 'PermissionDenied': + this.emit('permissionDenied', { + type: msg.type ?? 0, + permission: msg.permission ?? 0, + reason: msg.reason ?? '', + channelId: msg.channel_id ?? null, + session: msg.session ?? null, + name: msg.name ?? '' + }); + break; + case 'UserStats': + this.emit('userStats', msg); + break; + case 'PluginDataTransmission': + if (msg.senderSession != null && msg.dataID) { + this.emit('pluginData', msg.senderSession, msg.dataID, msg.data ?? new Uint8Array(0)); + } + break; + } + this.emit('message', name, msg); + } + + private applyChannelState(msg: any): void { + const id: number = msg.channel_id; + let ch = this.channels.get(id); + if (!ch) { + ch = { + id, parent: null, name: '', description: '', descriptionHash: null, position: 0, + temporary: false, links: new Set(), maxUsers: 0, canEnter: true + }; + this.channels.set(id, ch); + } + if (msg.parent != null) ch.parent = msg.parent; + if (msg.name != null) ch.name = msg.name; + if (msg.description_hash != null && msg.description == null) ch.description = ''; + if (msg.description != null) ch.description = msg.description; + if (msg.description_hash != null) ch.descriptionHash = msg.description_hash; + if (msg.position != null) ch.position = msg.position; + if (msg.temporary != null) ch.temporary = msg.temporary; + if (msg.max_users != null) ch.maxUsers = msg.max_users; + if (msg.can_enter != null) ch.canEnter = msg.can_enter; + if (msg.links?.length) ch.links = new Set(msg.links); + for (const l of msg.links_add ?? []) ch.links.add(l); + for (const l of msg.links_remove ?? []) ch.links.delete(l); + this.emit('channel', ch); + } + + private applyUserState(msg: any): void { + const session: number = msg.session ?? this.session; + let user = this.users.get(session); + const isNew = !user; + if (!user) { + user = { + session, name: '', userId: null, channelId: 0, mute: false, deaf: false, suppress: false, + selfMute: false, selfDeaf: false, prioritySpeaker: false, recording: false, + comment: '', commentHash: null, texture: null, textureHash: null, hash: '' + }; + this.users.set(session, user); + } + const fields: [string, keyof User][] = [ + ['name', 'name'], ['user_id', 'userId'], ['channel_id', 'channelId'], ['mute', 'mute'], + ['deaf', 'deaf'], ['suppress', 'suppress'], ['self_mute', 'selfMute'], ['self_deaf', 'selfDeaf'], + ['priority_speaker', 'prioritySpeaker'], ['recording', 'recording'], ['comment', 'comment'], + ['comment_hash', 'commentHash'], ['texture', 'texture'], ['texture_hash', 'textureHash'], ['hash', 'hash'] + ]; + // A new hash without text means the text changed and must be fetched (RequestBlob) + if (msg.comment_hash != null && msg.comment == null) user.comment = ''; + const changed: string[] = []; + for (const [src, dst] of fields) { + if (msg[src] != null) { + (user as any)[dst] = msg[src]; + changed.push(dst); + } + } + this.emit('user', user, changed, msg.actor ?? null, isNew); + } +} diff --git a/src/core/emitter.ts b/src/core/emitter.ts new file mode 100644 index 0000000..fab07ac --- /dev/null +++ b/src/core/emitter.ts @@ -0,0 +1,15 @@ +// Minimal typed event emitter that works in both browser and Node. +export class Emitter void>> { + private handlers = new Map>(); + + on(event: K, fn: Events[K]): () => void { + let set = this.handlers.get(event); + if (!set) this.handlers.set(event, (set = new Set())); + set.add(fn); + return () => set!.delete(fn); + } + + emit(event: K, ...args: Parameters): void { + for (const fn of this.handlers.get(event) ?? []) fn(...args); + } +} diff --git a/src/core/mumble-pb.d.ts b/src/core/mumble-pb.d.ts new file mode 100644 index 0000000..ec12da0 --- /dev/null +++ b/src/core/mumble-pb.d.ts @@ -0,0 +1,2 @@ +// Types for the generated static module; the codec in proto.ts adds the real shape. +export const MumbleProto: Record; diff --git a/src/core/mumble-pb.js b/src/core/mumble-pb.js new file mode 100644 index 0000000..25773af --- /dev/null +++ b/src/core/mumble-pb.js @@ -0,0 +1,8465 @@ +/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-mixed-operators, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars, default-case, jsdoc/require-param*/ +import $protobuf from "protobufjs/minimal.js"; + +const $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util; +const $Object = $util.global.Object, $undefined = $util.global.undefined, $Error = $util.global.Error, $RangeError = $util.global.RangeError, $TypeError = $util.global.TypeError, $parseInt = $util.global.parseInt, $String = $util.global.String, $Number = $util.global.Number, $BigInt = $util.global.BigInt, $Array = $util.global.Array, $Boolean = $util.global.Boolean, $isFinite = $util.global.isFinite; + +const $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {}); + +export const MumbleProto = $root.MumbleProto = (() => { + + const MumbleProto = {}; + + MumbleProto.Version = (function() { + + const Version = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + Version.prototype.version_v1 = 0; + Version.prototype.version_v2 = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + Version.prototype.release = ""; + Version.prototype.os = ""; + Version.prototype.os_version = ""; + + Version.create = function(properties) { + return new Version(properties); + }; + + Version.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.version_v1 != null && $Object.hasOwnProperty.call(message, "version_v1")) + writer.uint32(8).uint32(message.version_v1); + if (message.release != null && $Object.hasOwnProperty.call(message, "release")) + writer.uint32(18).string(message.release); + if (message.os != null && $Object.hasOwnProperty.call(message, "os")) + writer.uint32(26).string(message.os); + if (message.os_version != null && $Object.hasOwnProperty.call(message, "os_version")) + writer.uint32(34).string(message.os_version); + if (message.version_v2 != null && $Object.hasOwnProperty.call(message, "version_v2")) + writer.uint32(40).uint64(message.version_v2); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + Version.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.Version(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.version_v1 = reader.uint32(); + continue; + } + case 5: { + if (wireType !== 0) + break; + message.version_v2 = reader.uint64(); + continue; + } + case 2: { + if (wireType !== 2) + break; + message.release = reader.string(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.os = reader.string(); + continue; + } + case 4: { + if (wireType !== 2) + break; + message.os_version = reader.string(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + Version.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.version_v1 != null && $Object.hasOwnProperty.call(message, "version_v1")) + if (!$util.isInteger(message.version_v1)) + return "version_v1: integer expected"; + if (message.version_v2 != null && $Object.hasOwnProperty.call(message, "version_v2")) + if (!$util.isInteger(message.version_v2) && !(message.version_v2 && $util.isInteger(message.version_v2.low) && $util.isInteger(message.version_v2.high))) + return "version_v2: integer|Long expected"; + if (message.release != null && $Object.hasOwnProperty.call(message, "release")) + if (!$util.isString(message.release)) + return "release: string expected"; + if (message.os != null && $Object.hasOwnProperty.call(message, "os")) + if (!$util.isString(message.os)) + return "os: string expected"; + if (message.os_version != null && $Object.hasOwnProperty.call(message, "os_version")) + if (!$util.isString(message.os_version)) + return "os_version: string expected"; + return null; + }; + + Version.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.Version) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.Version: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.Version(); + if (object.version_v1 != null) + message.version_v1 = object.version_v1 >>> 0; + if (object.version_v2 != null) + if ($util.Long) + message.version_v2 = $util.Long.fromValue(object.version_v2, true); + else if (typeof object.version_v2 === "string") + message.version_v2 = $parseInt(object.version_v2, 10); + else if (typeof object.version_v2 === "number") + message.version_v2 = object.version_v2; + else if (typeof object.version_v2 === "object") + message.version_v2 = new $util.LongBits(object.version_v2.low >>> 0, object.version_v2.high >>> 0).toNumber(true); + if (object.release != null) + message.release = $String(object.release); + if (object.os != null) + message.os = $String(object.os); + if (object.os_version != null) + message.os_version = $String(object.os_version); + return message; + }; + + Version.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.version_v1 = 0; + object.release = ""; + object.os = ""; + object.os_version = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.version_v2 = options.longs === $String ? long.toString() : options.longs === $Number ? long.toNumber() : typeof $BigInt !== "undefined" && options.longs === $BigInt ? long.toBigInt() : long; + } else + object.version_v2 = options.longs === $String ? "0" : typeof $BigInt !== "undefined" && options.longs === $BigInt ? $BigInt("0") : 0; + } + if (message.version_v1 != null && $Object.hasOwnProperty.call(message, "version_v1")) + object.version_v1 = message.version_v1; + if (message.release != null && $Object.hasOwnProperty.call(message, "release")) + object.release = message.release; + if (message.os != null && $Object.hasOwnProperty.call(message, "os")) + object.os = message.os; + if (message.os_version != null && $Object.hasOwnProperty.call(message, "os_version")) + object.os_version = message.os_version; + if (message.version_v2 != null && $Object.hasOwnProperty.call(message, "version_v2")) + if (typeof $BigInt !== "undefined" && options.longs === $BigInt) + object.version_v2 = typeof message.version_v2 === "number" ? $BigInt(message.version_v2) : $util.Long.fromBits(message.version_v2.low >>> 0, message.version_v2.high >>> 0, true).toBigInt(); + else if (typeof message.version_v2 === "number") + object.version_v2 = options.longs === $String ? $String(message.version_v2) : message.version_v2; + else + object.version_v2 = options.longs === $String ? $util.Long.prototype.toString.call(message.version_v2) : options.longs === $Number ? new $util.LongBits(message.version_v2.low >>> 0, message.version_v2.high >>> 0).toNumber(true) : message.version_v2; + return object; + }; + + Version.prototype.toJSON = function() { + return Version.toObject(this, $protobuf.util.toJSONOptions); + }; + + Version.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.Version"; + }; + + return Version; + })(); + + MumbleProto.UDPTunnel = (function() { + + const UDPTunnel = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + UDPTunnel.prototype.packet = $util.newBuffer([]); + + UDPTunnel.create = function(properties) { + return new UDPTunnel(properties); + }; + + UDPTunnel.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + writer.uint32(10).bytes(message.packet); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + UDPTunnel.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.UDPTunnel(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 2) + break; + message.packet = reader.bytes(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "packet")) + throw $util.ProtocolError("missing required 'packet'", { instance: message }); + return message; + }; + + UDPTunnel.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (!(message.packet && typeof message.packet.length === "number" || $util.isString(message.packet))) + return "packet: buffer expected"; + return null; + }; + + UDPTunnel.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.UDPTunnel) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.UDPTunnel: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.UDPTunnel(); + if (object.packet != null) + if (typeof object.packet === "string") + $util.base64.decode(object.packet, message.packet = $util.newBuffer($util.base64.length(object.packet)), 0); + else if (object.packet.length >= 0) + message.packet = object.packet; + return message; + }; + + UDPTunnel.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) + if (options.bytes === $String) + object.packet = ""; + else { + object.packet = []; + if (options.bytes !== $Array) + object.packet = $util.newBuffer(object.packet); + } + if (message.packet != null && $Object.hasOwnProperty.call(message, "packet")) + object.packet = options.bytes === $String ? $util.base64.encode(message.packet, 0, message.packet.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.packet) : message.packet; + return object; + }; + + UDPTunnel.prototype.toJSON = function() { + return UDPTunnel.toObject(this, $protobuf.util.toJSONOptions); + }; + + UDPTunnel.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.UDPTunnel"; + }; + + return UDPTunnel; + })(); + + MumbleProto.Authenticate = (function() { + + const Authenticate = function (properties) { + this.tokens = []; + this.celt_versions = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + Authenticate.prototype.username = ""; + Authenticate.prototype.password = ""; + Authenticate.prototype.tokens = $util.emptyArray; + Authenticate.prototype.celt_versions = $util.emptyArray; + Authenticate.prototype.opus = false; + Authenticate.prototype.client_type = 0; + + Authenticate.create = function(properties) { + return new Authenticate(properties); + }; + + Authenticate.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.username != null && $Object.hasOwnProperty.call(message, "username")) + writer.uint32(10).string(message.username); + if (message.password != null && $Object.hasOwnProperty.call(message, "password")) + writer.uint32(18).string(message.password); + if (message.tokens != null && message.tokens.length) + for (let i = 0; i < message.tokens.length; ++i) + writer.uint32(26).string(message.tokens[i]); + if (message.celt_versions != null && message.celt_versions.length) + for (let i = 0; i < message.celt_versions.length; ++i) + writer.uint32(32).int32(message.celt_versions[i]); + if (message.opus != null && $Object.hasOwnProperty.call(message, "opus")) + writer.uint32(40).bool(message.opus); + if (message.client_type != null && $Object.hasOwnProperty.call(message, "client_type")) + writer.uint32(48).int32(message.client_type); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + Authenticate.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.Authenticate(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 2) + break; + message.username = reader.string(); + continue; + } + case 2: { + if (wireType !== 2) + break; + message.password = reader.string(); + continue; + } + case 3: { + if (wireType !== 2) + break; + if (!(message.tokens && message.tokens.length)) + message.tokens = []; + message.tokens.push(reader.string()); + continue; + } + case 4: { + if (wireType === 2) { + if (!(message.celt_versions && message.celt_versions.length)) + message.celt_versions = []; + reader.int32s(message.celt_versions); + continue; + } + if (wireType !== 0) + break; + if (!(message.celt_versions && message.celt_versions.length)) + message.celt_versions = []; + message.celt_versions.push(reader.int32()); + continue; + } + case 5: { + if (wireType !== 0) + break; + message.opus = reader.bool(); + continue; + } + case 6: { + if (wireType !== 0) + break; + message.client_type = reader.int32(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + Authenticate.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.username != null && $Object.hasOwnProperty.call(message, "username")) + if (!$util.isString(message.username)) + return "username: string expected"; + if (message.password != null && $Object.hasOwnProperty.call(message, "password")) + if (!$util.isString(message.password)) + return "password: string expected"; + if (message.tokens != null && $Object.hasOwnProperty.call(message, "tokens")) { + if (!$Array.isArray(message.tokens)) + return "tokens: array expected"; + for (let i = 0; i < message.tokens.length; ++i) + if (!$util.isString(message.tokens[i])) + return "tokens: string[] expected"; + } + if (message.celt_versions != null && $Object.hasOwnProperty.call(message, "celt_versions")) { + if (!$Array.isArray(message.celt_versions)) + return "celt_versions: array expected"; + for (let i = 0; i < message.celt_versions.length; ++i) + if (!$util.isInteger(message.celt_versions[i])) + return "celt_versions: integer[] expected"; + } + if (message.opus != null && $Object.hasOwnProperty.call(message, "opus")) + if (typeof message.opus !== "boolean") + return "opus: boolean expected"; + if (message.client_type != null && $Object.hasOwnProperty.call(message, "client_type")) + if (!$util.isInteger(message.client_type)) + return "client_type: integer expected"; + return null; + }; + + Authenticate.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.Authenticate) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.Authenticate: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.Authenticate(); + if (object.username != null) + message.username = $String(object.username); + if (object.password != null) + message.password = $String(object.password); + if (object.tokens) { + if (!$Array.isArray(object.tokens)) + throw $TypeError(".MumbleProto.Authenticate.tokens: array expected"); + message.tokens = $Array(object.tokens.length); + for (let i = 0; i < object.tokens.length; ++i) + message.tokens[i] = $String(object.tokens[i]); + } + if (object.celt_versions) { + if (!$Array.isArray(object.celt_versions)) + throw $TypeError(".MumbleProto.Authenticate.celt_versions: array expected"); + message.celt_versions = $Array(object.celt_versions.length); + for (let i = 0; i < object.celt_versions.length; ++i) + message.celt_versions[i] = object.celt_versions[i] | 0; + } + if (object.opus != null) + message.opus = $Boolean(object.opus); + if (object.client_type != null) + message.client_type = object.client_type | 0; + return message; + }; + + Authenticate.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) { + object.tokens = []; + object.celt_versions = []; + } + if (options.defaults) { + object.username = ""; + object.password = ""; + object.opus = false; + object.client_type = 0; + } + if (message.username != null && $Object.hasOwnProperty.call(message, "username")) + object.username = message.username; + if (message.password != null && $Object.hasOwnProperty.call(message, "password")) + object.password = message.password; + if (message.tokens && message.tokens.length) { + object.tokens = $Array(message.tokens.length); + for (let j = 0; j < message.tokens.length; ++j) + object.tokens[j] = message.tokens[j]; + } + if (message.celt_versions && message.celt_versions.length) { + object.celt_versions = $Array(message.celt_versions.length); + for (let j = 0; j < message.celt_versions.length; ++j) + object.celt_versions[j] = message.celt_versions[j]; + } + if (message.opus != null && $Object.hasOwnProperty.call(message, "opus")) + object.opus = message.opus; + if (message.client_type != null && $Object.hasOwnProperty.call(message, "client_type")) + object.client_type = message.client_type; + return object; + }; + + Authenticate.prototype.toJSON = function() { + return Authenticate.toObject(this, $protobuf.util.toJSONOptions); + }; + + Authenticate.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.Authenticate"; + }; + + return Authenticate; + })(); + + MumbleProto.Ping = (function() { + + const Ping = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + Ping.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + Ping.prototype.good = 0; + Ping.prototype.late = 0; + Ping.prototype.lost = 0; + Ping.prototype.resync = 0; + Ping.prototype.udp_packets = 0; + Ping.prototype.tcp_packets = 0; + Ping.prototype.udp_ping_avg = 0; + Ping.prototype.udp_ping_var = 0; + Ping.prototype.tcp_ping_avg = 0; + Ping.prototype.tcp_ping_var = 0; + + Ping.create = function(properties) { + return new Ping(properties); + }; + + Ping.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.timestamp != null && $Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(8).uint64(message.timestamp); + if (message.good != null && $Object.hasOwnProperty.call(message, "good")) + writer.uint32(16).uint32(message.good); + if (message.late != null && $Object.hasOwnProperty.call(message, "late")) + writer.uint32(24).uint32(message.late); + if (message.lost != null && $Object.hasOwnProperty.call(message, "lost")) + writer.uint32(32).uint32(message.lost); + if (message.resync != null && $Object.hasOwnProperty.call(message, "resync")) + writer.uint32(40).uint32(message.resync); + if (message.udp_packets != null && $Object.hasOwnProperty.call(message, "udp_packets")) + writer.uint32(48).uint32(message.udp_packets); + if (message.tcp_packets != null && $Object.hasOwnProperty.call(message, "tcp_packets")) + writer.uint32(56).uint32(message.tcp_packets); + if (message.udp_ping_avg != null && $Object.hasOwnProperty.call(message, "udp_ping_avg")) + writer.uint32(69).float(message.udp_ping_avg); + if (message.udp_ping_var != null && $Object.hasOwnProperty.call(message, "udp_ping_var")) + writer.uint32(77).float(message.udp_ping_var); + if (message.tcp_ping_avg != null && $Object.hasOwnProperty.call(message, "tcp_ping_avg")) + writer.uint32(85).float(message.tcp_ping_avg); + if (message.tcp_ping_var != null && $Object.hasOwnProperty.call(message, "tcp_ping_var")) + writer.uint32(93).float(message.tcp_ping_var); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + Ping.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.Ping(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.timestamp = reader.uint64(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.good = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.late = reader.uint32(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.lost = reader.uint32(); + continue; + } + case 5: { + if (wireType !== 0) + break; + message.resync = reader.uint32(); + continue; + } + case 6: { + if (wireType !== 0) + break; + message.udp_packets = reader.uint32(); + continue; + } + case 7: { + if (wireType !== 0) + break; + message.tcp_packets = reader.uint32(); + continue; + } + case 8: { + if (wireType !== 5) + break; + message.udp_ping_avg = reader.float(); + continue; + } + case 9: { + if (wireType !== 5) + break; + message.udp_ping_var = reader.float(); + continue; + } + case 10: { + if (wireType !== 5) + break; + message.tcp_ping_avg = reader.float(); + continue; + } + case 11: { + if (wireType !== 5) + break; + message.tcp_ping_var = reader.float(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + Ping.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.timestamp != null && $Object.hasOwnProperty.call(message, "timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + if (message.good != null && $Object.hasOwnProperty.call(message, "good")) + if (!$util.isInteger(message.good)) + return "good: integer expected"; + if (message.late != null && $Object.hasOwnProperty.call(message, "late")) + if (!$util.isInteger(message.late)) + return "late: integer expected"; + if (message.lost != null && $Object.hasOwnProperty.call(message, "lost")) + if (!$util.isInteger(message.lost)) + return "lost: integer expected"; + if (message.resync != null && $Object.hasOwnProperty.call(message, "resync")) + if (!$util.isInteger(message.resync)) + return "resync: integer expected"; + if (message.udp_packets != null && $Object.hasOwnProperty.call(message, "udp_packets")) + if (!$util.isInteger(message.udp_packets)) + return "udp_packets: integer expected"; + if (message.tcp_packets != null && $Object.hasOwnProperty.call(message, "tcp_packets")) + if (!$util.isInteger(message.tcp_packets)) + return "tcp_packets: integer expected"; + if (message.udp_ping_avg != null && $Object.hasOwnProperty.call(message, "udp_ping_avg")) + if (typeof message.udp_ping_avg !== "number") + return "udp_ping_avg: number expected"; + if (message.udp_ping_var != null && $Object.hasOwnProperty.call(message, "udp_ping_var")) + if (typeof message.udp_ping_var !== "number") + return "udp_ping_var: number expected"; + if (message.tcp_ping_avg != null && $Object.hasOwnProperty.call(message, "tcp_ping_avg")) + if (typeof message.tcp_ping_avg !== "number") + return "tcp_ping_avg: number expected"; + if (message.tcp_ping_var != null && $Object.hasOwnProperty.call(message, "tcp_ping_var")) + if (typeof message.tcp_ping_var !== "number") + return "tcp_ping_var: number expected"; + return null; + }; + + Ping.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.Ping) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.Ping: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.Ping(); + if (object.timestamp != null) + if ($util.Long) + message.timestamp = $util.Long.fromValue(object.timestamp, true); + else if (typeof object.timestamp === "string") + message.timestamp = $parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(true); + if (object.good != null) + message.good = object.good >>> 0; + if (object.late != null) + message.late = object.late >>> 0; + if (object.lost != null) + message.lost = object.lost >>> 0; + if (object.resync != null) + message.resync = object.resync >>> 0; + if (object.udp_packets != null) + message.udp_packets = object.udp_packets >>> 0; + if (object.tcp_packets != null) + message.tcp_packets = object.tcp_packets >>> 0; + if (object.udp_ping_avg != null) + message.udp_ping_avg = $Number(object.udp_ping_avg); + if (object.udp_ping_var != null) + message.udp_ping_var = $Number(object.udp_ping_var); + if (object.tcp_ping_avg != null) + message.tcp_ping_avg = $Number(object.tcp_ping_avg); + if (object.tcp_ping_var != null) + message.tcp_ping_var = $Number(object.tcp_ping_var); + return message; + }; + + Ping.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.timestamp = options.longs === $String ? long.toString() : options.longs === $Number ? long.toNumber() : typeof $BigInt !== "undefined" && options.longs === $BigInt ? long.toBigInt() : long; + } else + object.timestamp = options.longs === $String ? "0" : typeof $BigInt !== "undefined" && options.longs === $BigInt ? $BigInt("0") : 0; + object.good = 0; + object.late = 0; + object.lost = 0; + object.resync = 0; + object.udp_packets = 0; + object.tcp_packets = 0; + object.udp_ping_avg = 0; + object.udp_ping_var = 0; + object.tcp_ping_avg = 0; + object.tcp_ping_var = 0; + } + if (message.timestamp != null && $Object.hasOwnProperty.call(message, "timestamp")) + if (typeof $BigInt !== "undefined" && options.longs === $BigInt) + object.timestamp = typeof message.timestamp === "number" ? $BigInt(message.timestamp) : $util.Long.fromBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0, true).toBigInt(); + else if (typeof message.timestamp === "number") + object.timestamp = options.longs === $String ? $String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === $String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === $Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber(true) : message.timestamp; + if (message.good != null && $Object.hasOwnProperty.call(message, "good")) + object.good = message.good; + if (message.late != null && $Object.hasOwnProperty.call(message, "late")) + object.late = message.late; + if (message.lost != null && $Object.hasOwnProperty.call(message, "lost")) + object.lost = message.lost; + if (message.resync != null && $Object.hasOwnProperty.call(message, "resync")) + object.resync = message.resync; + if (message.udp_packets != null && $Object.hasOwnProperty.call(message, "udp_packets")) + object.udp_packets = message.udp_packets; + if (message.tcp_packets != null && $Object.hasOwnProperty.call(message, "tcp_packets")) + object.tcp_packets = message.tcp_packets; + if (message.udp_ping_avg != null && $Object.hasOwnProperty.call(message, "udp_ping_avg")) + object.udp_ping_avg = options.json && !$isFinite(message.udp_ping_avg) ? $String(message.udp_ping_avg) : message.udp_ping_avg; + if (message.udp_ping_var != null && $Object.hasOwnProperty.call(message, "udp_ping_var")) + object.udp_ping_var = options.json && !$isFinite(message.udp_ping_var) ? $String(message.udp_ping_var) : message.udp_ping_var; + if (message.tcp_ping_avg != null && $Object.hasOwnProperty.call(message, "tcp_ping_avg")) + object.tcp_ping_avg = options.json && !$isFinite(message.tcp_ping_avg) ? $String(message.tcp_ping_avg) : message.tcp_ping_avg; + if (message.tcp_ping_var != null && $Object.hasOwnProperty.call(message, "tcp_ping_var")) + object.tcp_ping_var = options.json && !$isFinite(message.tcp_ping_var) ? $String(message.tcp_ping_var) : message.tcp_ping_var; + return object; + }; + + Ping.prototype.toJSON = function() { + return Ping.toObject(this, $protobuf.util.toJSONOptions); + }; + + Ping.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.Ping"; + }; + + return Ping; + })(); + + MumbleProto.Reject = (function() { + + const Reject = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + Reject.prototype.type = 0; + Reject.prototype.reason = ""; + + Reject.create = function(properties) { + return new Reject(properties); + }; + + Reject.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.type != null && $Object.hasOwnProperty.call(message, "type")) + writer.uint32(8).int32(message.type); + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + writer.uint32(18).string(message.reason); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + Reject.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message, value; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.Reject(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + value = reader.int32(); + if ($root.MumbleProto.Reject.RejectType[value] !== $undefined) + message.type = value; + else if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + continue; + } + case 2: { + if (wireType !== 2) + break; + message.reason = reader.string(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + Reject.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.type != null && $Object.hasOwnProperty.call(message, "type")) + switch (message.type) { + default: + return "type: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + break; + } + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + if (!$util.isString(message.reason)) + return "reason: string expected"; + return null; + }; + + Reject.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.Reject) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.Reject: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.Reject(); + switch (object.type) { + case "None": + case 0: + message.type = 0; + break; + case "WrongVersion": + case 1: + message.type = 1; + break; + case "InvalidUsername": + case 2: + message.type = 2; + break; + case "WrongUserPW": + case 3: + message.type = 3; + break; + case "WrongServerPW": + case 4: + message.type = 4; + break; + case "UsernameInUse": + case 5: + message.type = 5; + break; + case "ServerFull": + case 6: + message.type = 6; + break; + case "NoCertificate": + case 7: + message.type = 7; + break; + case "AuthenticatorFail": + case 8: + message.type = 8; + break; + case "NoNewConnections": + case 9: + message.type = 9; + break; + default: + } + if (object.reason != null) + message.reason = $String(object.reason); + return message; + }; + + Reject.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.type = options.enums === $String ? "None" : 0; + object.reason = ""; + } + if (message.type != null && $Object.hasOwnProperty.call(message, "type")) + object.type = options.enums === $String ? $root.MumbleProto.Reject.RejectType[message.type] === $undefined ? message.type : $root.MumbleProto.Reject.RejectType[message.type] : message.type; + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + object.reason = message.reason; + return object; + }; + + Reject.prototype.toJSON = function() { + return Reject.toObject(this, $protobuf.util.toJSONOptions); + }; + + Reject.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.Reject"; + }; + + Reject.RejectType = (function() { + const valuesById = $Object.create(null), values = $Object.create(valuesById); + values[valuesById[0] = "None"] = 0; + values[valuesById[1] = "WrongVersion"] = 1; + values[valuesById[2] = "InvalidUsername"] = 2; + values[valuesById[3] = "WrongUserPW"] = 3; + values[valuesById[4] = "WrongServerPW"] = 4; + values[valuesById[5] = "UsernameInUse"] = 5; + values[valuesById[6] = "ServerFull"] = 6; + values[valuesById[7] = "NoCertificate"] = 7; + values[valuesById[8] = "AuthenticatorFail"] = 8; + values[valuesById[9] = "NoNewConnections"] = 9; + return values; + })(); + + return Reject; + })(); + + MumbleProto.ServerSync = (function() { + + const ServerSync = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + ServerSync.prototype.session = 0; + ServerSync.prototype.max_bandwidth = 0; + ServerSync.prototype.welcome_text = ""; + ServerSync.prototype.permissions = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + ServerSync.create = function(properties) { + return new ServerSync(properties); + }; + + ServerSync.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + writer.uint32(8).uint32(message.session); + if (message.max_bandwidth != null && $Object.hasOwnProperty.call(message, "max_bandwidth")) + writer.uint32(16).uint32(message.max_bandwidth); + if (message.welcome_text != null && $Object.hasOwnProperty.call(message, "welcome_text")) + writer.uint32(26).string(message.welcome_text); + if (message.permissions != null && $Object.hasOwnProperty.call(message, "permissions")) + writer.uint32(32).uint64(message.permissions); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + ServerSync.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.ServerSync(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.session = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.max_bandwidth = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.welcome_text = reader.string(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.permissions = reader.uint64(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + ServerSync.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + if (!$util.isInteger(message.session)) + return "session: integer expected"; + if (message.max_bandwidth != null && $Object.hasOwnProperty.call(message, "max_bandwidth")) + if (!$util.isInteger(message.max_bandwidth)) + return "max_bandwidth: integer expected"; + if (message.welcome_text != null && $Object.hasOwnProperty.call(message, "welcome_text")) + if (!$util.isString(message.welcome_text)) + return "welcome_text: string expected"; + if (message.permissions != null && $Object.hasOwnProperty.call(message, "permissions")) + if (!$util.isInteger(message.permissions) && !(message.permissions && $util.isInteger(message.permissions.low) && $util.isInteger(message.permissions.high))) + return "permissions: integer|Long expected"; + return null; + }; + + ServerSync.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.ServerSync) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.ServerSync: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.ServerSync(); + if (object.session != null) + message.session = object.session >>> 0; + if (object.max_bandwidth != null) + message.max_bandwidth = object.max_bandwidth >>> 0; + if (object.welcome_text != null) + message.welcome_text = $String(object.welcome_text); + if (object.permissions != null) + if ($util.Long) + message.permissions = $util.Long.fromValue(object.permissions, true); + else if (typeof object.permissions === "string") + message.permissions = $parseInt(object.permissions, 10); + else if (typeof object.permissions === "number") + message.permissions = object.permissions; + else if (typeof object.permissions === "object") + message.permissions = new $util.LongBits(object.permissions.low >>> 0, object.permissions.high >>> 0).toNumber(true); + return message; + }; + + ServerSync.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.session = 0; + object.max_bandwidth = 0; + object.welcome_text = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.permissions = options.longs === $String ? long.toString() : options.longs === $Number ? long.toNumber() : typeof $BigInt !== "undefined" && options.longs === $BigInt ? long.toBigInt() : long; + } else + object.permissions = options.longs === $String ? "0" : typeof $BigInt !== "undefined" && options.longs === $BigInt ? $BigInt("0") : 0; + } + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + object.session = message.session; + if (message.max_bandwidth != null && $Object.hasOwnProperty.call(message, "max_bandwidth")) + object.max_bandwidth = message.max_bandwidth; + if (message.welcome_text != null && $Object.hasOwnProperty.call(message, "welcome_text")) + object.welcome_text = message.welcome_text; + if (message.permissions != null && $Object.hasOwnProperty.call(message, "permissions")) + if (typeof $BigInt !== "undefined" && options.longs === $BigInt) + object.permissions = typeof message.permissions === "number" ? $BigInt(message.permissions) : $util.Long.fromBits(message.permissions.low >>> 0, message.permissions.high >>> 0, true).toBigInt(); + else if (typeof message.permissions === "number") + object.permissions = options.longs === $String ? $String(message.permissions) : message.permissions; + else + object.permissions = options.longs === $String ? $util.Long.prototype.toString.call(message.permissions) : options.longs === $Number ? new $util.LongBits(message.permissions.low >>> 0, message.permissions.high >>> 0).toNumber(true) : message.permissions; + return object; + }; + + ServerSync.prototype.toJSON = function() { + return ServerSync.toObject(this, $protobuf.util.toJSONOptions); + }; + + ServerSync.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.ServerSync"; + }; + + return ServerSync; + })(); + + MumbleProto.ChannelRemove = (function() { + + const ChannelRemove = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + ChannelRemove.prototype.channel_id = 0; + + ChannelRemove.create = function(properties) { + return new ChannelRemove(properties); + }; + + ChannelRemove.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + writer.uint32(8).uint32(message.channel_id); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + ChannelRemove.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.ChannelRemove(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.channel_id = reader.uint32(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "channel_id")) + throw $util.ProtocolError("missing required 'channel_id'", { instance: message }); + return message; + }; + + ChannelRemove.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (!$util.isInteger(message.channel_id)) + return "channel_id: integer expected"; + return null; + }; + + ChannelRemove.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.ChannelRemove) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.ChannelRemove: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.ChannelRemove(); + if (object.channel_id != null) + message.channel_id = object.channel_id >>> 0; + return message; + }; + + ChannelRemove.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) + object.channel_id = 0; + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + object.channel_id = message.channel_id; + return object; + }; + + ChannelRemove.prototype.toJSON = function() { + return ChannelRemove.toObject(this, $protobuf.util.toJSONOptions); + }; + + ChannelRemove.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.ChannelRemove"; + }; + + return ChannelRemove; + })(); + + MumbleProto.ChannelState = (function() { + + const ChannelState = function (properties) { + this.links = []; + this.links_add = []; + this.links_remove = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + ChannelState.prototype.channel_id = 0; + ChannelState.prototype.parent = 0; + ChannelState.prototype.name = ""; + ChannelState.prototype.links = $util.emptyArray; + ChannelState.prototype.description = ""; + ChannelState.prototype.links_add = $util.emptyArray; + ChannelState.prototype.links_remove = $util.emptyArray; + ChannelState.prototype.temporary = false; + ChannelState.prototype.position = 0; + ChannelState.prototype.description_hash = $util.newBuffer([]); + ChannelState.prototype.max_users = 0; + ChannelState.prototype.is_enter_restricted = false; + ChannelState.prototype.can_enter = false; + + ChannelState.create = function(properties) { + return new ChannelState(properties); + }; + + ChannelState.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + writer.uint32(8).uint32(message.channel_id); + if (message.parent != null && $Object.hasOwnProperty.call(message, "parent")) + writer.uint32(16).uint32(message.parent); + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + writer.uint32(26).string(message.name); + if (message.links != null && message.links.length) + for (let i = 0; i < message.links.length; ++i) + writer.uint32(32).uint32(message.links[i]); + if (message.description != null && $Object.hasOwnProperty.call(message, "description")) + writer.uint32(42).string(message.description); + if (message.links_add != null && message.links_add.length) + for (let i = 0; i < message.links_add.length; ++i) + writer.uint32(48).uint32(message.links_add[i]); + if (message.links_remove != null && message.links_remove.length) + for (let i = 0; i < message.links_remove.length; ++i) + writer.uint32(56).uint32(message.links_remove[i]); + if (message.temporary != null && $Object.hasOwnProperty.call(message, "temporary")) + writer.uint32(64).bool(message.temporary); + if (message.position != null && $Object.hasOwnProperty.call(message, "position")) + writer.uint32(72).int32(message.position); + if (message.description_hash != null && $Object.hasOwnProperty.call(message, "description_hash")) + writer.uint32(82).bytes(message.description_hash); + if (message.max_users != null && $Object.hasOwnProperty.call(message, "max_users")) + writer.uint32(88).uint32(message.max_users); + if (message.is_enter_restricted != null && $Object.hasOwnProperty.call(message, "is_enter_restricted")) + writer.uint32(96).bool(message.is_enter_restricted); + if (message.can_enter != null && $Object.hasOwnProperty.call(message, "can_enter")) + writer.uint32(104).bool(message.can_enter); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + ChannelState.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.ChannelState(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.channel_id = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.parent = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.name = reader.string(); + continue; + } + case 4: { + if (wireType === 2) { + if (!(message.links && message.links.length)) + message.links = []; + reader.uint32s(message.links); + continue; + } + if (wireType !== 0) + break; + if (!(message.links && message.links.length)) + message.links = []; + message.links.push(reader.uint32()); + continue; + } + case 5: { + if (wireType !== 2) + break; + message.description = reader.string(); + continue; + } + case 6: { + if (wireType === 2) { + if (!(message.links_add && message.links_add.length)) + message.links_add = []; + reader.uint32s(message.links_add); + continue; + } + if (wireType !== 0) + break; + if (!(message.links_add && message.links_add.length)) + message.links_add = []; + message.links_add.push(reader.uint32()); + continue; + } + case 7: { + if (wireType === 2) { + if (!(message.links_remove && message.links_remove.length)) + message.links_remove = []; + reader.uint32s(message.links_remove); + continue; + } + if (wireType !== 0) + break; + if (!(message.links_remove && message.links_remove.length)) + message.links_remove = []; + message.links_remove.push(reader.uint32()); + continue; + } + case 8: { + if (wireType !== 0) + break; + message.temporary = reader.bool(); + continue; + } + case 9: { + if (wireType !== 0) + break; + message.position = reader.int32(); + continue; + } + case 10: { + if (wireType !== 2) + break; + message.description_hash = reader.bytes(); + continue; + } + case 11: { + if (wireType !== 0) + break; + message.max_users = reader.uint32(); + continue; + } + case 12: { + if (wireType !== 0) + break; + message.is_enter_restricted = reader.bool(); + continue; + } + case 13: { + if (wireType !== 0) + break; + message.can_enter = reader.bool(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + ChannelState.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + if (!$util.isInteger(message.channel_id)) + return "channel_id: integer expected"; + if (message.parent != null && $Object.hasOwnProperty.call(message, "parent")) + if (!$util.isInteger(message.parent)) + return "parent: integer expected"; + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.links != null && $Object.hasOwnProperty.call(message, "links")) { + if (!$Array.isArray(message.links)) + return "links: array expected"; + for (let i = 0; i < message.links.length; ++i) + if (!$util.isInteger(message.links[i])) + return "links: integer[] expected"; + } + if (message.description != null && $Object.hasOwnProperty.call(message, "description")) + if (!$util.isString(message.description)) + return "description: string expected"; + if (message.links_add != null && $Object.hasOwnProperty.call(message, "links_add")) { + if (!$Array.isArray(message.links_add)) + return "links_add: array expected"; + for (let i = 0; i < message.links_add.length; ++i) + if (!$util.isInteger(message.links_add[i])) + return "links_add: integer[] expected"; + } + if (message.links_remove != null && $Object.hasOwnProperty.call(message, "links_remove")) { + if (!$Array.isArray(message.links_remove)) + return "links_remove: array expected"; + for (let i = 0; i < message.links_remove.length; ++i) + if (!$util.isInteger(message.links_remove[i])) + return "links_remove: integer[] expected"; + } + if (message.temporary != null && $Object.hasOwnProperty.call(message, "temporary")) + if (typeof message.temporary !== "boolean") + return "temporary: boolean expected"; + if (message.position != null && $Object.hasOwnProperty.call(message, "position")) + if (!$util.isInteger(message.position)) + return "position: integer expected"; + if (message.description_hash != null && $Object.hasOwnProperty.call(message, "description_hash")) + if (!(message.description_hash && typeof message.description_hash.length === "number" || $util.isString(message.description_hash))) + return "description_hash: buffer expected"; + if (message.max_users != null && $Object.hasOwnProperty.call(message, "max_users")) + if (!$util.isInteger(message.max_users)) + return "max_users: integer expected"; + if (message.is_enter_restricted != null && $Object.hasOwnProperty.call(message, "is_enter_restricted")) + if (typeof message.is_enter_restricted !== "boolean") + return "is_enter_restricted: boolean expected"; + if (message.can_enter != null && $Object.hasOwnProperty.call(message, "can_enter")) + if (typeof message.can_enter !== "boolean") + return "can_enter: boolean expected"; + return null; + }; + + ChannelState.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.ChannelState) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.ChannelState: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.ChannelState(); + if (object.channel_id != null) + message.channel_id = object.channel_id >>> 0; + if (object.parent != null) + message.parent = object.parent >>> 0; + if (object.name != null) + message.name = $String(object.name); + if (object.links) { + if (!$Array.isArray(object.links)) + throw $TypeError(".MumbleProto.ChannelState.links: array expected"); + message.links = $Array(object.links.length); + for (let i = 0; i < object.links.length; ++i) + message.links[i] = object.links[i] >>> 0; + } + if (object.description != null) + message.description = $String(object.description); + if (object.links_add) { + if (!$Array.isArray(object.links_add)) + throw $TypeError(".MumbleProto.ChannelState.links_add: array expected"); + message.links_add = $Array(object.links_add.length); + for (let i = 0; i < object.links_add.length; ++i) + message.links_add[i] = object.links_add[i] >>> 0; + } + if (object.links_remove) { + if (!$Array.isArray(object.links_remove)) + throw $TypeError(".MumbleProto.ChannelState.links_remove: array expected"); + message.links_remove = $Array(object.links_remove.length); + for (let i = 0; i < object.links_remove.length; ++i) + message.links_remove[i] = object.links_remove[i] >>> 0; + } + if (object.temporary != null) + message.temporary = $Boolean(object.temporary); + if (object.position != null) + message.position = object.position | 0; + if (object.description_hash != null) + if (typeof object.description_hash === "string") + $util.base64.decode(object.description_hash, message.description_hash = $util.newBuffer($util.base64.length(object.description_hash)), 0); + else if (object.description_hash.length >= 0) + message.description_hash = object.description_hash; + if (object.max_users != null) + message.max_users = object.max_users >>> 0; + if (object.is_enter_restricted != null) + message.is_enter_restricted = $Boolean(object.is_enter_restricted); + if (object.can_enter != null) + message.can_enter = $Boolean(object.can_enter); + return message; + }; + + ChannelState.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) { + object.links = []; + object.links_add = []; + object.links_remove = []; + } + if (options.defaults) { + object.channel_id = 0; + object.parent = 0; + object.name = ""; + object.description = ""; + object.temporary = false; + object.position = 0; + if (options.bytes === $String) + object.description_hash = ""; + else { + object.description_hash = []; + if (options.bytes !== $Array) + object.description_hash = $util.newBuffer(object.description_hash); + } + object.max_users = 0; + object.is_enter_restricted = false; + object.can_enter = false; + } + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + object.channel_id = message.channel_id; + if (message.parent != null && $Object.hasOwnProperty.call(message, "parent")) + object.parent = message.parent; + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + object.name = message.name; + if (message.links && message.links.length) { + object.links = $Array(message.links.length); + for (let j = 0; j < message.links.length; ++j) + object.links[j] = message.links[j]; + } + if (message.description != null && $Object.hasOwnProperty.call(message, "description")) + object.description = message.description; + if (message.links_add && message.links_add.length) { + object.links_add = $Array(message.links_add.length); + for (let j = 0; j < message.links_add.length; ++j) + object.links_add[j] = message.links_add[j]; + } + if (message.links_remove && message.links_remove.length) { + object.links_remove = $Array(message.links_remove.length); + for (let j = 0; j < message.links_remove.length; ++j) + object.links_remove[j] = message.links_remove[j]; + } + if (message.temporary != null && $Object.hasOwnProperty.call(message, "temporary")) + object.temporary = message.temporary; + if (message.position != null && $Object.hasOwnProperty.call(message, "position")) + object.position = message.position; + if (message.description_hash != null && $Object.hasOwnProperty.call(message, "description_hash")) + object.description_hash = options.bytes === $String ? $util.base64.encode(message.description_hash, 0, message.description_hash.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.description_hash) : message.description_hash; + if (message.max_users != null && $Object.hasOwnProperty.call(message, "max_users")) + object.max_users = message.max_users; + if (message.is_enter_restricted != null && $Object.hasOwnProperty.call(message, "is_enter_restricted")) + object.is_enter_restricted = message.is_enter_restricted; + if (message.can_enter != null && $Object.hasOwnProperty.call(message, "can_enter")) + object.can_enter = message.can_enter; + return object; + }; + + ChannelState.prototype.toJSON = function() { + return ChannelState.toObject(this, $protobuf.util.toJSONOptions); + }; + + ChannelState.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.ChannelState"; + }; + + return ChannelState; + })(); + + MumbleProto.UserRemove = (function() { + + const UserRemove = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + UserRemove.prototype.session = 0; + UserRemove.prototype.actor = 0; + UserRemove.prototype.reason = ""; + UserRemove.prototype.ban = false; + UserRemove.prototype.ban_certificate = false; + UserRemove.prototype.ban_ip = false; + + UserRemove.create = function(properties) { + return new UserRemove(properties); + }; + + UserRemove.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + writer.uint32(8).uint32(message.session); + if (message.actor != null && $Object.hasOwnProperty.call(message, "actor")) + writer.uint32(16).uint32(message.actor); + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + writer.uint32(26).string(message.reason); + if (message.ban != null && $Object.hasOwnProperty.call(message, "ban")) + writer.uint32(32).bool(message.ban); + if (message.ban_certificate != null && $Object.hasOwnProperty.call(message, "ban_certificate")) + writer.uint32(40).bool(message.ban_certificate); + if (message.ban_ip != null && $Object.hasOwnProperty.call(message, "ban_ip")) + writer.uint32(48).bool(message.ban_ip); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + UserRemove.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.UserRemove(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.session = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.actor = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.reason = reader.string(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.ban = reader.bool(); + continue; + } + case 5: { + if (wireType !== 0) + break; + message.ban_certificate = reader.bool(); + continue; + } + case 6: { + if (wireType !== 0) + break; + message.ban_ip = reader.bool(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "session")) + throw $util.ProtocolError("missing required 'session'", { instance: message }); + return message; + }; + + UserRemove.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (!$util.isInteger(message.session)) + return "session: integer expected"; + if (message.actor != null && $Object.hasOwnProperty.call(message, "actor")) + if (!$util.isInteger(message.actor)) + return "actor: integer expected"; + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + if (!$util.isString(message.reason)) + return "reason: string expected"; + if (message.ban != null && $Object.hasOwnProperty.call(message, "ban")) + if (typeof message.ban !== "boolean") + return "ban: boolean expected"; + if (message.ban_certificate != null && $Object.hasOwnProperty.call(message, "ban_certificate")) + if (typeof message.ban_certificate !== "boolean") + return "ban_certificate: boolean expected"; + if (message.ban_ip != null && $Object.hasOwnProperty.call(message, "ban_ip")) + if (typeof message.ban_ip !== "boolean") + return "ban_ip: boolean expected"; + return null; + }; + + UserRemove.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.UserRemove) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.UserRemove: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.UserRemove(); + if (object.session != null) + message.session = object.session >>> 0; + if (object.actor != null) + message.actor = object.actor >>> 0; + if (object.reason != null) + message.reason = $String(object.reason); + if (object.ban != null) + message.ban = $Boolean(object.ban); + if (object.ban_certificate != null) + message.ban_certificate = $Boolean(object.ban_certificate); + if (object.ban_ip != null) + message.ban_ip = $Boolean(object.ban_ip); + return message; + }; + + UserRemove.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.session = 0; + object.actor = 0; + object.reason = ""; + object.ban = false; + object.ban_certificate = false; + object.ban_ip = false; + } + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + object.session = message.session; + if (message.actor != null && $Object.hasOwnProperty.call(message, "actor")) + object.actor = message.actor; + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + object.reason = message.reason; + if (message.ban != null && $Object.hasOwnProperty.call(message, "ban")) + object.ban = message.ban; + if (message.ban_certificate != null && $Object.hasOwnProperty.call(message, "ban_certificate")) + object.ban_certificate = message.ban_certificate; + if (message.ban_ip != null && $Object.hasOwnProperty.call(message, "ban_ip")) + object.ban_ip = message.ban_ip; + return object; + }; + + UserRemove.prototype.toJSON = function() { + return UserRemove.toObject(this, $protobuf.util.toJSONOptions); + }; + + UserRemove.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.UserRemove"; + }; + + return UserRemove; + })(); + + MumbleProto.UserState = (function() { + + const UserState = function (properties) { + this.temporary_access_tokens = []; + this.listening_channel_add = []; + this.listening_channel_remove = []; + this.listening_volume_adjustment = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + UserState.prototype.session = 0; + UserState.prototype.actor = 0; + UserState.prototype.name = ""; + UserState.prototype.user_id = 0; + UserState.prototype.channel_id = 0; + UserState.prototype.mute = false; + UserState.prototype.deaf = false; + UserState.prototype.suppress = false; + UserState.prototype.self_mute = false; + UserState.prototype.self_deaf = false; + UserState.prototype.texture = $util.newBuffer([]); + UserState.prototype.plugin_context = $util.newBuffer([]); + UserState.prototype.plugin_identity = ""; + UserState.prototype.comment = ""; + UserState.prototype.hash = ""; + UserState.prototype.comment_hash = $util.newBuffer([]); + UserState.prototype.texture_hash = $util.newBuffer([]); + UserState.prototype.priority_speaker = false; + UserState.prototype.recording = false; + UserState.prototype.temporary_access_tokens = $util.emptyArray; + UserState.prototype.listening_channel_add = $util.emptyArray; + UserState.prototype.listening_channel_remove = $util.emptyArray; + UserState.prototype.listening_volume_adjustment = $util.emptyArray; + + UserState.create = function(properties) { + return new UserState(properties); + }; + + UserState.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + writer.uint32(8).uint32(message.session); + if (message.actor != null && $Object.hasOwnProperty.call(message, "actor")) + writer.uint32(16).uint32(message.actor); + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + writer.uint32(26).string(message.name); + if (message.user_id != null && $Object.hasOwnProperty.call(message, "user_id")) + writer.uint32(32).uint32(message.user_id); + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + writer.uint32(40).uint32(message.channel_id); + if (message.mute != null && $Object.hasOwnProperty.call(message, "mute")) + writer.uint32(48).bool(message.mute); + if (message.deaf != null && $Object.hasOwnProperty.call(message, "deaf")) + writer.uint32(56).bool(message.deaf); + if (message.suppress != null && $Object.hasOwnProperty.call(message, "suppress")) + writer.uint32(64).bool(message.suppress); + if (message.self_mute != null && $Object.hasOwnProperty.call(message, "self_mute")) + writer.uint32(72).bool(message.self_mute); + if (message.self_deaf != null && $Object.hasOwnProperty.call(message, "self_deaf")) + writer.uint32(80).bool(message.self_deaf); + if (message.texture != null && $Object.hasOwnProperty.call(message, "texture")) + writer.uint32(90).bytes(message.texture); + if (message.plugin_context != null && $Object.hasOwnProperty.call(message, "plugin_context")) + writer.uint32(98).bytes(message.plugin_context); + if (message.plugin_identity != null && $Object.hasOwnProperty.call(message, "plugin_identity")) + writer.uint32(106).string(message.plugin_identity); + if (message.comment != null && $Object.hasOwnProperty.call(message, "comment")) + writer.uint32(114).string(message.comment); + if (message.hash != null && $Object.hasOwnProperty.call(message, "hash")) + writer.uint32(122).string(message.hash); + if (message.comment_hash != null && $Object.hasOwnProperty.call(message, "comment_hash")) + writer.uint32(130).bytes(message.comment_hash); + if (message.texture_hash != null && $Object.hasOwnProperty.call(message, "texture_hash")) + writer.uint32(138).bytes(message.texture_hash); + if (message.priority_speaker != null && $Object.hasOwnProperty.call(message, "priority_speaker")) + writer.uint32(144).bool(message.priority_speaker); + if (message.recording != null && $Object.hasOwnProperty.call(message, "recording")) + writer.uint32(152).bool(message.recording); + if (message.temporary_access_tokens != null && message.temporary_access_tokens.length) + for (let i = 0; i < message.temporary_access_tokens.length; ++i) + writer.uint32(162).string(message.temporary_access_tokens[i]); + if (message.listening_channel_add != null && message.listening_channel_add.length) + for (let i = 0; i < message.listening_channel_add.length; ++i) + writer.uint32(168).uint32(message.listening_channel_add[i]); + if (message.listening_channel_remove != null && message.listening_channel_remove.length) + for (let i = 0; i < message.listening_channel_remove.length; ++i) + writer.uint32(176).uint32(message.listening_channel_remove[i]); + if (message.listening_volume_adjustment != null && message.listening_volume_adjustment.length) + for (let i = 0; i < message.listening_volume_adjustment.length; ++i) + $root.MumbleProto.UserState.VolumeAdjustment.encode(message.listening_volume_adjustment[i], writer.uint32(186).fork(), _depth + 1).ldelim(); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + UserState.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.UserState(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.session = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.actor = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.name = reader.string(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.user_id = reader.uint32(); + continue; + } + case 5: { + if (wireType !== 0) + break; + message.channel_id = reader.uint32(); + continue; + } + case 6: { + if (wireType !== 0) + break; + message.mute = reader.bool(); + continue; + } + case 7: { + if (wireType !== 0) + break; + message.deaf = reader.bool(); + continue; + } + case 8: { + if (wireType !== 0) + break; + message.suppress = reader.bool(); + continue; + } + case 9: { + if (wireType !== 0) + break; + message.self_mute = reader.bool(); + continue; + } + case 10: { + if (wireType !== 0) + break; + message.self_deaf = reader.bool(); + continue; + } + case 11: { + if (wireType !== 2) + break; + message.texture = reader.bytes(); + continue; + } + case 12: { + if (wireType !== 2) + break; + message.plugin_context = reader.bytes(); + continue; + } + case 13: { + if (wireType !== 2) + break; + message.plugin_identity = reader.string(); + continue; + } + case 14: { + if (wireType !== 2) + break; + message.comment = reader.string(); + continue; + } + case 15: { + if (wireType !== 2) + break; + message.hash = reader.string(); + continue; + } + case 16: { + if (wireType !== 2) + break; + message.comment_hash = reader.bytes(); + continue; + } + case 17: { + if (wireType !== 2) + break; + message.texture_hash = reader.bytes(); + continue; + } + case 18: { + if (wireType !== 0) + break; + message.priority_speaker = reader.bool(); + continue; + } + case 19: { + if (wireType !== 0) + break; + message.recording = reader.bool(); + continue; + } + case 20: { + if (wireType !== 2) + break; + if (!(message.temporary_access_tokens && message.temporary_access_tokens.length)) + message.temporary_access_tokens = []; + message.temporary_access_tokens.push(reader.string()); + continue; + } + case 21: { + if (wireType === 2) { + if (!(message.listening_channel_add && message.listening_channel_add.length)) + message.listening_channel_add = []; + reader.uint32s(message.listening_channel_add); + continue; + } + if (wireType !== 0) + break; + if (!(message.listening_channel_add && message.listening_channel_add.length)) + message.listening_channel_add = []; + message.listening_channel_add.push(reader.uint32()); + continue; + } + case 22: { + if (wireType === 2) { + if (!(message.listening_channel_remove && message.listening_channel_remove.length)) + message.listening_channel_remove = []; + reader.uint32s(message.listening_channel_remove); + continue; + } + if (wireType !== 0) + break; + if (!(message.listening_channel_remove && message.listening_channel_remove.length)) + message.listening_channel_remove = []; + message.listening_channel_remove.push(reader.uint32()); + continue; + } + case 23: { + if (wireType !== 2) + break; + if (!(message.listening_volume_adjustment && message.listening_volume_adjustment.length)) + message.listening_volume_adjustment = []; + message.listening_volume_adjustment.push($root.MumbleProto.UserState.VolumeAdjustment.decode(reader, reader.uint32(), $undefined, _depth + 1)); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + UserState.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + if (!$util.isInteger(message.session)) + return "session: integer expected"; + if (message.actor != null && $Object.hasOwnProperty.call(message, "actor")) + if (!$util.isInteger(message.actor)) + return "actor: integer expected"; + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.user_id != null && $Object.hasOwnProperty.call(message, "user_id")) + if (!$util.isInteger(message.user_id)) + return "user_id: integer expected"; + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + if (!$util.isInteger(message.channel_id)) + return "channel_id: integer expected"; + if (message.mute != null && $Object.hasOwnProperty.call(message, "mute")) + if (typeof message.mute !== "boolean") + return "mute: boolean expected"; + if (message.deaf != null && $Object.hasOwnProperty.call(message, "deaf")) + if (typeof message.deaf !== "boolean") + return "deaf: boolean expected"; + if (message.suppress != null && $Object.hasOwnProperty.call(message, "suppress")) + if (typeof message.suppress !== "boolean") + return "suppress: boolean expected"; + if (message.self_mute != null && $Object.hasOwnProperty.call(message, "self_mute")) + if (typeof message.self_mute !== "boolean") + return "self_mute: boolean expected"; + if (message.self_deaf != null && $Object.hasOwnProperty.call(message, "self_deaf")) + if (typeof message.self_deaf !== "boolean") + return "self_deaf: boolean expected"; + if (message.texture != null && $Object.hasOwnProperty.call(message, "texture")) + if (!(message.texture && typeof message.texture.length === "number" || $util.isString(message.texture))) + return "texture: buffer expected"; + if (message.plugin_context != null && $Object.hasOwnProperty.call(message, "plugin_context")) + if (!(message.plugin_context && typeof message.plugin_context.length === "number" || $util.isString(message.plugin_context))) + return "plugin_context: buffer expected"; + if (message.plugin_identity != null && $Object.hasOwnProperty.call(message, "plugin_identity")) + if (!$util.isString(message.plugin_identity)) + return "plugin_identity: string expected"; + if (message.comment != null && $Object.hasOwnProperty.call(message, "comment")) + if (!$util.isString(message.comment)) + return "comment: string expected"; + if (message.hash != null && $Object.hasOwnProperty.call(message, "hash")) + if (!$util.isString(message.hash)) + return "hash: string expected"; + if (message.comment_hash != null && $Object.hasOwnProperty.call(message, "comment_hash")) + if (!(message.comment_hash && typeof message.comment_hash.length === "number" || $util.isString(message.comment_hash))) + return "comment_hash: buffer expected"; + if (message.texture_hash != null && $Object.hasOwnProperty.call(message, "texture_hash")) + if (!(message.texture_hash && typeof message.texture_hash.length === "number" || $util.isString(message.texture_hash))) + return "texture_hash: buffer expected"; + if (message.priority_speaker != null && $Object.hasOwnProperty.call(message, "priority_speaker")) + if (typeof message.priority_speaker !== "boolean") + return "priority_speaker: boolean expected"; + if (message.recording != null && $Object.hasOwnProperty.call(message, "recording")) + if (typeof message.recording !== "boolean") + return "recording: boolean expected"; + if (message.temporary_access_tokens != null && $Object.hasOwnProperty.call(message, "temporary_access_tokens")) { + if (!$Array.isArray(message.temporary_access_tokens)) + return "temporary_access_tokens: array expected"; + for (let i = 0; i < message.temporary_access_tokens.length; ++i) + if (!$util.isString(message.temporary_access_tokens[i])) + return "temporary_access_tokens: string[] expected"; + } + if (message.listening_channel_add != null && $Object.hasOwnProperty.call(message, "listening_channel_add")) { + if (!$Array.isArray(message.listening_channel_add)) + return "listening_channel_add: array expected"; + for (let i = 0; i < message.listening_channel_add.length; ++i) + if (!$util.isInteger(message.listening_channel_add[i])) + return "listening_channel_add: integer[] expected"; + } + if (message.listening_channel_remove != null && $Object.hasOwnProperty.call(message, "listening_channel_remove")) { + if (!$Array.isArray(message.listening_channel_remove)) + return "listening_channel_remove: array expected"; + for (let i = 0; i < message.listening_channel_remove.length; ++i) + if (!$util.isInteger(message.listening_channel_remove[i])) + return "listening_channel_remove: integer[] expected"; + } + if (message.listening_volume_adjustment != null && $Object.hasOwnProperty.call(message, "listening_volume_adjustment")) { + if (!$Array.isArray(message.listening_volume_adjustment)) + return "listening_volume_adjustment: array expected"; + for (let i = 0; i < message.listening_volume_adjustment.length; ++i) { + let error = $root.MumbleProto.UserState.VolumeAdjustment.verify(message.listening_volume_adjustment[i], _depth + 1); + if (error) + return "listening_volume_adjustment." + error; + } + } + return null; + }; + + UserState.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.UserState) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.UserState: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.UserState(); + if (object.session != null) + message.session = object.session >>> 0; + if (object.actor != null) + message.actor = object.actor >>> 0; + if (object.name != null) + message.name = $String(object.name); + if (object.user_id != null) + message.user_id = object.user_id >>> 0; + if (object.channel_id != null) + message.channel_id = object.channel_id >>> 0; + if (object.mute != null) + message.mute = $Boolean(object.mute); + if (object.deaf != null) + message.deaf = $Boolean(object.deaf); + if (object.suppress != null) + message.suppress = $Boolean(object.suppress); + if (object.self_mute != null) + message.self_mute = $Boolean(object.self_mute); + if (object.self_deaf != null) + message.self_deaf = $Boolean(object.self_deaf); + if (object.texture != null) + if (typeof object.texture === "string") + $util.base64.decode(object.texture, message.texture = $util.newBuffer($util.base64.length(object.texture)), 0); + else if (object.texture.length >= 0) + message.texture = object.texture; + if (object.plugin_context != null) + if (typeof object.plugin_context === "string") + $util.base64.decode(object.plugin_context, message.plugin_context = $util.newBuffer($util.base64.length(object.plugin_context)), 0); + else if (object.plugin_context.length >= 0) + message.plugin_context = object.plugin_context; + if (object.plugin_identity != null) + message.plugin_identity = $String(object.plugin_identity); + if (object.comment != null) + message.comment = $String(object.comment); + if (object.hash != null) + message.hash = $String(object.hash); + if (object.comment_hash != null) + if (typeof object.comment_hash === "string") + $util.base64.decode(object.comment_hash, message.comment_hash = $util.newBuffer($util.base64.length(object.comment_hash)), 0); + else if (object.comment_hash.length >= 0) + message.comment_hash = object.comment_hash; + if (object.texture_hash != null) + if (typeof object.texture_hash === "string") + $util.base64.decode(object.texture_hash, message.texture_hash = $util.newBuffer($util.base64.length(object.texture_hash)), 0); + else if (object.texture_hash.length >= 0) + message.texture_hash = object.texture_hash; + if (object.priority_speaker != null) + message.priority_speaker = $Boolean(object.priority_speaker); + if (object.recording != null) + message.recording = $Boolean(object.recording); + if (object.temporary_access_tokens) { + if (!$Array.isArray(object.temporary_access_tokens)) + throw $TypeError(".MumbleProto.UserState.temporary_access_tokens: array expected"); + message.temporary_access_tokens = $Array(object.temporary_access_tokens.length); + for (let i = 0; i < object.temporary_access_tokens.length; ++i) + message.temporary_access_tokens[i] = $String(object.temporary_access_tokens[i]); + } + if (object.listening_channel_add) { + if (!$Array.isArray(object.listening_channel_add)) + throw $TypeError(".MumbleProto.UserState.listening_channel_add: array expected"); + message.listening_channel_add = $Array(object.listening_channel_add.length); + for (let i = 0; i < object.listening_channel_add.length; ++i) + message.listening_channel_add[i] = object.listening_channel_add[i] >>> 0; + } + if (object.listening_channel_remove) { + if (!$Array.isArray(object.listening_channel_remove)) + throw $TypeError(".MumbleProto.UserState.listening_channel_remove: array expected"); + message.listening_channel_remove = $Array(object.listening_channel_remove.length); + for (let i = 0; i < object.listening_channel_remove.length; ++i) + message.listening_channel_remove[i] = object.listening_channel_remove[i] >>> 0; + } + if (object.listening_volume_adjustment) { + if (!$Array.isArray(object.listening_volume_adjustment)) + throw $TypeError(".MumbleProto.UserState.listening_volume_adjustment: array expected"); + message.listening_volume_adjustment = $Array(object.listening_volume_adjustment.length); + for (let i = 0; i < object.listening_volume_adjustment.length; ++i) { + if (!$util.isObject(object.listening_volume_adjustment[i])) + throw $TypeError(".MumbleProto.UserState.listening_volume_adjustment: object expected"); + message.listening_volume_adjustment[i] = $root.MumbleProto.UserState.VolumeAdjustment.fromObject(object.listening_volume_adjustment[i], _depth + 1); + } + } + return message; + }; + + UserState.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) { + object.temporary_access_tokens = []; + object.listening_channel_add = []; + object.listening_channel_remove = []; + object.listening_volume_adjustment = []; + } + if (options.defaults) { + object.session = 0; + object.actor = 0; + object.name = ""; + object.user_id = 0; + object.channel_id = 0; + object.mute = false; + object.deaf = false; + object.suppress = false; + object.self_mute = false; + object.self_deaf = false; + if (options.bytes === $String) + object.texture = ""; + else { + object.texture = []; + if (options.bytes !== $Array) + object.texture = $util.newBuffer(object.texture); + } + if (options.bytes === $String) + object.plugin_context = ""; + else { + object.plugin_context = []; + if (options.bytes !== $Array) + object.plugin_context = $util.newBuffer(object.plugin_context); + } + object.plugin_identity = ""; + object.comment = ""; + object.hash = ""; + if (options.bytes === $String) + object.comment_hash = ""; + else { + object.comment_hash = []; + if (options.bytes !== $Array) + object.comment_hash = $util.newBuffer(object.comment_hash); + } + if (options.bytes === $String) + object.texture_hash = ""; + else { + object.texture_hash = []; + if (options.bytes !== $Array) + object.texture_hash = $util.newBuffer(object.texture_hash); + } + object.priority_speaker = false; + object.recording = false; + } + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + object.session = message.session; + if (message.actor != null && $Object.hasOwnProperty.call(message, "actor")) + object.actor = message.actor; + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + object.name = message.name; + if (message.user_id != null && $Object.hasOwnProperty.call(message, "user_id")) + object.user_id = message.user_id; + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + object.channel_id = message.channel_id; + if (message.mute != null && $Object.hasOwnProperty.call(message, "mute")) + object.mute = message.mute; + if (message.deaf != null && $Object.hasOwnProperty.call(message, "deaf")) + object.deaf = message.deaf; + if (message.suppress != null && $Object.hasOwnProperty.call(message, "suppress")) + object.suppress = message.suppress; + if (message.self_mute != null && $Object.hasOwnProperty.call(message, "self_mute")) + object.self_mute = message.self_mute; + if (message.self_deaf != null && $Object.hasOwnProperty.call(message, "self_deaf")) + object.self_deaf = message.self_deaf; + if (message.texture != null && $Object.hasOwnProperty.call(message, "texture")) + object.texture = options.bytes === $String ? $util.base64.encode(message.texture, 0, message.texture.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.texture) : message.texture; + if (message.plugin_context != null && $Object.hasOwnProperty.call(message, "plugin_context")) + object.plugin_context = options.bytes === $String ? $util.base64.encode(message.plugin_context, 0, message.plugin_context.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.plugin_context) : message.plugin_context; + if (message.plugin_identity != null && $Object.hasOwnProperty.call(message, "plugin_identity")) + object.plugin_identity = message.plugin_identity; + if (message.comment != null && $Object.hasOwnProperty.call(message, "comment")) + object.comment = message.comment; + if (message.hash != null && $Object.hasOwnProperty.call(message, "hash")) + object.hash = message.hash; + if (message.comment_hash != null && $Object.hasOwnProperty.call(message, "comment_hash")) + object.comment_hash = options.bytes === $String ? $util.base64.encode(message.comment_hash, 0, message.comment_hash.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.comment_hash) : message.comment_hash; + if (message.texture_hash != null && $Object.hasOwnProperty.call(message, "texture_hash")) + object.texture_hash = options.bytes === $String ? $util.base64.encode(message.texture_hash, 0, message.texture_hash.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.texture_hash) : message.texture_hash; + if (message.priority_speaker != null && $Object.hasOwnProperty.call(message, "priority_speaker")) + object.priority_speaker = message.priority_speaker; + if (message.recording != null && $Object.hasOwnProperty.call(message, "recording")) + object.recording = message.recording; + if (message.temporary_access_tokens && message.temporary_access_tokens.length) { + object.temporary_access_tokens = $Array(message.temporary_access_tokens.length); + for (let j = 0; j < message.temporary_access_tokens.length; ++j) + object.temporary_access_tokens[j] = message.temporary_access_tokens[j]; + } + if (message.listening_channel_add && message.listening_channel_add.length) { + object.listening_channel_add = $Array(message.listening_channel_add.length); + for (let j = 0; j < message.listening_channel_add.length; ++j) + object.listening_channel_add[j] = message.listening_channel_add[j]; + } + if (message.listening_channel_remove && message.listening_channel_remove.length) { + object.listening_channel_remove = $Array(message.listening_channel_remove.length); + for (let j = 0; j < message.listening_channel_remove.length; ++j) + object.listening_channel_remove[j] = message.listening_channel_remove[j]; + } + if (message.listening_volume_adjustment && message.listening_volume_adjustment.length) { + object.listening_volume_adjustment = $Array(message.listening_volume_adjustment.length); + for (let j = 0; j < message.listening_volume_adjustment.length; ++j) + object.listening_volume_adjustment[j] = $root.MumbleProto.UserState.VolumeAdjustment.toObject(message.listening_volume_adjustment[j], options, _depth + 1); + } + return object; + }; + + UserState.prototype.toJSON = function() { + return UserState.toObject(this, $protobuf.util.toJSONOptions); + }; + + UserState.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.UserState"; + }; + + UserState.VolumeAdjustment = (function() { + + const VolumeAdjustment = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + VolumeAdjustment.prototype.listening_channel = 0; + VolumeAdjustment.prototype.volume_adjustment = 0; + + VolumeAdjustment.create = function(properties) { + return new VolumeAdjustment(properties); + }; + + VolumeAdjustment.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.listening_channel != null && $Object.hasOwnProperty.call(message, "listening_channel")) + writer.uint32(8).uint32(message.listening_channel); + if (message.volume_adjustment != null && $Object.hasOwnProperty.call(message, "volume_adjustment")) + writer.uint32(21).float(message.volume_adjustment); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + VolumeAdjustment.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.UserState.VolumeAdjustment(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.listening_channel = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 5) + break; + message.volume_adjustment = reader.float(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + VolumeAdjustment.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.listening_channel != null && $Object.hasOwnProperty.call(message, "listening_channel")) + if (!$util.isInteger(message.listening_channel)) + return "listening_channel: integer expected"; + if (message.volume_adjustment != null && $Object.hasOwnProperty.call(message, "volume_adjustment")) + if (typeof message.volume_adjustment !== "number") + return "volume_adjustment: number expected"; + return null; + }; + + VolumeAdjustment.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.UserState.VolumeAdjustment) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.UserState.VolumeAdjustment: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.UserState.VolumeAdjustment(); + if (object.listening_channel != null) + message.listening_channel = object.listening_channel >>> 0; + if (object.volume_adjustment != null) + message.volume_adjustment = $Number(object.volume_adjustment); + return message; + }; + + VolumeAdjustment.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.listening_channel = 0; + object.volume_adjustment = 0; + } + if (message.listening_channel != null && $Object.hasOwnProperty.call(message, "listening_channel")) + object.listening_channel = message.listening_channel; + if (message.volume_adjustment != null && $Object.hasOwnProperty.call(message, "volume_adjustment")) + object.volume_adjustment = options.json && !$isFinite(message.volume_adjustment) ? $String(message.volume_adjustment) : message.volume_adjustment; + return object; + }; + + VolumeAdjustment.prototype.toJSON = function() { + return VolumeAdjustment.toObject(this, $protobuf.util.toJSONOptions); + }; + + VolumeAdjustment.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.UserState.VolumeAdjustment"; + }; + + return VolumeAdjustment; + })(); + + return UserState; + })(); + + MumbleProto.BanList = (function() { + + const BanList = function (properties) { + this.bans = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + BanList.prototype.bans = $util.emptyArray; + BanList.prototype.query = false; + + BanList.create = function(properties) { + return new BanList(properties); + }; + + BanList.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.bans != null && message.bans.length) + for (let i = 0; i < message.bans.length; ++i) + $root.MumbleProto.BanList.BanEntry.encode(message.bans[i], writer.uint32(10).fork(), _depth + 1).ldelim(); + if (message.query != null && $Object.hasOwnProperty.call(message, "query")) + writer.uint32(16).bool(message.query); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + BanList.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.BanList(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 2) + break; + if (!(message.bans && message.bans.length)) + message.bans = []; + message.bans.push($root.MumbleProto.BanList.BanEntry.decode(reader, reader.uint32(), $undefined, _depth + 1)); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.query = reader.bool(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + BanList.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.bans != null && $Object.hasOwnProperty.call(message, "bans")) { + if (!$Array.isArray(message.bans)) + return "bans: array expected"; + for (let i = 0; i < message.bans.length; ++i) { + let error = $root.MumbleProto.BanList.BanEntry.verify(message.bans[i], _depth + 1); + if (error) + return "bans." + error; + } + } + if (message.query != null && $Object.hasOwnProperty.call(message, "query")) + if (typeof message.query !== "boolean") + return "query: boolean expected"; + return null; + }; + + BanList.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.BanList) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.BanList: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.BanList(); + if (object.bans) { + if (!$Array.isArray(object.bans)) + throw $TypeError(".MumbleProto.BanList.bans: array expected"); + message.bans = $Array(object.bans.length); + for (let i = 0; i < object.bans.length; ++i) { + if (!$util.isObject(object.bans[i])) + throw $TypeError(".MumbleProto.BanList.bans: object expected"); + message.bans[i] = $root.MumbleProto.BanList.BanEntry.fromObject(object.bans[i], _depth + 1); + } + } + if (object.query != null) + message.query = $Boolean(object.query); + return message; + }; + + BanList.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) + object.bans = []; + if (options.defaults) + object.query = false; + if (message.bans && message.bans.length) { + object.bans = $Array(message.bans.length); + for (let j = 0; j < message.bans.length; ++j) + object.bans[j] = $root.MumbleProto.BanList.BanEntry.toObject(message.bans[j], options, _depth + 1); + } + if (message.query != null && $Object.hasOwnProperty.call(message, "query")) + object.query = message.query; + return object; + }; + + BanList.prototype.toJSON = function() { + return BanList.toObject(this, $protobuf.util.toJSONOptions); + }; + + BanList.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.BanList"; + }; + + BanList.BanEntry = (function() { + + const BanEntry = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + BanEntry.prototype.address = $util.newBuffer([]); + BanEntry.prototype.mask = 0; + BanEntry.prototype.name = ""; + BanEntry.prototype.hash = ""; + BanEntry.prototype.reason = ""; + BanEntry.prototype.start = ""; + BanEntry.prototype.duration = 0; + + BanEntry.create = function(properties) { + return new BanEntry(properties); + }; + + BanEntry.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + writer.uint32(10).bytes(message.address); + writer.uint32(16).uint32(message.mask); + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + writer.uint32(26).string(message.name); + if (message.hash != null && $Object.hasOwnProperty.call(message, "hash")) + writer.uint32(34).string(message.hash); + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + writer.uint32(42).string(message.reason); + if (message.start != null && $Object.hasOwnProperty.call(message, "start")) + writer.uint32(50).string(message.start); + if (message.duration != null && $Object.hasOwnProperty.call(message, "duration")) + writer.uint32(56).uint32(message.duration); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + BanEntry.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.BanList.BanEntry(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 2) + break; + message.address = reader.bytes(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.mask = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.name = reader.string(); + continue; + } + case 4: { + if (wireType !== 2) + break; + message.hash = reader.string(); + continue; + } + case 5: { + if (wireType !== 2) + break; + message.reason = reader.string(); + continue; + } + case 6: { + if (wireType !== 2) + break; + message.start = reader.string(); + continue; + } + case 7: { + if (wireType !== 0) + break; + message.duration = reader.uint32(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "address")) + throw $util.ProtocolError("missing required 'address'", { instance: message }); + if (!$Object.hasOwnProperty.call(message, "mask")) + throw $util.ProtocolError("missing required 'mask'", { instance: message }); + return message; + }; + + BanEntry.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (!(message.address && typeof message.address.length === "number" || $util.isString(message.address))) + return "address: buffer expected"; + if (!$util.isInteger(message.mask)) + return "mask: integer expected"; + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.hash != null && $Object.hasOwnProperty.call(message, "hash")) + if (!$util.isString(message.hash)) + return "hash: string expected"; + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + if (!$util.isString(message.reason)) + return "reason: string expected"; + if (message.start != null && $Object.hasOwnProperty.call(message, "start")) + if (!$util.isString(message.start)) + return "start: string expected"; + if (message.duration != null && $Object.hasOwnProperty.call(message, "duration")) + if (!$util.isInteger(message.duration)) + return "duration: integer expected"; + return null; + }; + + BanEntry.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.BanList.BanEntry) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.BanList.BanEntry: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.BanList.BanEntry(); + if (object.address != null) + if (typeof object.address === "string") + $util.base64.decode(object.address, message.address = $util.newBuffer($util.base64.length(object.address)), 0); + else if (object.address.length >= 0) + message.address = object.address; + if (object.mask != null) + message.mask = object.mask >>> 0; + if (object.name != null) + message.name = $String(object.name); + if (object.hash != null) + message.hash = $String(object.hash); + if (object.reason != null) + message.reason = $String(object.reason); + if (object.start != null) + message.start = $String(object.start); + if (object.duration != null) + message.duration = object.duration >>> 0; + return message; + }; + + BanEntry.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + if (options.bytes === $String) + object.address = ""; + else { + object.address = []; + if (options.bytes !== $Array) + object.address = $util.newBuffer(object.address); + } + object.mask = 0; + object.name = ""; + object.hash = ""; + object.reason = ""; + object.start = ""; + object.duration = 0; + } + if (message.address != null && $Object.hasOwnProperty.call(message, "address")) + object.address = options.bytes === $String ? $util.base64.encode(message.address, 0, message.address.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.address) : message.address; + if (message.mask != null && $Object.hasOwnProperty.call(message, "mask")) + object.mask = message.mask; + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + object.name = message.name; + if (message.hash != null && $Object.hasOwnProperty.call(message, "hash")) + object.hash = message.hash; + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + object.reason = message.reason; + if (message.start != null && $Object.hasOwnProperty.call(message, "start")) + object.start = message.start; + if (message.duration != null && $Object.hasOwnProperty.call(message, "duration")) + object.duration = message.duration; + return object; + }; + + BanEntry.prototype.toJSON = function() { + return BanEntry.toObject(this, $protobuf.util.toJSONOptions); + }; + + BanEntry.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.BanList.BanEntry"; + }; + + return BanEntry; + })(); + + return BanList; + })(); + + MumbleProto.TextMessage = (function() { + + const TextMessage = function (properties) { + this.session = []; + this.channel_id = []; + this.tree_id = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + TextMessage.prototype.actor = 0; + TextMessage.prototype.session = $util.emptyArray; + TextMessage.prototype.channel_id = $util.emptyArray; + TextMessage.prototype.tree_id = $util.emptyArray; + TextMessage.prototype.message = ""; + + TextMessage.create = function(properties) { + return new TextMessage(properties); + }; + + TextMessage.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.actor != null && $Object.hasOwnProperty.call(message, "actor")) + writer.uint32(8).uint32(message.actor); + if (message.session != null && message.session.length) + for (let i = 0; i < message.session.length; ++i) + writer.uint32(16).uint32(message.session[i]); + if (message.channel_id != null && message.channel_id.length) + for (let i = 0; i < message.channel_id.length; ++i) + writer.uint32(24).uint32(message.channel_id[i]); + if (message.tree_id != null && message.tree_id.length) + for (let i = 0; i < message.tree_id.length; ++i) + writer.uint32(32).uint32(message.tree_id[i]); + writer.uint32(42).string(message.message); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + TextMessage.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.TextMessage(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.actor = reader.uint32(); + continue; + } + case 2: { + if (wireType === 2) { + if (!(message.session && message.session.length)) + message.session = []; + reader.uint32s(message.session); + continue; + } + if (wireType !== 0) + break; + if (!(message.session && message.session.length)) + message.session = []; + message.session.push(reader.uint32()); + continue; + } + case 3: { + if (wireType === 2) { + if (!(message.channel_id && message.channel_id.length)) + message.channel_id = []; + reader.uint32s(message.channel_id); + continue; + } + if (wireType !== 0) + break; + if (!(message.channel_id && message.channel_id.length)) + message.channel_id = []; + message.channel_id.push(reader.uint32()); + continue; + } + case 4: { + if (wireType === 2) { + if (!(message.tree_id && message.tree_id.length)) + message.tree_id = []; + reader.uint32s(message.tree_id); + continue; + } + if (wireType !== 0) + break; + if (!(message.tree_id && message.tree_id.length)) + message.tree_id = []; + message.tree_id.push(reader.uint32()); + continue; + } + case 5: { + if (wireType !== 2) + break; + message.message = reader.string(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "message")) + throw $util.ProtocolError("missing required 'message'", { instance: message }); + return message; + }; + + TextMessage.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.actor != null && $Object.hasOwnProperty.call(message, "actor")) + if (!$util.isInteger(message.actor)) + return "actor: integer expected"; + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) { + if (!$Array.isArray(message.session)) + return "session: array expected"; + for (let i = 0; i < message.session.length; ++i) + if (!$util.isInteger(message.session[i])) + return "session: integer[] expected"; + } + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) { + if (!$Array.isArray(message.channel_id)) + return "channel_id: array expected"; + for (let i = 0; i < message.channel_id.length; ++i) + if (!$util.isInteger(message.channel_id[i])) + return "channel_id: integer[] expected"; + } + if (message.tree_id != null && $Object.hasOwnProperty.call(message, "tree_id")) { + if (!$Array.isArray(message.tree_id)) + return "tree_id: array expected"; + for (let i = 0; i < message.tree_id.length; ++i) + if (!$util.isInteger(message.tree_id[i])) + return "tree_id: integer[] expected"; + } + if (!$util.isString(message.message)) + return "message: string expected"; + return null; + }; + + TextMessage.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.TextMessage) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.TextMessage: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.TextMessage(); + if (object.actor != null) + message.actor = object.actor >>> 0; + if (object.session) { + if (!$Array.isArray(object.session)) + throw $TypeError(".MumbleProto.TextMessage.session: array expected"); + message.session = $Array(object.session.length); + for (let i = 0; i < object.session.length; ++i) + message.session[i] = object.session[i] >>> 0; + } + if (object.channel_id) { + if (!$Array.isArray(object.channel_id)) + throw $TypeError(".MumbleProto.TextMessage.channel_id: array expected"); + message.channel_id = $Array(object.channel_id.length); + for (let i = 0; i < object.channel_id.length; ++i) + message.channel_id[i] = object.channel_id[i] >>> 0; + } + if (object.tree_id) { + if (!$Array.isArray(object.tree_id)) + throw $TypeError(".MumbleProto.TextMessage.tree_id: array expected"); + message.tree_id = $Array(object.tree_id.length); + for (let i = 0; i < object.tree_id.length; ++i) + message.tree_id[i] = object.tree_id[i] >>> 0; + } + if (object.message != null) + message.message = $String(object.message); + return message; + }; + + TextMessage.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) { + object.session = []; + object.channel_id = []; + object.tree_id = []; + } + if (options.defaults) { + object.actor = 0; + object.message = ""; + } + if (message.actor != null && $Object.hasOwnProperty.call(message, "actor")) + object.actor = message.actor; + if (message.session && message.session.length) { + object.session = $Array(message.session.length); + for (let j = 0; j < message.session.length; ++j) + object.session[j] = message.session[j]; + } + if (message.channel_id && message.channel_id.length) { + object.channel_id = $Array(message.channel_id.length); + for (let j = 0; j < message.channel_id.length; ++j) + object.channel_id[j] = message.channel_id[j]; + } + if (message.tree_id && message.tree_id.length) { + object.tree_id = $Array(message.tree_id.length); + for (let j = 0; j < message.tree_id.length; ++j) + object.tree_id[j] = message.tree_id[j]; + } + if (message.message != null && $Object.hasOwnProperty.call(message, "message")) + object.message = message.message; + return object; + }; + + TextMessage.prototype.toJSON = function() { + return TextMessage.toObject(this, $protobuf.util.toJSONOptions); + }; + + TextMessage.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.TextMessage"; + }; + + return TextMessage; + })(); + + MumbleProto.PermissionDenied = (function() { + + const PermissionDenied = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + PermissionDenied.prototype.permission = 0; + PermissionDenied.prototype.channel_id = 0; + PermissionDenied.prototype.session = 0; + PermissionDenied.prototype.reason = ""; + PermissionDenied.prototype.type = 0; + PermissionDenied.prototype.name = ""; + + PermissionDenied.create = function(properties) { + return new PermissionDenied(properties); + }; + + PermissionDenied.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.permission != null && $Object.hasOwnProperty.call(message, "permission")) + writer.uint32(8).uint32(message.permission); + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + writer.uint32(16).uint32(message.channel_id); + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + writer.uint32(24).uint32(message.session); + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + writer.uint32(34).string(message.reason); + if (message.type != null && $Object.hasOwnProperty.call(message, "type")) + writer.uint32(40).int32(message.type); + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + writer.uint32(50).string(message.name); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + PermissionDenied.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message, value; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.PermissionDenied(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.permission = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.channel_id = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.session = reader.uint32(); + continue; + } + case 4: { + if (wireType !== 2) + break; + message.reason = reader.string(); + continue; + } + case 5: { + if (wireType !== 0) + break; + value = reader.int32(); + if ($root.MumbleProto.PermissionDenied.DenyType[value] !== $undefined) + message.type = value; + else if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + continue; + } + case 6: { + if (wireType !== 2) + break; + message.name = reader.string(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + PermissionDenied.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.permission != null && $Object.hasOwnProperty.call(message, "permission")) + if (!$util.isInteger(message.permission)) + return "permission: integer expected"; + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + if (!$util.isInteger(message.channel_id)) + return "channel_id: integer expected"; + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + if (!$util.isInteger(message.session)) + return "session: integer expected"; + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + if (!$util.isString(message.reason)) + return "reason: string expected"; + if (message.type != null && $Object.hasOwnProperty.call(message, "type")) + switch (message.type) { + default: + return "type: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + break; + } + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + if (!$util.isString(message.name)) + return "name: string expected"; + return null; + }; + + PermissionDenied.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.PermissionDenied) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.PermissionDenied: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.PermissionDenied(); + if (object.permission != null) + message.permission = object.permission >>> 0; + if (object.channel_id != null) + message.channel_id = object.channel_id >>> 0; + if (object.session != null) + message.session = object.session >>> 0; + if (object.reason != null) + message.reason = $String(object.reason); + switch (object.type) { + case "Text": + case 0: + message.type = 0; + break; + case "Permission": + case 1: + message.type = 1; + break; + case "SuperUser": + case 2: + message.type = 2; + break; + case "ChannelName": + case 3: + message.type = 3; + break; + case "TextTooLong": + case 4: + message.type = 4; + break; + case "H9K": + case 5: + message.type = 5; + break; + case "TemporaryChannel": + case 6: + message.type = 6; + break; + case "MissingCertificate": + case 7: + message.type = 7; + break; + case "UserName": + case 8: + message.type = 8; + break; + case "ChannelFull": + case 9: + message.type = 9; + break; + case "NestingLimit": + case 10: + message.type = 10; + break; + case "ChannelCountLimit": + case 11: + message.type = 11; + break; + case "ChannelListenerLimit": + case 12: + message.type = 12; + break; + case "UserListenerLimit": + case 13: + message.type = 13; + break; + default: + } + if (object.name != null) + message.name = $String(object.name); + return message; + }; + + PermissionDenied.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.permission = 0; + object.channel_id = 0; + object.session = 0; + object.reason = ""; + object.type = options.enums === $String ? "Text" : 0; + object.name = ""; + } + if (message.permission != null && $Object.hasOwnProperty.call(message, "permission")) + object.permission = message.permission; + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + object.channel_id = message.channel_id; + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + object.session = message.session; + if (message.reason != null && $Object.hasOwnProperty.call(message, "reason")) + object.reason = message.reason; + if (message.type != null && $Object.hasOwnProperty.call(message, "type")) + object.type = options.enums === $String ? $root.MumbleProto.PermissionDenied.DenyType[message.type] === $undefined ? message.type : $root.MumbleProto.PermissionDenied.DenyType[message.type] : message.type; + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + object.name = message.name; + return object; + }; + + PermissionDenied.prototype.toJSON = function() { + return PermissionDenied.toObject(this, $protobuf.util.toJSONOptions); + }; + + PermissionDenied.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.PermissionDenied"; + }; + + PermissionDenied.DenyType = (function() { + const valuesById = $Object.create(null), values = $Object.create(valuesById); + values[valuesById[0] = "Text"] = 0; + values[valuesById[1] = "Permission"] = 1; + values[valuesById[2] = "SuperUser"] = 2; + values[valuesById[3] = "ChannelName"] = 3; + values[valuesById[4] = "TextTooLong"] = 4; + values[valuesById[5] = "H9K"] = 5; + values[valuesById[6] = "TemporaryChannel"] = 6; + values[valuesById[7] = "MissingCertificate"] = 7; + values[valuesById[8] = "UserName"] = 8; + values[valuesById[9] = "ChannelFull"] = 9; + values[valuesById[10] = "NestingLimit"] = 10; + values[valuesById[11] = "ChannelCountLimit"] = 11; + values[valuesById[12] = "ChannelListenerLimit"] = 12; + values[valuesById[13] = "UserListenerLimit"] = 13; + return values; + })(); + + return PermissionDenied; + })(); + + MumbleProto.ACL = (function() { + + const ACL = function (properties) { + this.groups = []; + this.acls = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + ACL.prototype.channel_id = 0; + ACL.prototype.inherit_acls = true; + ACL.prototype.groups = $util.emptyArray; + ACL.prototype.acls = $util.emptyArray; + ACL.prototype.query = false; + + ACL.create = function(properties) { + return new ACL(properties); + }; + + ACL.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + writer.uint32(8).uint32(message.channel_id); + if (message.inherit_acls != null && $Object.hasOwnProperty.call(message, "inherit_acls")) + writer.uint32(16).bool(message.inherit_acls); + if (message.groups != null && message.groups.length) + for (let i = 0; i < message.groups.length; ++i) + $root.MumbleProto.ACL.ChanGroup.encode(message.groups[i], writer.uint32(26).fork(), _depth + 1).ldelim(); + if (message.acls != null && message.acls.length) + for (let i = 0; i < message.acls.length; ++i) + $root.MumbleProto.ACL.ChanACL.encode(message.acls[i], writer.uint32(34).fork(), _depth + 1).ldelim(); + if (message.query != null && $Object.hasOwnProperty.call(message, "query")) + writer.uint32(40).bool(message.query); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + ACL.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.ACL(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.channel_id = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.inherit_acls = reader.bool(); + continue; + } + case 3: { + if (wireType !== 2) + break; + if (!(message.groups && message.groups.length)) + message.groups = []; + message.groups.push($root.MumbleProto.ACL.ChanGroup.decode(reader, reader.uint32(), $undefined, _depth + 1)); + continue; + } + case 4: { + if (wireType !== 2) + break; + if (!(message.acls && message.acls.length)) + message.acls = []; + message.acls.push($root.MumbleProto.ACL.ChanACL.decode(reader, reader.uint32(), $undefined, _depth + 1)); + continue; + } + case 5: { + if (wireType !== 0) + break; + message.query = reader.bool(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "channel_id")) + throw $util.ProtocolError("missing required 'channel_id'", { instance: message }); + return message; + }; + + ACL.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (!$util.isInteger(message.channel_id)) + return "channel_id: integer expected"; + if (message.inherit_acls != null && $Object.hasOwnProperty.call(message, "inherit_acls")) + if (typeof message.inherit_acls !== "boolean") + return "inherit_acls: boolean expected"; + if (message.groups != null && $Object.hasOwnProperty.call(message, "groups")) { + if (!$Array.isArray(message.groups)) + return "groups: array expected"; + for (let i = 0; i < message.groups.length; ++i) { + let error = $root.MumbleProto.ACL.ChanGroup.verify(message.groups[i], _depth + 1); + if (error) + return "groups." + error; + } + } + if (message.acls != null && $Object.hasOwnProperty.call(message, "acls")) { + if (!$Array.isArray(message.acls)) + return "acls: array expected"; + for (let i = 0; i < message.acls.length; ++i) { + let error = $root.MumbleProto.ACL.ChanACL.verify(message.acls[i], _depth + 1); + if (error) + return "acls." + error; + } + } + if (message.query != null && $Object.hasOwnProperty.call(message, "query")) + if (typeof message.query !== "boolean") + return "query: boolean expected"; + return null; + }; + + ACL.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.ACL) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.ACL: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.ACL(); + if (object.channel_id != null) + message.channel_id = object.channel_id >>> 0; + if (object.inherit_acls != null) + message.inherit_acls = $Boolean(object.inherit_acls); + if (object.groups) { + if (!$Array.isArray(object.groups)) + throw $TypeError(".MumbleProto.ACL.groups: array expected"); + message.groups = $Array(object.groups.length); + for (let i = 0; i < object.groups.length; ++i) { + if (!$util.isObject(object.groups[i])) + throw $TypeError(".MumbleProto.ACL.groups: object expected"); + message.groups[i] = $root.MumbleProto.ACL.ChanGroup.fromObject(object.groups[i], _depth + 1); + } + } + if (object.acls) { + if (!$Array.isArray(object.acls)) + throw $TypeError(".MumbleProto.ACL.acls: array expected"); + message.acls = $Array(object.acls.length); + for (let i = 0; i < object.acls.length; ++i) { + if (!$util.isObject(object.acls[i])) + throw $TypeError(".MumbleProto.ACL.acls: object expected"); + message.acls[i] = $root.MumbleProto.ACL.ChanACL.fromObject(object.acls[i], _depth + 1); + } + } + if (object.query != null) + message.query = $Boolean(object.query); + return message; + }; + + ACL.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) { + object.groups = []; + object.acls = []; + } + if (options.defaults) { + object.channel_id = 0; + object.inherit_acls = true; + object.query = false; + } + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + object.channel_id = message.channel_id; + if (message.inherit_acls != null && $Object.hasOwnProperty.call(message, "inherit_acls")) + object.inherit_acls = message.inherit_acls; + if (message.groups && message.groups.length) { + object.groups = $Array(message.groups.length); + for (let j = 0; j < message.groups.length; ++j) + object.groups[j] = $root.MumbleProto.ACL.ChanGroup.toObject(message.groups[j], options, _depth + 1); + } + if (message.acls && message.acls.length) { + object.acls = $Array(message.acls.length); + for (let j = 0; j < message.acls.length; ++j) + object.acls[j] = $root.MumbleProto.ACL.ChanACL.toObject(message.acls[j], options, _depth + 1); + } + if (message.query != null && $Object.hasOwnProperty.call(message, "query")) + object.query = message.query; + return object; + }; + + ACL.prototype.toJSON = function() { + return ACL.toObject(this, $protobuf.util.toJSONOptions); + }; + + ACL.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.ACL"; + }; + + ACL.ChanGroup = (function() { + + const ChanGroup = function (properties) { + this.add = []; + this.remove = []; + this.inherited_members = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + ChanGroup.prototype.name = ""; + ChanGroup.prototype.inherited = true; + ChanGroup.prototype.inherit = true; + ChanGroup.prototype.inheritable = true; + ChanGroup.prototype.add = $util.emptyArray; + ChanGroup.prototype.remove = $util.emptyArray; + ChanGroup.prototype.inherited_members = $util.emptyArray; + + ChanGroup.create = function(properties) { + return new ChanGroup(properties); + }; + + ChanGroup.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + writer.uint32(10).string(message.name); + if (message.inherited != null && $Object.hasOwnProperty.call(message, "inherited")) + writer.uint32(16).bool(message.inherited); + if (message.inherit != null && $Object.hasOwnProperty.call(message, "inherit")) + writer.uint32(24).bool(message.inherit); + if (message.inheritable != null && $Object.hasOwnProperty.call(message, "inheritable")) + writer.uint32(32).bool(message.inheritable); + if (message.add != null && message.add.length) + for (let i = 0; i < message.add.length; ++i) + writer.uint32(40).uint32(message.add[i]); + if (message.remove != null && message.remove.length) + for (let i = 0; i < message.remove.length; ++i) + writer.uint32(48).uint32(message.remove[i]); + if (message.inherited_members != null && message.inherited_members.length) + for (let i = 0; i < message.inherited_members.length; ++i) + writer.uint32(56).uint32(message.inherited_members[i]); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + ChanGroup.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.ACL.ChanGroup(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 2) + break; + message.name = reader.string(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.inherited = reader.bool(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.inherit = reader.bool(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.inheritable = reader.bool(); + continue; + } + case 5: { + if (wireType === 2) { + if (!(message.add && message.add.length)) + message.add = []; + reader.uint32s(message.add); + continue; + } + if (wireType !== 0) + break; + if (!(message.add && message.add.length)) + message.add = []; + message.add.push(reader.uint32()); + continue; + } + case 6: { + if (wireType === 2) { + if (!(message.remove && message.remove.length)) + message.remove = []; + reader.uint32s(message.remove); + continue; + } + if (wireType !== 0) + break; + if (!(message.remove && message.remove.length)) + message.remove = []; + message.remove.push(reader.uint32()); + continue; + } + case 7: { + if (wireType === 2) { + if (!(message.inherited_members && message.inherited_members.length)) + message.inherited_members = []; + reader.uint32s(message.inherited_members); + continue; + } + if (wireType !== 0) + break; + if (!(message.inherited_members && message.inherited_members.length)) + message.inherited_members = []; + message.inherited_members.push(reader.uint32()); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "name")) + throw $util.ProtocolError("missing required 'name'", { instance: message }); + return message; + }; + + ChanGroup.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.inherited != null && $Object.hasOwnProperty.call(message, "inherited")) + if (typeof message.inherited !== "boolean") + return "inherited: boolean expected"; + if (message.inherit != null && $Object.hasOwnProperty.call(message, "inherit")) + if (typeof message.inherit !== "boolean") + return "inherit: boolean expected"; + if (message.inheritable != null && $Object.hasOwnProperty.call(message, "inheritable")) + if (typeof message.inheritable !== "boolean") + return "inheritable: boolean expected"; + if (message.add != null && $Object.hasOwnProperty.call(message, "add")) { + if (!$Array.isArray(message.add)) + return "add: array expected"; + for (let i = 0; i < message.add.length; ++i) + if (!$util.isInteger(message.add[i])) + return "add: integer[] expected"; + } + if (message.remove != null && $Object.hasOwnProperty.call(message, "remove")) { + if (!$Array.isArray(message.remove)) + return "remove: array expected"; + for (let i = 0; i < message.remove.length; ++i) + if (!$util.isInteger(message.remove[i])) + return "remove: integer[] expected"; + } + if (message.inherited_members != null && $Object.hasOwnProperty.call(message, "inherited_members")) { + if (!$Array.isArray(message.inherited_members)) + return "inherited_members: array expected"; + for (let i = 0; i < message.inherited_members.length; ++i) + if (!$util.isInteger(message.inherited_members[i])) + return "inherited_members: integer[] expected"; + } + return null; + }; + + ChanGroup.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.ACL.ChanGroup) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.ACL.ChanGroup: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.ACL.ChanGroup(); + if (object.name != null) + message.name = $String(object.name); + if (object.inherited != null) + message.inherited = $Boolean(object.inherited); + if (object.inherit != null) + message.inherit = $Boolean(object.inherit); + if (object.inheritable != null) + message.inheritable = $Boolean(object.inheritable); + if (object.add) { + if (!$Array.isArray(object.add)) + throw $TypeError(".MumbleProto.ACL.ChanGroup.add: array expected"); + message.add = $Array(object.add.length); + for (let i = 0; i < object.add.length; ++i) + message.add[i] = object.add[i] >>> 0; + } + if (object.remove) { + if (!$Array.isArray(object.remove)) + throw $TypeError(".MumbleProto.ACL.ChanGroup.remove: array expected"); + message.remove = $Array(object.remove.length); + for (let i = 0; i < object.remove.length; ++i) + message.remove[i] = object.remove[i] >>> 0; + } + if (object.inherited_members) { + if (!$Array.isArray(object.inherited_members)) + throw $TypeError(".MumbleProto.ACL.ChanGroup.inherited_members: array expected"); + message.inherited_members = $Array(object.inherited_members.length); + for (let i = 0; i < object.inherited_members.length; ++i) + message.inherited_members[i] = object.inherited_members[i] >>> 0; + } + return message; + }; + + ChanGroup.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) { + object.add = []; + object.remove = []; + object.inherited_members = []; + } + if (options.defaults) { + object.name = ""; + object.inherited = true; + object.inherit = true; + object.inheritable = true; + } + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + object.name = message.name; + if (message.inherited != null && $Object.hasOwnProperty.call(message, "inherited")) + object.inherited = message.inherited; + if (message.inherit != null && $Object.hasOwnProperty.call(message, "inherit")) + object.inherit = message.inherit; + if (message.inheritable != null && $Object.hasOwnProperty.call(message, "inheritable")) + object.inheritable = message.inheritable; + if (message.add && message.add.length) { + object.add = $Array(message.add.length); + for (let j = 0; j < message.add.length; ++j) + object.add[j] = message.add[j]; + } + if (message.remove && message.remove.length) { + object.remove = $Array(message.remove.length); + for (let j = 0; j < message.remove.length; ++j) + object.remove[j] = message.remove[j]; + } + if (message.inherited_members && message.inherited_members.length) { + object.inherited_members = $Array(message.inherited_members.length); + for (let j = 0; j < message.inherited_members.length; ++j) + object.inherited_members[j] = message.inherited_members[j]; + } + return object; + }; + + ChanGroup.prototype.toJSON = function() { + return ChanGroup.toObject(this, $protobuf.util.toJSONOptions); + }; + + ChanGroup.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.ACL.ChanGroup"; + }; + + return ChanGroup; + })(); + + ACL.ChanACL = (function() { + + const ChanACL = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + ChanACL.prototype.apply_here = true; + ChanACL.prototype.apply_subs = true; + ChanACL.prototype.inherited = true; + ChanACL.prototype.user_id = 0; + ChanACL.prototype.group = ""; + ChanACL.prototype.grant = 0; + ChanACL.prototype.deny = 0; + + ChanACL.create = function(properties) { + return new ChanACL(properties); + }; + + ChanACL.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.apply_here != null && $Object.hasOwnProperty.call(message, "apply_here")) + writer.uint32(8).bool(message.apply_here); + if (message.apply_subs != null && $Object.hasOwnProperty.call(message, "apply_subs")) + writer.uint32(16).bool(message.apply_subs); + if (message.inherited != null && $Object.hasOwnProperty.call(message, "inherited")) + writer.uint32(24).bool(message.inherited); + if (message.user_id != null && $Object.hasOwnProperty.call(message, "user_id")) + writer.uint32(32).uint32(message.user_id); + if (message.group != null && $Object.hasOwnProperty.call(message, "group")) + writer.uint32(42).string(message.group); + if (message.grant != null && $Object.hasOwnProperty.call(message, "grant")) + writer.uint32(48).uint32(message.grant); + if (message.deny != null && $Object.hasOwnProperty.call(message, "deny")) + writer.uint32(56).uint32(message.deny); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + ChanACL.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.ACL.ChanACL(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.apply_here = reader.bool(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.apply_subs = reader.bool(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.inherited = reader.bool(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.user_id = reader.uint32(); + continue; + } + case 5: { + if (wireType !== 2) + break; + message.group = reader.string(); + continue; + } + case 6: { + if (wireType !== 0) + break; + message.grant = reader.uint32(); + continue; + } + case 7: { + if (wireType !== 0) + break; + message.deny = reader.uint32(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + ChanACL.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.apply_here != null && $Object.hasOwnProperty.call(message, "apply_here")) + if (typeof message.apply_here !== "boolean") + return "apply_here: boolean expected"; + if (message.apply_subs != null && $Object.hasOwnProperty.call(message, "apply_subs")) + if (typeof message.apply_subs !== "boolean") + return "apply_subs: boolean expected"; + if (message.inherited != null && $Object.hasOwnProperty.call(message, "inherited")) + if (typeof message.inherited !== "boolean") + return "inherited: boolean expected"; + if (message.user_id != null && $Object.hasOwnProperty.call(message, "user_id")) + if (!$util.isInteger(message.user_id)) + return "user_id: integer expected"; + if (message.group != null && $Object.hasOwnProperty.call(message, "group")) + if (!$util.isString(message.group)) + return "group: string expected"; + if (message.grant != null && $Object.hasOwnProperty.call(message, "grant")) + if (!$util.isInteger(message.grant)) + return "grant: integer expected"; + if (message.deny != null && $Object.hasOwnProperty.call(message, "deny")) + if (!$util.isInteger(message.deny)) + return "deny: integer expected"; + return null; + }; + + ChanACL.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.ACL.ChanACL) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.ACL.ChanACL: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.ACL.ChanACL(); + if (object.apply_here != null) + message.apply_here = $Boolean(object.apply_here); + if (object.apply_subs != null) + message.apply_subs = $Boolean(object.apply_subs); + if (object.inherited != null) + message.inherited = $Boolean(object.inherited); + if (object.user_id != null) + message.user_id = object.user_id >>> 0; + if (object.group != null) + message.group = $String(object.group); + if (object.grant != null) + message.grant = object.grant >>> 0; + if (object.deny != null) + message.deny = object.deny >>> 0; + return message; + }; + + ChanACL.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.apply_here = true; + object.apply_subs = true; + object.inherited = true; + object.user_id = 0; + object.group = ""; + object.grant = 0; + object.deny = 0; + } + if (message.apply_here != null && $Object.hasOwnProperty.call(message, "apply_here")) + object.apply_here = message.apply_here; + if (message.apply_subs != null && $Object.hasOwnProperty.call(message, "apply_subs")) + object.apply_subs = message.apply_subs; + if (message.inherited != null && $Object.hasOwnProperty.call(message, "inherited")) + object.inherited = message.inherited; + if (message.user_id != null && $Object.hasOwnProperty.call(message, "user_id")) + object.user_id = message.user_id; + if (message.group != null && $Object.hasOwnProperty.call(message, "group")) + object.group = message.group; + if (message.grant != null && $Object.hasOwnProperty.call(message, "grant")) + object.grant = message.grant; + if (message.deny != null && $Object.hasOwnProperty.call(message, "deny")) + object.deny = message.deny; + return object; + }; + + ChanACL.prototype.toJSON = function() { + return ChanACL.toObject(this, $protobuf.util.toJSONOptions); + }; + + ChanACL.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.ACL.ChanACL"; + }; + + return ChanACL; + })(); + + return ACL; + })(); + + MumbleProto.QueryUsers = (function() { + + const QueryUsers = function (properties) { + this.ids = []; + this.names = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + QueryUsers.prototype.ids = $util.emptyArray; + QueryUsers.prototype.names = $util.emptyArray; + + QueryUsers.create = function(properties) { + return new QueryUsers(properties); + }; + + QueryUsers.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.ids != null && message.ids.length) + for (let i = 0; i < message.ids.length; ++i) + writer.uint32(8).uint32(message.ids[i]); + if (message.names != null && message.names.length) + for (let i = 0; i < message.names.length; ++i) + writer.uint32(18).string(message.names[i]); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + QueryUsers.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.QueryUsers(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType === 2) { + if (!(message.ids && message.ids.length)) + message.ids = []; + reader.uint32s(message.ids); + continue; + } + if (wireType !== 0) + break; + if (!(message.ids && message.ids.length)) + message.ids = []; + message.ids.push(reader.uint32()); + continue; + } + case 2: { + if (wireType !== 2) + break; + if (!(message.names && message.names.length)) + message.names = []; + message.names.push(reader.string()); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + QueryUsers.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.ids != null && $Object.hasOwnProperty.call(message, "ids")) { + if (!$Array.isArray(message.ids)) + return "ids: array expected"; + for (let i = 0; i < message.ids.length; ++i) + if (!$util.isInteger(message.ids[i])) + return "ids: integer[] expected"; + } + if (message.names != null && $Object.hasOwnProperty.call(message, "names")) { + if (!$Array.isArray(message.names)) + return "names: array expected"; + for (let i = 0; i < message.names.length; ++i) + if (!$util.isString(message.names[i])) + return "names: string[] expected"; + } + return null; + }; + + QueryUsers.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.QueryUsers) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.QueryUsers: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.QueryUsers(); + if (object.ids) { + if (!$Array.isArray(object.ids)) + throw $TypeError(".MumbleProto.QueryUsers.ids: array expected"); + message.ids = $Array(object.ids.length); + for (let i = 0; i < object.ids.length; ++i) + message.ids[i] = object.ids[i] >>> 0; + } + if (object.names) { + if (!$Array.isArray(object.names)) + throw $TypeError(".MumbleProto.QueryUsers.names: array expected"); + message.names = $Array(object.names.length); + for (let i = 0; i < object.names.length; ++i) + message.names[i] = $String(object.names[i]); + } + return message; + }; + + QueryUsers.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) { + object.ids = []; + object.names = []; + } + if (message.ids && message.ids.length) { + object.ids = $Array(message.ids.length); + for (let j = 0; j < message.ids.length; ++j) + object.ids[j] = message.ids[j]; + } + if (message.names && message.names.length) { + object.names = $Array(message.names.length); + for (let j = 0; j < message.names.length; ++j) + object.names[j] = message.names[j]; + } + return object; + }; + + QueryUsers.prototype.toJSON = function() { + return QueryUsers.toObject(this, $protobuf.util.toJSONOptions); + }; + + QueryUsers.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.QueryUsers"; + }; + + return QueryUsers; + })(); + + MumbleProto.CryptSetup = (function() { + + const CryptSetup = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + CryptSetup.prototype.key = $util.newBuffer([]); + CryptSetup.prototype.client_nonce = $util.newBuffer([]); + CryptSetup.prototype.server_nonce = $util.newBuffer([]); + + CryptSetup.create = function(properties) { + return new CryptSetup(properties); + }; + + CryptSetup.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.key != null && $Object.hasOwnProperty.call(message, "key")) + writer.uint32(10).bytes(message.key); + if (message.client_nonce != null && $Object.hasOwnProperty.call(message, "client_nonce")) + writer.uint32(18).bytes(message.client_nonce); + if (message.server_nonce != null && $Object.hasOwnProperty.call(message, "server_nonce")) + writer.uint32(26).bytes(message.server_nonce); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + CryptSetup.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.CryptSetup(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 2) + break; + message.key = reader.bytes(); + continue; + } + case 2: { + if (wireType !== 2) + break; + message.client_nonce = reader.bytes(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.server_nonce = reader.bytes(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + CryptSetup.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.key != null && $Object.hasOwnProperty.call(message, "key")) + if (!(message.key && typeof message.key.length === "number" || $util.isString(message.key))) + return "key: buffer expected"; + if (message.client_nonce != null && $Object.hasOwnProperty.call(message, "client_nonce")) + if (!(message.client_nonce && typeof message.client_nonce.length === "number" || $util.isString(message.client_nonce))) + return "client_nonce: buffer expected"; + if (message.server_nonce != null && $Object.hasOwnProperty.call(message, "server_nonce")) + if (!(message.server_nonce && typeof message.server_nonce.length === "number" || $util.isString(message.server_nonce))) + return "server_nonce: buffer expected"; + return null; + }; + + CryptSetup.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.CryptSetup) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.CryptSetup: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.CryptSetup(); + if (object.key != null) + if (typeof object.key === "string") + $util.base64.decode(object.key, message.key = $util.newBuffer($util.base64.length(object.key)), 0); + else if (object.key.length >= 0) + message.key = object.key; + if (object.client_nonce != null) + if (typeof object.client_nonce === "string") + $util.base64.decode(object.client_nonce, message.client_nonce = $util.newBuffer($util.base64.length(object.client_nonce)), 0); + else if (object.client_nonce.length >= 0) + message.client_nonce = object.client_nonce; + if (object.server_nonce != null) + if (typeof object.server_nonce === "string") + $util.base64.decode(object.server_nonce, message.server_nonce = $util.newBuffer($util.base64.length(object.server_nonce)), 0); + else if (object.server_nonce.length >= 0) + message.server_nonce = object.server_nonce; + return message; + }; + + CryptSetup.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + if (options.bytes === $String) + object.key = ""; + else { + object.key = []; + if (options.bytes !== $Array) + object.key = $util.newBuffer(object.key); + } + if (options.bytes === $String) + object.client_nonce = ""; + else { + object.client_nonce = []; + if (options.bytes !== $Array) + object.client_nonce = $util.newBuffer(object.client_nonce); + } + if (options.bytes === $String) + object.server_nonce = ""; + else { + object.server_nonce = []; + if (options.bytes !== $Array) + object.server_nonce = $util.newBuffer(object.server_nonce); + } + } + if (message.key != null && $Object.hasOwnProperty.call(message, "key")) + object.key = options.bytes === $String ? $util.base64.encode(message.key, 0, message.key.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.key) : message.key; + if (message.client_nonce != null && $Object.hasOwnProperty.call(message, "client_nonce")) + object.client_nonce = options.bytes === $String ? $util.base64.encode(message.client_nonce, 0, message.client_nonce.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.client_nonce) : message.client_nonce; + if (message.server_nonce != null && $Object.hasOwnProperty.call(message, "server_nonce")) + object.server_nonce = options.bytes === $String ? $util.base64.encode(message.server_nonce, 0, message.server_nonce.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.server_nonce) : message.server_nonce; + return object; + }; + + CryptSetup.prototype.toJSON = function() { + return CryptSetup.toObject(this, $protobuf.util.toJSONOptions); + }; + + CryptSetup.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.CryptSetup"; + }; + + return CryptSetup; + })(); + + MumbleProto.ContextActionModify = (function() { + + const ContextActionModify = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + ContextActionModify.prototype.action = ""; + ContextActionModify.prototype.text = ""; + ContextActionModify.prototype.context = 0; + ContextActionModify.prototype.operation = 0; + + ContextActionModify.create = function(properties) { + return new ContextActionModify(properties); + }; + + ContextActionModify.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + writer.uint32(10).string(message.action); + if (message.text != null && $Object.hasOwnProperty.call(message, "text")) + writer.uint32(18).string(message.text); + if (message.context != null && $Object.hasOwnProperty.call(message, "context")) + writer.uint32(24).uint32(message.context); + if (message.operation != null && $Object.hasOwnProperty.call(message, "operation")) + writer.uint32(32).int32(message.operation); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + ContextActionModify.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message, value; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.ContextActionModify(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 2) + break; + message.action = reader.string(); + continue; + } + case 2: { + if (wireType !== 2) + break; + message.text = reader.string(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.context = reader.uint32(); + continue; + } + case 4: { + if (wireType !== 0) + break; + value = reader.int32(); + if ($root.MumbleProto.ContextActionModify.Operation[value] !== $undefined) + message.operation = value; + else if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "action")) + throw $util.ProtocolError("missing required 'action'", { instance: message }); + return message; + }; + + ContextActionModify.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (!$util.isString(message.action)) + return "action: string expected"; + if (message.text != null && $Object.hasOwnProperty.call(message, "text")) + if (!$util.isString(message.text)) + return "text: string expected"; + if (message.context != null && $Object.hasOwnProperty.call(message, "context")) + if (!$util.isInteger(message.context)) + return "context: integer expected"; + if (message.operation != null && $Object.hasOwnProperty.call(message, "operation")) + switch (message.operation) { + default: + return "operation: enum value expected"; + case 0: + case 1: + break; + } + return null; + }; + + ContextActionModify.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.ContextActionModify) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.ContextActionModify: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.ContextActionModify(); + if (object.action != null) + message.action = $String(object.action); + if (object.text != null) + message.text = $String(object.text); + if (object.context != null) + message.context = object.context >>> 0; + switch (object.operation) { + case "Add": + case 0: + message.operation = 0; + break; + case "Remove": + case 1: + message.operation = 1; + break; + default: + } + return message; + }; + + ContextActionModify.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.action = ""; + object.text = ""; + object.context = 0; + object.operation = options.enums === $String ? "Add" : 0; + } + if (message.action != null && $Object.hasOwnProperty.call(message, "action")) + object.action = message.action; + if (message.text != null && $Object.hasOwnProperty.call(message, "text")) + object.text = message.text; + if (message.context != null && $Object.hasOwnProperty.call(message, "context")) + object.context = message.context; + if (message.operation != null && $Object.hasOwnProperty.call(message, "operation")) + object.operation = options.enums === $String ? $root.MumbleProto.ContextActionModify.Operation[message.operation] === $undefined ? message.operation : $root.MumbleProto.ContextActionModify.Operation[message.operation] : message.operation; + return object; + }; + + ContextActionModify.prototype.toJSON = function() { + return ContextActionModify.toObject(this, $protobuf.util.toJSONOptions); + }; + + ContextActionModify.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.ContextActionModify"; + }; + + ContextActionModify.Context = (function() { + const valuesById = $Object.create(null), values = $Object.create(valuesById); + values[valuesById[1] = "Server"] = 1; + values[valuesById[2] = "Channel"] = 2; + values[valuesById[4] = "User"] = 4; + return values; + })(); + + ContextActionModify.Operation = (function() { + const valuesById = $Object.create(null), values = $Object.create(valuesById); + values[valuesById[0] = "Add"] = 0; + values[valuesById[1] = "Remove"] = 1; + return values; + })(); + + return ContextActionModify; + })(); + + MumbleProto.ContextAction = (function() { + + const ContextAction = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + ContextAction.prototype.session = 0; + ContextAction.prototype.channel_id = 0; + ContextAction.prototype.action = ""; + + ContextAction.create = function(properties) { + return new ContextAction(properties); + }; + + ContextAction.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + writer.uint32(8).uint32(message.session); + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + writer.uint32(16).uint32(message.channel_id); + writer.uint32(26).string(message.action); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + ContextAction.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.ContextAction(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.session = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.channel_id = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.action = reader.string(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "action")) + throw $util.ProtocolError("missing required 'action'", { instance: message }); + return message; + }; + + ContextAction.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + if (!$util.isInteger(message.session)) + return "session: integer expected"; + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + if (!$util.isInteger(message.channel_id)) + return "channel_id: integer expected"; + if (!$util.isString(message.action)) + return "action: string expected"; + return null; + }; + + ContextAction.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.ContextAction) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.ContextAction: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.ContextAction(); + if (object.session != null) + message.session = object.session >>> 0; + if (object.channel_id != null) + message.channel_id = object.channel_id >>> 0; + if (object.action != null) + message.action = $String(object.action); + return message; + }; + + ContextAction.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.session = 0; + object.channel_id = 0; + object.action = ""; + } + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + object.session = message.session; + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + object.channel_id = message.channel_id; + if (message.action != null && $Object.hasOwnProperty.call(message, "action")) + object.action = message.action; + return object; + }; + + ContextAction.prototype.toJSON = function() { + return ContextAction.toObject(this, $protobuf.util.toJSONOptions); + }; + + ContextAction.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.ContextAction"; + }; + + return ContextAction; + })(); + + MumbleProto.UserList = (function() { + + const UserList = function (properties) { + this.users = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + UserList.prototype.users = $util.emptyArray; + + UserList.create = function(properties) { + return new UserList(properties); + }; + + UserList.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.users != null && message.users.length) + for (let i = 0; i < message.users.length; ++i) + $root.MumbleProto.UserList.User.encode(message.users[i], writer.uint32(10).fork(), _depth + 1).ldelim(); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + UserList.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.UserList(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 2) + break; + if (!(message.users && message.users.length)) + message.users = []; + message.users.push($root.MumbleProto.UserList.User.decode(reader, reader.uint32(), $undefined, _depth + 1)); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + UserList.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.users != null && $Object.hasOwnProperty.call(message, "users")) { + if (!$Array.isArray(message.users)) + return "users: array expected"; + for (let i = 0; i < message.users.length; ++i) { + let error = $root.MumbleProto.UserList.User.verify(message.users[i], _depth + 1); + if (error) + return "users." + error; + } + } + return null; + }; + + UserList.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.UserList) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.UserList: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.UserList(); + if (object.users) { + if (!$Array.isArray(object.users)) + throw $TypeError(".MumbleProto.UserList.users: array expected"); + message.users = $Array(object.users.length); + for (let i = 0; i < object.users.length; ++i) { + if (!$util.isObject(object.users[i])) + throw $TypeError(".MumbleProto.UserList.users: object expected"); + message.users[i] = $root.MumbleProto.UserList.User.fromObject(object.users[i], _depth + 1); + } + } + return message; + }; + + UserList.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) + object.users = []; + if (message.users && message.users.length) { + object.users = $Array(message.users.length); + for (let j = 0; j < message.users.length; ++j) + object.users[j] = $root.MumbleProto.UserList.User.toObject(message.users[j], options, _depth + 1); + } + return object; + }; + + UserList.prototype.toJSON = function() { + return UserList.toObject(this, $protobuf.util.toJSONOptions); + }; + + UserList.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.UserList"; + }; + + UserList.User = (function() { + + const User = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + User.prototype.user_id = 0; + User.prototype.name = ""; + User.prototype.last_seen = ""; + User.prototype.last_channel = 0; + + User.create = function(properties) { + return new User(properties); + }; + + User.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + writer.uint32(8).uint32(message.user_id); + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + writer.uint32(18).string(message.name); + if (message.last_seen != null && $Object.hasOwnProperty.call(message, "last_seen")) + writer.uint32(26).string(message.last_seen); + if (message.last_channel != null && $Object.hasOwnProperty.call(message, "last_channel")) + writer.uint32(32).uint32(message.last_channel); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + User.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.UserList.User(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.user_id = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 2) + break; + message.name = reader.string(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.last_seen = reader.string(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.last_channel = reader.uint32(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "user_id")) + throw $util.ProtocolError("missing required 'user_id'", { instance: message }); + return message; + }; + + User.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (!$util.isInteger(message.user_id)) + return "user_id: integer expected"; + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.last_seen != null && $Object.hasOwnProperty.call(message, "last_seen")) + if (!$util.isString(message.last_seen)) + return "last_seen: string expected"; + if (message.last_channel != null && $Object.hasOwnProperty.call(message, "last_channel")) + if (!$util.isInteger(message.last_channel)) + return "last_channel: integer expected"; + return null; + }; + + User.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.UserList.User) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.UserList.User: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.UserList.User(); + if (object.user_id != null) + message.user_id = object.user_id >>> 0; + if (object.name != null) + message.name = $String(object.name); + if (object.last_seen != null) + message.last_seen = $String(object.last_seen); + if (object.last_channel != null) + message.last_channel = object.last_channel >>> 0; + return message; + }; + + User.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.user_id = 0; + object.name = ""; + object.last_seen = ""; + object.last_channel = 0; + } + if (message.user_id != null && $Object.hasOwnProperty.call(message, "user_id")) + object.user_id = message.user_id; + if (message.name != null && $Object.hasOwnProperty.call(message, "name")) + object.name = message.name; + if (message.last_seen != null && $Object.hasOwnProperty.call(message, "last_seen")) + object.last_seen = message.last_seen; + if (message.last_channel != null && $Object.hasOwnProperty.call(message, "last_channel")) + object.last_channel = message.last_channel; + return object; + }; + + User.prototype.toJSON = function() { + return User.toObject(this, $protobuf.util.toJSONOptions); + }; + + User.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.UserList.User"; + }; + + return User; + })(); + + return UserList; + })(); + + MumbleProto.VoiceTarget = (function() { + + const VoiceTarget = function (properties) { + this.targets = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + VoiceTarget.prototype.id = 0; + VoiceTarget.prototype.targets = $util.emptyArray; + + VoiceTarget.create = function(properties) { + return new VoiceTarget(properties); + }; + + VoiceTarget.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.id != null && $Object.hasOwnProperty.call(message, "id")) + writer.uint32(8).uint32(message.id); + if (message.targets != null && message.targets.length) + for (let i = 0; i < message.targets.length; ++i) + $root.MumbleProto.VoiceTarget.Target.encode(message.targets[i], writer.uint32(18).fork(), _depth + 1).ldelim(); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + VoiceTarget.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.VoiceTarget(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.id = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 2) + break; + if (!(message.targets && message.targets.length)) + message.targets = []; + message.targets.push($root.MumbleProto.VoiceTarget.Target.decode(reader, reader.uint32(), $undefined, _depth + 1)); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + VoiceTarget.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.id != null && $Object.hasOwnProperty.call(message, "id")) + if (!$util.isInteger(message.id)) + return "id: integer expected"; + if (message.targets != null && $Object.hasOwnProperty.call(message, "targets")) { + if (!$Array.isArray(message.targets)) + return "targets: array expected"; + for (let i = 0; i < message.targets.length; ++i) { + let error = $root.MumbleProto.VoiceTarget.Target.verify(message.targets[i], _depth + 1); + if (error) + return "targets." + error; + } + } + return null; + }; + + VoiceTarget.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.VoiceTarget) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.VoiceTarget: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.VoiceTarget(); + if (object.id != null) + message.id = object.id >>> 0; + if (object.targets) { + if (!$Array.isArray(object.targets)) + throw $TypeError(".MumbleProto.VoiceTarget.targets: array expected"); + message.targets = $Array(object.targets.length); + for (let i = 0; i < object.targets.length; ++i) { + if (!$util.isObject(object.targets[i])) + throw $TypeError(".MumbleProto.VoiceTarget.targets: object expected"); + message.targets[i] = $root.MumbleProto.VoiceTarget.Target.fromObject(object.targets[i], _depth + 1); + } + } + return message; + }; + + VoiceTarget.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) + object.targets = []; + if (options.defaults) + object.id = 0; + if (message.id != null && $Object.hasOwnProperty.call(message, "id")) + object.id = message.id; + if (message.targets && message.targets.length) { + object.targets = $Array(message.targets.length); + for (let j = 0; j < message.targets.length; ++j) + object.targets[j] = $root.MumbleProto.VoiceTarget.Target.toObject(message.targets[j], options, _depth + 1); + } + return object; + }; + + VoiceTarget.prototype.toJSON = function() { + return VoiceTarget.toObject(this, $protobuf.util.toJSONOptions); + }; + + VoiceTarget.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.VoiceTarget"; + }; + + VoiceTarget.Target = (function() { + + const Target = function (properties) { + this.session = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + Target.prototype.session = $util.emptyArray; + Target.prototype.channel_id = 0; + Target.prototype.group = ""; + Target.prototype.links = false; + Target.prototype.children = false; + + Target.create = function(properties) { + return new Target(properties); + }; + + Target.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.session != null && message.session.length) + for (let i = 0; i < message.session.length; ++i) + writer.uint32(8).uint32(message.session[i]); + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + writer.uint32(16).uint32(message.channel_id); + if (message.group != null && $Object.hasOwnProperty.call(message, "group")) + writer.uint32(26).string(message.group); + if (message.links != null && $Object.hasOwnProperty.call(message, "links")) + writer.uint32(32).bool(message.links); + if (message.children != null && $Object.hasOwnProperty.call(message, "children")) + writer.uint32(40).bool(message.children); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + Target.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.VoiceTarget.Target(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType === 2) { + if (!(message.session && message.session.length)) + message.session = []; + reader.uint32s(message.session); + continue; + } + if (wireType !== 0) + break; + if (!(message.session && message.session.length)) + message.session = []; + message.session.push(reader.uint32()); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.channel_id = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.group = reader.string(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.links = reader.bool(); + continue; + } + case 5: { + if (wireType !== 0) + break; + message.children = reader.bool(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + Target.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) { + if (!$Array.isArray(message.session)) + return "session: array expected"; + for (let i = 0; i < message.session.length; ++i) + if (!$util.isInteger(message.session[i])) + return "session: integer[] expected"; + } + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + if (!$util.isInteger(message.channel_id)) + return "channel_id: integer expected"; + if (message.group != null && $Object.hasOwnProperty.call(message, "group")) + if (!$util.isString(message.group)) + return "group: string expected"; + if (message.links != null && $Object.hasOwnProperty.call(message, "links")) + if (typeof message.links !== "boolean") + return "links: boolean expected"; + if (message.children != null && $Object.hasOwnProperty.call(message, "children")) + if (typeof message.children !== "boolean") + return "children: boolean expected"; + return null; + }; + + Target.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.VoiceTarget.Target) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.VoiceTarget.Target: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.VoiceTarget.Target(); + if (object.session) { + if (!$Array.isArray(object.session)) + throw $TypeError(".MumbleProto.VoiceTarget.Target.session: array expected"); + message.session = $Array(object.session.length); + for (let i = 0; i < object.session.length; ++i) + message.session[i] = object.session[i] >>> 0; + } + if (object.channel_id != null) + message.channel_id = object.channel_id >>> 0; + if (object.group != null) + message.group = $String(object.group); + if (object.links != null) + message.links = $Boolean(object.links); + if (object.children != null) + message.children = $Boolean(object.children); + return message; + }; + + Target.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) + object.session = []; + if (options.defaults) { + object.channel_id = 0; + object.group = ""; + object.links = false; + object.children = false; + } + if (message.session && message.session.length) { + object.session = $Array(message.session.length); + for (let j = 0; j < message.session.length; ++j) + object.session[j] = message.session[j]; + } + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + object.channel_id = message.channel_id; + if (message.group != null && $Object.hasOwnProperty.call(message, "group")) + object.group = message.group; + if (message.links != null && $Object.hasOwnProperty.call(message, "links")) + object.links = message.links; + if (message.children != null && $Object.hasOwnProperty.call(message, "children")) + object.children = message.children; + return object; + }; + + Target.prototype.toJSON = function() { + return Target.toObject(this, $protobuf.util.toJSONOptions); + }; + + Target.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.VoiceTarget.Target"; + }; + + return Target; + })(); + + return VoiceTarget; + })(); + + MumbleProto.PermissionQuery = (function() { + + const PermissionQuery = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + PermissionQuery.prototype.channel_id = 0; + PermissionQuery.prototype.permissions = 0; + PermissionQuery.prototype.flush = false; + + PermissionQuery.create = function(properties) { + return new PermissionQuery(properties); + }; + + PermissionQuery.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + writer.uint32(8).uint32(message.channel_id); + if (message.permissions != null && $Object.hasOwnProperty.call(message, "permissions")) + writer.uint32(16).uint32(message.permissions); + if (message.flush != null && $Object.hasOwnProperty.call(message, "flush")) + writer.uint32(24).bool(message.flush); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + PermissionQuery.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.PermissionQuery(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.channel_id = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.permissions = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.flush = reader.bool(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + PermissionQuery.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + if (!$util.isInteger(message.channel_id)) + return "channel_id: integer expected"; + if (message.permissions != null && $Object.hasOwnProperty.call(message, "permissions")) + if (!$util.isInteger(message.permissions)) + return "permissions: integer expected"; + if (message.flush != null && $Object.hasOwnProperty.call(message, "flush")) + if (typeof message.flush !== "boolean") + return "flush: boolean expected"; + return null; + }; + + PermissionQuery.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.PermissionQuery) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.PermissionQuery: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.PermissionQuery(); + if (object.channel_id != null) + message.channel_id = object.channel_id >>> 0; + if (object.permissions != null) + message.permissions = object.permissions >>> 0; + if (object.flush != null) + message.flush = $Boolean(object.flush); + return message; + }; + + PermissionQuery.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.channel_id = 0; + object.permissions = 0; + object.flush = false; + } + if (message.channel_id != null && $Object.hasOwnProperty.call(message, "channel_id")) + object.channel_id = message.channel_id; + if (message.permissions != null && $Object.hasOwnProperty.call(message, "permissions")) + object.permissions = message.permissions; + if (message.flush != null && $Object.hasOwnProperty.call(message, "flush")) + object.flush = message.flush; + return object; + }; + + PermissionQuery.prototype.toJSON = function() { + return PermissionQuery.toObject(this, $protobuf.util.toJSONOptions); + }; + + PermissionQuery.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.PermissionQuery"; + }; + + return PermissionQuery; + })(); + + MumbleProto.CodecVersion = (function() { + + const CodecVersion = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + CodecVersion.prototype.alpha = 0; + CodecVersion.prototype.beta = 0; + CodecVersion.prototype.prefer_alpha = true; + CodecVersion.prototype.opus = false; + + CodecVersion.create = function(properties) { + return new CodecVersion(properties); + }; + + CodecVersion.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + writer.uint32(8).int32(message.alpha); + writer.uint32(16).int32(message.beta); + writer.uint32(24).bool(message.prefer_alpha); + if (message.opus != null && $Object.hasOwnProperty.call(message, "opus")) + writer.uint32(32).bool(message.opus); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + CodecVersion.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.CodecVersion(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.alpha = reader.int32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.beta = reader.int32(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.prefer_alpha = reader.bool(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.opus = reader.bool(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + if (!$Object.hasOwnProperty.call(message, "alpha")) + throw $util.ProtocolError("missing required 'alpha'", { instance: message }); + if (!$Object.hasOwnProperty.call(message, "beta")) + throw $util.ProtocolError("missing required 'beta'", { instance: message }); + if (!$Object.hasOwnProperty.call(message, "prefer_alpha")) + throw $util.ProtocolError("missing required 'prefer_alpha'", { instance: message }); + return message; + }; + + CodecVersion.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (!$util.isInteger(message.alpha)) + return "alpha: integer expected"; + if (!$util.isInteger(message.beta)) + return "beta: integer expected"; + if (typeof message.prefer_alpha !== "boolean") + return "prefer_alpha: boolean expected"; + if (message.opus != null && $Object.hasOwnProperty.call(message, "opus")) + if (typeof message.opus !== "boolean") + return "opus: boolean expected"; + return null; + }; + + CodecVersion.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.CodecVersion) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.CodecVersion: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.CodecVersion(); + if (object.alpha != null) + message.alpha = object.alpha | 0; + if (object.beta != null) + message.beta = object.beta | 0; + if (object.prefer_alpha != null) + message.prefer_alpha = $Boolean(object.prefer_alpha); + if (object.opus != null) + message.opus = $Boolean(object.opus); + return message; + }; + + CodecVersion.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.alpha = 0; + object.beta = 0; + object.prefer_alpha = true; + object.opus = false; + } + if (message.alpha != null && $Object.hasOwnProperty.call(message, "alpha")) + object.alpha = message.alpha; + if (message.beta != null && $Object.hasOwnProperty.call(message, "beta")) + object.beta = message.beta; + if (message.prefer_alpha != null && $Object.hasOwnProperty.call(message, "prefer_alpha")) + object.prefer_alpha = message.prefer_alpha; + if (message.opus != null && $Object.hasOwnProperty.call(message, "opus")) + object.opus = message.opus; + return object; + }; + + CodecVersion.prototype.toJSON = function() { + return CodecVersion.toObject(this, $protobuf.util.toJSONOptions); + }; + + CodecVersion.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.CodecVersion"; + }; + + return CodecVersion; + })(); + + MumbleProto.UserStats = (function() { + + const UserStats = function (properties) { + this.certificates = []; + this.celt_versions = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + UserStats.prototype.session = 0; + UserStats.prototype.stats_only = false; + UserStats.prototype.certificates = $util.emptyArray; + UserStats.prototype.from_client = null; + UserStats.prototype.from_server = null; + UserStats.prototype.udp_packets = 0; + UserStats.prototype.tcp_packets = 0; + UserStats.prototype.udp_ping_avg = 0; + UserStats.prototype.udp_ping_var = 0; + UserStats.prototype.tcp_ping_avg = 0; + UserStats.prototype.tcp_ping_var = 0; + UserStats.prototype.version = null; + UserStats.prototype.celt_versions = $util.emptyArray; + UserStats.prototype.address = $util.newBuffer([]); + UserStats.prototype.bandwidth = 0; + UserStats.prototype.onlinesecs = 0; + UserStats.prototype.idlesecs = 0; + UserStats.prototype.strong_certificate = false; + UserStats.prototype.opus = false; + UserStats.prototype.rolling_stats = null; + + UserStats.create = function(properties) { + return new UserStats(properties); + }; + + UserStats.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + writer.uint32(8).uint32(message.session); + if (message.stats_only != null && $Object.hasOwnProperty.call(message, "stats_only")) + writer.uint32(16).bool(message.stats_only); + if (message.certificates != null && message.certificates.length) + for (let i = 0; i < message.certificates.length; ++i) + writer.uint32(26).bytes(message.certificates[i]); + if (message.from_client != null && $Object.hasOwnProperty.call(message, "from_client")) + $root.MumbleProto.UserStats.Stats.encode(message.from_client, writer.uint32(34).fork(), _depth + 1).ldelim(); + if (message.from_server != null && $Object.hasOwnProperty.call(message, "from_server")) + $root.MumbleProto.UserStats.Stats.encode(message.from_server, writer.uint32(42).fork(), _depth + 1).ldelim(); + if (message.udp_packets != null && $Object.hasOwnProperty.call(message, "udp_packets")) + writer.uint32(48).uint32(message.udp_packets); + if (message.tcp_packets != null && $Object.hasOwnProperty.call(message, "tcp_packets")) + writer.uint32(56).uint32(message.tcp_packets); + if (message.udp_ping_avg != null && $Object.hasOwnProperty.call(message, "udp_ping_avg")) + writer.uint32(69).float(message.udp_ping_avg); + if (message.udp_ping_var != null && $Object.hasOwnProperty.call(message, "udp_ping_var")) + writer.uint32(77).float(message.udp_ping_var); + if (message.tcp_ping_avg != null && $Object.hasOwnProperty.call(message, "tcp_ping_avg")) + writer.uint32(85).float(message.tcp_ping_avg); + if (message.tcp_ping_var != null && $Object.hasOwnProperty.call(message, "tcp_ping_var")) + writer.uint32(93).float(message.tcp_ping_var); + if (message.version != null && $Object.hasOwnProperty.call(message, "version")) + $root.MumbleProto.Version.encode(message.version, writer.uint32(98).fork(), _depth + 1).ldelim(); + if (message.celt_versions != null && message.celt_versions.length) + for (let i = 0; i < message.celt_versions.length; ++i) + writer.uint32(104).int32(message.celt_versions[i]); + if (message.address != null && $Object.hasOwnProperty.call(message, "address")) + writer.uint32(114).bytes(message.address); + if (message.bandwidth != null && $Object.hasOwnProperty.call(message, "bandwidth")) + writer.uint32(120).uint32(message.bandwidth); + if (message.onlinesecs != null && $Object.hasOwnProperty.call(message, "onlinesecs")) + writer.uint32(128).uint32(message.onlinesecs); + if (message.idlesecs != null && $Object.hasOwnProperty.call(message, "idlesecs")) + writer.uint32(136).uint32(message.idlesecs); + if (message.strong_certificate != null && $Object.hasOwnProperty.call(message, "strong_certificate")) + writer.uint32(144).bool(message.strong_certificate); + if (message.opus != null && $Object.hasOwnProperty.call(message, "opus")) + writer.uint32(152).bool(message.opus); + if (message.rolling_stats != null && $Object.hasOwnProperty.call(message, "rolling_stats")) + $root.MumbleProto.UserStats.RollingStats.encode(message.rolling_stats, writer.uint32(162).fork(), _depth + 1).ldelim(); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + UserStats.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.UserStats(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.session = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.stats_only = reader.bool(); + continue; + } + case 3: { + if (wireType !== 2) + break; + if (!(message.certificates && message.certificates.length)) + message.certificates = []; + message.certificates.push(reader.bytes()); + continue; + } + case 4: { + if (wireType !== 2) + break; + message.from_client = $root.MumbleProto.UserStats.Stats.decode(reader, reader.uint32(), $undefined, _depth + 1, message.from_client); + continue; + } + case 5: { + if (wireType !== 2) + break; + message.from_server = $root.MumbleProto.UserStats.Stats.decode(reader, reader.uint32(), $undefined, _depth + 1, message.from_server); + continue; + } + case 6: { + if (wireType !== 0) + break; + message.udp_packets = reader.uint32(); + continue; + } + case 7: { + if (wireType !== 0) + break; + message.tcp_packets = reader.uint32(); + continue; + } + case 8: { + if (wireType !== 5) + break; + message.udp_ping_avg = reader.float(); + continue; + } + case 9: { + if (wireType !== 5) + break; + message.udp_ping_var = reader.float(); + continue; + } + case 10: { + if (wireType !== 5) + break; + message.tcp_ping_avg = reader.float(); + continue; + } + case 11: { + if (wireType !== 5) + break; + message.tcp_ping_var = reader.float(); + continue; + } + case 12: { + if (wireType !== 2) + break; + message.version = $root.MumbleProto.Version.decode(reader, reader.uint32(), $undefined, _depth + 1, message.version); + continue; + } + case 13: { + if (wireType === 2) { + if (!(message.celt_versions && message.celt_versions.length)) + message.celt_versions = []; + reader.int32s(message.celt_versions); + continue; + } + if (wireType !== 0) + break; + if (!(message.celt_versions && message.celt_versions.length)) + message.celt_versions = []; + message.celt_versions.push(reader.int32()); + continue; + } + case 14: { + if (wireType !== 2) + break; + message.address = reader.bytes(); + continue; + } + case 15: { + if (wireType !== 0) + break; + message.bandwidth = reader.uint32(); + continue; + } + case 16: { + if (wireType !== 0) + break; + message.onlinesecs = reader.uint32(); + continue; + } + case 17: { + if (wireType !== 0) + break; + message.idlesecs = reader.uint32(); + continue; + } + case 18: { + if (wireType !== 0) + break; + message.strong_certificate = reader.bool(); + continue; + } + case 19: { + if (wireType !== 0) + break; + message.opus = reader.bool(); + continue; + } + case 20: { + if (wireType !== 2) + break; + message.rolling_stats = $root.MumbleProto.UserStats.RollingStats.decode(reader, reader.uint32(), $undefined, _depth + 1, message.rolling_stats); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + UserStats.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + if (!$util.isInteger(message.session)) + return "session: integer expected"; + if (message.stats_only != null && $Object.hasOwnProperty.call(message, "stats_only")) + if (typeof message.stats_only !== "boolean") + return "stats_only: boolean expected"; + if (message.certificates != null && $Object.hasOwnProperty.call(message, "certificates")) { + if (!$Array.isArray(message.certificates)) + return "certificates: array expected"; + for (let i = 0; i < message.certificates.length; ++i) + if (!(message.certificates[i] && typeof message.certificates[i].length === "number" || $util.isString(message.certificates[i]))) + return "certificates: buffer[] expected"; + } + if (message.from_client != null && $Object.hasOwnProperty.call(message, "from_client")) { + let error = $root.MumbleProto.UserStats.Stats.verify(message.from_client, _depth + 1); + if (error) + return "from_client." + error; + } + if (message.from_server != null && $Object.hasOwnProperty.call(message, "from_server")) { + let error = $root.MumbleProto.UserStats.Stats.verify(message.from_server, _depth + 1); + if (error) + return "from_server." + error; + } + if (message.udp_packets != null && $Object.hasOwnProperty.call(message, "udp_packets")) + if (!$util.isInteger(message.udp_packets)) + return "udp_packets: integer expected"; + if (message.tcp_packets != null && $Object.hasOwnProperty.call(message, "tcp_packets")) + if (!$util.isInteger(message.tcp_packets)) + return "tcp_packets: integer expected"; + if (message.udp_ping_avg != null && $Object.hasOwnProperty.call(message, "udp_ping_avg")) + if (typeof message.udp_ping_avg !== "number") + return "udp_ping_avg: number expected"; + if (message.udp_ping_var != null && $Object.hasOwnProperty.call(message, "udp_ping_var")) + if (typeof message.udp_ping_var !== "number") + return "udp_ping_var: number expected"; + if (message.tcp_ping_avg != null && $Object.hasOwnProperty.call(message, "tcp_ping_avg")) + if (typeof message.tcp_ping_avg !== "number") + return "tcp_ping_avg: number expected"; + if (message.tcp_ping_var != null && $Object.hasOwnProperty.call(message, "tcp_ping_var")) + if (typeof message.tcp_ping_var !== "number") + return "tcp_ping_var: number expected"; + if (message.version != null && $Object.hasOwnProperty.call(message, "version")) { + let error = $root.MumbleProto.Version.verify(message.version, _depth + 1); + if (error) + return "version." + error; + } + if (message.celt_versions != null && $Object.hasOwnProperty.call(message, "celt_versions")) { + if (!$Array.isArray(message.celt_versions)) + return "celt_versions: array expected"; + for (let i = 0; i < message.celt_versions.length; ++i) + if (!$util.isInteger(message.celt_versions[i])) + return "celt_versions: integer[] expected"; + } + if (message.address != null && $Object.hasOwnProperty.call(message, "address")) + if (!(message.address && typeof message.address.length === "number" || $util.isString(message.address))) + return "address: buffer expected"; + if (message.bandwidth != null && $Object.hasOwnProperty.call(message, "bandwidth")) + if (!$util.isInteger(message.bandwidth)) + return "bandwidth: integer expected"; + if (message.onlinesecs != null && $Object.hasOwnProperty.call(message, "onlinesecs")) + if (!$util.isInteger(message.onlinesecs)) + return "onlinesecs: integer expected"; + if (message.idlesecs != null && $Object.hasOwnProperty.call(message, "idlesecs")) + if (!$util.isInteger(message.idlesecs)) + return "idlesecs: integer expected"; + if (message.strong_certificate != null && $Object.hasOwnProperty.call(message, "strong_certificate")) + if (typeof message.strong_certificate !== "boolean") + return "strong_certificate: boolean expected"; + if (message.opus != null && $Object.hasOwnProperty.call(message, "opus")) + if (typeof message.opus !== "boolean") + return "opus: boolean expected"; + if (message.rolling_stats != null && $Object.hasOwnProperty.call(message, "rolling_stats")) { + let error = $root.MumbleProto.UserStats.RollingStats.verify(message.rolling_stats, _depth + 1); + if (error) + return "rolling_stats." + error; + } + return null; + }; + + UserStats.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.UserStats) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.UserStats: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.UserStats(); + if (object.session != null) + message.session = object.session >>> 0; + if (object.stats_only != null) + message.stats_only = $Boolean(object.stats_only); + if (object.certificates) { + if (!$Array.isArray(object.certificates)) + throw $TypeError(".MumbleProto.UserStats.certificates: array expected"); + message.certificates = $Array(object.certificates.length); + for (let i = 0; i < object.certificates.length; ++i) + if (typeof object.certificates[i] === "string") + $util.base64.decode(object.certificates[i], message.certificates[i] = $util.newBuffer($util.base64.length(object.certificates[i])), 0); + else if (object.certificates[i].length >= 0) + message.certificates[i] = object.certificates[i]; + } + if (object.from_client != null) { + if (!$util.isObject(object.from_client)) + throw $TypeError(".MumbleProto.UserStats.from_client: object expected"); + message.from_client = $root.MumbleProto.UserStats.Stats.fromObject(object.from_client, _depth + 1); + } + if (object.from_server != null) { + if (!$util.isObject(object.from_server)) + throw $TypeError(".MumbleProto.UserStats.from_server: object expected"); + message.from_server = $root.MumbleProto.UserStats.Stats.fromObject(object.from_server, _depth + 1); + } + if (object.udp_packets != null) + message.udp_packets = object.udp_packets >>> 0; + if (object.tcp_packets != null) + message.tcp_packets = object.tcp_packets >>> 0; + if (object.udp_ping_avg != null) + message.udp_ping_avg = $Number(object.udp_ping_avg); + if (object.udp_ping_var != null) + message.udp_ping_var = $Number(object.udp_ping_var); + if (object.tcp_ping_avg != null) + message.tcp_ping_avg = $Number(object.tcp_ping_avg); + if (object.tcp_ping_var != null) + message.tcp_ping_var = $Number(object.tcp_ping_var); + if (object.version != null) { + if (!$util.isObject(object.version)) + throw $TypeError(".MumbleProto.UserStats.version: object expected"); + message.version = $root.MumbleProto.Version.fromObject(object.version, _depth + 1); + } + if (object.celt_versions) { + if (!$Array.isArray(object.celt_versions)) + throw $TypeError(".MumbleProto.UserStats.celt_versions: array expected"); + message.celt_versions = $Array(object.celt_versions.length); + for (let i = 0; i < object.celt_versions.length; ++i) + message.celt_versions[i] = object.celt_versions[i] | 0; + } + if (object.address != null) + if (typeof object.address === "string") + $util.base64.decode(object.address, message.address = $util.newBuffer($util.base64.length(object.address)), 0); + else if (object.address.length >= 0) + message.address = object.address; + if (object.bandwidth != null) + message.bandwidth = object.bandwidth >>> 0; + if (object.onlinesecs != null) + message.onlinesecs = object.onlinesecs >>> 0; + if (object.idlesecs != null) + message.idlesecs = object.idlesecs >>> 0; + if (object.strong_certificate != null) + message.strong_certificate = $Boolean(object.strong_certificate); + if (object.opus != null) + message.opus = $Boolean(object.opus); + if (object.rolling_stats != null) { + if (!$util.isObject(object.rolling_stats)) + throw $TypeError(".MumbleProto.UserStats.rolling_stats: object expected"); + message.rolling_stats = $root.MumbleProto.UserStats.RollingStats.fromObject(object.rolling_stats, _depth + 1); + } + return message; + }; + + UserStats.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) { + object.certificates = []; + object.celt_versions = []; + } + if (options.defaults) { + object.session = 0; + object.stats_only = false; + object.from_client = null; + object.from_server = null; + object.udp_packets = 0; + object.tcp_packets = 0; + object.udp_ping_avg = 0; + object.udp_ping_var = 0; + object.tcp_ping_avg = 0; + object.tcp_ping_var = 0; + object.version = null; + if (options.bytes === $String) + object.address = ""; + else { + object.address = []; + if (options.bytes !== $Array) + object.address = $util.newBuffer(object.address); + } + object.bandwidth = 0; + object.onlinesecs = 0; + object.idlesecs = 0; + object.strong_certificate = false; + object.opus = false; + object.rolling_stats = null; + } + if (message.session != null && $Object.hasOwnProperty.call(message, "session")) + object.session = message.session; + if (message.stats_only != null && $Object.hasOwnProperty.call(message, "stats_only")) + object.stats_only = message.stats_only; + if (message.certificates && message.certificates.length) { + object.certificates = $Array(message.certificates.length); + for (let j = 0; j < message.certificates.length; ++j) + object.certificates[j] = options.bytes === $String ? $util.base64.encode(message.certificates[j], 0, message.certificates[j].length) : options.bytes === $Array ? $Array.prototype.slice.call(message.certificates[j]) : message.certificates[j]; + } + if (message.from_client != null && $Object.hasOwnProperty.call(message, "from_client")) + object.from_client = $root.MumbleProto.UserStats.Stats.toObject(message.from_client, options, _depth + 1); + if (message.from_server != null && $Object.hasOwnProperty.call(message, "from_server")) + object.from_server = $root.MumbleProto.UserStats.Stats.toObject(message.from_server, options, _depth + 1); + if (message.udp_packets != null && $Object.hasOwnProperty.call(message, "udp_packets")) + object.udp_packets = message.udp_packets; + if (message.tcp_packets != null && $Object.hasOwnProperty.call(message, "tcp_packets")) + object.tcp_packets = message.tcp_packets; + if (message.udp_ping_avg != null && $Object.hasOwnProperty.call(message, "udp_ping_avg")) + object.udp_ping_avg = options.json && !$isFinite(message.udp_ping_avg) ? $String(message.udp_ping_avg) : message.udp_ping_avg; + if (message.udp_ping_var != null && $Object.hasOwnProperty.call(message, "udp_ping_var")) + object.udp_ping_var = options.json && !$isFinite(message.udp_ping_var) ? $String(message.udp_ping_var) : message.udp_ping_var; + if (message.tcp_ping_avg != null && $Object.hasOwnProperty.call(message, "tcp_ping_avg")) + object.tcp_ping_avg = options.json && !$isFinite(message.tcp_ping_avg) ? $String(message.tcp_ping_avg) : message.tcp_ping_avg; + if (message.tcp_ping_var != null && $Object.hasOwnProperty.call(message, "tcp_ping_var")) + object.tcp_ping_var = options.json && !$isFinite(message.tcp_ping_var) ? $String(message.tcp_ping_var) : message.tcp_ping_var; + if (message.version != null && $Object.hasOwnProperty.call(message, "version")) + object.version = $root.MumbleProto.Version.toObject(message.version, options, _depth + 1); + if (message.celt_versions && message.celt_versions.length) { + object.celt_versions = $Array(message.celt_versions.length); + for (let j = 0; j < message.celt_versions.length; ++j) + object.celt_versions[j] = message.celt_versions[j]; + } + if (message.address != null && $Object.hasOwnProperty.call(message, "address")) + object.address = options.bytes === $String ? $util.base64.encode(message.address, 0, message.address.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.address) : message.address; + if (message.bandwidth != null && $Object.hasOwnProperty.call(message, "bandwidth")) + object.bandwidth = message.bandwidth; + if (message.onlinesecs != null && $Object.hasOwnProperty.call(message, "onlinesecs")) + object.onlinesecs = message.onlinesecs; + if (message.idlesecs != null && $Object.hasOwnProperty.call(message, "idlesecs")) + object.idlesecs = message.idlesecs; + if (message.strong_certificate != null && $Object.hasOwnProperty.call(message, "strong_certificate")) + object.strong_certificate = message.strong_certificate; + if (message.opus != null && $Object.hasOwnProperty.call(message, "opus")) + object.opus = message.opus; + if (message.rolling_stats != null && $Object.hasOwnProperty.call(message, "rolling_stats")) + object.rolling_stats = $root.MumbleProto.UserStats.RollingStats.toObject(message.rolling_stats, options, _depth + 1); + return object; + }; + + UserStats.prototype.toJSON = function() { + return UserStats.toObject(this, $protobuf.util.toJSONOptions); + }; + + UserStats.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.UserStats"; + }; + + UserStats.Stats = (function() { + + const Stats = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + Stats.prototype.good = 0; + Stats.prototype.late = 0; + Stats.prototype.lost = 0; + Stats.prototype.resync = 0; + + Stats.create = function(properties) { + return new Stats(properties); + }; + + Stats.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.good != null && $Object.hasOwnProperty.call(message, "good")) + writer.uint32(8).uint32(message.good); + if (message.late != null && $Object.hasOwnProperty.call(message, "late")) + writer.uint32(16).uint32(message.late); + if (message.lost != null && $Object.hasOwnProperty.call(message, "lost")) + writer.uint32(24).uint32(message.lost); + if (message.resync != null && $Object.hasOwnProperty.call(message, "resync")) + writer.uint32(32).uint32(message.resync); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + Stats.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.UserStats.Stats(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.good = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.late = reader.uint32(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.lost = reader.uint32(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.resync = reader.uint32(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + Stats.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.good != null && $Object.hasOwnProperty.call(message, "good")) + if (!$util.isInteger(message.good)) + return "good: integer expected"; + if (message.late != null && $Object.hasOwnProperty.call(message, "late")) + if (!$util.isInteger(message.late)) + return "late: integer expected"; + if (message.lost != null && $Object.hasOwnProperty.call(message, "lost")) + if (!$util.isInteger(message.lost)) + return "lost: integer expected"; + if (message.resync != null && $Object.hasOwnProperty.call(message, "resync")) + if (!$util.isInteger(message.resync)) + return "resync: integer expected"; + return null; + }; + + Stats.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.UserStats.Stats) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.UserStats.Stats: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.UserStats.Stats(); + if (object.good != null) + message.good = object.good >>> 0; + if (object.late != null) + message.late = object.late >>> 0; + if (object.lost != null) + message.lost = object.lost >>> 0; + if (object.resync != null) + message.resync = object.resync >>> 0; + return message; + }; + + Stats.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.good = 0; + object.late = 0; + object.lost = 0; + object.resync = 0; + } + if (message.good != null && $Object.hasOwnProperty.call(message, "good")) + object.good = message.good; + if (message.late != null && $Object.hasOwnProperty.call(message, "late")) + object.late = message.late; + if (message.lost != null && $Object.hasOwnProperty.call(message, "lost")) + object.lost = message.lost; + if (message.resync != null && $Object.hasOwnProperty.call(message, "resync")) + object.resync = message.resync; + return object; + }; + + Stats.prototype.toJSON = function() { + return Stats.toObject(this, $protobuf.util.toJSONOptions); + }; + + Stats.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.UserStats.Stats"; + }; + + return Stats; + })(); + + UserStats.RollingStats = (function() { + + const RollingStats = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + RollingStats.prototype.time_window = 0; + RollingStats.prototype.from_client = null; + RollingStats.prototype.from_server = null; + + RollingStats.create = function(properties) { + return new RollingStats(properties); + }; + + RollingStats.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.time_window != null && $Object.hasOwnProperty.call(message, "time_window")) + writer.uint32(8).uint32(message.time_window); + if (message.from_client != null && $Object.hasOwnProperty.call(message, "from_client")) + $root.MumbleProto.UserStats.Stats.encode(message.from_client, writer.uint32(18).fork(), _depth + 1).ldelim(); + if (message.from_server != null && $Object.hasOwnProperty.call(message, "from_server")) + $root.MumbleProto.UserStats.Stats.encode(message.from_server, writer.uint32(26).fork(), _depth + 1).ldelim(); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + RollingStats.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.UserStats.RollingStats(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.time_window = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 2) + break; + message.from_client = $root.MumbleProto.UserStats.Stats.decode(reader, reader.uint32(), $undefined, _depth + 1, message.from_client); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.from_server = $root.MumbleProto.UserStats.Stats.decode(reader, reader.uint32(), $undefined, _depth + 1, message.from_server); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + RollingStats.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.time_window != null && $Object.hasOwnProperty.call(message, "time_window")) + if (!$util.isInteger(message.time_window)) + return "time_window: integer expected"; + if (message.from_client != null && $Object.hasOwnProperty.call(message, "from_client")) { + let error = $root.MumbleProto.UserStats.Stats.verify(message.from_client, _depth + 1); + if (error) + return "from_client." + error; + } + if (message.from_server != null && $Object.hasOwnProperty.call(message, "from_server")) { + let error = $root.MumbleProto.UserStats.Stats.verify(message.from_server, _depth + 1); + if (error) + return "from_server." + error; + } + return null; + }; + + RollingStats.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.UserStats.RollingStats) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.UserStats.RollingStats: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.UserStats.RollingStats(); + if (object.time_window != null) + message.time_window = object.time_window >>> 0; + if (object.from_client != null) { + if (!$util.isObject(object.from_client)) + throw $TypeError(".MumbleProto.UserStats.RollingStats.from_client: object expected"); + message.from_client = $root.MumbleProto.UserStats.Stats.fromObject(object.from_client, _depth + 1); + } + if (object.from_server != null) { + if (!$util.isObject(object.from_server)) + throw $TypeError(".MumbleProto.UserStats.RollingStats.from_server: object expected"); + message.from_server = $root.MumbleProto.UserStats.Stats.fromObject(object.from_server, _depth + 1); + } + return message; + }; + + RollingStats.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.time_window = 0; + object.from_client = null; + object.from_server = null; + } + if (message.time_window != null && $Object.hasOwnProperty.call(message, "time_window")) + object.time_window = message.time_window; + if (message.from_client != null && $Object.hasOwnProperty.call(message, "from_client")) + object.from_client = $root.MumbleProto.UserStats.Stats.toObject(message.from_client, options, _depth + 1); + if (message.from_server != null && $Object.hasOwnProperty.call(message, "from_server")) + object.from_server = $root.MumbleProto.UserStats.Stats.toObject(message.from_server, options, _depth + 1); + return object; + }; + + RollingStats.prototype.toJSON = function() { + return RollingStats.toObject(this, $protobuf.util.toJSONOptions); + }; + + RollingStats.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.UserStats.RollingStats"; + }; + + return RollingStats; + })(); + + return UserStats; + })(); + + MumbleProto.RequestBlob = (function() { + + const RequestBlob = function (properties) { + this.session_texture = []; + this.session_comment = []; + this.channel_description = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + RequestBlob.prototype.session_texture = $util.emptyArray; + RequestBlob.prototype.session_comment = $util.emptyArray; + RequestBlob.prototype.channel_description = $util.emptyArray; + + RequestBlob.create = function(properties) { + return new RequestBlob(properties); + }; + + RequestBlob.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.session_texture != null && message.session_texture.length) + for (let i = 0; i < message.session_texture.length; ++i) + writer.uint32(8).uint32(message.session_texture[i]); + if (message.session_comment != null && message.session_comment.length) + for (let i = 0; i < message.session_comment.length; ++i) + writer.uint32(16).uint32(message.session_comment[i]); + if (message.channel_description != null && message.channel_description.length) + for (let i = 0; i < message.channel_description.length; ++i) + writer.uint32(24).uint32(message.channel_description[i]); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + RequestBlob.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.RequestBlob(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType === 2) { + if (!(message.session_texture && message.session_texture.length)) + message.session_texture = []; + reader.uint32s(message.session_texture); + continue; + } + if (wireType !== 0) + break; + if (!(message.session_texture && message.session_texture.length)) + message.session_texture = []; + message.session_texture.push(reader.uint32()); + continue; + } + case 2: { + if (wireType === 2) { + if (!(message.session_comment && message.session_comment.length)) + message.session_comment = []; + reader.uint32s(message.session_comment); + continue; + } + if (wireType !== 0) + break; + if (!(message.session_comment && message.session_comment.length)) + message.session_comment = []; + message.session_comment.push(reader.uint32()); + continue; + } + case 3: { + if (wireType === 2) { + if (!(message.channel_description && message.channel_description.length)) + message.channel_description = []; + reader.uint32s(message.channel_description); + continue; + } + if (wireType !== 0) + break; + if (!(message.channel_description && message.channel_description.length)) + message.channel_description = []; + message.channel_description.push(reader.uint32()); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + RequestBlob.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.session_texture != null && $Object.hasOwnProperty.call(message, "session_texture")) { + if (!$Array.isArray(message.session_texture)) + return "session_texture: array expected"; + for (let i = 0; i < message.session_texture.length; ++i) + if (!$util.isInteger(message.session_texture[i])) + return "session_texture: integer[] expected"; + } + if (message.session_comment != null && $Object.hasOwnProperty.call(message, "session_comment")) { + if (!$Array.isArray(message.session_comment)) + return "session_comment: array expected"; + for (let i = 0; i < message.session_comment.length; ++i) + if (!$util.isInteger(message.session_comment[i])) + return "session_comment: integer[] expected"; + } + if (message.channel_description != null && $Object.hasOwnProperty.call(message, "channel_description")) { + if (!$Array.isArray(message.channel_description)) + return "channel_description: array expected"; + for (let i = 0; i < message.channel_description.length; ++i) + if (!$util.isInteger(message.channel_description[i])) + return "channel_description: integer[] expected"; + } + return null; + }; + + RequestBlob.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.RequestBlob) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.RequestBlob: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.RequestBlob(); + if (object.session_texture) { + if (!$Array.isArray(object.session_texture)) + throw $TypeError(".MumbleProto.RequestBlob.session_texture: array expected"); + message.session_texture = $Array(object.session_texture.length); + for (let i = 0; i < object.session_texture.length; ++i) + message.session_texture[i] = object.session_texture[i] >>> 0; + } + if (object.session_comment) { + if (!$Array.isArray(object.session_comment)) + throw $TypeError(".MumbleProto.RequestBlob.session_comment: array expected"); + message.session_comment = $Array(object.session_comment.length); + for (let i = 0; i < object.session_comment.length; ++i) + message.session_comment[i] = object.session_comment[i] >>> 0; + } + if (object.channel_description) { + if (!$Array.isArray(object.channel_description)) + throw $TypeError(".MumbleProto.RequestBlob.channel_description: array expected"); + message.channel_description = $Array(object.channel_description.length); + for (let i = 0; i < object.channel_description.length; ++i) + message.channel_description[i] = object.channel_description[i] >>> 0; + } + return message; + }; + + RequestBlob.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) { + object.session_texture = []; + object.session_comment = []; + object.channel_description = []; + } + if (message.session_texture && message.session_texture.length) { + object.session_texture = $Array(message.session_texture.length); + for (let j = 0; j < message.session_texture.length; ++j) + object.session_texture[j] = message.session_texture[j]; + } + if (message.session_comment && message.session_comment.length) { + object.session_comment = $Array(message.session_comment.length); + for (let j = 0; j < message.session_comment.length; ++j) + object.session_comment[j] = message.session_comment[j]; + } + if (message.channel_description && message.channel_description.length) { + object.channel_description = $Array(message.channel_description.length); + for (let j = 0; j < message.channel_description.length; ++j) + object.channel_description[j] = message.channel_description[j]; + } + return object; + }; + + RequestBlob.prototype.toJSON = function() { + return RequestBlob.toObject(this, $protobuf.util.toJSONOptions); + }; + + RequestBlob.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.RequestBlob"; + }; + + return RequestBlob; + })(); + + MumbleProto.ServerConfig = (function() { + + const ServerConfig = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + ServerConfig.prototype.max_bandwidth = 0; + ServerConfig.prototype.welcome_text = ""; + ServerConfig.prototype.allow_html = false; + ServerConfig.prototype.message_length = 0; + ServerConfig.prototype.image_message_length = 0; + ServerConfig.prototype.max_users = 0; + ServerConfig.prototype.recording_allowed = false; + + ServerConfig.create = function(properties) { + return new ServerConfig(properties); + }; + + ServerConfig.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.max_bandwidth != null && $Object.hasOwnProperty.call(message, "max_bandwidth")) + writer.uint32(8).uint32(message.max_bandwidth); + if (message.welcome_text != null && $Object.hasOwnProperty.call(message, "welcome_text")) + writer.uint32(18).string(message.welcome_text); + if (message.allow_html != null && $Object.hasOwnProperty.call(message, "allow_html")) + writer.uint32(24).bool(message.allow_html); + if (message.message_length != null && $Object.hasOwnProperty.call(message, "message_length")) + writer.uint32(32).uint32(message.message_length); + if (message.image_message_length != null && $Object.hasOwnProperty.call(message, "image_message_length")) + writer.uint32(40).uint32(message.image_message_length); + if (message.max_users != null && $Object.hasOwnProperty.call(message, "max_users")) + writer.uint32(48).uint32(message.max_users); + if (message.recording_allowed != null && $Object.hasOwnProperty.call(message, "recording_allowed")) + writer.uint32(56).bool(message.recording_allowed); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + ServerConfig.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.ServerConfig(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.max_bandwidth = reader.uint32(); + continue; + } + case 2: { + if (wireType !== 2) + break; + message.welcome_text = reader.string(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.allow_html = reader.bool(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.message_length = reader.uint32(); + continue; + } + case 5: { + if (wireType !== 0) + break; + message.image_message_length = reader.uint32(); + continue; + } + case 6: { + if (wireType !== 0) + break; + message.max_users = reader.uint32(); + continue; + } + case 7: { + if (wireType !== 0) + break; + message.recording_allowed = reader.bool(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + ServerConfig.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.max_bandwidth != null && $Object.hasOwnProperty.call(message, "max_bandwidth")) + if (!$util.isInteger(message.max_bandwidth)) + return "max_bandwidth: integer expected"; + if (message.welcome_text != null && $Object.hasOwnProperty.call(message, "welcome_text")) + if (!$util.isString(message.welcome_text)) + return "welcome_text: string expected"; + if (message.allow_html != null && $Object.hasOwnProperty.call(message, "allow_html")) + if (typeof message.allow_html !== "boolean") + return "allow_html: boolean expected"; + if (message.message_length != null && $Object.hasOwnProperty.call(message, "message_length")) + if (!$util.isInteger(message.message_length)) + return "message_length: integer expected"; + if (message.image_message_length != null && $Object.hasOwnProperty.call(message, "image_message_length")) + if (!$util.isInteger(message.image_message_length)) + return "image_message_length: integer expected"; + if (message.max_users != null && $Object.hasOwnProperty.call(message, "max_users")) + if (!$util.isInteger(message.max_users)) + return "max_users: integer expected"; + if (message.recording_allowed != null && $Object.hasOwnProperty.call(message, "recording_allowed")) + if (typeof message.recording_allowed !== "boolean") + return "recording_allowed: boolean expected"; + return null; + }; + + ServerConfig.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.ServerConfig) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.ServerConfig: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.ServerConfig(); + if (object.max_bandwidth != null) + message.max_bandwidth = object.max_bandwidth >>> 0; + if (object.welcome_text != null) + message.welcome_text = $String(object.welcome_text); + if (object.allow_html != null) + message.allow_html = $Boolean(object.allow_html); + if (object.message_length != null) + message.message_length = object.message_length >>> 0; + if (object.image_message_length != null) + message.image_message_length = object.image_message_length >>> 0; + if (object.max_users != null) + message.max_users = object.max_users >>> 0; + if (object.recording_allowed != null) + message.recording_allowed = $Boolean(object.recording_allowed); + return message; + }; + + ServerConfig.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.max_bandwidth = 0; + object.welcome_text = ""; + object.allow_html = false; + object.message_length = 0; + object.image_message_length = 0; + object.max_users = 0; + object.recording_allowed = false; + } + if (message.max_bandwidth != null && $Object.hasOwnProperty.call(message, "max_bandwidth")) + object.max_bandwidth = message.max_bandwidth; + if (message.welcome_text != null && $Object.hasOwnProperty.call(message, "welcome_text")) + object.welcome_text = message.welcome_text; + if (message.allow_html != null && $Object.hasOwnProperty.call(message, "allow_html")) + object.allow_html = message.allow_html; + if (message.message_length != null && $Object.hasOwnProperty.call(message, "message_length")) + object.message_length = message.message_length; + if (message.image_message_length != null && $Object.hasOwnProperty.call(message, "image_message_length")) + object.image_message_length = message.image_message_length; + if (message.max_users != null && $Object.hasOwnProperty.call(message, "max_users")) + object.max_users = message.max_users; + if (message.recording_allowed != null && $Object.hasOwnProperty.call(message, "recording_allowed")) + object.recording_allowed = message.recording_allowed; + return object; + }; + + ServerConfig.prototype.toJSON = function() { + return ServerConfig.toObject(this, $protobuf.util.toJSONOptions); + }; + + ServerConfig.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.ServerConfig"; + }; + + return ServerConfig; + })(); + + MumbleProto.SuggestConfig = (function() { + + const SuggestConfig = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + SuggestConfig.prototype.version_v1 = 0; + SuggestConfig.prototype.version_v2 = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + SuggestConfig.prototype.positional = false; + SuggestConfig.prototype.push_to_talk = false; + + SuggestConfig.create = function(properties) { + return new SuggestConfig(properties); + }; + + SuggestConfig.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.version_v1 != null && $Object.hasOwnProperty.call(message, "version_v1")) + writer.uint32(8).uint32(message.version_v1); + if (message.positional != null && $Object.hasOwnProperty.call(message, "positional")) + writer.uint32(16).bool(message.positional); + if (message.push_to_talk != null && $Object.hasOwnProperty.call(message, "push_to_talk")) + writer.uint32(24).bool(message.push_to_talk); + if (message.version_v2 != null && $Object.hasOwnProperty.call(message, "version_v2")) + writer.uint32(32).uint64(message.version_v2); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + SuggestConfig.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.SuggestConfig(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.version_v1 = reader.uint32(); + continue; + } + case 4: { + if (wireType !== 0) + break; + message.version_v2 = reader.uint64(); + continue; + } + case 2: { + if (wireType !== 0) + break; + message.positional = reader.bool(); + continue; + } + case 3: { + if (wireType !== 0) + break; + message.push_to_talk = reader.bool(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + SuggestConfig.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.version_v1 != null && $Object.hasOwnProperty.call(message, "version_v1")) + if (!$util.isInteger(message.version_v1)) + return "version_v1: integer expected"; + if (message.version_v2 != null && $Object.hasOwnProperty.call(message, "version_v2")) + if (!$util.isInteger(message.version_v2) && !(message.version_v2 && $util.isInteger(message.version_v2.low) && $util.isInteger(message.version_v2.high))) + return "version_v2: integer|Long expected"; + if (message.positional != null && $Object.hasOwnProperty.call(message, "positional")) + if (typeof message.positional !== "boolean") + return "positional: boolean expected"; + if (message.push_to_talk != null && $Object.hasOwnProperty.call(message, "push_to_talk")) + if (typeof message.push_to_talk !== "boolean") + return "push_to_talk: boolean expected"; + return null; + }; + + SuggestConfig.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.SuggestConfig) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.SuggestConfig: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.SuggestConfig(); + if (object.version_v1 != null) + message.version_v1 = object.version_v1 >>> 0; + if (object.version_v2 != null) + if ($util.Long) + message.version_v2 = $util.Long.fromValue(object.version_v2, true); + else if (typeof object.version_v2 === "string") + message.version_v2 = $parseInt(object.version_v2, 10); + else if (typeof object.version_v2 === "number") + message.version_v2 = object.version_v2; + else if (typeof object.version_v2 === "object") + message.version_v2 = new $util.LongBits(object.version_v2.low >>> 0, object.version_v2.high >>> 0).toNumber(true); + if (object.positional != null) + message.positional = $Boolean(object.positional); + if (object.push_to_talk != null) + message.push_to_talk = $Boolean(object.push_to_talk); + return message; + }; + + SuggestConfig.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + object.version_v1 = 0; + object.positional = false; + object.push_to_talk = false; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.version_v2 = options.longs === $String ? long.toString() : options.longs === $Number ? long.toNumber() : typeof $BigInt !== "undefined" && options.longs === $BigInt ? long.toBigInt() : long; + } else + object.version_v2 = options.longs === $String ? "0" : typeof $BigInt !== "undefined" && options.longs === $BigInt ? $BigInt("0") : 0; + } + if (message.version_v1 != null && $Object.hasOwnProperty.call(message, "version_v1")) + object.version_v1 = message.version_v1; + if (message.positional != null && $Object.hasOwnProperty.call(message, "positional")) + object.positional = message.positional; + if (message.push_to_talk != null && $Object.hasOwnProperty.call(message, "push_to_talk")) + object.push_to_talk = message.push_to_talk; + if (message.version_v2 != null && $Object.hasOwnProperty.call(message, "version_v2")) + if (typeof $BigInt !== "undefined" && options.longs === $BigInt) + object.version_v2 = typeof message.version_v2 === "number" ? $BigInt(message.version_v2) : $util.Long.fromBits(message.version_v2.low >>> 0, message.version_v2.high >>> 0, true).toBigInt(); + else if (typeof message.version_v2 === "number") + object.version_v2 = options.longs === $String ? $String(message.version_v2) : message.version_v2; + else + object.version_v2 = options.longs === $String ? $util.Long.prototype.toString.call(message.version_v2) : options.longs === $Number ? new $util.LongBits(message.version_v2.low >>> 0, message.version_v2.high >>> 0).toNumber(true) : message.version_v2; + return object; + }; + + SuggestConfig.prototype.toJSON = function() { + return SuggestConfig.toObject(this, $protobuf.util.toJSONOptions); + }; + + SuggestConfig.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.SuggestConfig"; + }; + + return SuggestConfig; + })(); + + MumbleProto.PluginDataTransmission = (function() { + + const PluginDataTransmission = function (properties) { + this.receiverSessions = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + PluginDataTransmission.prototype.senderSession = 0; + PluginDataTransmission.prototype.receiverSessions = $util.emptyArray; + PluginDataTransmission.prototype.data = $util.newBuffer([]); + PluginDataTransmission.prototype.dataID = ""; + + PluginDataTransmission.create = function(properties) { + return new PluginDataTransmission(properties); + }; + + PluginDataTransmission.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.senderSession != null && $Object.hasOwnProperty.call(message, "senderSession")) + writer.uint32(8).uint32(message.senderSession); + if (message.receiverSessions != null && message.receiverSessions.length) + writer.uint32(18).uint32s(message.receiverSessions); + if (message.data != null && $Object.hasOwnProperty.call(message, "data")) + writer.uint32(26).bytes(message.data); + if (message.dataID != null && $Object.hasOwnProperty.call(message, "dataID")) + writer.uint32(34).string(message.dataID); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + PluginDataTransmission.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleProto.PluginDataTransmission(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.senderSession = reader.uint32(); + continue; + } + case 2: { + if (wireType === 2) { + if (!(message.receiverSessions && message.receiverSessions.length)) + message.receiverSessions = []; + reader.uint32s(message.receiverSessions); + continue; + } + if (wireType !== 0) + break; + if (!(message.receiverSessions && message.receiverSessions.length)) + message.receiverSessions = []; + message.receiverSessions.push(reader.uint32()); + continue; + } + case 3: { + if (wireType !== 2) + break; + message.data = reader.bytes(); + continue; + } + case 4: { + if (wireType !== 2) + break; + message.dataID = reader.string(); + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + PluginDataTransmission.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.senderSession != null && $Object.hasOwnProperty.call(message, "senderSession")) + if (!$util.isInteger(message.senderSession)) + return "senderSession: integer expected"; + if (message.receiverSessions != null && $Object.hasOwnProperty.call(message, "receiverSessions")) { + if (!$Array.isArray(message.receiverSessions)) + return "receiverSessions: array expected"; + for (let i = 0; i < message.receiverSessions.length; ++i) + if (!$util.isInteger(message.receiverSessions[i])) + return "receiverSessions: integer[] expected"; + } + if (message.data != null && $Object.hasOwnProperty.call(message, "data")) + if (!(message.data && typeof message.data.length === "number" || $util.isString(message.data))) + return "data: buffer expected"; + if (message.dataID != null && $Object.hasOwnProperty.call(message, "dataID")) + if (!$util.isString(message.dataID)) + return "dataID: string expected"; + return null; + }; + + PluginDataTransmission.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleProto.PluginDataTransmission) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleProto.PluginDataTransmission: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleProto.PluginDataTransmission(); + if (object.senderSession != null) + message.senderSession = object.senderSession >>> 0; + if (object.receiverSessions) { + if (!$Array.isArray(object.receiverSessions)) + throw $TypeError(".MumbleProto.PluginDataTransmission.receiverSessions: array expected"); + message.receiverSessions = $Array(object.receiverSessions.length); + for (let i = 0; i < object.receiverSessions.length; ++i) + message.receiverSessions[i] = object.receiverSessions[i] >>> 0; + } + if (object.data != null) + if (typeof object.data === "string") + $util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0); + else if (object.data.length >= 0) + message.data = object.data; + if (object.dataID != null) + message.dataID = $String(object.dataID); + return message; + }; + + PluginDataTransmission.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) + object.receiverSessions = []; + if (options.defaults) { + object.senderSession = 0; + if (options.bytes === $String) + object.data = ""; + else { + object.data = []; + if (options.bytes !== $Array) + object.data = $util.newBuffer(object.data); + } + object.dataID = ""; + } + if (message.senderSession != null && $Object.hasOwnProperty.call(message, "senderSession")) + object.senderSession = message.senderSession; + if (message.receiverSessions && message.receiverSessions.length) { + object.receiverSessions = $Array(message.receiverSessions.length); + for (let j = 0; j < message.receiverSessions.length; ++j) + object.receiverSessions[j] = message.receiverSessions[j]; + } + if (message.data != null && $Object.hasOwnProperty.call(message, "data")) + object.data = options.bytes === $String ? $util.base64.encode(message.data, 0, message.data.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.data) : message.data; + if (message.dataID != null && $Object.hasOwnProperty.call(message, "dataID")) + object.dataID = message.dataID; + return object; + }; + + PluginDataTransmission.prototype.toJSON = function() { + return PluginDataTransmission.toObject(this, $protobuf.util.toJSONOptions); + }; + + PluginDataTransmission.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleProto.PluginDataTransmission"; + }; + + return PluginDataTransmission; + })(); + + return MumbleProto; +})(); + +export { + $root as default +}; diff --git a/src/core/mumble-udp-pb.d.ts b/src/core/mumble-udp-pb.d.ts new file mode 100644 index 0000000..2ec8176 --- /dev/null +++ b/src/core/mumble-udp-pb.d.ts @@ -0,0 +1 @@ +export const MumbleUDP: Record; diff --git a/src/core/mumble-udp-pb.js b/src/core/mumble-udp-pb.js new file mode 100644 index 0000000..9f34779 --- /dev/null +++ b/src/core/mumble-udp-pb.js @@ -0,0 +1,639 @@ +/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-mixed-operators, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars, default-case, jsdoc/require-param*/ +import $protobuf from "protobufjs/minimal.js"; + +const $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util; +const $Object = $util.global.Object, $undefined = $util.global.undefined, $Error = $util.global.Error, $RangeError = $util.global.RangeError, $Array = $util.global.Array, $TypeError = $util.global.TypeError, $Number = $util.global.Number, $parseInt = $util.global.parseInt, $Boolean = $util.global.Boolean, $String = $util.global.String, $BigInt = $util.global.BigInt, $isFinite = $util.global.isFinite; + +const $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {}); + +export const MumbleUDP = $root.MumbleUDP = (() => { + + const MumbleUDP = {}; + + MumbleUDP.Audio = (function() { + + const Audio = function (properties) { + this.positional_data = []; + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + Audio.prototype.target = null; + Audio.prototype.context = null; + Audio.prototype.sender_session = 0; + Audio.prototype.frame_number = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + Audio.prototype.opus_data = $util.newBuffer([]); + Audio.prototype.positional_data = $util.emptyArray; + Audio.prototype.volume_adjustment = 0; + Audio.prototype.is_terminator = false; + + let $oneOfFields; + + $Object.defineProperty(Audio.prototype, "Header", { + get: $util.oneOfGetter($oneOfFields = ["target", "context"]), + set: $util.oneOfSetter($oneOfFields) + }); + + Audio.create = function(properties) { + return new Audio(properties); + }; + + Audio.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.target != null && $Object.hasOwnProperty.call(message, "target")) + writer.uint32(8).uint32(message.target); + if (message.context != null && $Object.hasOwnProperty.call(message, "context")) + writer.uint32(16).uint32(message.context); + if (message.sender_session != null && $Object.hasOwnProperty.call(message, "sender_session") && message.sender_session !== 0) + writer.uint32(24).uint32(message.sender_session); + if (message.frame_number != null && $Object.hasOwnProperty.call(message, "frame_number") && (typeof message.frame_number === "object" ? message.frame_number.low || message.frame_number.high : message.frame_number !== 0)) + writer.uint32(32).uint64(message.frame_number); + if (message.opus_data != null && $Object.hasOwnProperty.call(message, "opus_data") && message.opus_data.length) + writer.uint32(42).bytes(message.opus_data); + if (message.positional_data != null && message.positional_data.length) + writer.uint32(50).floats(message.positional_data); + if (message.volume_adjustment != null && $Object.hasOwnProperty.call(message, "volume_adjustment") && !$Object.is(message.volume_adjustment, 0)) + writer.uint32(61).float(message.volume_adjustment); + if (message.is_terminator != null && $Object.hasOwnProperty.call(message, "is_terminator") && message.is_terminator !== false) + writer.uint32(128).bool(message.is_terminator); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + Audio.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message, value; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleUDP.Audio(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + message.target = reader.uint32(); + message.Header = "target"; + continue; + } + case 2: { + if (wireType !== 0) + break; + message.context = reader.uint32(); + message.Header = "context"; + continue; + } + case 3: { + if (wireType !== 0) + break; + if (value = reader.uint32()) + message.sender_session = value; + else + delete message.sender_session; + continue; + } + case 4: { + if (wireType !== 0) + break; + if (typeof (value = reader.uint64()) === "object" ? value.low || value.high : value !== 0) + message.frame_number = value; + else + delete message.frame_number; + continue; + } + case 5: { + if (wireType !== 2) + break; + if ((value = reader.bytes()).length) + message.opus_data = value; + else + delete message.opus_data; + continue; + } + case 6: { + if (wireType === 2) { + if (!(message.positional_data && message.positional_data.length)) + message.positional_data = []; + reader.floats(message.positional_data); + continue; + } + if (wireType !== 5) + break; + if (!(message.positional_data && message.positional_data.length)) + message.positional_data = []; + message.positional_data.push(reader.float()); + continue; + } + case 7: { + if (wireType !== 5) + break; + if (!$Object.is(value = reader.float(), 0)) + message.volume_adjustment = value; + else + delete message.volume_adjustment; + continue; + } + case 16: { + if (wireType !== 0) + break; + if (value = reader.bool()) + message.is_terminator = value; + else + delete message.is_terminator; + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + Audio.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + let properties = {}; + if (message.target != null && $Object.hasOwnProperty.call(message, "target")) { + properties.Header = 1; + if (!$util.isInteger(message.target)) + return "target: integer expected"; + } + if (message.context != null && $Object.hasOwnProperty.call(message, "context")) { + if (properties.Header === 1) + return "Header: multiple values"; + properties.Header = 1; + if (!$util.isInteger(message.context)) + return "context: integer expected"; + } + if (message.sender_session != null && $Object.hasOwnProperty.call(message, "sender_session")) + if (!$util.isInteger(message.sender_session)) + return "sender_session: integer expected"; + if (message.frame_number != null && $Object.hasOwnProperty.call(message, "frame_number")) + if (!$util.isInteger(message.frame_number) && !(message.frame_number && $util.isInteger(message.frame_number.low) && $util.isInteger(message.frame_number.high))) + return "frame_number: integer|Long expected"; + if (message.opus_data != null && $Object.hasOwnProperty.call(message, "opus_data")) + if (!(message.opus_data && typeof message.opus_data.length === "number" || $util.isString(message.opus_data))) + return "opus_data: buffer expected"; + if (message.positional_data != null && $Object.hasOwnProperty.call(message, "positional_data")) { + if (!$Array.isArray(message.positional_data)) + return "positional_data: array expected"; + for (let i = 0; i < message.positional_data.length; ++i) + if (typeof message.positional_data[i] !== "number") + return "positional_data: number[] expected"; + } + if (message.volume_adjustment != null && $Object.hasOwnProperty.call(message, "volume_adjustment")) + if (typeof message.volume_adjustment !== "number") + return "volume_adjustment: number expected"; + if (message.is_terminator != null && $Object.hasOwnProperty.call(message, "is_terminator")) + if (typeof message.is_terminator !== "boolean") + return "is_terminator: boolean expected"; + return null; + }; + + Audio.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleUDP.Audio) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleUDP.Audio: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleUDP.Audio(); + if (object.target != null) + message.target = object.target >>> 0; + if (object.context != null) + message.context = object.context >>> 0; + if (object.sender_session != null) + if ($Number(object.sender_session) !== 0) + message.sender_session = object.sender_session >>> 0; + if (object.frame_number != null) + if (typeof object.frame_number === "object" ? object.frame_number.low || object.frame_number.high : $Number(object.frame_number) !== 0) + if ($util.Long) + message.frame_number = $util.Long.fromValue(object.frame_number, true); + else if (typeof object.frame_number === "string") + message.frame_number = $parseInt(object.frame_number, 10); + else if (typeof object.frame_number === "number") + message.frame_number = object.frame_number; + else if (typeof object.frame_number === "object") + message.frame_number = new $util.LongBits(object.frame_number.low >>> 0, object.frame_number.high >>> 0).toNumber(true); + if (object.opus_data != null) + if (object.opus_data.length) + if (typeof object.opus_data === "string") + $util.base64.decode(object.opus_data, message.opus_data = $util.newBuffer($util.base64.length(object.opus_data)), 0); + else if (object.opus_data.length >= 0) + message.opus_data = object.opus_data; + if (object.positional_data) { + if (!$Array.isArray(object.positional_data)) + throw $TypeError(".MumbleUDP.Audio.positional_data: array expected"); + message.positional_data = $Array(object.positional_data.length); + for (let i = 0; i < object.positional_data.length; ++i) + message.positional_data[i] = $Number(object.positional_data[i]); + } + if (object.volume_adjustment != null) + if (!$Object.is($Number(object.volume_adjustment), 0)) + message.volume_adjustment = $Number(object.volume_adjustment); + if (object.is_terminator != null) + if (object.is_terminator) + message.is_terminator = $Boolean(object.is_terminator); + return message; + }; + + Audio.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.arrays || options.defaults) + object.positional_data = []; + if (options.defaults) { + object.sender_session = 0; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.frame_number = options.longs === $String ? long.toString() : options.longs === $Number ? long.toNumber() : typeof $BigInt !== "undefined" && options.longs === $BigInt ? long.toBigInt() : long; + } else + object.frame_number = options.longs === $String ? "0" : typeof $BigInt !== "undefined" && options.longs === $BigInt ? $BigInt("0") : 0; + if (options.bytes === $String) + object.opus_data = ""; + else { + object.opus_data = []; + if (options.bytes !== $Array) + object.opus_data = $util.newBuffer(object.opus_data); + } + object.volume_adjustment = 0; + object.is_terminator = false; + } + if (message.target != null && $Object.hasOwnProperty.call(message, "target")) { + object.target = message.target; + if (options.oneofs) + object.Header = "target"; + } + if (message.context != null && $Object.hasOwnProperty.call(message, "context")) { + object.context = message.context; + if (options.oneofs) + object.Header = "context"; + } + if (message.sender_session != null && $Object.hasOwnProperty.call(message, "sender_session")) + object.sender_session = message.sender_session; + if (message.frame_number != null && $Object.hasOwnProperty.call(message, "frame_number")) + if (typeof $BigInt !== "undefined" && options.longs === $BigInt) + object.frame_number = typeof message.frame_number === "number" ? $BigInt(message.frame_number) : $util.Long.fromBits(message.frame_number.low >>> 0, message.frame_number.high >>> 0, true).toBigInt(); + else if (typeof message.frame_number === "number") + object.frame_number = options.longs === $String ? $String(message.frame_number) : message.frame_number; + else + object.frame_number = options.longs === $String ? $util.Long.prototype.toString.call(message.frame_number) : options.longs === $Number ? new $util.LongBits(message.frame_number.low >>> 0, message.frame_number.high >>> 0).toNumber(true) : message.frame_number; + if (message.opus_data != null && $Object.hasOwnProperty.call(message, "opus_data")) + object.opus_data = options.bytes === $String ? $util.base64.encode(message.opus_data, 0, message.opus_data.length) : options.bytes === $Array ? $Array.prototype.slice.call(message.opus_data) : message.opus_data; + if (message.positional_data && message.positional_data.length) { + object.positional_data = $Array(message.positional_data.length); + for (let j = 0; j < message.positional_data.length; ++j) + object.positional_data[j] = options.json && !$isFinite(message.positional_data[j]) ? $String(message.positional_data[j]) : message.positional_data[j]; + } + if (message.volume_adjustment != null && $Object.hasOwnProperty.call(message, "volume_adjustment")) + object.volume_adjustment = options.json && !$isFinite(message.volume_adjustment) ? $String(message.volume_adjustment) : message.volume_adjustment; + if (message.is_terminator != null && $Object.hasOwnProperty.call(message, "is_terminator")) + object.is_terminator = message.is_terminator; + return object; + }; + + Audio.prototype.toJSON = function() { + return Audio.toObject(this, $protobuf.util.toJSONOptions); + }; + + Audio.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleUDP.Audio"; + }; + + return Audio; + })(); + + MumbleUDP.Ping = (function() { + + const Ping = function (properties) { + if (properties) + for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null && keys[i] !== "__proto__") + this[keys[i]] = properties[keys[i]]; + }; + + Ping.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + Ping.prototype.request_extended_information = false; + Ping.prototype.server_version_v2 = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + Ping.prototype.user_count = 0; + Ping.prototype.max_user_count = 0; + Ping.prototype.max_bandwidth_per_user = 0; + + Ping.create = function(properties) { + return new Ping(properties); + }; + + Ping.encode = function (message, writer, _depth) { + if (!writer) + writer = $Writer.create(); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + if (message.timestamp != null && $Object.hasOwnProperty.call(message, "timestamp") && (typeof message.timestamp === "object" ? message.timestamp.low || message.timestamp.high : message.timestamp !== 0)) + writer.uint32(8).uint64(message.timestamp); + if (message.request_extended_information != null && $Object.hasOwnProperty.call(message, "request_extended_information") && message.request_extended_information !== false) + writer.uint32(16).bool(message.request_extended_information); + if (message.server_version_v2 != null && $Object.hasOwnProperty.call(message, "server_version_v2") && (typeof message.server_version_v2 === "object" ? message.server_version_v2.low || message.server_version_v2.high : message.server_version_v2 !== 0)) + writer.uint32(24).uint64(message.server_version_v2); + if (message.user_count != null && $Object.hasOwnProperty.call(message, "user_count") && message.user_count !== 0) + writer.uint32(32).uint32(message.user_count); + if (message.max_user_count != null && $Object.hasOwnProperty.call(message, "max_user_count") && message.max_user_count !== 0) + writer.uint32(40).uint32(message.max_user_count); + if (message.max_bandwidth_per_user != null && $Object.hasOwnProperty.call(message, "max_bandwidth_per_user") && message.max_bandwidth_per_user !== 0) + writer.uint32(48).uint32(message.max_bandwidth_per_user); + if (message.$unknowns != null && $Object.hasOwnProperty.call(message, "$unknowns")) + for (let i = 0; i < message.$unknowns.length; ++i) + writer.raw(message.$unknowns[i]); + return writer; + }; + + Ping.decode = function (reader, length, _end, _depth, _target) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + if (_depth === $undefined) + _depth = 0; + if (_depth > $Reader.recursionLimit) + throw $Error("max depth exceeded"); + let end, message, value; + if (length === $undefined) + end = reader.len; + else { + end = reader.pos + length; + if (end > reader.len) + throw $RangeError("index out of range"); + length = reader.len; + reader.len = end; + } + message = _target || new $root.MumbleUDP.Ping(); + while (reader.pos < end) { + let start = reader.pos; + let tag = reader.tag(); + if (tag === _end) { + _end = $undefined; + break; + } + let wireType = tag & 7; + switch (tag >>>= 3) { + case 1: { + if (wireType !== 0) + break; + if (typeof (value = reader.uint64()) === "object" ? value.low || value.high : value !== 0) + message.timestamp = value; + else + delete message.timestamp; + continue; + } + case 2: { + if (wireType !== 0) + break; + if (value = reader.bool()) + message.request_extended_information = value; + else + delete message.request_extended_information; + continue; + } + case 3: { + if (wireType !== 0) + break; + if (typeof (value = reader.uint64()) === "object" ? value.low || value.high : value !== 0) + message.server_version_v2 = value; + else + delete message.server_version_v2; + continue; + } + case 4: { + if (wireType !== 0) + break; + if (value = reader.uint32()) + message.user_count = value; + else + delete message.user_count; + continue; + } + case 5: { + if (wireType !== 0) + break; + if (value = reader.uint32()) + message.max_user_count = value; + else + delete message.max_user_count; + continue; + } + case 6: { + if (wireType !== 0) + break; + if (value = reader.uint32()) + message.max_bandwidth_per_user = value; + else + delete message.max_bandwidth_per_user; + continue; + } + } + reader.skipType(wireType, _depth, tag); + if (!reader.discardUnknown) { + $util.makeProp(message, "$unknowns", false); + (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos)); + } + } + if (length !== $undefined) { + if (reader.pos !== end) + throw $RangeError("index out of range"); + reader.len = length; + } + if (_end !== $undefined) + throw $Error("missing end group"); + return message; + }; + + Ping.verify = function (message, _depth) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + return "max depth exceeded"; + if (message.timestamp != null && $Object.hasOwnProperty.call(message, "timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + if (message.request_extended_information != null && $Object.hasOwnProperty.call(message, "request_extended_information")) + if (typeof message.request_extended_information !== "boolean") + return "request_extended_information: boolean expected"; + if (message.server_version_v2 != null && $Object.hasOwnProperty.call(message, "server_version_v2")) + if (!$util.isInteger(message.server_version_v2) && !(message.server_version_v2 && $util.isInteger(message.server_version_v2.low) && $util.isInteger(message.server_version_v2.high))) + return "server_version_v2: integer|Long expected"; + if (message.user_count != null && $Object.hasOwnProperty.call(message, "user_count")) + if (!$util.isInteger(message.user_count)) + return "user_count: integer expected"; + if (message.max_user_count != null && $Object.hasOwnProperty.call(message, "max_user_count")) + if (!$util.isInteger(message.max_user_count)) + return "max_user_count: integer expected"; + if (message.max_bandwidth_per_user != null && $Object.hasOwnProperty.call(message, "max_bandwidth_per_user")) + if (!$util.isInteger(message.max_bandwidth_per_user)) + return "max_bandwidth_per_user: integer expected"; + return null; + }; + + Ping.fromObject = function (object, _depth) { + if (object instanceof $root.MumbleUDP.Ping) + return object; + if (!$util.isObject(object)) + throw $TypeError(".MumbleUDP.Ping: object expected"); + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let message = new $root.MumbleUDP.Ping(); + if (object.timestamp != null) + if (typeof object.timestamp === "object" ? object.timestamp.low || object.timestamp.high : $Number(object.timestamp) !== 0) + if ($util.Long) + message.timestamp = $util.Long.fromValue(object.timestamp, true); + else if (typeof object.timestamp === "string") + message.timestamp = $parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(true); + if (object.request_extended_information != null) + if (object.request_extended_information) + message.request_extended_information = $Boolean(object.request_extended_information); + if (object.server_version_v2 != null) + if (typeof object.server_version_v2 === "object" ? object.server_version_v2.low || object.server_version_v2.high : $Number(object.server_version_v2) !== 0) + if ($util.Long) + message.server_version_v2 = $util.Long.fromValue(object.server_version_v2, true); + else if (typeof object.server_version_v2 === "string") + message.server_version_v2 = $parseInt(object.server_version_v2, 10); + else if (typeof object.server_version_v2 === "number") + message.server_version_v2 = object.server_version_v2; + else if (typeof object.server_version_v2 === "object") + message.server_version_v2 = new $util.LongBits(object.server_version_v2.low >>> 0, object.server_version_v2.high >>> 0).toNumber(true); + if (object.user_count != null) + if ($Number(object.user_count) !== 0) + message.user_count = object.user_count >>> 0; + if (object.max_user_count != null) + if ($Number(object.max_user_count) !== 0) + message.max_user_count = object.max_user_count >>> 0; + if (object.max_bandwidth_per_user != null) + if ($Number(object.max_bandwidth_per_user) !== 0) + message.max_bandwidth_per_user = object.max_bandwidth_per_user >>> 0; + return message; + }; + + Ping.toObject = function (message, options, _depth) { + if (!options) + options = {}; + if (_depth === $undefined) + _depth = 0; + if (_depth > $util.recursionLimit) + throw $Error("max depth exceeded"); + let object = {}; + if (options.defaults) { + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.timestamp = options.longs === $String ? long.toString() : options.longs === $Number ? long.toNumber() : typeof $BigInt !== "undefined" && options.longs === $BigInt ? long.toBigInt() : long; + } else + object.timestamp = options.longs === $String ? "0" : typeof $BigInt !== "undefined" && options.longs === $BigInt ? $BigInt("0") : 0; + object.request_extended_information = false; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.server_version_v2 = options.longs === $String ? long.toString() : options.longs === $Number ? long.toNumber() : typeof $BigInt !== "undefined" && options.longs === $BigInt ? long.toBigInt() : long; + } else + object.server_version_v2 = options.longs === $String ? "0" : typeof $BigInt !== "undefined" && options.longs === $BigInt ? $BigInt("0") : 0; + object.user_count = 0; + object.max_user_count = 0; + object.max_bandwidth_per_user = 0; + } + if (message.timestamp != null && $Object.hasOwnProperty.call(message, "timestamp")) + if (typeof $BigInt !== "undefined" && options.longs === $BigInt) + object.timestamp = typeof message.timestamp === "number" ? $BigInt(message.timestamp) : $util.Long.fromBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0, true).toBigInt(); + else if (typeof message.timestamp === "number") + object.timestamp = options.longs === $String ? $String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === $String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === $Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber(true) : message.timestamp; + if (message.request_extended_information != null && $Object.hasOwnProperty.call(message, "request_extended_information")) + object.request_extended_information = message.request_extended_information; + if (message.server_version_v2 != null && $Object.hasOwnProperty.call(message, "server_version_v2")) + if (typeof $BigInt !== "undefined" && options.longs === $BigInt) + object.server_version_v2 = typeof message.server_version_v2 === "number" ? $BigInt(message.server_version_v2) : $util.Long.fromBits(message.server_version_v2.low >>> 0, message.server_version_v2.high >>> 0, true).toBigInt(); + else if (typeof message.server_version_v2 === "number") + object.server_version_v2 = options.longs === $String ? $String(message.server_version_v2) : message.server_version_v2; + else + object.server_version_v2 = options.longs === $String ? $util.Long.prototype.toString.call(message.server_version_v2) : options.longs === $Number ? new $util.LongBits(message.server_version_v2.low >>> 0, message.server_version_v2.high >>> 0).toNumber(true) : message.server_version_v2; + if (message.user_count != null && $Object.hasOwnProperty.call(message, "user_count")) + object.user_count = message.user_count; + if (message.max_user_count != null && $Object.hasOwnProperty.call(message, "max_user_count")) + object.max_user_count = message.max_user_count; + if (message.max_bandwidth_per_user != null && $Object.hasOwnProperty.call(message, "max_bandwidth_per_user")) + object.max_bandwidth_per_user = message.max_bandwidth_per_user; + return object; + }; + + Ping.prototype.toJSON = function() { + return Ping.toObject(this, $protobuf.util.toJSONOptions); + }; + + Ping.getTypeUrl = function(prefix) { + if (prefix === $undefined) + prefix = "type.googleapis.com"; + return prefix + "/MumbleUDP.Ping"; + }; + + return Ping; + })(); + + return MumbleUDP; +})(); + +export { + $root as default +}; diff --git a/src/core/proto.ts b/src/core/proto.ts new file mode 100644 index 0000000..6264944 --- /dev/null +++ b/src/core/proto.ts @@ -0,0 +1,81 @@ +// Generated from proto/Mumble.proto by `npm run proto` (static code, no eval, so it runs under a strict CSP) +import { MumbleProto } from './mumble-pb.js'; + +// TCP control message type ids, in wire order (index = type id). +export const MESSAGE_TYPES = [ + 'Version', 'UDPTunnel', 'Authenticate', 'Ping', 'Reject', 'ServerSync', + 'ChannelRemove', 'ChannelState', 'UserRemove', 'UserState', 'BanList', + 'TextMessage', 'PermissionDenied', 'ACL', 'QueryUsers', 'CryptSetup', + 'ContextActionModify', 'ContextAction', 'UserList', 'VoiceTarget', + 'PermissionQuery', 'CodecVersion', 'UserStats', 'RequestBlob', + 'ServerConfig', 'SuggestConfig', 'PluginDataTransmission' +] as const; + +export type MessageName = (typeof MESSAGE_TYPES)[number]; + +export interface Codec { + encode(name: MessageName, payload: Record): Uint8Array; + decode(typeId: number, body: Uint8Array): { name: MessageName; msg: any } | null; +} + +interface GeneratedType { + verify(obj: Record): string | null; + fromObject(obj: Record): unknown; + encode(msg: unknown): { finish(): Uint8Array }; + decode(body: Uint8Array): unknown; + toObject(msg: unknown, opts: { longs: NumberConstructor }): any; +} + +// Field names keep their snake_case spelling from the .proto file; 64-bit integers become numbers. +export function createCodec(): Codec { + const types = MESSAGE_TYPES.map(n => (MumbleProto as unknown as Record)[n]); + + return { + encode(name, payload) { + const id = MESSAGE_TYPES.indexOf(name); + const type = types[id]; + const err = type.verify(payload); + if (err) throw new Error(`${name}: ${err}`); + const body = type.encode(type.fromObject(payload)).finish(); + return frame(id, body); + }, + decode(typeId, body) { + const type = types[typeId]; + if (!type) return null; + const msg = type.toObject(type.decode(body), { longs: Number }); + return { name: MESSAGE_TYPES[typeId], msg }; + } + }; +} + +// 6-byte header: uint16 type, uint32 length (big endian), then the body. +export function frame(typeId: number, body: Uint8Array): Uint8Array { + const out = new Uint8Array(6 + body.length); + const view = new DataView(out.buffer); + view.setUint16(0, typeId); + view.setUint32(2, body.length); + out.set(body, 6); + return out; +} + +// Reassembles framed messages from an arbitrary chunked byte stream. +export class FrameReader { + private buf = new Uint8Array(0); + + push(chunk: Uint8Array, onFrame: (typeId: number, body: Uint8Array) => void): void { + const merged = new Uint8Array(this.buf.length + chunk.length); + merged.set(this.buf); + merged.set(chunk, this.buf.length); + let off = 0; + while (merged.length - off >= 6) { + const view = new DataView(merged.buffer, merged.byteOffset + off); + const typeId = view.getUint16(0); + const len = view.getUint32(2); + if (len > 8 * 1024 * 1024) throw new Error(`Frame too large: ${len}`); + if (merged.length - off - 6 < len) break; + onFrame(typeId, merged.subarray(off + 6, off + 6 + len)); + off += 6 + len; + } + this.buf = merged.slice(off); + } +} diff --git a/src/core/transport.ts b/src/core/transport.ts new file mode 100644 index 0000000..d8bca9e --- /dev/null +++ b/src/core/transport.ts @@ -0,0 +1,42 @@ +// A reliable, ordered byte stream to a Mumble server (TLS in Electron, WebSocket proxy on the web). +export interface Transport { + send(bytes: Uint8Array): void; + close(): void; + onData: ((chunk: Uint8Array) => void) | null; + onClose: ((reason: string) => void) | null; +} + +export interface ConnectTarget { + host: string; + port: number; +} + +// Identity certificate the client presents; Mumble uses it to recognize registered users. +export interface Identity { + certPem: string; + keyPem: string; + fingerprint: string; +} + +export interface CertDetails { + subject: string; + issuer: string; + validFrom: string; + validTo: string; + serialNumber: string; + fingerprint: string; // SHA-1, the hash Mumble uses for users + fingerprint256: string; + subjectAltName: string; + keyType: string; + keyBits: number | null; + ca: boolean; + selfSigned: boolean; + pem: string; +} + +export interface ServerCertInfo { + fingerprint: string; // sha256 of the server certificate, colon-separated hex + authorized: boolean; // true if it chains to a trusted CA + authError: string | null; // why it is not trusted, e.g. DEPTH_ZERO_SELF_SIGNED_CERT + chain: CertDetails[]; // leaf first +} diff --git a/src/core/voice-packet.ts b/src/core/voice-packet.ts new file mode 100644 index 0000000..c9f9616 --- /dev/null +++ b/src/core/voice-packet.ts @@ -0,0 +1,121 @@ +// Mumble voice packets, as sent over UDP or tunneled through TCP (UDPTunnel). +// Two wire formats exist: the legacy one (header byte + Mumble varints) and, since 1.5, +// a protobuf one (type byte 0 + MumbleUDP.Audio). Servers pick per client version. +import { MumbleUDP } from './mumble-udp-pb.js'; + +export interface VoicePacket { + session: number; // sender (only in packets from the server) + target: number; // 0 normal talking, 1-30 whisper targets, 31 server loopback; context when received + frame: number; // sequence number, in 10 ms audio frames + opus: Uint8Array; + last: boolean; // end of this transmission +} + +const LEGACY_OPUS = 4; +const PROTOBUF_AUDIO = 0; + +// ─── Mumble varint (PacketDataStream) ───────────────────────────────────────── + +export function writeVarint(out: number[], value: number): void { + if (!Number.isInteger(value) || value < 0) throw new Error(`Unsupported varint ${value}`); + if (value < 0x80) out.push(value); + else if (value < 0x4000) out.push(0x80 | (value >> 8), value & 0xff); + else if (value < 0x200000) out.push(0xc0 | (value >> 16), (value >> 8) & 0xff, value & 0xff); + else if (value < 0x10000000) out.push(0xe0 | (value >> 24), (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff); + else if (value < 0x100000000) out.push(0xf0, (value >>> 24) & 0xff, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff); + else { + const hi = Math.floor(value / 0x100000000), lo = value >>> 0; + out.push(0xf4, (hi >>> 24) & 0xff, (hi >> 16) & 0xff, (hi >> 8) & 0xff, hi & 0xff, + (lo >>> 24) & 0xff, (lo >> 16) & 0xff, (lo >> 8) & 0xff, lo & 0xff); + } +} + +export function readVarint(buf: Uint8Array, pos: number): [value: number, next: number] { + const need = (n: number) => { if (pos + n > buf.length) throw new Error('Truncated varint'); }; + need(1); + const b = buf[pos]; + if ((b & 0x80) === 0) return [b, pos + 1]; + if ((b & 0xc0) === 0x80) { need(2); return [((b & 0x3f) << 8) | buf[pos + 1], pos + 2]; } + if ((b & 0xe0) === 0xc0) { need(3); return [((b & 0x1f) << 16) | (buf[pos + 1] << 8) | buf[pos + 2], pos + 3]; } + if ((b & 0xf0) === 0xe0) { need(4); return [((b & 0x0f) << 24 | (buf[pos + 1] << 16) | (buf[pos + 2] << 8) | buf[pos + 3]) >>> 0, pos + 4]; } + const be32 = (p: number) => ((buf[p] << 24) | (buf[p + 1] << 16) | (buf[p + 2] << 8) | buf[p + 3]) >>> 0; + if ((b & 0xfc) === 0xf0) { need(5); return [be32(pos + 1), pos + 5]; } + if ((b & 0xfc) === 0xf4) { need(9); return [be32(pos + 1) * 0x100000000 + be32(pos + 5), pos + 9]; } + // Negative numbers (0xf8, 0xfc prefixes) never occur in audio headers + throw new Error('Unsupported varint prefix'); +} + +// ─── Encoding (client to server) ────────────────────────────────────────────── + +export function encodeVoice(p: Omit, protobuf: boolean): Uint8Array { + if (protobuf) { + const msg = MumbleUDP.Audio.fromObject({ + target: p.target, + frame_number: p.frame, + opus_data: p.opus, + is_terminator: p.last + }); + const body: Uint8Array = MumbleUDP.Audio.encode(msg).finish(); + const out = new Uint8Array(body.length + 1); + out[0] = PROTOBUF_AUDIO; + out.set(body, 1); + return out; + } + if (p.opus.length >= 0x2000) throw new Error('Opus frame too large'); + const head: number[] = [(LEGACY_OPUS << 5) | (p.target & 0x1f)]; + writeVarint(head, p.frame); + writeVarint(head, p.opus.length | (p.last ? 0x2000 : 0)); + const out = new Uint8Array(head.length + p.opus.length); + out.set(head); + out.set(p.opus, head.length); + return out; +} + +// ─── Decoding (server to client) ────────────────────────────────────────────── + +// Returns null for pings, other codecs and malformed packets. +export function decodeVoice(buf: Uint8Array): VoicePacket | null { + if (!buf.length) return null; + try { + if (buf[0] === PROTOBUF_AUDIO) { + const m = MumbleUDP.Audio.toObject(MumbleUDP.Audio.decode(buf.subarray(1)), { longs: Number, defaults: true }); + return { + session: m.sender_session, + target: m.context ?? m.target ?? 0, + frame: m.frame_number, + opus: m.opus_data instanceof Uint8Array ? m.opus_data : new Uint8Array(m.opus_data ?? []), + last: !!m.is_terminator + }; + } + if (buf[0] >> 5 !== LEGACY_OPUS) return null; + const target = buf[0] & 0x1f; + let pos = 1, session, frame, size; + [session, pos] = readVarint(buf, pos); + [frame, pos] = readVarint(buf, pos); + [size, pos] = readVarint(buf, pos); + const len = size & 0x1fff; + if (pos + len > buf.length) return null; + return { session, target, frame, opus: buf.slice(pos, pos + len), last: (size & 0x2000) !== 0 }; + } catch { + return null; + } +} + +// For tests and the server-side view: a client packet as the server would relay it +export function relayAsServer(clientPacket: Uint8Array, session: number, protobuf: boolean): Uint8Array { + if (protobuf) { + const m = MumbleUDP.Audio.decode(clientPacket.subarray(1)); + m.sender_session = session; + m.context = 0; + const body: Uint8Array = MumbleUDP.Audio.encode(m).finish(); + const out = new Uint8Array(body.length + 1); + out.set(body, 1); + return out; + } + const head: number[] = [clientPacket[0] & 0xe0]; + writeVarint(head, session); + const out = new Uint8Array(head.length + clientPacket.length - 1); + out.set(head); + out.set(clientPacket.subarray(1), head.length); + return out; +} diff --git a/src/lib/actions.ts b/src/lib/actions.ts new file mode 100644 index 0000000..75c2934 --- /dev/null +++ b/src/lib/actions.ts @@ -0,0 +1,86 @@ +import { session } from './session.svelte.ts'; +import { ui } from './ui.svelte.ts'; +import { store } from './settings.svelte.ts'; +import { voice, userKey } from './audio/voice.svelte.ts'; +import type { MenuItem } from './menu.svelte.ts'; +import type { Channel, User } from '../core/client.ts'; + +// Right-click menu for a channel in the tree +export function channelMenu(c: Channel): MenuItem[] { + const here = session.self?.channelId === c.id; + return [ + { label: here ? 'You are here' : 'Join channel', action: () => session.joinChannel(c.id), disabled: here || !c.canEnter }, + { label: 'Open chat', action: () => { session.showChannel(c.id, 'chat'); ui.panelOpen = true; } }, + { label: 'Show description', action: () => { session.showChannel(c.id, 'info'); ui.panelOpen = true; } }, + { separator: true, label: '' }, + { label: session.isExpanded(c.id) ? 'Collapse' : 'Expand', action: () => session.toggleExpanded(c.id), disabled: c.id === 0 }, + { label: 'Expand all', action: () => session.setAllExpanded(true) }, + { label: 'Collapse all', action: () => session.setAllExpanded(false) }, + { separator: true, label: '' }, + { label: 'Copy channel name', action: () => navigator.clipboard.writeText(c.name || 'Root') } + ]; +} + +// Right-click menu for a user. Moderation entries are always offered; the server decides +// whether we may use them and answers with a permission denial otherwise. +export function userMenu(u: User): MenuItem[] { + const self = session.self; + const isSelf = u.session === self?.session; + const items: MenuItem[] = [ + { label: 'View profile', action: () => { session.showUser(u.session); ui.panelOpen = true; } }, + { label: 'Information', action: () => (ui.userInfo = u.session) } + ]; + if (isSelf) { + items.push( + { label: 'Mute', checked: u.selfMute, action: () => session.setSelfMute(!u.selfMute) }, + { label: 'Deafen', checked: u.selfDeaf, action: () => session.setSelfDeaf(!u.selfDeaf) }, + { label: 'Change name...', action: () => changeNamePrompt(u) } + ); + if (u.userId == null) items.push({ label: 'Register on this server', action: () => session.register(u.session) }); + } else { + items.push( + { label: 'Send message', action: () => session.selectView(`dm:${u.session}`) }, + { label: 'Mute for me', checked: !!voice.settings.localMutes[userKey(u)], action: () => voice.setLocalMute(u, !voice.settings.localMutes[userKey(u)]) }, + { label: 'Set nickname...', action: () => nicknamePrompt(u) } + ); + if (self && u.channelId !== self.channelId) { + items.push({ label: 'Move to my channel', action: () => session.moveUser(u.session, self.channelId) }); + } + } + items.push( + { separator: true, label: '' }, + { label: 'Server mute', checked: u.mute, action: () => session.setServerMute(u.session, !u.mute) }, + { label: 'Server deafen', checked: u.deaf, action: () => session.setServerDeaf(u.session, !u.deaf) }, + { label: 'Priority speaker', checked: u.prioritySpeaker, action: () => session.setPrioritySpeaker(u.session, !u.prioritySpeaker) } + ); + if (!isSelf && u.userId == null) items.push({ label: 'Register user', action: () => session.register(u.session) }); + if (!isSelf) { + items.push( + { separator: true, label: '' }, + { label: 'Kick...', danger: true, action: () => (ui.prompt = { title: `Kick ${u.name}`, label: 'Reason (optional)', confirm: 'Kick', danger: true, onsubmit: r => session.kick(u.session, r) }) }, + { label: 'Ban...', danger: true, action: () => (ui.prompt = { title: `Ban ${u.name}`, label: 'Reason (optional)', confirm: 'Ban', danger: true, onsubmit: r => session.kick(u.session, r, true) }) } + ); + } + items.push({ separator: true, label: '' }, { label: 'Copy name', action: () => navigator.clipboard.writeText(u.name) }); + if (u.hash) items.push({ label: 'Copy certificate hash', action: () => navigator.clipboard.writeText(u.hash) }); + return items; +} + +export function changeNamePrompt(u: User): void { + ui.prompt = { + title: 'Change your name', label: 'New name', confirm: 'Reconnect with this name', initial: u.name, + text: u.userId != null + ? 'You are registered here, so the server keeps your registered name. The new name applies on servers where you are a guest.' + : 'Mumble cannot rename you while connected, so mumh5 reconnects with the new name and remembers it for this server.', + onsubmit: name => session.changeName(name) + }; +} + +export function nicknamePrompt(u: User): void { + ui.prompt = { + title: `Nickname for ${u.name}`, label: 'Nickname (only you see it; empty to remove)', confirm: 'Save', + initial: store.nicknames[userKey(u)] ?? '', + onsubmit: nick => store.setNickname(userKey(u), nick) + }; +} + diff --git a/src/lib/audio/capture.worklet.ts b/src/lib/audio/capture.worklet.ts new file mode 100644 index 0000000..7a305b7 --- /dev/null +++ b/src/lib/audio/capture.worklet.ts @@ -0,0 +1,33 @@ +/// +// Cuts microphone input into 10 ms mono frames (480 samples at 48 kHz) for the encoder, +// with the RMS level of each frame for the meter and voice activity detection. + +const FRAME = 480; + +class CaptureProcessor extends AudioWorkletProcessor { + private buf = new Float32Array(FRAME); + private fill = 0; + + process(inputs: Float32Array[][]): boolean { + const input = inputs[0]?.[0]; + if (!input) return true; + let i = 0; + while (i < input.length) { + const n = Math.min(FRAME - this.fill, input.length - i); + this.buf.set(input.subarray(i, i + n), this.fill); + this.fill += n; + i += n; + if (this.fill === FRAME) { + let sum = 0; + for (let k = 0; k < FRAME; k++) sum += this.buf[k] * this.buf[k]; + const frame = this.buf; + this.port.postMessage({ frame, rms: Math.sqrt(sum / FRAME) }, [frame.buffer]); + this.buf = new Float32Array(FRAME); + this.fill = 0; + } + } + return true; + } +} + +registerProcessor('mumh5-capture', CaptureProcessor); diff --git a/src/lib/audio/playback.worklet.ts b/src/lib/audio/playback.worklet.ts new file mode 100644 index 0000000..4cbfc5a --- /dev/null +++ b/src/lib/audio/playback.worklet.ts @@ -0,0 +1,95 @@ +/// +// Mixes decoded voice of all speakers. Each speaker has a queue that starts playing once +// `jitter` ms are buffered (absorbs network jitter), and re-buffers after running dry. + +interface Speaker { + chunks: Float32Array[]; + offset: number; // read position in chunks[0] + queued: number; // samples waiting + playing: boolean; + gain: number; + peak: number; +} + +class PlaybackProcessor extends AudioWorkletProcessor { + private speakers = new Map(); + private jitter = Math.round(sampleRate * 0.06); + private maxQueue = Math.round(sampleRate * 0.4); + private gains = new Map(); + private sinceReport = 0; + + constructor() { + super(); + this.port.onmessage = e => { + const m = e.data; + if (m.pcm) this.push(m.session, m.pcm); + else if (m.gain !== undefined) { + this.gains.set(m.session, m.gain); + const s = this.speakers.get(m.session); + if (s) s.gain = m.gain; + } else if (m.jitterMs !== undefined) this.jitter = Math.round(sampleRate * m.jitterMs / 1000); + else if (m.drop !== undefined) this.speakers.delete(m.drop); + else if (m.clear) this.speakers.clear(); + }; + } + + private push(session: number, pcm: Float32Array) { + let s = this.speakers.get(session); + if (!s) { + s = { chunks: [], offset: 0, queued: 0, playing: false, gain: this.gains.get(session) ?? 1, peak: 0 }; + this.speakers.set(session, s); + } + s.chunks.push(pcm); + s.queued += pcm.length; + // Too far behind (e.g. after a stall): drop the oldest audio to catch up + while (s.queued > this.maxQueue && s.chunks.length > 1) { + const c = s.chunks.shift()!; + s.queued -= c.length - s.offset; + s.offset = 0; + } + if (!s.playing && s.queued >= this.jitter) s.playing = true; + } + + process(_inputs: Float32Array[][], outputs: Float32Array[][]): boolean { + const out = outputs[0]; + const n = out[0].length; + const mix = out[0]; + mix.fill(0); + for (const s of this.speakers.values()) { + if (!s.playing) continue; + let i = 0; + while (i < n && s.chunks.length) { + const c = s.chunks[0]; + const take = Math.min(n - i, c.length - s.offset); + for (let k = 0; k < take; k++) { + const v = c[s.offset + k] * s.gain; + mix[i + k] += v; + const a = v < 0 ? -v : v; + if (a > s.peak) s.peak = a; + } + i += take; + s.offset += take; + s.queued -= take; + if (s.offset === c.length) { s.chunks.shift(); s.offset = 0; } + } + if (!s.chunks.length) s.playing = false; // ran dry: buffer again before resuming + } + // Soft clip so several loud speakers do not distort harshly + for (let i = 0; i < n; i++) { + const v = mix[i]; + if (v > 1 || v < -1) mix[i] = Math.tanh(v); + } + for (let ch = 1; ch < out.length; ch++) out[ch].set(mix); + + this.sinceReport += n; + if (this.sinceReport >= sampleRate / 10) { + const levels: Record = {}; + for (const [id, s] of this.speakers) { levels[id] = s.peak; s.peak = 0; } + this.port.postMessage({ levels }); + this.sinceReport = 0; + } + return true; + } +} + +registerProcessor('mumh5-playback', PlaybackProcessor); diff --git a/src/lib/audio/voice.svelte.ts b/src/lib/audio/voice.svelte.ts new file mode 100644 index 0000000..9281697 --- /dev/null +++ b/src/lib/audio/voice.svelte.ts @@ -0,0 +1,447 @@ +import captureUrl from './capture.worklet.ts?worker&url'; +import playbackUrl from './playback.worklet.ts?worker&url'; +import { encodeVoice, decodeVoice } from '../../core/voice-packet.ts'; +import type { MumbleClient } from '../../core/client.ts'; +import { load, save } from '../storage.ts'; + +export type TransmitMode = 'vad' | 'ptt' | 'continuous'; + +export interface VoiceSettings { + inputDevice: string; + outputDevice: string; + mode: TransmitMode; + pttKey: string; // KeyboardEvent.code + vadThreshold: number; // dBFS; louder frames open the voice activity gate + vadHoldMs: number; // keep sending this long after the level drops + inputGain: number; // 0..3 + outputVolume: number; // 0..2 + echoCancellation: boolean; + noiseSuppression: boolean; + autoGainControl: boolean; + bitrate: number; // Opus bits per second + frameMs: 10 | 20 | 40 | 60; + jitterMs: number; + // Per-user local volume and mute, keyed by certificate hash (or name without one) + userVolumes: Record; + localMutes: Record; +} + +const defaults: VoiceSettings = { + inputDevice: 'default', + outputDevice: 'default', + mode: 'vad', + pttKey: 'Backquote', + vadThreshold: -45, + vadHoldMs: 350, + inputGain: 1, + outputVolume: 1, + echoCancellation: true, + noiseSuppression: true, + autoGainControl: true, + bitrate: 40000, + frameMs: 20, + jitterMs: 60, + userVolumes: {}, + localMutes: {} +}; + +const SAMPLE_RATE = 48000; +const FRAME = 480; // 10 ms +// Rough per-packet cost of IP, TCP/TLS or UDP, and Mumble headers, for the bandwidth limit +const PACKET_OVERHEAD_BYTES = 60; + +export const userKey = (u: { hash: string; name: string }) => u.hash || `name:${u.name}`; + +export interface DeviceInfo { id: string; label: string } + +class VoiceEngine { + settings = $state(load('mumh5.voice', defaults)); + inputDevices = $state([]); + outputDevices = $state([]); + running = $state(false); + error = $state(''); + level = $state(-100); // current input level, dBFS + transmitting = $state(false); + pttDown = $state(false); + testing = $state(false); // hear yourself + talking = $state>({}); + effectiveBitrate = $state(0); + stats = $state({ sent: 0, received: 0, decoded: 0, lost: 0 }); + + private ctx: AudioContext | null = null; + private stream: MediaStream | null = null; + private source: MediaStreamAudioSourceNode | null = null; + private inputGainNode: GainNode | null = null; + private outputGainNode: GainNode | null = null; + private capture: AudioWorkletNode | null = null; + private playback: AudioWorkletNode | null = null; + private encoder: AudioEncoder | null = null; + private decoders = new Map | null }>(); + private client: MumbleClient | null = null; + private sessionGains = new Map(); + private unsubscribe: (() => void)[] = []; + + private frameCounter = 0; // Mumble sequence, in 10 ms frames + private sampleTime = 0; // encoder timestamps, microseconds + private lastVoiceAt = 0; // for VAD hold + private open = false; // gate state + private stopping = false; // flushing the last packet of a transmission + private held: Uint8Array[] = []; + private levelRaw = -100; + private levelTimer: ReturnType | null = null; + + constructor() { + if (typeof window === 'undefined') return; + window.addEventListener('keydown', e => this.onKey(e, true)); + window.addEventListener('keyup', e => this.onKey(e, false)); + // Released keys are not reported while the window is in the background + window.addEventListener('blur', () => { this.pttDown = false; }); + navigator.mediaDevices?.addEventListener('devicechange', () => this.refreshDevices()); + } + + save(): void { + save('mumh5.voice', $state.snapshot(this.settings)); + } + + update(patch: Partial): void { + Object.assign(this.settings, patch); + this.save(); + if ('inputGain' in patch && this.inputGainNode) this.inputGainNode.gain.value = this.settings.inputGain; + if ('outputVolume' in patch && this.outputGainNode) this.outputGainNode.gain.value = this.settings.outputVolume; + if ('jitterMs' in patch) this.playback?.port.postMessage({ jitterMs: this.settings.jitterMs }); + if ('outputDevice' in patch) this.applyOutputDevice(); + if ('bitrate' in patch || 'frameMs' in patch) this.configureEncoder(); + if (['inputDevice', 'echoCancellation', 'noiseSuppression', 'autoGainControl'].some(k => k in patch)) this.restartInput(); + } + + // ─── Devices ──────────────────────────────────────────────────────────────── + + async refreshDevices(): Promise { + if (!navigator.mediaDevices?.enumerateDevices) return; + const all = await navigator.mediaDevices.enumerateDevices(); + const map = (kind: MediaDeviceKind) => all.filter(d => d.kind === kind && d.deviceId !== 'communications') + .map(d => ({ id: d.deviceId, label: d.label || (d.deviceId === 'default' ? 'System default' : 'Unnamed device') })); + this.inputDevices = map('audioinput'); + this.outputDevices = map('audiooutput'); + } + + // ─── Lifecycle ────────────────────────────────────────────────────────────── + + // Starts the audio graph; safe to call repeatedly + async start(): Promise { + if (this.ctx) return; + this.error = ''; + try { + if (typeof AudioEncoder === 'undefined' || !(await AudioEncoder.isConfigSupported(this.encoderConfig())).supported) { + throw new Error('This system cannot encode Opus audio'); + } + const ctx = new AudioContext({ sampleRate: SAMPLE_RATE, latencyHint: 'interactive' }); + this.ctx = ctx; + await ctx.audioWorklet.addModule(captureUrl); + await ctx.audioWorklet.addModule(playbackUrl); + + this.outputGainNode = new GainNode(ctx, { gain: this.settings.outputVolume }); + this.playback = new AudioWorkletNode(ctx, 'mumh5-playback', { numberOfInputs: 0, outputChannelCount: [2] }); + this.playback.port.onmessage = e => this.onLevels(e.data.levels); + this.playback.port.postMessage({ jitterMs: this.settings.jitterMs }); + for (const [s, g] of this.sessionGains) this.playback.port.postMessage({ session: s, gain: g }); + this.playback.connect(this.outputGainNode).connect(ctx.destination); + + this.inputGainNode = new GainNode(ctx, { gain: this.settings.inputGain }); + this.capture = new AudioWorkletNode(ctx, 'mumh5-capture', { numberOfOutputs: 0 }); + this.capture.port.onmessage = e => this.onFrame(e.data.frame, e.data.rms); + this.inputGainNode.connect(this.capture); + + await this.applyOutputDevice(); + await this.restartInput(); + this.configureEncoder(); + await ctx.resume(); + this.levelTimer = setInterval(() => { this.level = this.levelRaw; }, 50); + this.running = true; + await this.refreshDevices(); + } catch (e) { + this.error = (e as Error).message; + await this.stop(); + } + } + + async stop(): Promise { + this.endTransmission(); + if (this.levelTimer) clearInterval(this.levelTimer); + this.levelTimer = null; + this.stream?.getTracks().forEach(t => t.stop()); + this.stream = null; + for (const d of this.decoders.values()) { try { d.decoder.close(); } catch { /* closed */ } } + this.decoders.clear(); + try { this.encoder?.close(); } catch { /* closed */ } + this.encoder = null; + await this.ctx?.close().catch(() => {}); + this.ctx = null; + this.capture = this.playback = null; + this.running = false; + this.transmitting = false; + this.talking = {}; + this.level = -100; + } + + private async restartInput(): Promise { + if (!this.ctx || !this.inputGainNode) return; + this.source?.disconnect(); + this.stream?.getTracks().forEach(t => t.stop()); + const s = this.settings; + try { + this.stream = await navigator.mediaDevices.getUserMedia({ + audio: { + deviceId: s.inputDevice && s.inputDevice !== 'default' ? { exact: s.inputDevice } : undefined, + echoCancellation: s.echoCancellation, + noiseSuppression: s.noiseSuppression, + autoGainControl: s.autoGainControl, + channelCount: 1, + sampleRate: SAMPLE_RATE + } + }); + } catch (e) { + this.error = `Microphone unavailable: ${(e as Error).message}`; + return; + } + this.error = ''; + this.source = this.ctx.createMediaStreamSource(this.stream); + this.source.connect(this.inputGainNode); + this.refreshDevices(); + } + + private async applyOutputDevice(): Promise { + const ctx = this.ctx as (AudioContext & { setSinkId?: (id: string) => Promise }) | null; + if (!ctx?.setSinkId) return; + try { + await ctx.setSinkId(this.settings.outputDevice === 'default' ? '' : this.settings.outputDevice); + } catch (e) { + this.error = `Output device unavailable: ${(e as Error).message}`; + } + } + + // ─── Connection ───────────────────────────────────────────────────────────── + + attach(client: MumbleClient): void { + this.unsubscribe.forEach(off => off()); + this.client = client; + this.stats = { sent: 0, received: 0, decoded: 0, lost: 0 }; + this.unsubscribe = [ + client.on('voice', raw => { if (this.client === client) this.receive(raw); }), + client.on('userRemove', u => this.dropSession(u.session)) + ]; + this.limitBitrate(); + this.start(); + } + + detach(): void { + this.endTransmission(); + this.unsubscribe.forEach(off => off()); + this.unsubscribe = []; + this.client = null; + for (const s of [...this.decoders.keys()]) this.dropSession(s); + this.playback?.port.postMessage({ clear: true }); + this.talking = {}; + this.transmitting = false; + // Release the microphone while not connected (unless testing it) + if (!this.testing) this.stop(); + } + + // Opus bitrate that keeps bitrate plus packet overhead inside the server's per-user limit + private allowedBitrate(): number { + const max = this.client?.maxBandwidth ?? 0; + const overhead = PACKET_OVERHEAD_BYTES * 8 * (1000 / this.settings.frameMs); + return Math.min(this.settings.bitrate, max ? Math.max(8000, max - overhead) : Infinity); + } + + private limitBitrate(): void { + if (this.allowedBitrate() !== this.effectiveBitrate) this.configureEncoder(); + } + + // ─── Sending ──────────────────────────────────────────────────────────────── + + private encoderConfig(): AudioEncoderConfig { + return { + codec: 'opus', + sampleRate: SAMPLE_RATE, + numberOfChannels: 1, + bitrate: this.effectiveBitrate || this.allowedBitrate(), + opus: { frameDuration: this.settings.frameMs * 1000, complexity: 10, useinbandfec: true, usedtx: false } + } as AudioEncoderConfig; + } + + private configureEncoder(): void { + this.effectiveBitrate = this.allowedBitrate(); + if (!this.ctx) return; + try { this.encoder?.close(); } catch { /* closed */ } + this.encoder = new AudioEncoder({ + output: chunk => this.onEncoded(chunk), + error: e => { this.error = `Encoder: ${e.message}`; } + }); + this.encoder.configure(this.encoderConfig()); + } + + private canTalk(): boolean { + const self = this.client?.self; + return !!self && this.client!.synced && !self.selfMute && !self.mute && !self.suppress && !self.selfDeaf && !self.deaf; + } + + private onFrame(frame: Float32Array, rms: number): void { + const db = rms > 0 ? 20 * Math.log10(rms) : -100; + this.levelRaw = Math.max(-100, db); + const now = performance.now(); + const s = this.settings; + + if (this.testing) this.playback?.port.postMessage({ session: -1, pcm: frame.slice() }); + + let wanted: boolean; + if (s.mode === 'continuous') wanted = true; + else if (s.mode === 'ptt') wanted = this.pttDown; + else { + if (db > s.vadThreshold) this.lastVoiceAt = now; + wanted = now - this.lastVoiceAt < s.vadHoldMs; + } + wanted &&= this.canTalk() && !!this.encoder && this.encoder.state === 'configured'; + + if (wanted && !this.open) { this.open = true; this.transmitting = true; } + if (!wanted && this.open) { this.endTransmission(); return; } + if (!this.open) return; + + const data = new AudioData({ + format: 'f32-planar', sampleRate: SAMPLE_RATE, numberOfFrames: FRAME, numberOfChannels: 1, + timestamp: this.sampleTime, data: frame + }); + this.sampleTime += 10000; + this.encoder!.encode(data); + data.close(); + } + + private onEncoded(chunk: EncodedAudioChunk): void { + const opus = new Uint8Array(chunk.byteLength); + chunk.copyTo(opus); + if (this.stopping) { this.held.push(opus); return; } + this.sendPacket(opus, false); + } + + private sendPacket(opus: Uint8Array, last: boolean): void { + const client = this.client; + if (!client) return; + client.sendVoiceTunnel(encodeVoice({ target: 0, frame: this.frameCounter, opus, last }, client.protobufVoice)); + this.frameCounter += this.settings.frameMs / 10; + this.stats.sent++; + } + + // Flush what the encoder still holds and mark the final packet, so receivers end the stream cleanly + private endTransmission(): void { + if (!this.open) return; + this.open = false; + this.transmitting = false; + const enc = this.encoder; + if (!enc || enc.state !== 'configured') return; + this.stopping = true; + enc.flush().then(() => { + const held = this.held; + this.held = []; + this.stopping = false; + held.forEach((opus, i) => this.sendPacket(opus, i === held.length - 1)); + if (!held.length) this.sendPacket(new Uint8Array(0), true); + }).catch(() => { this.stopping = false; this.held = []; }); + } + + private onKey(e: KeyboardEvent, down: boolean): void { + if (e.code !== this.settings.pttKey || e.repeat) return; + // Typing in a text field does not trigger push to talk + const t = e.target as HTMLElement | null; + if (down && t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.isContentEditable)) return; + this.pttDown = down; + } + + // ─── Receiving ────────────────────────────────────────────────────────────── + + private receive(raw: Uint8Array): void { + const p = decodeVoice(raw); + if (!p) return; + this.stats.received++; + const self = this.client?.self; + if (!this.ctx || !this.playback || self?.selfDeaf || self?.deaf) return; + const user = this.client?.users.get(p.session); + if (user && this.settings.localMutes[userKey(user)]) return; + + let d = this.decoders.get(p.session); + if (!d) { + const session = p.session; + const decoder = new AudioDecoder({ + output: data => this.onDecoded(session, data), + error: () => this.dropSession(session) + }); + decoder.configure({ codec: 'opus', sampleRate: SAMPLE_RATE, numberOfChannels: 1 }); + d = { decoder, lastFrame: -1, timer: null }; + this.decoders.set(session, d); + if (user) this.setSessionGain(session, this.settings.userVolumes[userKey(user)] ?? 1); + } + if (d.lastFrame >= 0 && p.frame > d.lastFrame + 6 && p.frame - d.lastFrame < 500) this.stats.lost++; + d.lastFrame = p.frame; + + if (p.opus.length) { + d.decoder.decode(new EncodedAudioChunk({ type: 'key', timestamp: p.frame * 10000, data: p.opus })); + } + if (!this.talking[p.session]) this.talking[p.session] = true; + if (d.timer) clearTimeout(d.timer); + // Speaking ends with the terminator, or when packets stop arriving + d.timer = setTimeout(() => { delete this.talking[p.session]; }, p.last ? this.settings.jitterMs + 60 : 400); + } + + private onDecoded(session: number, data: AudioData): void { + const pcm = new Float32Array(data.numberOfFrames); + data.copyTo(pcm, { planeIndex: 0, format: 'f32-planar' }); + data.close(); + this.stats.decoded++; + this.playback?.port.postMessage({ session, pcm }, [pcm.buffer]); + } + + private dropSession(session: number): void { + const d = this.decoders.get(session); + if (d) { + if (d.timer) clearTimeout(d.timer); + try { d.decoder.close(); } catch { /* closed */ } + this.decoders.delete(session); + } + this.playback?.port.postMessage({ drop: session }); + delete this.talking[session]; + } + + private onLevels(_levels: Record): void { + // Per-speaker peaks from the playback worklet, for future meters + } + + // ─── Per-user controls ────────────────────────────────────────────────────── + + private setSessionGain(session: number, gain: number): void { + this.sessionGains.set(session, gain); + this.playback?.port.postMessage({ session, gain }); + } + + setUserVolume(user: { session: number; hash: string; name: string }, volume: number): void { + this.settings.userVolumes[userKey(user)] = volume; + this.save(); + this.setSessionGain(user.session, volume); + } + + setLocalMute(user: { session: number; hash: string; name: string }, muted: boolean): void { + if (muted) this.settings.localMutes[userKey(user)] = true; + else delete this.settings.localMutes[userKey(user)]; + this.save(); + if (muted) this.dropSession(user.session); + } + + setTesting(on: boolean): void { + this.testing = on; + if (on) this.start(); + else { + this.playback?.port.postMessage({ drop: -1 }); + if (!this.client) this.stop(); + } + } +} + +export const voice = new VoiceEngine(); diff --git a/src/lib/audio/worklet-env.d.ts b/src/lib/audio/worklet-env.d.ts new file mode 100644 index 0000000..75fb88b --- /dev/null +++ b/src/lib/audio/worklet-env.d.ts @@ -0,0 +1,7 @@ +// Minimal AudioWorklet global scope typings (not part of the DOM lib) +declare abstract class AudioWorkletProcessor { + readonly port: MessagePort; + abstract process(inputs: Float32Array[][], outputs: Float32Array[][], parameters: Record): boolean; +} +declare function registerProcessor(name: string, ctor: new () => AudioWorkletProcessor): void; +declare const sampleRate: number; diff --git a/src/lib/html.ts b/src/lib/html.ts new file mode 100644 index 0000000..1945a35 --- /dev/null +++ b/src/lib/html.ts @@ -0,0 +1,167 @@ +import DOMPurify, { type Config } from 'dompurify'; + +export type EmbedKind = 'image' | 'video' | 'audio' | 'youtube'; +export interface Embed { kind: EmbedKind; url: string; name: string; videoId?: string; start?: number } + +// YouTube links: watch, youtu.be, shorts, embed, live, music, mobile +export function youtubeVideo(href: string): { id: string; start: number } | null { + let u: URL; + try { u = new URL(href); } catch { return null; } + const host = u.hostname.replace(/^(www|m|music)\./, ''); + let id = ''; + if (host === 'youtu.be') id = u.pathname.slice(1).split('/')[0]; + else if (host === 'youtube.com' || host === 'youtube-nocookie.com') { + if (u.pathname === '/watch') id = u.searchParams.get('v') ?? ''; + else id = /^\/(?:shorts|embed|live|v)\/([^/?#]+)/.exec(u.pathname)?.[1] ?? ''; + } + if (!/^[A-Za-z0-9_-]{11}$/.test(id)) return null; + // t=90, t=1m30s, start=90 + const t = u.searchParams.get('t') ?? u.searchParams.get('start') ?? ''; + const m = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s?)?$/.exec(t); + const start = m ? (Number(m[1] ?? 0) * 3600 + Number(m[2] ?? 0) * 60 + Number(m[3] ?? 0)) : 0; + return { id, start }; +} + +const EXT: Record = { + png: 'image', jpg: 'image', jpeg: 'image', gif: 'image', webp: 'image', avif: 'image', + mp4: 'video', webm: 'video', mov: 'video', m4v: 'video', + mp3: 'audio', ogg: 'audio', opus: 'audio', wav: 'audio', flac: 'audio', m4a: 'audio' +}; + +export function mediaKind(name: string): EmbedKind | null { + const m = /\.([a-z0-9]+)$/i.exec(name); + return m ? EXT[m[1].toLowerCase()] ?? null : null; +} + +const purifyConfig: Config & { RETURN_DOM_FRAGMENT: true } = { + ALLOWED_TAGS: ['a', 'b', 'i', 'u', 's', 'strong', 'em', 'br', 'p', 'span', 'div', 'ul', 'ol', 'li', + 'blockquote', 'code', 'pre', 'img', 'h1', 'h2', 'h3', 'h4', 'table', 'thead', 'tbody', 'tr', 'td', 'th', + 'hr', 'sub', 'sup', 'font'], + // style is reduced to a safe subset below; color is the attribute older clients send + ALLOWED_ATTR: ['href', 'src', 'alt', 'title', 'style', 'color'], + ALLOW_DATA_ATTR: false, + RETURN_DOM_FRAGMENT: true +}; + +// Text styling that Mumble clients (Qt rich text) use; anything else is dropped +const STYLE_PROPS: Record = { + 'color': /^(#[0-9a-f]{3,8}|rgba?\([\d\s.,%]+\)|[a-z]{3,20})$/i, + 'background-color': /^(#[0-9a-f]{3,8}|rgba?\([\d\s.,%]+\)|[a-z]{3,20})$/i, + 'font-weight': /^(normal|bold|bolder|lighter|[1-9]00)$/i, + 'font-style': /^(normal|italic|oblique)$/i, + 'text-decoration': /^(none|underline|line-through|overline)( (underline|line-through|overline))*$/i, + 'font-size': /^(\d{1,2}(\.\d+)?(pt|px|em|%)|small|medium|large|x-large|xx-large|smaller|larger)$/i, + 'text-align': /^(left|right|center|justify)$/i +}; + +// rgb(1, 2, 3) -> #010203, which every Mumble client understands +function normalizeColor(v: string): string { + const m = /^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/i.exec(v); + return m ? '#' + m.slice(1, 4).map(n => Math.min(255, Number(n)).toString(16).padStart(2, '0')).join('') : v; +} + +export function cleanStyle(style: string): string { + const out: string[] = []; + for (const decl of style.split(';')) { + const i = decl.indexOf(':'); + if (i < 0) continue; + const prop = decl.slice(0, i).trim().toLowerCase(); + let value = decl.slice(i + 1).trim().replace(/\s*!important$/i, ''); + if (!STYLE_PROPS[prop]?.test(value)) continue; + if (prop.endsWith('color')) value = normalizeColor(value); + out.push(`${prop}:${value}`); + } + return out.join(';'); +} + +DOMPurify.addHook('afterSanitizeAttributes', node => { + const el = node as Element; + if (el.hasAttribute('style')) { + const clean = cleanStyle(el.getAttribute('style') ?? ''); + if (clean) el.setAttribute('style', clean); + else el.removeAttribute('style'); + } + if (el.hasAttribute('color') && !STYLE_PROPS.color.test(el.getAttribute('color') ?? '')) el.removeAttribute('color'); + if (el.tagName === 'A') { + const href = el.getAttribute('href') ?? ''; + if (!/^https?:\/\//i.test(href)) el.removeAttribute('href'); + el.setAttribute('target', '_blank'); + el.setAttribute('rel', 'noopener noreferrer'); + } + // Only inline data: images; remote images would leak our IP to arbitrary hosts + if (el.tagName === 'IMG' && !/^data:image\/(png|jpe?g|gif|webp);/i.test(el.getAttribute('src') ?? '')) { + el.replaceWith(document.createTextNode('[image]')); + } +}); + +// Sanitize an incoming Mumble HTML message and pull out media links from trusted hosts. +export function renderIncoming(html: string, trustedHosts: string[]): { html: string; embeds: Embed[] } { + const frag = DOMPurify.sanitize(html, purifyConfig); + const embeds: Embed[] = []; + for (const a of frag.querySelectorAll('a[href]')) { + const yt = youtubeVideo(a.getAttribute('href')!); + if (yt) { + if (!embeds.some(e => e.videoId === yt.id) && embeds.filter(e => e.kind === 'youtube').length < 3) { + embeds.push({ kind: 'youtube', url: a.getAttribute('href')!, name: a.textContent ?? '', videoId: yt.id, start: yt.start }); + } + continue; + } + let url: URL; + try { url = new URL(a.getAttribute('href')!); } catch { continue; } + if (!trustedHosts.includes(url.host.toLowerCase())) continue; + const name = decodeURIComponent(url.pathname.split('/').pop() ?? ''); + const kind = mediaKind(name); + if (kind) embeds.push({ kind, url: url.href, name }); + } + // The inline thumbnail is only there for vanilla clients; we show the real media instead + if (embeds.some(e => e.kind !== 'youtube')) frag.querySelectorAll('img').forEach(img => img.remove()); + const div = document.createElement('div'); + div.append(frag); + return { html: div.innerHTML.replace(/^()+|()+$/g, ''), embeds }; +} + +export function escapeHtml(s: string): string { + return s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); +} + +// Plain composer text to the HTML Mumble clients expect: escaped, links clickable, newlines as
    . +// Output must stay well-formed XML: Murmur parses long messages as XML and denies them otherwise. +export function textToHtml(text: string): string { + return escapeHtml(text) + .replace(/https?:\/\/[^\s<]+[^\s<.,:;"')\]]/g, url => `
    ${url}`) + .replace(/\r?\n/g, '
    '); +} + +export function formatBytes(n: number): string { + if (n < 1024) return `${n} B`; + if (n < 1048576) return `${(n / 1024).toFixed(1)} KB`; + if (n < 1073741824) return `${(n / 1048576).toFixed(1)} MB`; + return `${(n / 1073741824).toFixed(2)} GB`; +} + +// ─── Outgoing rich text (comments) ──────────────────────────────────────────── + +const VOID_TAGS = new Set(['br', 'hr', 'img']); +const OUT_ATTRS = new Set(['href', 'src', 'alt', 'title', 'style', 'color']); +const escText = (t: string) => t.replace(/&/g, '&').replace(//g, '>'); +const escAttr = (t: string) => escText(t).replace(/"/g, '"'); + +function serialize(node: Node): string { + if (node.nodeType === Node.TEXT_NODE) return escText(node.textContent ?? ''); + if (node.nodeType !== Node.ELEMENT_NODE) return ''; + const el = node as Element; + const tag = el.tagName.toLowerCase(); + const attrs = [...el.attributes].filter(a => OUT_ATTRS.has(a.name)).map(a => ` ${a.name}="${escAttr(a.value)}"`).join(''); + if (VOID_TAGS.has(tag)) return `<${tag}${attrs}/>`; + return `<${tag}${attrs}>${[...el.childNodes].map(serialize).join('')}`; +} + +// Sanitized, well-formed XHTML that Murmur's XML check accepts and Mumble clients render +export function toMumbleHtml(html: string): string { + const frag = DOMPurify.sanitize(html, purifyConfig); + return [...frag.childNodes].map(serialize).join('') + .replace(/(

    <\/p>)+$/, '') + .replace(/^()+|()+$/g, '') + .trim(); +} + diff --git a/src/lib/icons.ts b/src/lib/icons.ts new file mode 100644 index 0000000..b924847 --- /dev/null +++ b/src/lib/icons.ts @@ -0,0 +1,30 @@ +// SVG path data (24x24 viewBox, square caps) shared by and the tray icon +export const ICON_PATHS: Record = { + mic: 'M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3zM19 10v2a7 7 0 0 1-14 0v-2M12 19v3', + 'mic-off': 'M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3zM19 10v2a7 7 0 0 1-14 0v-2M12 19v3M3 3l18 18', + headphones: 'M3 14v-2a9 9 0 0 1 18 0v2M21 14v7h-4v-7zM3 14v7h4v-7z', + 'headphones-off': 'M3 14v-2a9 9 0 0 1 18 0v2M21 14v7h-4v-7zM3 14v7h4v-7zM3 3l18 18', + settings: 'M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6', + plus: 'M12 5v14M5 12h14', + paperclip: 'M21.4 11.1l-9.2 9.2a6 6 0 0 1-8.5-8.5l9.2-9.2a4 4 0 0 1 5.7 5.7l-9.2 9.2a2 2 0 0 1-2.8-2.8l8.5-8.5', + hash: 'M4 9h16M4 15h16M10 3L8 21M16 3l-2 18', + channel: 'M11 5L6 9H2v6h4l5 4zM15.5 8.5a5 5 0 0 1 0 7', + users: 'M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM23 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8', + menu: 'M3 6h18M3 12h18M3 18h18', + x: 'M18 6L6 18M6 6l12 12', + power: 'M18.4 6.6a9 9 0 1 1-12.8 0M12 2v10', + lock: 'M5 11h14v10H5zM8 11V7a4 4 0 0 1 8 0v4', + file: 'M14 2H6v20h12V8zM14 2v6h6', + send: 'M22 2L11 13M22 2l-7 20-4-9-9-4z', + message: 'M21 15H7l-4 4V3h18z', + trash: 'M3 6h18M8 6V3h8v3M19 6l-1 15H6L5 6', + server: 'M2 3h20v8H2zM2 13h20v8H2zM6 7h.01M6 17h.01', + shield: 'M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z', + download: 'M12 3v12M7 10l5 5 5-5M4 21h16', + list: 'M9 6h12M9 12h12M9 18h12M4 6h.01M4 12h.01M4 18h.01', + 'list-ordered': 'M10 6h11M10 12h11M10 18h11M4 4v4M3 18h3l-3 3h3M3 10h2l-2 3h2', + link: 'M10 14a4 4 0 0 0 6 0l3-3a4 4 0 0 0-6-6l-1 1M14 10a4 4 0 0 0-6 0l-3 3a4 4 0 0 0 6 6l1-1', + image: 'M3 3h18v18H3zM8.5 10a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM21 15l-5-5L5 21', + code: 'M16 18l6-6-6-6M8 6l-6 6 6 6', + eraser: 'M20 20H7L3 16l10-10 7 7-6.5 7M6 11l7 7' +}; diff --git a/src/lib/identities.svelte.ts b/src/lib/identities.svelte.ts new file mode 100644 index 0000000..5a8f88d --- /dev/null +++ b/src/lib/identities.svelte.ts @@ -0,0 +1,27 @@ +import { native, type IdentitySummary } from './native.ts'; + +// Client certificates kept by the desktop app's main process +class Identities { + list = $state([]); + setupDone = $state(true); + loaded = $state(false); + + async refresh(): Promise { + if (!native) return; + const r = await native.identities.list(); + this.list = r.identities; + this.setupDone = r.setupDone; + this.loaded = true; + } + + get default(): IdentitySummary | undefined { + return this.list.find(i => i.isDefault) ?? this.list[0]; + } + + byId(id: string | undefined): IdentitySummary | undefined { + return this.list.find(i => i.id === id) ?? this.default; + } +} + +export const identities = new Identities(); +identities.refresh(); diff --git a/src/lib/menu.svelte.ts b/src/lib/menu.svelte.ts new file mode 100644 index 0000000..6aefdd9 --- /dev/null +++ b/src/lib/menu.svelte.ts @@ -0,0 +1,25 @@ +export interface MenuItem { + label: string; + action?: () => void; + danger?: boolean; + checked?: boolean; + disabled?: boolean; + separator?: boolean; +} + +// One context menu for the whole app, opened at the pointer position +class MenuStore { + open = $state<{ x: number; y: number; items: MenuItem[] } | null>(null); + + show(e: MouseEvent, items: MenuItem[]): void { + e.preventDefault(); + e.stopPropagation(); + this.open = { x: e.clientX, y: e.clientY, items }; + } + + close(): void { + this.open = null; + } +} + +export const menu = new MenuStore(); diff --git a/src/lib/native.ts b/src/lib/native.ts new file mode 100644 index 0000000..4673f4f --- /dev/null +++ b/src/lib/native.ts @@ -0,0 +1,72 @@ +import type { Transport, ServerCertInfo, CertDetails } from '../core/transport.ts'; + +interface NativeApi { + platformInfo(): Promise<{ os: string; osVersion: string }>; + describeCerts(ders: Uint8Array[]): Promise; + updateTray(state: { icon: string; tooltip: string; connected: boolean; server: string; muted: boolean; deafened: boolean; mode: string }): void; + onTrayAction(fn: (action: string) => void): void; + identities: { + list(): Promise<{ identities: IdentitySummary[]; setupDone: boolean }>; + create(name: string, email: string): Promise; + importP12(bytes: Uint8Array, password: string, name: string): Promise; + findMumble(): Promise<{ name: string } | null>; + importMumble(name: string): Promise; + exportP12(id: string, password: string): Promise; + setDefault(id: string): Promise; + rename(id: string, name: string): Promise; + remove(id: string): Promise; + finishSetup(): Promise; + }; + open(connId: string, host: string, port: number, identityId?: string): Promise; + send(connId: string, bytes: Uint8Array): void; + close(connId: string): void; + on(event: 'secure' | 'data' | 'close', fn: (connId: string, ...args: any[]) => void): () => void; +} + +export interface IdentitySummary { + id: string; + name: string; + fingerprint: string; + isDefault: boolean; + cert: CertDetails; +} + +declare global { + interface Window { mumh5Native?: NativeApi } +} + +export const native: NativeApi | null = typeof window !== 'undefined' ? window.mumh5Native ?? null : null; + +// Transport backed by a TLS socket in the Electron main process. +// `secure` resolves once the TLS handshake is done, before any Mumble data is sent, +// so the caller can check the server certificate before sending a password. +export class ElectronTransport implements Transport { + onData: ((chunk: Uint8Array) => void) | null = null; + onClose: ((reason: string) => void) | null = null; + readonly secure: Promise; + private id = crypto.randomUUID(); + private offs: (() => void)[] = []; + private api: NativeApi; + + constructor(api: NativeApi, host: string, port: number, identityId?: string) { + this.api = api; + let resolveSecure!: (i: ServerCertInfo) => void; + let rejectSecure!: (e: Error) => void; + this.secure = new Promise((res, rej) => { resolveSecure = res; rejectSecure = rej; }); + const id = this.id; + this.offs.push( + api.on('secure', (cid, info) => { if (cid === id) resolveSecure(info); }), + api.on('data', (cid, chunk) => { if (cid === id) this.onData?.(chunk); }), + api.on('close', (cid, reason) => { + if (cid !== id) return; + this.offs.forEach(off => off()); + rejectSecure(new Error(reason)); + this.onClose?.(reason); + }) + ); + api.open(id, host, port, identityId).catch(e => rejectSecure(e)); + } + + send(bytes: Uint8Array): void { this.api.send(this.id, bytes); } + close(): void { this.api.close(this.id); } +} diff --git a/src/lib/session.svelte.ts b/src/lib/session.svelte.ts new file mode 100644 index 0000000..11504d4 --- /dev/null +++ b/src/lib/session.svelte.ts @@ -0,0 +1,678 @@ +import { createCodec } from '../core/proto.ts'; +import { MumbleClient, describeDenial, type Channel, type User, type TextMessage } from '../core/client.ts'; +import { native, ElectronTransport } from './native.ts'; +import type { ServerCertInfo } from '../core/transport.ts'; +import { store, type SavedServer } from './settings.svelte.ts'; +import { renderIncoming, textToHtml, escapeHtml, formatBytes, type Embed } from './html.ts'; +import { uploadFile, makeThumbnail, makeInlineImage, fetchUploadInfo, checkFile, type UploadInfo } from './upload.ts'; +import { voice } from './audio/voice.svelte.ts'; + +const codec = createCodec(); + +// A chat view is a channel ("ch:") or a direct conversation with a user ("dm:"). +export type ViewKey = `ch:${number}` | `dm:${number}`; + +export interface ChatEntry { + id: number; + kind: 'text' | 'system'; + author: string; + authorSession: number | null; + self: boolean; + html: string; + embeds: Embed[]; + time: number; +} + +export interface UploadJob { + id: number; + key: string; + name: string; + progress: number; + error: string; +} + +export interface CertPrompt { + server: SavedServer; + hostPort: string; + fingerprint: string; + previous: string; +} + +// Right-hand panel: member list, a channel (description preview or its side chat), or a user profile +export type Panel = + | { kind: 'members' } + | { kind: 'channel'; id: number; tab: 'info' | 'chat' } + | { kind: 'user'; session: number }; + +let nextId = 1; + +export class Session { + status = $state<'idle' | 'connecting' | 'connected'>('idle'); + error = $state(''); + server = $state(null); + // Bumped on every client state change; views read it to re-derive from the client's maps + tick = $state(0); + view = $state('ch:0'); + panel = $state({ kind: 'members' }); + logs = $state>({}); + unread = $state>({}); + uploads = $state([]); + certPrompt = $state(null); + rtt = $state(0); + // TLS details of the current server, for the certificate viewer and the trusted badge + serverCert = $state(null); + uploadInfo = $state(null); + // Channel tree expansion the user chose; channels not in here follow the default + expanded = $state>({}); + + client: MumbleClient | null = null; + // Incremented per connect so a slow, superseded attempt can tell it is stale + private attempt = 0; + private uploadInfoFor = ''; + // Blob hashes already requested, so a preview does not ask the server repeatedly + private requested = new Set(); + // Last message with an inline image, resent as a plain link if the server refuses it + private lastImageSend: { key: string; fallback: string; at: number } | null = null; + // Channel we asked to move to; the chat view switches when the server confirms it + private pendingJoin: number | null = null; + + // ─── Derived helpers ──────────────────────────────────────────────────────── + // The client mutates its objects in place. These return shallow copies and read `tick`, + // so every state change hands Svelte new objects and dependent views update. + + get self(): User | null { + void this.tick; + const u = this.client?.self; + return u ? { ...u } : null; + } + + channel(id: number): Channel | undefined { + void this.tick; + const c = this.client?.channels.get(id); + return c && { ...c }; + } + + user(session: number): User | undefined { + void this.tick; + const u = this.client?.users.get(session); + return u && { ...u }; + } + + childrenOf(parent: number | null): Channel[] { + void this.tick; + if (!this.client) return []; + return [...this.client.channels.values()] + .filter(c => (parent === null ? c.id === 0 : c.parent === parent && c.id !== 0)) + .sort((a, b) => a.position - b.position || a.name.localeCompare(b.name)) + .map(c => ({ ...c })); + } + + usersIn(channelId: number): User[] { + void this.tick; + if (!this.client) return []; + return [...this.client.users.values()] + .filter(u => u.channelId === channelId) + .sort((a, b) => a.name.localeCompare(b.name)) + .map(u => ({ ...u })); + } + + allUsers(): User[] { + void this.tick; + return this.client ? [...this.client.users.values()].sort((a, b) => a.name.localeCompare(b.name)).map(u => ({ ...u })) : []; + } + + // Users in a channel and all of its subchannels + subtreeUserCount(id: number): number { + void this.tick; + const client = this.client; + if (!client) return 0; + const ids = new Set([id]); + let grew = true; + while (grew) { + grew = false; + for (const c of client.channels.values()) { + if (c.parent != null && ids.has(c.parent) && !ids.has(c.id)) { ids.add(c.id); grew = true; } + } + } + let n = 0; + for (const u of client.users.values()) if (ids.has(u.channelId)) n++; + return n; + } + + // Collapsed by default; channels with people in them open up, like the desktop client + isExpanded(id: number): boolean { + if (id === 0) return true; + return this.expanded[id] ?? this.subtreeUserCount(id) > 0; + } + + toggleExpanded(id: number): void { + this.expanded[id] = !this.isExpanded(id); + } + + setAllExpanded(open: boolean): void { + const all: Record = {}; + for (const id of this.client?.channels.keys() ?? []) all[id] = open; + this.expanded = all; + } + + viewTitle(key: string = this.view): string { + const [kind, id] = key.split(':'); + if (kind === 'ch') return this.channel(Number(id))?.name || 'Root'; + return this.user(Number(id))?.name ?? 'Offline user'; + } + + // Keys whose chat is on screen right now (main view and an open side chat) + private visibleKeys(): string[] { + const keys: string[] = [this.view]; + if (this.panel.kind === 'channel' && this.panel.tab === 'chat') keys.push(`ch:${this.panel.id}`); + return keys; + } + + // ─── Connection ───────────────────────────────────────────────────────────── + + async connect(server: SavedServer): Promise { + this.disconnect(); + const attempt = ++this.attempt; + this.server = server; + this.error = ''; + this.logs = {}; + this.unread = {}; + this.expanded = {}; + this.panel = { kind: 'members' }; + this.requested.clear(); + this.serverCert = null; + this.status = 'connecting'; + + if (!native) { + this.fail('Connecting needs the desktop app for now. The web version will connect through a proxy.'); + return; + } + + const transport = new ElectronTransport(native, server.host, server.port, server.identityId); + let info; + try { + info = await transport.secure; + } catch (e) { + if (attempt === this.attempt) this.fail((e as Error).message); + return; + } + if (attempt !== this.attempt) return transport.close(); + this.serverCert = info; + + // Trust on first use: pin the certificate, and stop before sending credentials if it changed + const hostPort = `${server.host.toLowerCase()}:${server.port}`; + const pinned = store.pins[hostPort]; + if (!pinned) { + store.pin(hostPort, info.fingerprint); + } else if (pinned !== info.fingerprint && !info.authorized) { + transport.close(); + this.certPrompt = { server, hostPort, fingerprint: info.fingerprint, previous: pinned }; + this.fail('The server certificate changed.'); + return; + } + + const client = new MumbleClient(codec); + this.client = client; + this.wire(client); + // TLS is up but the server may still never finish the login + setTimeout(() => { if (this.client === client && !client.synced) client.disconnect('Login timed out'); }, 20000); + const platform = await native.platformInfo(); + if (attempt !== this.attempt) return transport.close(); + client.connect(transport, { + username: server.username, + password: server.password, + os: platform.os, + osVersion: platform.osVersion + }); + } + + acceptCertificate(): void { + const p = this.certPrompt; + if (!p) return; + store.pin(p.hostPort, p.fingerprint); + this.certPrompt = null; + this.connect(p.server); + } + + disconnect(): void { + this.attempt++; + const client = this.client; + this.client = null; + client?.disconnect(); + sessions.onClosed(this); + this.status = 'idle'; + this.tick++; + } + + private fail(msg: string): void { + this.status = 'idle'; + this.error = msg; + } + + private wire(client: MumbleClient): void { + const live = () => this.client === client; + const bump = () => { if (live()) this.tick++; }; + + client.on('synced', () => { + if (!live()) return; + this.status = 'connected'; + this.view = `ch:${client.self?.channelId ?? 0}`; + sessions.onSynced(this); + if (client.welcomeText) this.system(this.view, client.welcomeText, true); + bump(); + }); + client.on('channel', bump); + client.on('channelRemove', id => { + if (!live()) return; + if (this.panel.kind === 'channel' && this.panel.id === id) this.panel = { kind: 'members' }; + bump(); + }); + client.on('ping', rtt => { if (live()) this.rtt = rtt; }); + + client.on('user', (user, changed, _actor, isNew) => { + if (!live()) return; + const self = client.self; + if (client.synced && self) { + if (isNew) { + if (user.channelId === self.channelId) this.system(`ch:${self.channelId}`, `${escapeHtml(user.name)} connected`); + } else if (changed.includes('userId') && user.userId != null) { + const who = user.session === self.session ? 'You are' : `${escapeHtml(user.name)} is`; + this.system(this.view, `${who} now registered on this server`); + } else if (changed.includes('channelId')) { + if (user.session === self.session) { + // Follow our own channel moves in the chat view (also from a DM when we asked to join) + if (this.view.startsWith('ch:') || this.pendingJoin === user.channelId) this.selectView(`ch:${user.channelId}`); + this.pendingJoin = null; + this.system(`ch:${user.channelId}`, `You joined ${escapeHtml(this.channel(user.channelId)?.name || 'Root')}`); + } else if (user.channelId === self.channelId) { + this.system(`ch:${self.channelId}`, `${escapeHtml(user.name)} joined the channel`); + } + } + } + bump(); + }); + + client.on('userRemove', (user, actor, reason, ban) => { + if (!live()) return; + const self = client.self; + if (self && user.channelId === self.channelId) { + const by = actor != null && actor !== user.session ? client.users.get(actor)?.name : null; + const what = by ? `${ban ? 'was banned' : 'was kicked'} by ${escapeHtml(by)}` : 'disconnected'; + this.system(`ch:${self.channelId}`, `${escapeHtml(user.name)} ${what}${reason ? `: ${escapeHtml(reason)}` : ''}`); + } + if (this.panel.kind === 'user' && this.panel.session === user.session) this.panel = { kind: 'members' }; + bump(); + }); + + client.on('text', msg => { if (live()) this.receive(client, msg); }); + + client.on('permissionDenied', d => { + if (!live()) return; + // An image preview can exceed what the server accepts; the link alone still gets through + const img = this.lastImageSend; + if (d.type === 4 && img && Date.now() - img.at < 5000) { + this.lastImageSend = null; + this.system(img.key, 'The server refused the image preview, sent the link only'); + client.sendText(this.target(img.key), img.fallback); + return; + } + if (d.channelId != null && d.channelId === this.pendingJoin) this.pendingJoin = null; + const ch = d.channelId != null ? client.channels.get(d.channelId)?.name : undefined; + this.system(this.view, escapeHtml(describeDenial(d, ch))); + }); + + client.on('close', reason => { + if (this.client !== client) return; + this.client = null; + sessions.onClosed(this); + this.status = 'idle'; + this.error = reason === 'Disconnected' ? '' : reason; + this.tick++; + }); + } + + // ─── Panels, descriptions, comments ───────────────────────────────────────── + + showChannel(id: number, tab: 'info' | 'chat' = 'info'): void { + this.panel = { kind: 'channel', id, tab }; + if (tab === 'chat') delete this.unread[`ch:${id}`]; + this.loadDescription(id); + } + + showUser(session: number): void { + this.panel = { kind: 'user', session }; + this.loadComment(session); + } + + closePanel(): void { + this.panel = { kind: 'members' }; + } + + // Long descriptions and comments are only announced by hash; fetch the text on demand + loadDescription(id: number): void { + const c = this.client?.channels.get(id); + if (!c?.descriptionHash || c.description) return; + const tag = `d:${id}:${[...c.descriptionHash].join(',')}`; + if (this.requested.has(tag)) return; + this.requested.add(tag); + this.client!.requestBlob({ descriptions: [id] }); + } + + loadComment(session: number): void { + const u = this.client?.users.get(session); + if (!u?.commentHash || u.comment) return; + const tag = `c:${session}:${[...u.commentHash].join(',')}`; + if (this.requested.has(tag)) return; + this.requested.add(tag); + this.client!.requestBlob({ comments: [session] }); + } + + register(session: number): void { + this.client?.register(session); + } + + // Mumble has no rename while connected: reconnect under the new name (saved for this server) + changeName(name: string): void { + const server = this.server; + if (!server || !name.trim()) return; + const updated = { ...$state.snapshot(server), username: name.trim() }; + store.upsertServer(updated); + this.connect(updated); + } + + // html comes from the rich editor, already sanitized XHTML + setComment(html: string): void { + this.client?.setComment(html); + } + + // Largest description or image message the server accepts (0: no limit) + get htmlLimit(): number { + void this.tick; + return this.client?.config.imageMessageLength ?? 131072; + } + + // ─── Chat ─────────────────────────────────────────────────────────────────── + + private push(key: string, entry: Omit): void { + // Assign first, then push through the stored proxy; pushing onto the raw array would not be reactive + if (!this.logs[key]) this.logs[key] = []; + this.logs[key].push({ ...entry, id: nextId++, time: Date.now() }); + if (sessions.active !== this || !this.visibleKeys().includes(key)) this.unread[key] = (this.unread[key] ?? 0) + 1; + } + + private system(key: string, html: string, trusted = false): void { + const rendered = trusted ? renderIncoming(html, store.trustedHosts) : { html, embeds: [] }; + this.push(key, { kind: 'system', author: '', authorSession: null, self: false, ...rendered }); + } + + private receive(client: MumbleClient, msg: TextMessage): void { + const self = client.self; + const sender = msg.actor != null ? client.users.get(msg.actor) : undefined; + let key: string; + if (msg.actor == null) key = this.view; + else if (msg.channels.length || msg.trees.length) key = `ch:${msg.channels[0] ?? self?.channelId ?? 0}`; + else key = `dm:${msg.actor}`; + + const rendered = renderIncoming(msg.html, store.trustedHosts); + if (msg.actor == null) { + this.push(key, { kind: 'system', author: '', authorSession: null, self: false, ...rendered }); + } else { + this.push(key, { kind: 'text', author: sender ? store.displayName(sender) : `#${msg.actor}`, authorSession: msg.actor, self: false, ...rendered }); + } + } + + // Opening a server marks what is on screen as read + markVisibleRead(): void { + for (const k of this.visibleKeys()) delete this.unread[k]; + } + + selectView(key: ViewKey): void { + this.view = key; + delete this.unread[key]; + } + + // The view follows once the server confirms the move (see the 'user' handler). Murmur + // silently drops own state changes sent too quickly (leaky bucket, about one per second), + // so an unconfirmed join is sent once more before giving up. + joinChannel(id: number): void { + const client = this.client; + if (!client) return; + // Joining a channel is where you want to talk: voice moves to this server + sessions.setVoice(this); + if (this.self?.channelId === id) { + this.selectView(`ch:${id}`); + return; + } + this.pendingJoin = id; + client.joinChannel(id); + const moved = () => this.client !== client || this.pendingJoin !== id || client.self?.channelId === id; + setTimeout(() => { + if (moved()) return; + client.joinChannel(id); + setTimeout(() => { + if (moved()) return; + this.pendingJoin = null; + this.system(this.view, `The server did not move you to ${escapeHtml(client.channels.get(id)?.name || 'Root')}. Try again in a moment.`); + }, 1500); + }, 1200); + } + + private target(key: string): { channels?: number[]; users?: number[] } { + const [kind, id] = key.split(':'); + return kind === 'ch' ? { channels: [Number(id)] } : { users: [Number(id)] }; + } + + // Send HTML to a view and echo it locally (the server does not echo our messages). + sendHtml(html: string, key: string = this.view): boolean { + const client = this.client; + if (!client || this.status !== 'connected') return false; + const limit = / limit) { + this.system(key, `Message too long for this server (${html.length} / ${limit} characters)`); + return false; + } + client.sendText(this.target(key), html); + const rendered = renderIncoming(html, store.trustedHosts); + this.push(key, { kind: 'text', author: client.self?.name ?? '', authorSession: client.session, self: true, ...rendered }); + return true; + } + + sendText(text: string, key: string = this.view): boolean { + const trimmed = text.trim(); + return trimmed ? this.sendHtml(textToHtml(trimmed), key) : false; + } + + async uploadFiles(files: File[], key: string = this.view): Promise { + const { uploadHost, uploadKey, uploadExpiry, sendThumbnails } = store.settings; + if (!uploadHost || !uploadKey) return this.sendInlineImages(files, key); + let info: UploadInfo; + try { + info = await this.loadUploadInfo(); + } catch (e) { + this.system(key, `File sharing unavailable: ${escapeHtml((e as Error).message)}`); + return; + } + for (const f of files) { + const problem = checkFile(info, f); + if (problem) this.system(key, escapeHtml(problem)); + } + for (const file of files.filter(f => !checkFile(info, f))) { + const job = { id: nextId++, key, name: file.name, progress: 0, error: '' }; + this.uploads.push(job); + const live = () => this.uploads.find(j => j.id === job.id)!; + try { + const res = await uploadFile(uploadHost, uploadKey, file, uploadExpiry, p => { live().progress = p; }); + // Well-formed XHTML (
    , ): Murmur rejects long messages that do not parse as XML + const link = `${escapeHtml(res.name)} (${formatBytes(res.size)})`; + let html = link; + const cfg = this.client?.config; + if (sendThumbnails && cfg?.allowHtml !== false) { + const budget = Math.min(cfg?.imageMessageLength || 131072, 100000) - link.length - 64; + const thumb = await makeThumbnail(file, budget); + if (thumb) html += `
    `; + } + if (html !== link) this.lastImageSend = { key, fallback: link, at: Date.now() }; + this.sendHtml(html, key); + this.uploads = this.uploads.filter(j => j.id !== job.id); + } catch (e) { + live().error = (e as Error).message; + setTimeout(() => { this.uploads = this.uploads.filter(j => j.id !== job.id); }, 6000); + } + } + } + + // Without file hosting: images go inline like a pasted picture in the desktop client, + // scaled to the server's image limit. Other files need an upload host. + private async sendInlineImages(files: File[], key: string): Promise { + const cfg = this.client?.config; + for (const file of files) { + if (!file.type.startsWith('image/')) { + this.system(key, `${escapeHtml(file.name)}: sending files needs file hosting. Set up an upload host in Settings; without one only images can be sent.`); + continue; + } + if (cfg?.allowHtml === false) { + this.system(key, 'This server does not allow images in messages.'); + return; + } + // 0 means no limit; stay reasonable anyway + const limit = cfg?.imageMessageLength || 1024 * 1024; + const uri = await makeInlineImage(file, limit - 64); + if (!uri) { + this.system(key, `${escapeHtml(file.name)}: could not make this image small enough for the server (limit ${formatBytes(limit)})`); + continue; + } + this.sendHtml(``, key); + } + } + + // Cached per host+key; refreshed when settings change + async loadUploadInfo(): Promise { + const { uploadHost, uploadKey } = store.settings; + const id = `${uploadHost}|${uploadKey}`; + if (this.uploadInfo && this.uploadInfoFor === id) return this.uploadInfo; + const info = await fetchUploadInfo(uploadHost, uploadKey); + this.uploadInfo = info; + this.uploadInfoFor = id; + return info; + } + + // ─── Voice state and moderation ───────────────────────────────────────────── + + setSelfMute(v: boolean) { this.client?.setSelfMute(v); } + setSelfDeaf(v: boolean) { this.client?.setSelfDeaf(v); } + + kick(session: number, reason: string, ban = false) { this.client?.kick(session, reason, ban); } + setServerMute(session: number, v: boolean) { this.client?.setUserState(session, { mute: v }); } + setServerDeaf(session: number, v: boolean) { this.client?.setUserState(session, { deaf: v }); } + setPrioritySpeaker(session: number, v: boolean) { this.client?.setUserState(session, { priority_speaker: v }); } + moveUser(session: number, channelId: number) { this.client?.setUserState(session, { channel_id: channelId }); } +} + +// ─── Several servers at once ─────────────────────────────────────────────────── +// Every server has its own Session. Text works on all of them; voice runs on one (like +// Discord): the server where you last joined a channel. On the others you are shown as +// deafened, so nobody expects you to hear them, and your state is restored when voice returns. + +class Sessions { + list = $state([]); + activeId = $state(null); + voiceId = $state(null); + private idle = new Session(); + // Self mute/deaf before we deafened a background server, to restore later + private saved = new Map(); + + get active(): Session { + return this.list.find(s => s.server?.id === this.activeId) ?? this.idle; + } + + byServer(id: string): Session | undefined { + return this.list.find(s => s.server?.id === id); + } + + // Show a server, connecting if needed + open(server: SavedServer): void { + let s = this.byServer(server.id); + this.activeId = server.id; + s?.markVisibleRead(); + if (!s) { + s = new Session(); + this.list.push(s); + s = this.list[this.list.length - 1]; + } + if (s.status === 'idle') s.connect(server); + } + + select(id: string): void { + this.activeId = id; + this.active.markVisibleRead(); + } + + close(id: string): void { + const s = this.byServer(id); + if (!s) return; + s.disconnect(); + this.list = this.list.filter(x => x !== s); + if (this.activeId === id) this.activeId = this.list.find(x => x.status !== 'idle')?.server?.id ?? null; + } + + get voiceSession(): Session | undefined { + return this.list.find(s => s.server?.id === this.voiceId); + } + + onSynced(s: Session): void { + if (!this.voiceId || !this.voiceSession?.client) this.setVoice(s, true); + else this.toBackground(s); + } + + onClosed(s: Session): void { + this.saved.delete(s); + if (this.voiceId !== s.server?.id) return; + voice.detach(); + // Hand voice to another connected server, if any + const next = this.list.find(x => x !== s && x.client && x.status === 'connected'); + this.voiceId = null; + if (next) this.setVoice(next); + } + + setVoice(s: Session, first = false): void { + const id = s.server?.id ?? null; + if (!id || (this.voiceId === id && !first)) return; + const prev = this.voiceSession; + if (prev && prev !== s) { + voice.detach(); + this.toBackground(prev); + } + this.voiceId = id; + this.fromBackground(s); + if (s.client) voice.attach(s.client); + } + + private toBackground(s: Session): void { + const self = s.client?.self; + if (!s.client || !self || this.saved.has(s)) return; + this.saved.set(s, { mute: self.selfMute, deaf: self.selfDeaf }); + if (!self.selfDeaf) s.client.setSelfDeaf(true); + } + + private fromBackground(s: Session): void { + const prev = this.saved.get(s); + this.saved.delete(s); + if (!prev || !s.client || prev.deaf) return; + s.client.send('UserState', { self_deaf: false, self_mute: prev.mute }); + } +} + +export const sessions = new Sessions(); + +// The session of the server on screen. Forwards to the active Session so components keep +// using `session.x`; methods are bound to the real instance so async work stays with its server. +export const session = new Proxy({} as Session, { + get(_t, prop) { + const a = sessions.active; + const v = Reflect.get(a, prop, a); + return typeof v === 'function' ? v.bind(a) : v; + }, + set(_t, prop, value) { + return Reflect.set(sessions.active, prop, value, sessions.active); + } +}); diff --git a/src/lib/settings.svelte.ts b/src/lib/settings.svelte.ts new file mode 100644 index 0000000..b92b7ac --- /dev/null +++ b/src/lib/settings.svelte.ts @@ -0,0 +1,100 @@ +import { load, loadList, save } from './storage.ts'; + +export interface SavedServer { + id: string; + label: string; + host: string; + port: number; + username: string; + password: string; + identityId?: string; // certificate to connect with; the default identity when unset + icon?: string; // custom rail icon, a small square data: image +} + +export interface Settings { + uploadHost: string; // f0ckm base URL, e.g. https://f0ck.dev + uploadKey: string; // upload-only key from scripts/chat-upload-key.mjs + uploadExpiry: string; // 1h / 24h / 7d / 30d + embedHosts: string[]; // extra hosts whose media links render inline + sendThumbnails: boolean; // include a small inline image for vanilla Mumble clients + compact: boolean; + youtube: 'off' | 'click' | 'thumbnail'; // YouTube links: plain, click-to-play card, card with thumbnail +} + +const defaults: Settings = { + uploadHost: '', + uploadKey: '', + uploadExpiry: '30d', + embedHosts: [], + sendThumbnails: true, + compact: false, + youtube: 'click' +}; + +class SettingsStore { + settings = $state(load('mumh5.settings', defaults)); + servers = $state(loadList('mumh5.servers')); + // Pinned sha256 fingerprints of server certificates, keyed by host:port (trust on first use) + pins = $state>(load('mumh5.pins', {})); + // Local nicknames for other users, only visible to us; keyed by certificate hash (or name) + nicknames = $state>(load('mumh5.nicknames', {})); + + saveSettings() { save('mumh5.settings', $state.snapshot(this.settings)); } + + upsertServer(s: SavedServer) { + const i = this.servers.findIndex(x => x.id === s.id); + if (i === -1) this.servers.push(s); + else this.servers[i] = s; + save('mumh5.servers', $state.snapshot(this.servers)); + } + + // Reorder the server list (drag and drop in the rail) + moveServer(id: string, toIndex: number) { + const from = this.servers.findIndex(s => s.id === id); + if (from < 0) return; + const list = [...this.servers]; + const [item] = list.splice(from, 1); + list.splice(Math.max(0, Math.min(list.length, toIndex)), 0, item); + this.servers = list; + save('mumh5.servers', $state.snapshot(this.servers)); + } + + setServerIcon(id: string, icon: string | undefined) { + const s = this.servers.find(x => x.id === id); + if (!s) return; + if (icon) s.icon = icon; + else delete s.icon; + save('mumh5.servers', $state.snapshot(this.servers)); + } + + removeServer(id: string) { + this.servers = this.servers.filter(s => s.id !== id); + save('mumh5.servers', $state.snapshot(this.servers)); + } + + setNickname(key: string, nick: string) { + if (nick.trim()) this.nicknames[key] = nick.trim(); + else delete this.nicknames[key]; + save('mumh5.nicknames', $state.snapshot(this.nicknames)); + } + + // Name to show for a user: our local nickname, else their name + displayName(u: { hash: string; name: string }): string { + return this.nicknames[u.hash || `name:${u.name}`] ?? u.name; + } + + pin(hostPort: string, fingerprint: string) { + this.pins[hostPort] = fingerprint; + save('mumh5.pins', $state.snapshot(this.pins)); + } + + // Hosts whose media links are embedded: the upload host plus user-added ones. + // Other links stay plain links, so opening a chat never pings arbitrary servers. + get trustedHosts(): string[] { + const hosts = [...this.settings.embedHosts]; + try { if (this.settings.uploadHost) hosts.push(new URL(this.settings.uploadHost).host); } catch { /* invalid URL */ } + return hosts.map(h => h.trim().toLowerCase()).filter(Boolean); + } +} + +export const store = new SettingsStore(); diff --git a/src/lib/storage.ts b/src/lib/storage.ts new file mode 100644 index 0000000..f16853b --- /dev/null +++ b/src/lib/storage.ts @@ -0,0 +1,23 @@ +// localStorage wrapper that tolerates missing or broken storage. +export function load(key: string, fallback: T): T { + try { + const raw = localStorage.getItem(key); + return raw ? { ...fallback, ...JSON.parse(raw) } : fallback; + } catch { + return fallback; + } +} + +export function loadList(key: string): T[] { + try { + const raw = localStorage.getItem(key); + const v = raw ? JSON.parse(raw) : []; + return Array.isArray(v) ? v : []; + } catch { + return []; + } +} + +export function save(key: string, value: unknown): void { + try { localStorage.setItem(key, JSON.stringify(value)); } catch { /* storage unavailable */ } +} diff --git a/src/lib/tray.svelte.ts b/src/lib/tray.svelte.ts new file mode 100644 index 0000000..3c8cd0a --- /dev/null +++ b/src/lib/tray.svelte.ts @@ -0,0 +1,80 @@ +import { native } from './native.ts'; +import { ICON_PATHS } from './icons.ts'; +import { session, sessions } from './session.svelte.ts'; +import { voice, type TransmitMode } from './audio/voice.svelte.ts'; +import { ui } from './ui.svelte.ts'; + +type TrayLook = 'offline' | 'idle' | 'talking' | 'muted' | 'deafened'; + +const LOOK: Record = { + offline: { bg: '#4a4c54', glyph: 'mic' }, + idle: { bg: '#7c6cff', glyph: 'mic' }, + talking: { bg: '#2fb863', glyph: 'mic' }, + muted: { bg: '#e0443e', glyph: 'mic-off' }, + deafened: { bg: '#e0443e', glyph: 'headphones-off' } +}; + +const cache = new Map(); + +// Square tile with a white glyph, like the rail tiles; 64 px so the OS can scale it down sharply +function drawIcon(look: TrayLook): string { + const hit = cache.get(look); + if (hit) return hit; + const size = 64; + const canvas = document.createElement('canvas'); + canvas.width = canvas.height = size; + const ctx = canvas.getContext('2d')!; + ctx.fillStyle = LOOK[look].bg; + ctx.fillRect(0, 0, size, size); + ctx.translate(8, 8); + ctx.scale(2, 2); // 24 unit glyph into 48 px + ctx.strokeStyle = '#ffffff'; + ctx.lineWidth = 2.6; + ctx.lineCap = 'square'; + ctx.lineJoin = 'miter'; + ctx.stroke(new Path2D(ICON_PATHS[LOOK[look].glyph])); + const url = canvas.toDataURL('image/png'); + cache.set(look, url); + return url; +} + +// Mirrors voice state into the system tray and handles its menu +export function startTray(): void { + if (!native) return; + const api = native; + + $effect.root(() => { + $effect(() => { + const self = session.self; + const voiceSession = sessions.voiceSession; + const connected = session.status === 'connected'; + const vSelf = voiceSession?.self; + const muted = !!(vSelf ? vSelf.selfMute || vSelf.mute : self?.selfMute); + const deafened = !!(vSelf ? vSelf.selfDeaf || vSelf.deaf : self?.selfDeaf); + const look: TrayLook = !connected && !voiceSession ? 'offline' + : deafened ? 'deafened' : muted ? 'muted' : voice.transmitting ? 'talking' : 'idle'; + const server = voiceSession?.server?.label ?? session.server?.label ?? ''; + const state = { offline: 'not connected', idle: 'connected', talking: 'talking', muted: 'muted', deafened: 'deafened' }[look]; + api.updateTray({ + icon: drawIcon(look), + tooltip: server ? `mumh5: ${state} on ${server}` : 'mumh5: not connected', + connected: !!(voiceSession?.status === 'connected' || connected), + server, + muted, + deafened, + mode: voice.settings.mode + }); + }); + }); + + api.onTrayAction(action => { + // Tray actions apply where voice runs + const target = sessions.voiceSession ?? sessions.active; + const self = target.self; + if (action === 'toggle-mute' && self) target.setSelfMute(!self.selfMute); + else if (action === 'toggle-deafen' && self) target.setSelfDeaf(!self.selfDeaf); + else if (action.startsWith('mode:')) voice.update({ mode: action.slice(5) as TransmitMode }); + else if (action === 'settings') { ui.settingsTab = 'voice'; ui.settingsOpen = true; } + else if (action === 'disconnect' && target.server) sessions.close(target.server.id); + }); +} diff --git a/src/lib/ui.svelte.ts b/src/lib/ui.svelte.ts new file mode 100644 index 0000000..24ebb73 --- /dev/null +++ b/src/lib/ui.svelte.ts @@ -0,0 +1,35 @@ +import type { CertDetails } from '../core/transport.ts'; + +export interface PromptRequest { + title: string; + label: string; + confirm: string; + danger?: boolean; + input?: 'text' | 'password' | 'none'; + initial?: string; + text?: string; + onsubmit: (value: string) => void; +} + +export interface CertRequest { + title: string; + chain: CertDetails[]; + status?: { ok: boolean; text: string }; +} + +// App-wide dialogs that can be opened from anywhere (menus, panels) +class Ui { + prompt = $state(null); + cert = $state(null); + settingsOpen = $state(false); + wizard = $state<'setup' | 'add' | null>(null); + // Quick audio popover from right-clicking mute (input) or deafen (output) + quickAudio = $state<{ kind: 'input' | 'output'; x: number; y: number } | null>(null); + settingsTab = $state<'voice' | 'files' | 'identities'>('voice'); + // Session whose connection information is shown + userInfo = $state(null); + // Set when a panel was opened on a layout where it is an overlay + panelOpen = $state(false); +} + +export const ui = new Ui(); diff --git a/src/lib/upload.ts b/src/lib/upload.ts new file mode 100644 index 0000000..69b95fe --- /dev/null +++ b/src/lib/upload.ts @@ -0,0 +1,118 @@ +export interface UploadResult { + url: string; + name: string; + mime: string; + inline: boolean; + size: number; + expires_at: number; + delete_token: string; +} + +export interface UploadInfo { + allowed_mimes: string[]; + allowed_extensions: string[]; + max_bytes: number; +} + +const endpoint = (host: string) => host.replace(/\/+$/, '') + '/api/chat/upload'; + +// Allowed types and limits of the upload host; also serves as a key check. +export async function fetchUploadInfo(host: string, key: string): Promise { + const r = await fetch(endpoint(host), { headers: { 'X-API-Key': key } }); + const body = await r.json().catch(() => null); + if (r.status === 401) throw new Error('Key rejected'); + if (!r.ok || !body?.success) throw new Error(body?.msg || `Unexpected response (HTTP ${r.status})`); + return body; +} + +// Client-side pre-check; the host verifies the real type again after upload +export function checkFile(info: UploadInfo, file: File): string | null { + const ext = /\.([a-z0-9]+)$/i.exec(file.name)?.[1]?.toLowerCase() ?? ''; + const typeOk = file.type ? info.allowed_mimes.includes(file.type) : info.allowed_extensions.includes(ext); + if (!typeOk) return `${file.name}: file type not allowed on this upload host`; + if (file.size > info.max_bytes) return `${file.name}: too large (max ${Math.round(info.max_bytes / 1048576)} MB)`; + return null; +} + +// Value for +export function acceptAttr(info: UploadInfo | null): string { + if (!info) return ''; + return [...info.allowed_mimes, ...info.allowed_extensions.map(e => '.' + e)].join(','); +} + +// Upload one file to a f0ckm chat-upload endpoint. XHR instead of fetch for upload progress. +export function uploadFile( + host: string, key: string, file: File, expiry: string, onProgress: (fraction: number) => void +): Promise { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.open('POST', endpoint(host)); + xhr.setRequestHeader('X-API-Key', key); + xhr.setRequestHeader('X-Filename', encodeURIComponent(file.name)); + xhr.setRequestHeader('X-Upload-Expiry', expiry); + if (file.type) xhr.setRequestHeader('Content-Type', file.type); + xhr.upload.onprogress = e => { if (e.lengthComputable) onProgress(e.loaded / e.total); }; + xhr.onerror = () => reject(new Error('Network error')); + xhr.onload = () => { + let body: any = null; + try { body = JSON.parse(xhr.responseText); } catch { /* not JSON */ } + if (xhr.status === 200 && body?.success) resolve(body); + else reject(new Error(body?.msg || `Upload failed (HTTP ${xhr.status})`)); + }; + xhr.send(file); + }); +} + +const readDataUrl = (file: Blob) => new Promise((resolve, reject) => { + const r = new FileReader(); + r.onload = () => resolve(String(r.result)); + r.onerror = () => reject(r.error); + r.readAsDataURL(file); +}); + +// JPEG data URI of an image, scaled down until it fits in maxChars. Mumble clients render +// inline data: images, which is also how the desktop client sends pasted pictures. +export async function makeInlineImage(file: File, maxChars: number, sizes = [1280, 1024, 800, 640, 480, 320, 200, 120]): Promise { + if (!/^image\/(png|jpeg|gif|webp|avif|bmp)$/.test(file.type) || maxChars < 2000) return null; + // Small enough as it is: send the original (keeps GIF animation and PNG transparency) + if (/^image\/(png|jpeg|gif|webp)$/.test(file.type) && Math.ceil(file.size / 3) * 4 + 40 < maxChars) { + return readDataUrl(file); + } + try { + const bmp = await createImageBitmap(file); + for (const size of sizes) { + const scale = Math.min(1, size / Math.max(bmp.width, bmp.height)); + if (scale === 1 && size !== sizes[0] && Math.max(bmp.width, bmp.height) < size) continue; + const canvas = document.createElement('canvas'); + canvas.width = Math.max(1, Math.round(bmp.width * scale)); + canvas.height = Math.max(1, Math.round(bmp.height * scale)); + canvas.getContext('2d')!.drawImage(bmp, 0, 0, canvas.width, canvas.height); + for (const q of [0.85, 0.7, 0.5]) { + const uri = canvas.toDataURL('image/jpeg', q); + if (uri.length < maxChars) return uri; + } + } + } catch { /* undecodable image */ } + return null; +} + +// Small preview next to an f0ckm link, for vanilla Mumble clients +export function makeThumbnail(file: File, maxChars: number): Promise { + return makeInlineImage(file, maxChars, [320, 200, 120]); +} + +// Square server icon: center-cropped, scaled to 128x128, as a small WebP data URI +export async function makeServerIcon(file: File, size = 128): Promise { + const bmp = await createImageBitmap(file); + const side = Math.min(bmp.width, bmp.height); + const canvas = document.createElement('canvas'); + canvas.width = canvas.height = size; + const ctx = canvas.getContext('2d')!; + ctx.imageSmoothingQuality = 'high'; + ctx.drawImage(bmp, (bmp.width - side) / 2, (bmp.height - side) / 2, side, side, 0, 0, size, size); + bmp.close(); + const webp = canvas.toDataURL('image/webp', 0.85); + // Browsers without WebP encoding fall back to PNG + return webp.startsWith('data:image/webp') ? webp : canvas.toDataURL('image/png'); +} + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..037036c --- /dev/null +++ b/src/main.ts @@ -0,0 +1,7 @@ +import { mount } from 'svelte'; +import './app.css'; +import App from './App.svelte'; +import { startTray } from './lib/tray.svelte.ts'; + +mount(App, { target: document.getElementById('app')! }); +startTray(); diff --git a/src/ui/Avatar.svelte b/src/ui/Avatar.svelte new file mode 100644 index 0000000..d5e7796 --- /dev/null +++ b/src/ui/Avatar.svelte @@ -0,0 +1,19 @@ + + + + {(name.trim()[0] ?? '?').toUpperCase()} + + + diff --git a/src/ui/CertDialog.svelte b/src/ui/CertDialog.svelte new file mode 100644 index 0000000..53f6ab2 --- /dev/null +++ b/src/ui/CertDialog.svelte @@ -0,0 +1,22 @@ + + + (session.certPrompt = null)} width={520}> +

    The certificate of {p.hostPort} is different from the one it had before. This happens when a server is reinstalled, but it can also mean someone is intercepting the connection. Your password has not been sent.

    +

    Previous

    {p.previous} +

    Now

    {p.fingerprint} + {#snippet footer()} + + + {/snippet} + + + diff --git a/src/ui/CertViewer.svelte b/src/ui/CertViewer.svelte new file mode 100644 index 0000000..3532910 --- /dev/null +++ b/src/ui/CertViewer.svelte @@ -0,0 +1,73 @@ + + + + {#if status}

    {status.text}

    {/if} + {#if chain.length > 1} +
    + {#each chain as c, i (c.fingerprint256)} + + {/each} +
    + {/if} + {#if cert} +

    Subject

    +
    {#each parts(cert.subject) as [k, v] (k + v)}
    {names[k] ?? k}
    {v}
    {/each}
    +

    Issuer {#if cert.selfSigned}self-signed{/if}

    +
    {#each parts(cert.issuer) as [k, v] (k + v)}
    {names[k] ?? k}
    {v}
    {/each}
    +

    Validity {#if expired}expired{/if}

    +
    +
    Not before
    {date(cert.validFrom)}
    +
    Not after
    {date(cert.validTo)}
    +
    +

    Details

    +
    +
    Public key
    {cert.keyType.toUpperCase()}{cert.keyBits ? ` ${cert.keyBits} bit` : ''}
    + {#if cert.subjectAltName}
    Alt names
    {cert.subjectAltName}
    {/if} +
    Serial
    {cert.serialNumber}
    +
    SHA-1
    {cert.fingerprint}
    +
    SHA-256
    {cert.fingerprint256}
    +
    + {/if} + {#snippet footer()} + + + {/snippet} +
    + + diff --git a/src/ui/ChannelNode.svelte b/src/ui/ChannelNode.svelte new file mode 100644 index 0000000..55b4941 --- /dev/null +++ b/src/ui/ChannelNode.svelte @@ -0,0 +1,116 @@ + + +
  • +
    menu.show(e, channelMenu(channel))} role="presentation"> + {#if children.length || users.length} + + {:else} + + {/if} + +
    + + {#if users.length && expanded} +
      + {#each users as u (u.session)} + {@const isSelf = u.session === session.self?.session} + {@const clicks = clickOrDouble( + () => { session.showUser(u.session); ui.panelOpen = true; }, + () => { if (!isSelf) { session.selectView(`dm:${u.session}`); onnavigate(); } } + )} +
    • + +
    • + {/each} +
    + {/if} + {#if children.length && expanded} +
      + {#each children as c (c.id)} + + {/each} +
    + {/if} +
  • + + diff --git a/src/ui/Chat.svelte b/src/ui/Chat.svelte new file mode 100644 index 0000000..f41c737 --- /dev/null +++ b/src/ui/Chat.svelte @@ -0,0 +1,58 @@ + + +
    +
    + {#if showMenu}{/if} + +

    {title}

    + {#if topic}{topic}{/if} + + +
    + + + {#snippet empty()} +
    + {#if session.status === 'connected'} +

    {isDm ? `Direct messages with ${title}` : `Welcome to #${title}`}

    +

    {isDm ? 'Messages here are only visible to the two of you.' : 'Messages go to everyone in this channel. Drop files here to share them.'}

    + {:else if session.status === 'connecting'} +

    Connecting...

    + {:else} +

    mumh5

    +

    Choose a server to get started.

    + {/if} +
    + {/snippet} +
    + + +
    + + diff --git a/src/ui/ChatLog.svelte b/src/ui/ChatLog.svelte new file mode 100644 index 0000000..bf236da --- /dev/null +++ b/src/ui/ChatLog.svelte @@ -0,0 +1,63 @@ + + +
    { if (e.dataTransfer?.types.includes('Files')) dragging++; }} + ondragleave={() => (dragging = Math.max(0, dragging - 1))} + ondragover={e => e.preventDefault()} {ondrop}> +
    (pinned = list.scrollHeight - list.scrollTop - list.clientHeight < 40)} + onloadcapture={onload} onloadedmetadatacapture={onload}> + {#if !entries.length}{@render empty()}{/if} + {#each entries as entry, i (entry.id)} + + {/each} +
    +
    + {#if dragging} +

    Drop to upload to {key.startsWith('dm:') ? '@' : '#'}{title}

    + {/if} +
    + + diff --git a/src/ui/Composer.svelte b/src/ui/Composer.svelte new file mode 100644 index 0000000..982cabd --- /dev/null +++ b/src/ui/Composer.svelte @@ -0,0 +1,87 @@ + + +
    + {#if uploads.length} +
      + {#each uploads as u (u.id)} +
    • + + {u.name} + {#if u.error}{u.error}{:else}{/if} +
    • + {/each} +
    + {/if} +
    + + { session.uploadFiles([...(picker.files ?? [])], target); picker.value = ''; }} /> + + +
    +
    + + diff --git a/src/ui/ConnectDialog.svelte b/src/ui/ConnectDialog.svelte new file mode 100644 index 0000000..68fcf1c --- /dev/null +++ b/src/ui/ConnectDialog.svelte @@ -0,0 +1,105 @@ + + + +
    + +
    + + +
    + + + + + {#if identities.list.length > 1} + + + {/if} + + + +
    + + {#if icon}{:else}{(label || host || '?').trim().slice(0, 2).toUpperCase()}{/if} + + + {#if icon}{/if} + +
    + {#if iconError}

    {iconError}

    {/if} +
    + {#snippet footer()} + {#if initial}{/if} + + + {/snippet} +
    + + diff --git a/src/ui/ContextMenu.svelte b/src/ui/ContextMenu.svelte new file mode 100644 index 0000000..f4870bc --- /dev/null +++ b/src/ui/ContextMenu.svelte @@ -0,0 +1,64 @@ + + + menu.close()} onresize={() => menu.close()} /> + +{#if menu.open} + + +{/if} + + diff --git a/src/ui/Icon.svelte b/src/ui/Icon.svelte new file mode 100644 index 0000000..1587ff1 --- /dev/null +++ b/src/ui/Icon.svelte @@ -0,0 +1,10 @@ + + + diff --git a/src/ui/IdentityList.svelte b/src/ui/IdentityList.svelte new file mode 100644 index 0000000..9df9019 --- /dev/null +++ b/src/ui/IdentityList.svelte @@ -0,0 +1,83 @@ + + +
      + {#each identities.list as i (i.id)} +
    • +
      + {i.name} + {#if i.isDefault}default{/if} +
      + {i.fingerprint} + {#if usedBy(i.id).length}

      Used for {usedBy(i.id).join(', ')}

      {/if} +
      + {#if !i.isDefault}{/if} + + + + +
      +
    • + {:else} +
    • No identity yet; one is created when you first connect.
    • + {/each} +
    + +{#if message}

    {message}

    {/if} + + diff --git a/src/ui/IdentityWizard.svelte b/src/ui/IdentityWizard.svelte new file mode 100644 index 0000000..24e77a1 --- /dev/null +++ b/src/ui/IdentityWizard.svelte @@ -0,0 +1,178 @@ + + + {} : onclose} width={560}> + {#if step === 'welcome'} +

    Mumble recognizes you by a certificate, not by a password. Registered names, admin rights and friends lists on servers are tied to it, so it is worth setting up once and keeping a backup.

    +
    + + {#if mumble} + + {/if} + + {#if existing} + + {/if} +
    + {:else if step === 'create'} +
    +

    The name is stored in the certificate and helps you tell identities apart. Servers show the username you enter when connecting, not this.

    + + + + + +
    + {:else if step === 'import'} +
    + + (file = (e.currentTarget as HTMLInputElement).files?.[0] ?? null)} /> + + +
    + {:else if step === 'backup' && result} +

    Identity {result.name} is ready.

    +

    {result.fingerprint}

    +

    If this computer dies, the certificate goes with it, and so do your registrations. Save a password-protected backup now; the desktop Mumble client can import it too.

    + + + + + {:else if step === 'done'} +

    You are set up{result ? ` as ${result.name}` : ''}.

    + {#if result}

    {result.fingerprint}

    {/if} + {#if savedTo}

    Backup saved to {savedTo}

    {/if} +

    Manage identities, pick one per server and export backups in Settings.

    + {/if} + + {#if error}

    {error}

    {/if} + + {#snippet footer()} + {#if step === 'welcome'} + {#if mode === 'add'}{/if} + {:else if step === 'create'} + + + {:else if step === 'import'} + + + {:else if step === 'backup'} + + + {:else} + + {/if} + {/snippet} +
    + + diff --git a/src/ui/Members.svelte b/src/ui/Members.svelte new file mode 100644 index 0000000..2901518 --- /dev/null +++ b/src/ui/Members.svelte @@ -0,0 +1,52 @@ + + + + + diff --git a/src/ui/Message.svelte b/src/ui/Message.svelte new file mode 100644 index 0000000..7505093 --- /dev/null +++ b/src/ui/Message.svelte @@ -0,0 +1,80 @@ + + +{#if entry.kind === 'system'} +
    + +
    {@html entry.html} {hhmm}
    +
    +{:else} +
    +
    + {#if grouped} + {hhmm} + {:else} + + {/if} +
    +
    + {#if !grouped} +
    + {entry.author} + +
    + {/if} + {#if entry.html}
    {@html entry.html}
    {/if} + {#each entry.embeds as m (m.url)} + {#if m.kind === 'youtube'} + {#if store.settings.youtube !== 'off'}
    {/if} + {:else} +
    + {#if m.kind === 'image'} + {m.name} + {:else if m.kind === 'video'} + + {:else} + + {/if} +
    + {/if} + {/each} +
    +
    +{/if} + + diff --git a/src/ui/Modal.svelte b/src/ui/Modal.svelte new file mode 100644 index 0000000..e65cdb5 --- /dev/null +++ b/src/ui/Modal.svelte @@ -0,0 +1,35 @@ + + + { if (e.key === 'Escape') onclose(); }} /> + + + + diff --git a/src/ui/PromptDialog.svelte b/src/ui/PromptDialog.svelte new file mode 100644 index 0000000..0b2827e --- /dev/null +++ b/src/ui/PromptDialog.svelte @@ -0,0 +1,29 @@ + + + +
    { e.preventDefault(); onsubmit(value); onclose(); }}> + {#if text}

    {text}

    {/if} + {#if input !== 'none'} + + + + {/if} +
    + {#snippet footer()} + + + {/snippet} +
    + + diff --git a/src/ui/QuickAudio.svelte b/src/ui/QuickAudio.svelte new file mode 100644 index 0000000..34b5906 --- /dev/null +++ b/src/ui/QuickAudio.svelte @@ -0,0 +1,77 @@ + + + { if (e.key === 'Escape') close(); }} onresize={close} /> + + + + + diff --git a/src/ui/RichEditor.svelte b/src/ui/RichEditor.svelte new file mode 100644 index 0000000..e63f83c --- /dev/null +++ b/src/ui/RichEditor.svelte @@ -0,0 +1,166 @@ + + +
    + + +
    + {#if source} + + {/if} + +
    + {#if error}{error}{/if} + + {formatBytes(source ? sourceText.length : size)}{limit ? ` / ${formatBytes(limit)}` : ''} +
    +
    + + diff --git a/src/ui/RightPanel.svelte b/src/ui/RightPanel.svelte new file mode 100644 index 0000000..1cb7d42 --- /dev/null +++ b/src/ui/RightPanel.svelte @@ -0,0 +1,239 @@ + + + setWidth(width)} /> + + + + diff --git a/src/ui/ServerRail.svelte b/src/ui/ServerRail.svelte new file mode 100644 index 0000000..40dc2b0 --- /dev/null +++ b/src/ui/ServerRail.svelte @@ -0,0 +1,127 @@ + + + + + diff --git a/src/ui/SettingsDialog.svelte b/src/ui/SettingsDialog.svelte new file mode 100644 index 0000000..9279113 --- /dev/null +++ b/src/ui/SettingsDialog.svelte @@ -0,0 +1,105 @@ + + + { saveFiles(); onclose(); }} width={640}> +
    + {#each tabs as t (t.id)} + + {/each} +
    + + {#if tab === 'voice'} + + {:else if tab === 'files'} +

    Files go to a f0ckm instance and are posted as links. Other mumh5 users see them inline; regular Mumble users get a link and a small preview. Without an upload host you can still send images, inline and scaled to the server's limit.

    + + + + +
    +
    + + +
    + +
    + {#if testResult}

    {testResult}

    {/if} + + +

    Embeds

    + + +

    Links from other hosts stay plain links, so opening a chat never contacts servers you did not choose.

    + + + {:else} +

    Servers recognize you by your certificate. The default is used unless a server is set to another one.

    + + {/if} + + {#snippet footer()} + + {/snippet} +
    + + diff --git a/src/ui/Sidebar.svelte b/src/ui/Sidebar.svelte new file mode 100644 index 0000000..d4a58ee --- /dev/null +++ b/src/ui/Sidebar.svelte @@ -0,0 +1,144 @@ + + + + + diff --git a/src/ui/UserInfoDialog.svelte b/src/ui/UserInfoDialog.svelte new file mode 100644 index 0000000..e33444a --- /dev/null +++ b/src/ui/UserInfoDialog.svelte @@ -0,0 +1,149 @@ + + + + {#if !stats} +

    Asking the server...

    + {:else} +

    Connection

    +
    +
    Online for
    {duration(stats.onlinesecs)}
    + {#if stats.idlesecs != null}
    Idle for
    {duration(stats.idlesecs)}
    {/if} +
    Ping (TCP)
    {ping(stats.tcp_ping_avg, stats.tcp_ping_var)}
    +
    Ping (UDP)
    {stats.udp_packets ? ping(stats.udp_ping_avg, stats.udp_ping_var) : 'not using UDP (voice over TCP)'}
    +
    Packets
    {stats.tcp_packets ?? 0} TCP, {stats.udp_packets ?? 0} UDP
    + {#if stats.bandwidth != null}
    Bandwidth
    {formatBytes(stats.bandwidth)}/s
    {/if} + {#if stats.address?.length}
    Address
    {address(stats.address)}
    {/if} +
    + + {#if stats.version} +

    Client

    +
    +
    Version
    {version || 'unknown'}
    + {#if stats.version.os}
    System
    {stats.version.os} {stats.version.os_version ?? ''}
    {/if} +
    Opus
    {stats.opus ? 'supported' : 'no (legacy codecs only)'}
    +
    + {/if} + + {#if stats.from_client || stats.from_server} +

    Voice packets

    + + + + + + +
    GoodLateLostResyncLoss
    From client{stats.from_client?.good ?? 0}{stats.from_client?.late ?? 0}{stats.from_client?.lost ?? 0}{stats.from_client?.resync ?? 0}{loss(stats.from_client)}
    To client{stats.from_server?.good ?? 0}{stats.from_server?.late ?? 0}{stats.from_server?.lost ?? 0}{stats.from_server?.resync ?? 0}{loss(stats.from_server)}
    +

    Counted on the encrypted UDP channel; clients sending voice over TCP show zeros.

    + {/if} + + {#if stats.certificates?.length} +

    Certificate

    +
    +
    Subject
    {certs[0]?.subject.replace(/\n/g, ', ') ?? '...'}
    +
    Verified
    {stats.strong_certificate ? 'yes, signed by a trusted authority' : 'no, self-signed'}
    +
    + {#if certs.length} + + {/if} + {:else if user?.hash} +

    Certificate

    +
    SHA-1
    {user.hash}
    +

    Only admins and the user themselves can see the full certificate.

    + {/if} + + {#if !stats.version} +

    Client details, address and certificate are only shown to admins and to the user themselves.

    + {/if} + {/if} + + {#snippet footer()} + {#if updated}Updates every 5 seconds{/if} + + {/snippet} +
    + + diff --git a/src/ui/VoiceSettings.svelte b/src/ui/VoiceSettings.svelte new file mode 100644 index 0000000..19c159e --- /dev/null +++ b/src/ui/VoiceSettings.svelte @@ -0,0 +1,173 @@ + + + + +
    + {#if voice.error}

    {voice.error}

    {/if} + +

    Devices

    +
    +
    + + +
    +
    + + +
    +
    + +

    Transmit

    +
    + {#each modes as m (m.id)} + + {/each} +
    + + {#if s.mode === 'ptt'} + +
    + + {voice.pttDown ? 'Talking' : 'Hold the key to talk'} +
    +

    Works while mumh5 is focused. System-wide push to talk is planned.

    + {/if} + + + + {#if s.mode === 'vad'} + voice.update({ vadThreshold: Number(e.currentTarget.value) })} aria-label="Voice activity threshold" /> +

    Speak normally and put the marker just below your voice; the bar turns green when you would be sending. Threshold {s.vadThreshold} dB.

    + + voice.update({ vadHoldMs: Number(e.currentTarget.value) })} /> + {/if} + +
    +
    + + voice.update({ inputGain: Number(e.currentTarget.value) })} /> +
    +
    + + voice.update({ outputVolume: Number(e.currentTarget.value) })} /> +
    +
    + +
    + + {voice.testing ? 'You should hear yourself. Use headphones to avoid feedback.' : 'Plays your microphone back to you'} +
    + +

    Processing

    + + + + +

    Quality

    +
    +
    + + voice.update({ bitrate: Number(e.currentTarget.value) })} /> + {#if voice.effectiveBitrate && voice.effectiveBitrate < s.bitrate && session.status === 'connected'} +

    Limited to {Math.round(voice.effectiveBitrate / 1000)} kbit/s by this server

    + {/if} +
    +
    + + +
    +
    + + voice.update({ jitterMs: Number(e.currentTarget.value) })} /> +

    Higher values smooth out bad connections at the cost of delay.

    + + {#if session.status === 'connected'} +

    Statistics

    +

    Sent {voice.stats.sent} packets, received {voice.stats.received}, decoded {voice.stats.decoded}, gaps {voice.stats.lost}. Transport: TCP tunnel.

    + {/if} +
    + + diff --git a/src/ui/YouTubeEmbed.svelte b/src/ui/YouTubeEmbed.svelte new file mode 100644 index 0000000..c0f4acb --- /dev/null +++ b/src/ui/YouTubeEmbed.svelte @@ -0,0 +1,42 @@ + + +
    + {#if playing} + + {:else} + + {/if} + +
    + + diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..36c98fd --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,3 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +export default { preprocess: vitePreprocess() }; diff --git a/test/e2e/app.e2e.ts b/test/e2e/app.e2e.ts new file mode 100644 index 0000000..86235d1 --- /dev/null +++ b/test/e2e/app.e2e.ts @@ -0,0 +1,561 @@ +// Drives the built Electron app against a real Mumble server, with a headless second client. +// npm run build && MUMBLE_TEST_HOST=localhost:64739 npm run test:e2e +// Optional: UPLOAD_HOST + UPLOAD_KEY to also test file sharing, SHOTS_DIR to save screenshots. +import { _electron as electron } from 'playwright-core'; +import electronPath from 'electron'; +import assert from 'node:assert/strict'; +import { mkdtempSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import zlib from 'node:zlib'; +import { createCodec } from '../../src/core/proto.ts'; +import { encodeVoice, decodeVoice, type VoicePacket } from '../../src/core/voice-packet.ts'; +import { MumbleClient } from '../../src/core/client.ts'; +import type { Transport } from '../../src/core/transport.ts'; +import { openTls } from '../../electron/tls-transport.ts'; +import { generateIdentity } from '../../electron/identity.ts'; + +const target = process.env.MUMBLE_TEST_HOST; +if (!target) { + console.log('MUMBLE_TEST_HOST not set, skipping'); + process.exit(0); +} +const [host, port] = target.split(':'); +const shots = process.env.SHOTS_DIR; +const root = path.resolve(import.meta.dirname, '../..'); + +function headless(username: string, password = ''): Promise { + const codec = createCodec(); + const id = generateIdentity(username); + const client = new MumbleClient(codec); + const t: Transport = { onData: null, onClose: null, send: b => conn.send(b), close: () => conn.close() }; + const conn = openTls(host, Number(port), id.certPem, id.keyPem, { + onSecure: () => {}, onData: c => t.onData?.(c), onClose: r => t.onClose?.(r) + }); + client.connect(t, { username, password, os: 'test' }); + return new Promise((res, rej) => { client.on('synced', () => res(client)); client.on('close', rej); }); +} + +// Noisy PNG, no image library needed. Noise keeps the JPEG preview big enough (over the +// server's 5000-char text limit) to exercise Murmur's XML check on image messages. +function testPng(w = 400, h = 300): Buffer { + const raw = Buffer.alloc((w * 3 + 1) * h); + for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) { + raw.set([(x * 7 + Math.random() * 90) & 255, (y * 5 + Math.random() * 90) & 255, Math.random() * 255], y * (w * 3 + 1) + 1 + x * 3); + } + const chunk = (type: string, data: Buffer) => { + const len = Buffer.alloc(4); len.writeUInt32BE(data.length); + const td = Buffer.concat([Buffer.from(type), data]); + const crc = Buffer.alloc(4); crc.writeUInt32BE(zlib.crc32(td)); + return Buffer.concat([len, td, crc]); + }; + const ihdr = Buffer.alloc(13); ihdr.writeUInt32BE(w, 0); ihdr.writeUInt32BE(h, 4); ihdr.set([8, 2, 0, 0, 0], 8); + return Buffer.concat([Buffer.from('89504e470d0a1a0a', 'hex'), chunk('IHDR', ihdr), chunk('IDAT', zlib.deflateSync(raw)), chunk('IEND', Buffer.alloc(0))]); +} + +// Fails with a label instead of hanging when an expected event never comes +function within(p: Promise, label: string, ms = 10000): Promise { + return Promise.race([p, new Promise((_, rej) => setTimeout(() => rej(new Error(`Timed out waiting for: ${label}`)), ms))]); +} + +const { ELECTRON_RUN_AS_NODE, ...env } = process.env; +const userData = mkdtempSync(path.join(tmpdir(), 'mumh5-e2e-')); +const app = await electron.launch({ + executablePath: electronPath as unknown as string, + // Stay on $DISPLAY (e.g. Xvfb); Electron would otherwise pick the Wayland session automatically + // Fake microphone (a beeping tone) and auto-granted permission for the voice tests + args: [root, `--user-data-dir=${userData}`, '--ozone-platform=x11', '--use-fake-device-for-media-stream', '--use-fake-ui-for-media-stream'], + env: env as Record +}); +const bob = await headless('bob'); +// SuperUser can create channels; needs MUMBLE_SUPERUSER_PASSWORD on the test server +const admin = process.env.MUMBLE_SUPERUSER_PASSWORD ? await headless('SuperUser', process.env.MUMBLE_SUPERUSER_PASSWORD) : null; +try { + const page = await app.firstWindow(); + page.on('console', m => { if (m.type() === 'error') console.log('[renderer]', m.text()); }); + await page.setViewportSize({ width: 1280, height: 800 }); + + // First start: identity setup wizard + await page.getByRole('dialog', { name: 'Set up your identity' }).waitFor(); + await page.getByRole('button', { name: /Create a new identity/ }).click(); + await page.getByLabel('Name').fill('alice'); + await page.getByRole('button', { name: 'Create', exact: true }).click(); + await page.getByRole('button', { name: 'Skip for now' }).click(); + await page.getByRole('button', { name: 'Done' }).click(); + await page.getByRole('dialog', { name: 'Set up your identity' }).waitFor({ state: 'detached' }); + console.log('ok: identity wizard creates an identity'); + + // Settings: upload host + key + if (process.env.UPLOAD_HOST && process.env.UPLOAD_KEY) { + await page.getByTitle('Settings').click(); + await page.getByRole('tab', { name: 'Chat and files' }).click(); + await page.getByLabel('Upload host').fill(process.env.UPLOAD_HOST); + await page.getByLabel('Upload key').fill(process.env.UPLOAD_KEY); + await page.getByRole('button', { name: 'Test key' }).click(); + await page.getByText(/^Key works\./).waitFor(); + await page.getByRole('button', { name: 'Done', exact: true }).click(); + } + + // Add and connect to the server + await page.getByTitle('Add a server').click(); + await page.getByLabel('Address').fill(host); + await page.getByLabel('Port').fill(port); + await page.getByLabel('Username').fill('alice'); + await page.getByLabel('Label').fill('Test Server'); + await page.getByRole('button', { name: 'Save and connect' }).click(); + await page.getByText(/Connected/).first().waitFor(); + console.log('ok: connected'); + + // Bob is listed in the channel tree + await page.locator('.sidebar').getByText('bob').waitFor(); + console.log('ok: sees bob'); + + // ─── Voice ─────────────────────────────────────────────────────────────── + const aliceSession = () => [...bob.users.values()].find(u => u.name === 'alice')!.session; + const collect = (n: number, stopOnLast = false) => new Promise(res => { + const got: VoicePacket[] = []; + const off = bob.on('voice', raw => { + const p = decodeVoice(raw); + if (!p || p.session !== aliceSession()) return; + got.push(p); + if (got.length >= n || (stopOnLast && p.last)) { off(); res(got); } + }); + }); + const setMode = async (label: string) => { + await page.getByTitle('Settings').click(); + await page.getByRole('radio', { name: new RegExp(label) }).click(); + await page.getByRole('button', { name: 'Done', exact: true }).click(); + }; + + // Always on: a steady stream of 20 ms Opus packets + const stream = collect(25); + await setMode('Always on'); + const packets = await within(stream, 'voice packets from the app'); + assert.ok(packets.every(p => p.opus.length > 0 && !p.last)); + const steps = packets.slice(1).map((p, i) => p.frame - packets[i].frame); + assert.ok(steps.every(d => d === 2), `sequence advances 2 frames per 20 ms packet: ${steps.join(',')}`); + console.log(`ok: app sends Opus voice (${packets[0].opus.length} bytes per packet)`); + + // Echo alice's own audio back as bob: the app decodes it and shows bob speaking + const echo = packets.map((p, i) => encodeVoice({ target: 0, frame: i * 2, opus: p.opus, last: i === packets.length - 1 }, bob.protobufVoice)); + const bobRow = page.locator('.sidebar .user', { hasText: 'bob' }); + const pump = setInterval(() => { const pk = echo.shift(); if (pk) bob.sendVoiceTunnel(pk); }, 20); + await bobRow.locator('.avatar.speaking').waitFor({ timeout: 3000 }); + console.log('ok: incoming voice decoded, speaker highlighted'); + await bobRow.locator('.avatar.speaking').waitFor({ state: 'detached', timeout: 3000 }); + clearInterval(pump); + console.log('ok: speaking indicator clears after the terminator'); + + // Push to talk: silent until the key is held, terminator on release + const ended = collect(1000, true); + await setMode('Push to talk'); + const tail = await within(ended, 'terminator after leaving always-on'); + assert.equal(tail.at(-1)!.last, true); + let leaked = 0; + const offLeak = bob.on('voice', raw => { if (decodeVoice(raw)?.session === aliceSession()) leaked++; }); + await page.waitForTimeout(400); + offLeak(); + assert.equal(leaked, 0, 'no voice while the push-to-talk key is up'); + await page.locator('.chat h1').click(); + const ptt = collect(1000, true); + await page.keyboard.down('Backquote'); + await page.waitForTimeout(300); + await page.keyboard.up('Backquote'); + const burst = await within(ptt, 'push-to-talk burst'); + assert.ok(burst.length >= 8 && burst.length <= 30, `about 300 ms of audio (${burst.length} packets)`); + assert.equal(burst.at(-1)!.last, true); + console.log(`ok: push to talk (${burst.length} packets, ends with terminator)`); + + // Voice activity with the fake beeping microphone: transmits in bursts + await setMode('Voice activity'); + const vad = await within(collect(10), 'voice activity packets', 8000); + assert.ok(vad.length === 10); + const biggest = Math.max(...vad.map(p => p.opus.length)); + assert.ok(biggest > 40, `packets during the tone carry real audio (largest ${biggest} bytes)`); + console.log(`ok: voice activity detection transmits on the tone (up to ${biggest} bytes per packet)`); + + // The app's own statistics confirm it decoded the echoed audio + await page.getByTitle('Settings').click(); + const statsText = await page.locator('.stats').textContent(); + const decoded = Number(/decoded (\d+)/.exec(statsText ?? '')?.[1]); + assert.ok(decoded >= 20, `decoded frames reported: ${statsText}`); + await page.getByRole('button', { name: 'Done', exact: true }).click(); + console.log(`ok: ${decoded} frames decoded`); + await setMode('Push to talk'); + await page.waitForTimeout(300); + + // Alice -> channel + const gotText = new Promise(res => bob.on('text', m => res(m.html))); + await page.getByLabel('Message').fill('hello alice\nsecond line https://example.com/x'); + await page.getByLabel('Message').press('Enter'); + const html = await within(gotText, 'channel text'); + assert.equal(html, 'hello <from> alice
    second line https://example.com/x'); + console.log('ok: bob received channel text'); + + // Bob -> channel, rendered sanitized + bob.sendText({ channels: [0] }, 'hi alice bold'); + await page.locator('.msg', { hasText: 'hi alice' }).waitFor(); + assert.equal(await page.evaluate(() => (window as any).pwned), undefined); + assert.equal(await page.locator('.msg b', { hasText: 'bold' }).count(), 1); + assert.equal(await page.locator('img[src^="https://evil"]').count(), 0); + console.log('ok: incoming text rendered and sanitized'); + + // YouTube links become a click-to-play card; nothing loads from YouTube before the click + bob.sendText({ channels: [0] }, 'watch https://youtu.be/dQw4w9WgXcQ?t=1m30s'); + const card = page.locator('.msg', { hasText: 'watch' }).locator('.yt'); + await card.getByText('from 1:30, click to play').waitFor(); + assert.equal(await card.locator('iframe').count(), 0); + assert.equal(await card.locator('.facade').evaluate(el => getComputedStyle(el).backgroundImage), 'none', 'no thumbnail request by default'); + await card.locator('.facade').click(); + assert.equal(await card.locator('iframe').getAttribute('src'), 'https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ?autoplay=1&rel=0&start=90'); + console.log('ok: YouTube link embedded as click-to-play'); + + // Bob -> DM + const alice = [...bob.users.values()].find(u => u.name === 'alice')!; + bob.sendText({ users: [alice.session] }, 'psst'); + await page.locator('.sidebar').getByText('Direct messages').waitFor(); + await page.locator('.dm', { hasText: 'bob' }).click(); + await page.locator('.msg', { hasText: 'psst' }).waitFor(); + console.log('ok: direct message shown in its own view'); + await page.locator('.channel .name').first().dblclick(); + + // Mute toggles propagate + const muted = new Promise(res => bob.on('user', (u, changed) => { if (u.name === 'alice' && changed.includes('selfMute')) res(u.selfMute); })); + await page.locator('.me').getByRole('button', { name: 'Mute', exact: true }).click(); + assert.equal(await within(muted, 'mute state'), true); + await page.locator('.me').getByRole('button', { name: 'Unmute', exact: true }).waitFor(); + + // Right-click on mute / deafen opens quick audio options + await page.locator('.me').getByRole('button', { name: 'Unmute', exact: true }).click({ button: 'right' }); + const micPop = page.getByRole('dialog', { name: 'Microphone' }); + await micPop.getByLabel('Microphone').waitFor(); + await micPop.getByRole('radio', { name: 'Always on' }).waitFor(); + await micPop.getByLabel(/Input volume/).fill('1.5'); + await micPop.getByText('Input volume: 150%').waitFor(); + await page.keyboard.press('Escape'); + await micPop.waitFor({ state: 'detached' }); + await page.locator('.me').getByRole('button', { name: 'Deafen', exact: true }).click({ button: 'right' }); + const outPop = page.getByRole('dialog', { name: 'Output' }); + await outPop.getByLabel('Output device').waitFor(); + await outPop.getByRole('button', { name: 'Voice settings...' }).click(); + await page.getByRole('tab', { name: 'Voice', selected: true }).waitFor(); + await page.getByText('Microphone volume: 150%').waitFor(); + await page.getByRole('button', { name: 'Done', exact: true }).click(); + console.log('ok: quick audio options on right-click'); + + // Tray icon mirrors the voice state; its menu acts on it + const trayState = () => app.evaluate(() => (globalThis as any).__mumh5Tray && { + tooltip: (globalThis as any).__mumh5Tray.tooltip, items: (globalThis as any).__mumh5Tray.items, icon: (globalThis as any).__mumh5Tray.state.icon + }); + const trayUntil = async (label: string, pred: (t: any) => boolean) => { + for (let i = 0; i < 50; i++) { const t = await trayState(); if (t && pred(t)) return t; await page.waitForTimeout(100); } + throw new Error(`Tray never reached: ${label} (${JSON.stringify(await trayState())})`); + }; + const tMuted = await trayUntil('muted', t => /muted on Test Server/.test(t.tooltip)); + assert.equal(tMuted.icon, 'data:image/png;base64,'); + assert.equal(tMuted.items.find((i: any) => i.label === 'Mute').checked, true); + await app.evaluate(() => (globalThis as any).__mumh5Tray.click('Mute')); + await within(new Promise(res => bob.on('user', (u, ch) => { if (u.name === 'alice' && ch.includes('selfMute') && !u.selfMute) res(); })), 'unmuted from the tray'); + await trayUntil('connected', t => /connected on Test Server/.test(t.tooltip) && !t.items.find((i: any) => i.label === 'Mute').checked); + await app.evaluate(() => (globalThis as any).__mumh5Tray.click('Mute')); + await trayUntil('muted again', t => /muted/.test(t.tooltip)); + console.log('ok: tray icon follows voice state and its menu mutes'); + await page.locator('.channel + .users, .users').getByTitle('Muted', { exact: true }).first().waitFor(); + console.log('ok: self mute propagated and shown'); + + if (process.env.UPLOAD_HOST) { + const png = path.join(userData, 'gradient.png'); + writeFileSync(png, testPng()); + const gotUpload = new Promise(res => bob.on('text', m => res(m.html))); + await page.locator('.chat .composer input[type=file]').setInputFiles(png); + const up = await within(gotUpload, 'upload message'); + assert.match(up, /gradient\.png<\/a>/); + assert.match(up, /$/); + assert.ok(up.length > 5000, `preview should exceed the text limit (${up.length})`); + await page.locator('.embed img').waitFor(); + await page.waitForFunction(() => (document.querySelector('.embed img') as HTMLImageElement)?.naturalWidth === 400); + console.log('ok: upload posted with vanilla thumbnail, embed loads for mumh5'); + + // Types the upload host does not allow are refused before uploading + const txt = path.join(userData, 'notes.txt'); + writeFileSync(txt, 'plain text'); + let leaked = false; + const off = bob.on('text', () => { leaked = true; }); + await page.locator('.chat .composer input[type=file]').setInputFiles(txt); + await page.getByText('notes.txt: file type not allowed on this upload host').waitFor(); + await page.waitForTimeout(500); + off(); + assert.equal(leaked, false); + console.log('ok: disallowed file type refused'); + } + + // Server certificate viewer from the header (the Docker server is self-signed, so no green header) + assert.equal(await page.locator('.sidebar header.trusted').count(), 0); + await page.locator('.sidebar header .title').click(); + await page.getByRole('dialog', { name: /Certificate of/ }).getByText('self-signed').waitFor(); + await page.getByRole('button', { name: 'Close', exact: true }).last().click(); + console.log('ok: server certificate viewer'); + + // Own description: rich text with a picture, as Mumble-compatible XHTML + await page.locator('.me .profile').click(); + await page.getByRole('button', { name: 'Edit description' }).click(); + const area = page.locator('.rich .area'); + await area.click(); + await page.keyboard.type('I test things '); + await page.keyboard.press('Control+b'); + await page.keyboard.type('bold'); + await page.keyboard.press('Control+b'); + await page.keyboard.press('Enter'); + await page.keyboard.type('second line'); + const pic = path.join(userData, 'avatar.png'); + writeFileSync(pic, testPng(300, 200)); + await page.locator('.rich input[type=file]').setInputFiles(pic); + await area.locator('img').waitFor(); + const aliceId = [...bob.users.values()].find(u => u.name === 'alice')!.session; + const commented = new Promise(res => bob.on('user', (u, changed) => { + if (u.session !== aliceId) return; + if (changed.includes('comment') && u.comment) res(u.comment); + // Long comments are announced by hash only; fetch the text + else if (changed.includes('commentHash')) bob.requestBlob({ comments: [aliceId] }); + })); + await page.getByRole('button', { name: 'Save', exact: true }).click(); + const comment = await within(commented, 'comment update'); + assert.match(comment, /^

    I test things bold<\/span><\/p>

    second line<\/p>$/); + assert.ok(comment.length > 5000, 'long enough that the server ran its XML check and accepted it'); + await page.locator('.panel .html img').waitFor(); + console.log('ok: own description edited'); + + // Other user's profile and context menu + await page.locator('.sidebar .user', { hasText: 'bob' }).click({ button: 'right' }); + for (const item of ['View profile', 'Send message', 'Server mute', 'Kick...', 'Ban...']) { + await page.getByRole('menuitem', { name: item }).waitFor(); + } + await page.getByRole('menuitem', { name: 'View profile' }).click(); + await page.locator('.panel h3', { hasText: 'bob' }).waitFor(); + console.log('ok: user context menu and profile'); + + // Information: own connection shows client details and the full certificate + await page.locator('.sidebar .user.self').click({ button: 'right' }); + await page.getByRole('menuitem', { name: 'Information' }).click(); + const info = page.getByRole('dialog', { name: /^Information: alice/ }); + await info.getByText('mumh5 0.1.0').waitFor(); + await info.getByText('linux', { exact: false }).first().waitFor(); + await info.getByText('Online for').waitFor(); + await info.getByRole('button', { name: 'View certificate' }).click(); + await page.getByRole('dialog', { name: /^Certificate of alice/ }).getByText('alice', { exact: true }).first().waitFor(); + await page.getByRole('dialog', { name: /^Certificate of alice/ }).getByRole('button', { name: 'Close', exact: true }).last().click(); + await info.getByRole('button', { name: 'Close', exact: true }).last().click(); + console.log('ok: own connection information with certificate chain'); + + // Someone else as a normal user: times and pings, details withheld by the server + await page.locator('.sidebar .user', { hasText: 'bob' }).click({ button: 'right' }); + await page.getByRole('menuitem', { name: 'Information' }).click(); + const bobInfo = page.getByRole('dialog', { name: 'Information: bob' }); + await bobInfo.getByText('Ping (TCP)').waitFor(); + await bobInfo.getByText('only shown to admins', { exact: false }).first().waitFor(); + assert.equal(await bobInfo.getByText('mumh5 0.1.0').count(), 0); + await bobInfo.getByRole('button', { name: 'Close', exact: true }).last().click(); + console.log('ok: other user information respects server permissions'); + + if (admin) { + // Remove channels left over from an earlier run (the server refuses duplicate names) + for (const c of [...admin.channels.values()]) { + if (c.id !== 0 && c.parent === 0) admin.send('ChannelRemove', { channel_id: c.id }); + } + await new Promise(r => setTimeout(r, 300)); + + // Channels: a long description (only sent as a hash), and a nested pair + const longDesc = 'Welcome to the lobby. ' + 'This description is long enough that the server only announces its hash. '.repeat(3); + const created = new Promise(res => { + let n = 0; + admin.on('channel', c => { if (['Lobby', 'Games', 'Minecraft'].includes(c.name) && ++n === 3) res(); }); + }); + admin.send('ChannelState', { parent: 0, name: 'Lobby', description: longDesc }); + admin.send('ChannelState', { parent: 0, name: 'Games' }); + await new Promise(r => setTimeout(r, 300)); + const games = [...admin.channels.values()].find(c => c.name === 'Games')!; + admin.send('ChannelState', { parent: games.id, name: 'Minecraft' }); + await within(created, 'channels created'); + + await page.locator('.channel', { hasText: 'Games' }).waitFor(); + assert.equal(await page.locator('.channel', { hasText: 'Minecraft' }).count(), 0, 'empty subchannels start collapsed'); + console.log('ok: channels collapsed by default'); + + // Single click previews the description (fetched on demand), without joining + await page.locator('.channel .name', { hasText: 'Lobby' }).click(); + await page.locator('.panel .html', { hasText: 'Welcome to the lobby' }).waitFor(); + assert.equal(await page.locator('.me .who span').textContent(), 'Root'); + console.log('ok: single click shows description without joining'); + + // Side chat sends to that channel while staying in Root + const lobby = [...bob.channels.values()].find(c => c.name === 'Lobby')!; + await page.locator('.panel [role=tab]', { hasText: 'Chat' }).click(); + // Channel messages only reach people in that channel, so listen from inside Lobby + admin.joinChannel(lobby.id); + await new Promise(r => setTimeout(r, 300)); + const sideMsg = new Promise(res => admin.on('text', m => { if (m.html === 'side hello') res(m.channels); })); + await page.locator('.panel textarea').fill('side hello'); + await page.locator('.panel textarea').press('Enter'); + assert.deepEqual(await within(sideMsg, 'side chat message'), [lobby.id]); + await page.locator('.panel .msg', { hasText: 'side hello' }).waitFor(); + assert.equal(await page.locator('.chat .msg', { hasText: 'side hello' }).count(), 0); + console.log('ok: side chat sends to the previewed channel'); + + // Double click joins; the joined channel opens up + await page.locator('.channel .name', { hasText: 'Games' }).dblclick(); + await page.locator('.me .who span', { hasText: 'Games' }).waitFor(); + await page.locator('.channel', { hasText: 'Minecraft' }).waitFor(); + console.log('ok: double click joins and expands'); + + // Channel context menu + await page.locator('.channel .name', { hasText: 'Lobby' }).click({ button: 'right' }); + await page.getByRole('menuitem', { name: 'Join channel' }).click(); + await page.locator('.me .who span', { hasText: 'Lobby' }).waitFor(); + console.log('ok: channel context menu joins'); + + // Side panel can be resized by dragging its left edge + const panelBox = (await page.locator('aside.panel').boundingBox())!; + const handle = (await page.locator('aside.panel .resize').boundingBox())!; + await page.mouse.move(handle.x + 4, handle.y + 200); + await page.mouse.down(); + await page.mouse.move(handle.x - 150, handle.y + 200, { steps: 5 }); + await page.mouse.up(); + const grown = (await page.locator('aside.panel').boundingBox())!; + assert.ok(Math.abs(grown.width - (panelBox.width + 154)) < 6, `panel resized ${panelBox.width} -> ${grown.width}`); + console.log('ok: side panel resizable'); + } + + // Without an upload host, images are sent inline within Mumble's image limit + await page.locator('.channel .name', { hasText: 'Root' }).dblclick(); + await page.locator('.me .who span', { hasText: 'Root' }).waitFor(); + await page.getByTitle('Settings').click(); + await page.getByRole('tab', { name: 'Chat and files' }).click(); + await page.getByLabel('Upload host').fill(''); + await page.getByRole('button', { name: 'Done', exact: true }).click(); + const big = path.join(userData, 'big.png'); + writeFileSync(big, testPng(1600, 1200)); + const gotInline = new Promise(res => bob.on('text', m => { if (m.html.startsWith('$/); + assert.ok(inline.length <= 131072, `inline image within the server limit (${inline.length})`); + console.log(`ok: inline image without upload host (${inline.length} chars)`); + + // ─── Several servers at once ───────────────────────────────────────────── + const userState = (name: string) => [...bob.users.values()].find(u => u.name === name); + const until2 = (label: string, cond: () => boolean) => within(new Promise(res => { + if (cond()) return res(); + const off = bob.on('user', () => { if (cond()) { off(); res(); } }); + }), label); + + await page.getByTitle('Add a server').click(); + await page.getByLabel('Address').fill(host); + await page.getByLabel('Port').fill(port); + await page.getByLabel('Username').fill('alice-b'); + await page.getByLabel('Label').fill('Second'); + await page.getByRole('button', { name: 'Save and connect' }).click(); + await page.locator('.rail .tile.live').nth(1).waitFor(); + assert.equal(await page.locator('.rail .tile.live').count(), 2, 'both servers connected'); + await until2('background server shows deafened', () => !!userState('alice-b')?.selfDeaf); + assert.equal(await page.locator('.rail .tile.voice').getAttribute('title').then(t => t?.startsWith('Test Server')), true); + await page.getByText('Voice is on Test Server').waitFor(); + console.log('ok: second server connected, deafened in the background'); + + // Joining a channel on the second server moves voice there + await page.locator('.channel .name', { hasText: 'Root' }).dblclick(); + await until2('voice moved to the second server', () => !userState('alice-b')?.selfDeaf && !!userState('alice')?.selfDeaf); + assert.equal(await page.locator('.rail .tile.voice').getAttribute('title').then(t => t?.startsWith('Second')), true); + console.log('ok: voice follows the channel you join'); + + // Messages on the server not on screen show as unread on its tile + bob.sendText({ channels: [0] }, 'ping both'); + await page.locator('.rail .tile[title^="Test Server"] .unread').waitFor(); + console.log('ok: unread badge on the background server'); + + // Reorder by dragging Second above Test Server + await page.locator('.rail .tile[title^="Second"]').dragTo(page.locator('.rail .tile[title^="Test Server"]'), { targetPosition: { x: 22, y: 4 } }); + assert.match(await page.locator('.rail .tile').first().getAttribute('title') ?? '', /^Second/); + console.log('ok: servers reordered by drag and drop'); + + // Custom icon from the tile's context menu: square-cropped and shown instead of initials + const iconFile = path.join(userData, 'icon.png'); + writeFileSync(iconFile, testPng(300, 200)); + await page.locator('.rail .tile[title^="Second"]').click({ button: 'right' }); + const chooser = page.waitForEvent('filechooser'); + await page.getByRole('menuitem', { name: 'Change icon...' }).click(); + await (await chooser).setFiles(iconFile); + const icon = page.locator('.rail .tile[title^="Second"] img.icon'); + await icon.waitFor(); + assert.deepEqual(await icon.evaluate((i: HTMLImageElement) => [i.naturalWidth, i.naturalHeight, i.src.slice(0, 15)]), [128, 128, 'data:image/webp']); + console.log('ok: custom server icon'); + + // Disconnecting the voice server hands voice back and restores the earlier state + await page.locator('.rail .tile[title^="Second"]').click({ button: 'right' }); + await page.getByRole('menuitem', { name: 'Disconnect' }).click(); + await until2('voice back on the first server', () => !userState('alice-b') && !userState('alice')?.selfDeaf); + assert.equal(userState('alice')?.selfMute, true, 'earlier self-mute kept'); + await page.locator('.rail .tile[title^="Test Server"]').click(); + await page.locator('.rail .tile[title^="Test Server"] .unread').waitFor({ state: 'detached' }); + console.log('ok: voice returns when the other server disconnects'); + + // Change name: Mumble needs a reconnect, the app does it and remembers the name. + // Unique per run: a reused test server may still have an earlier run's name registered. + const newName = `alice${Date.now() % 100000}`; + await page.locator('.me .profile').click(); + await page.getByRole('button', { name: 'Change name' }).click(); + await page.getByLabel('New name').fill(newName); + await page.getByRole('button', { name: 'Reconnect with this name' }).click(); + await page.locator('.me .who strong', { hasText: newName }).waitFor(); + await within(new Promise(res => { + if ([...bob.users.values()].some(u => u.name === newName)) return res(); + bob.on('user', u => { if (u.name === newName) res(); }); + }), 'bob sees the new name'); + console.log('ok: name changed by reconnecting'); + + // Self-registration: guest badge becomes registered + await page.locator('.me .profile').click(); + await page.locator('.panel .badge-reg', { hasText: 'Guest' }).waitFor(); + await page.locator('.panel .register').click(); + await page.locator('.panel .badge-reg.registered', { hasText: 'Registered' }).waitFor(); + await page.locator('.sidebar .user', { hasText: newName }).locator('.reg').waitFor(); + console.log('ok: registered on the server'); + + if (shots) { + await page.waitForTimeout(300); + for (const [name, w, h] of [['wide', 1280, 800], ['medium', 900, 700], ['narrow', 400, 780]] as const) { + await page.setViewportSize({ width: w, height: h }); + await page.waitForTimeout(200); + await page.screenshot({ path: path.join(shots, `${name}.png`) }); + } + await page.setViewportSize({ width: 1280, height: 900 }); + await page.locator('.me').getByRole('button', { name: /^(Mute|Unmute)$/ }).click({ button: 'right' }); + await page.waitForTimeout(300); + await page.screenshot({ path: path.join(shots, 'quick-audio.png') }); + await page.keyboard.press('Escape'); + await page.locator('.me .profile').click(); + await page.getByRole('button', { name: 'Edit description' }).click(); + await page.waitForTimeout(300); + await page.screenshot({ path: path.join(shots, 'editor.png') }); + await page.getByRole('button', { name: 'Cancel' }).click(); + await page.getByTitle('Settings').click(); + await page.waitForTimeout(600); + await page.screenshot({ path: path.join(shots, 'settings-voice.png') }); + await page.getByRole('button', { name: 'Done', exact: true }).click(); + await page.locator('.sidebar .user', { hasText: 'bob' }).click(); + await page.waitForTimeout(400); + await page.screenshot({ path: path.join(shots, 'profile.png') }); + await page.setViewportSize({ width: 400, height: 780 }); + await page.waitForTimeout(200); + await page.getByLabel('Open channels').click(); + await page.waitForTimeout(200); + await page.screenshot({ path: path.join(shots, 'narrow-drawer.png') }); + } + console.log('E2E PASSED'); +} catch (e) { + if (shots) await (await app.firstWindow()).screenshot({ path: path.join(shots, 'failure.png') }); + throw e; +} finally { + bob.disconnect(); + admin?.disconnect(); + await app.close(); +} diff --git a/test/e2e/screenshots.ts b/test/e2e/screenshots.ts new file mode 100644 index 0000000..35dc6f5 --- /dev/null +++ b/test/e2e/screenshots.ts @@ -0,0 +1,137 @@ +// Generates the README screenshots in docs/screenshots from a scripted scene. +// docker run -d --name mumh5-shots -p 64740:64738 -e MUMBLE_SUPERUSER_PASSWORD=shots \ +// -e MUMBLE_CONFIG_AUTOBANATTEMPTS=0 -e "MUMBLE_CONFIG_WELCOMETEXT=Welcome to the community voice server." \ +// mumblevoip/mumble-server +// npm run build && MUMBLE_TEST_HOST=localhost:64740 MUMBLE_SUPERUSER_PASSWORD=shots npm run screenshots +import { _electron as electron } from 'playwright-core'; +import electronPath from 'electron'; +import { mkdtempSync, mkdirSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { createCodec } from '../../src/core/proto.ts'; +import { MumbleClient } from '../../src/core/client.ts'; +import type { Transport } from '../../src/core/transport.ts'; +import { openTls } from '../../electron/tls-transport.ts'; +import { generateIdentity } from '../../electron/identity.ts'; + +const target = process.env.MUMBLE_TEST_HOST; +const superPw = process.env.MUMBLE_SUPERUSER_PASSWORD; +if (!target || !superPw) { + console.log('Set MUMBLE_TEST_HOST and MUMBLE_SUPERUSER_PASSWORD'); + process.exit(1); +} +const [host, port] = target.split(':'); +const root = path.resolve(import.meta.dirname, '../..'); +const out = path.join(root, 'docs', 'screenshots'); +mkdirSync(out, { recursive: true }); +const wait = (ms: number) => new Promise(r => setTimeout(r, ms)); + +function headless(username: string, password = ''): Promise { + const id = generateIdentity(username); + const client = new MumbleClient(createCodec()); + const t: Transport = { onData: null, onClose: null, send: b => conn.send(b), close: () => conn.close() }; + const conn = openTls(host, Number(port), id.certPem, id.keyPem, { + onSecure: () => {}, onData: c => t.onData?.(c), onClose: r => t.onClose?.(r) + }); + client.connect(t, { username, password, os: 'Linux' }); + return new Promise((res, rej) => { client.on('synced', () => res(client)); client.on('close', rej); }); +} + +const byName = (c: MumbleClient, name: string) => [...c.channels.values()].find(x => x.name === name)!; + +// ─── Server scene ───────────────────────────────────────────────────────────── +const admin = await headless('SuperUser', superPw); +// Start from an empty tree when the server is reused +for (const c of [...admin.channels.values()]) if (c.id !== 0 && c.parent === 0) admin.send('ChannelRemove', { channel_id: c.id }); +await wait(500); +admin.send('ChannelState', { parent: 0, name: 'Lobby', position: 0, description: '

    Welcome! Hang out, say hi, and drop your clips here.

    Be nice. Push to talk is appreciated in busy rooms.

    ' }); +admin.send('ChannelState', { parent: 0, name: 'Gaming', position: 1 }); +admin.send('ChannelState', { parent: 0, name: 'Music', position: 2, description: 'Listening parties every Friday.' }); +admin.send('ChannelState', { parent: 0, name: 'AFK', position: 3 }); +await wait(1500); +admin.send('ChannelState', { parent: byName(admin, 'Gaming').id, name: 'Minecraft' }); +admin.send('ChannelState', { parent: byName(admin, 'Gaming').id, name: 'Valorant' }); +await wait(1500); +const lobby = byName(admin, 'Lobby').id; +admin.disconnect(); + +const sarah = await headless('sarah'); +const max = await headless('max'); +const jonas = await headless('jonas'); +const lena = await headless('lena'); +sarah.joinChannel(lobby); +max.joinChannel(lobby); +await wait(300); +jonas.joinChannel(byName(jonas, 'Minecraft').id); +lena.joinChannel(byName(lena, 'Music').id); +await wait(1200); +lena.setSelfMute(true); +max.setSelfDeaf(true); +sarah.setComment('

    sarah streamer, night owl

    Mostly playing Minecraft and Valorant. Ask me about modpacks.

    • EU evenings
    • Push to talk
    '); + +// ─── App ────────────────────────────────────────────────────────────────────── +const { ELECTRON_RUN_AS_NODE, ...env } = process.env; +const app = await electron.launch({ + executablePath: electronPath as unknown as string, + args: [root, `--user-data-dir=${mkdtempSync(path.join(tmpdir(), 'mumh5-e2e-'))}`, '--ozone-platform=x11', + '--use-fake-device-for-media-stream', '--use-fake-ui-for-media-stream'], + env: env as Record +}); +const page = await app.firstWindow(); +await page.setViewportSize({ width: 1440, height: 900 }); + +await page.getByRole('button', { name: /Create a new identity/ }).click(); +await page.getByLabel('Name').fill('kibi'); +await page.getByRole('button', { name: 'Create', exact: true }).click(); +await page.getByRole('button', { name: 'Skip for now' }).click(); +await page.getByRole('button', { name: 'Done' }).click(); + +await page.getByTitle('Settings').click(); +await page.getByRole('tab', { name: 'Chat and files' }).click(); +await page.getByLabel('YouTube links').selectOption('thumbnail'); +await page.getByRole('tab', { name: 'Voice' }).click(); +await page.getByRole('radio', { name: /Always on/ }).click(); +await page.getByRole('button', { name: 'Done', exact: true }).click(); + +await page.getByTitle('Add a server').click(); +await page.getByLabel('Address').fill(host); +await page.getByLabel('Port').fill(port); +await page.getByLabel('Username').fill('kibi'); +await page.getByLabel('Label').fill('Community'); +await page.getByRole('button', { name: 'Save and connect' }).click(); +await page.getByText(/Connected/).first().waitFor(); +await page.locator('.channel .name', { hasText: 'Lobby' }).dblclick(); +await page.locator('.me .who span', { hasText: 'Lobby' }).waitFor(); +await wait(800); + +sarah.sendText({ channels: [lobby] }, 'anyone up for a round later?'); +await wait(1200); +max.sendText({ channels: [lobby] }, 'yes, after dinner. 8pm?'); +await wait(1200); +await page.getByLabel('Message').fill('works for me. meanwhile, a classic: https://www.youtube.com/watch?v=dQw4w9WgXcQ'); +await page.getByLabel('Message').press('Enter'); +await wait(1200); +sarah.sendText({ channels: [lobby] }, 'no. not again (ok it is a good song)'); +await wait(3000); + +await page.screenshot({ path: path.join(out, 'main.png') }); + +await page.locator('.sidebar .user', { hasText: 'sarah' }).click(); +await page.locator('.panel .html', { hasText: 'streamer' }).waitFor(); +await wait(500); +await page.screenshot({ path: path.join(out, 'profile.png') }); + +await page.getByTitle('Settings').click(); +await wait(800); +await page.screenshot({ path: path.join(out, 'voice-settings.png') }); +await page.getByRole('button', { name: 'Done', exact: true }).click(); + +await page.setViewportSize({ width: 390, height: 844 }); +await page.locator('.scrim').first().click().catch(() => {}); +await wait(500); +await page.screenshot({ path: path.join(out, 'mobile.png') }); + +await app.close(); +for (const c of [sarah, max, jonas, lena]) c.disconnect(); +console.log(`Screenshots written to ${out}`); +process.exit(0); diff --git a/test/identity.test.ts b/test/identity.test.ts new file mode 100644 index 0000000..aa3e1f6 --- /dev/null +++ b/test/identity.test.ts @@ -0,0 +1,70 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { mkdtempSync, mkdirSync, writeFileSync, statSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { generateIdentity, identityFromP12, identityToP12 } from '../electron/identity.ts'; +import { IdentityStore } from '../electron/identity-store.ts'; + +const tmp = () => mkdtempSync(path.join(tmpdir(), 'mumh5-id-')); + +test('PKCS#12 export and import round trip', () => { + const id = generateIdentity('roundtrip', 'rt@example.com'); + const p12 = identityToP12(id, 'hunter22', 'roundtrip'); + const back = identityFromP12(p12, 'hunter22'); + assert.equal(back.fingerprint, id.fingerprint); + assert.throws(() => identityFromP12(p12, 'wrong'), /Wrong password/); +}); + +test('store migrates the legacy identity and still asks for setup', async () => { + const dir = tmp(); + const legacy = generateIdentity('legacy user'); + writeFileSync(path.join(dir, 'identity.json'), JSON.stringify(legacy)); + const store = new IdentityStore(dir); + const { identities, setupDone } = await store.list(); + assert.equal(setupDone, false); + assert.equal(identities.length, 1); + assert.equal(identities[0].fingerprint, legacy.fingerprint); + assert.equal(identities[0].name, 'legacy user'); + assert.ok(identities[0].isDefault); + assert.equal(statSync(path.join(dir, 'identities.json')).mode & 0o077, 0, 'identities file is owner-only'); + await store.finishSetup(); + assert.equal((await new IdentityStore(dir).list()).setupDone, true); +}); + +test('store create, import, duplicates, default and remove', async () => { + const store = new IdentityStore(tmp()); + const a = await store.create('alice', ''); + const other = generateIdentity('bob'); + const b = await store.importP12(identityToP12(other, 'pw', 'bob'), 'pw', ''); + assert.equal(b.name, 'bob'); + await assert.rejects(store.importP12(identityToP12(other, 'x', 'bob'), 'x', ''), /already stored/); + assert.equal((await store.get()).id, a.id, 'first identity is the default'); + assert.equal((await store.get(b.id)).fingerprint, other.fingerprint); + await store.setDefault(b.id); + await store.remove(b.id); + const { identities } = await store.list(); + assert.deepEqual(identities.map(i => [i.name, i.isDefault]), [['alice', true]]); +}); + +test('imports the desktop Mumble client certificate', async () => { + const cfg = tmp(); + const mumble = generateIdentity('Mumble User'); + mkdirSync(path.join(cfg, 'Mumble', 'Mumble'), { recursive: true }); + const b64 = Buffer.from(identityToP12(mumble, '', 'Mumble User')).toString('base64'); + writeFileSync(path.join(cfg, 'Mumble', 'Mumble', 'mumble_settings.json'), JSON.stringify({ certificate: b64 })); + const prev = { xdg: process.env.XDG_CONFIG_HOME, appdata: process.env.APPDATA, home: process.env.HOME }; + process.env.XDG_CONFIG_HOME = cfg; + process.env.APPDATA = path.join(cfg, 'none'); + process.env.HOME = path.join(cfg, 'none'); + try { + const store = new IdentityStore(tmp()); + assert.deepEqual(await store.findMumbleCertificate().then(f => f?.name), 'Mumble User'); + const imported = await store.importFromMumble(''); + assert.equal(imported.fingerprint, mumble.fingerprint); + } finally { + for (const [k, v] of Object.entries({ XDG_CONFIG_HOME: prev.xdg, APPDATA: prev.appdata, HOME: prev.home })) { + if (v === undefined) delete process.env[k]; else process.env[k] = v; + } + } +}); diff --git a/test/proto.test.ts b/test/proto.test.ts new file mode 100644 index 0000000..e03b78d --- /dev/null +++ b/test/proto.test.ts @@ -0,0 +1,26 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { createCodec, FrameReader } from '../src/core/proto.ts'; + +const codec = createCodec(); + +test('encode/decode roundtrip with framing split across chunks', () => { + const a = codec.encode('TextMessage', { channel_id: [0], message: 'hello world' }); + const b = codec.encode('Ping', { timestamp: 1790796000000 }); + const stream = new Uint8Array([...a, ...b]); + const reader = new FrameReader(); + const out: any[] = []; + for (let i = 0; i < stream.length; i += 3) { + reader.push(stream.subarray(i, i + 3), (id, body) => out.push(codec.decode(id, body))); + } + assert.equal(out.length, 2); + assert.equal(out[0].name, 'TextMessage'); + assert.equal(out[0].msg.message, 'hello world'); + assert.deepEqual(out[0].msg.channel_id, [0]); + assert.equal(out[1].name, 'Ping'); + assert.equal(out[1].msg.timestamp, 1790796000000); +}); + +test('encode rejects invalid payloads', () => { + assert.throws(() => codec.encode('ChannelRemove', { channel_id: 'nope' })); +}); diff --git a/test/server.test.ts b/test/server.test.ts new file mode 100644 index 0000000..098af4b --- /dev/null +++ b/test/server.test.ts @@ -0,0 +1,141 @@ +// Integration test against a real Mumble server. Skipped unless MUMBLE_TEST_HOST is set, e.g. +// docker run -d -p 64739:64738 mumblevoip/mumble-server && MUMBLE_TEST_HOST=localhost:64739 npm test +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { createCodec } from '../src/core/proto.ts'; +import { MumbleClient } from '../src/core/client.ts'; +import type { Transport } from '../src/core/transport.ts'; +import { openTls } from '../electron/tls-transport.ts'; +import { generateIdentity } from '../electron/identity.ts'; +import { encodeVoice, decodeVoice } from '../src/core/voice-packet.ts'; + +const target = process.env.MUMBLE_TEST_HOST; +const codec = createCodec(); + +function connect(name: string): Promise { + const [host, port] = target!.split(':'); + const id = generateIdentity(name); + const client = new MumbleClient(codec); + const transport: Transport = { onData: null, onClose: null, send: b => conn.send(b), close: () => conn.close() }; + const conn = openTls(host, Number(port || 64738), id.certPem, id.keyPem, { + onSecure: () => {}, + onData: c => transport.onData?.(c), + onClose: r => transport.onClose?.(r) + }); + client.connect(transport, { username: name, os: 'test' }); + return new Promise((resolve, reject) => { + client.on('synced', () => resolve(client)); + client.on('close', reject); + }); +} + +const until = (fn: (resolve: (v: T) => void) => void, ms = 5000) => + new Promise((resolve, reject) => { + const t = setTimeout(() => reject(new Error('timeout')), ms); + fn(v => { clearTimeout(t); resolve(v); }); + }); + +test('two clients sync, see each other, exchange text, and update state', { skip: !target }, async () => { + const alice = await connect('alice' + Date.now() % 1000); + const bob = await connect('bob' + Date.now() % 1000); + try { + assert.ok(alice.channels.has(0), 'root channel present'); + assert.ok(alice.session != null && bob.session != null); + + // Alice learns about Bob via UserState + await until(res => { + if (alice.users.has(bob.session!)) return res(); + alice.on('user', u => { if (u.session === bob.session) res(); }); + }); + + // Channel text message + const got = until(res => bob.on('text', m => res(m.html))); + alice.sendText({ channels: [0] }, 'hi from alice'); + assert.equal(await got, 'hi from alice'); + + // Self-mute propagates to other clients + const muted = until(res => bob.on('user', (u, changed) => { + if (u.session === alice.session && changed.includes('selfMute')) res(u.selfMute); + })); + alice.setSelfMute(true); + assert.equal(await muted, true); + + // Plugin data between clients (used for rich chat) + const pd = until(res => bob.on('pluginData', (s, id, data) => res(`${s}:${id}:${new TextDecoder().decode(data)}`))); + alice.sendPluginData([bob.session!], 'mumh5', new TextEncoder().encode('{"t":"typing"}')); + assert.equal(await pd, `${alice.session}:mumh5:{"t":"typing"}`); + + // Disconnect is seen as UserRemove + const gone = until(res => bob.on('userRemove', u => res(u.session))); + const aliceSession = alice.session; + alice.disconnect(); + assert.equal(await gone, aliceSession); + } finally { + alice.disconnect(); + bob.disconnect(); + } +}); + +test('image messages over the text limit must be well-formed XML', { skip: !target }, async () => { + const alice = await connect('imgA' + Date.now() % 1000); + const bob = await connect('imgB' + Date.now() % 1000); + try { + // Longer than the default 5000-char text limit, under the 128 KB image limit + const img = ``; + + const denied = until(res => alice.on('permissionDenied', d => res(d.type))); + alice.sendText({ channels: [0] }, `
    f.png
    ${img}`); + assert.equal(await denied, 4, 'unclosed
    is invalid XML, server denies as TextTooLong'); + + const got = until(res => bob.on('text', m => res(m.html))); + const ok = `f.png
    ${img}`; + alice.sendText({ channels: [0] }, ok); + assert.equal(await got, ok); + } finally { + alice.disconnect(); + bob.disconnect(); + } +}); + +test('bursts of messages are paced instead of dropped by the server', { skip: !target }, async () => { + const alice = await connect('burstA' + Date.now() % 1000); + const bob = await connect('burstB' + Date.now() % 1000); + try { + const got: string[] = []; + const all = until(res => bob.on('text', m => { got.push(m.html); if (got.length === 9) res(); }), 15000); + for (let i = 0; i < 9; i++) alice.sendText({ channels: [0] }, `msg ${i}`); + assert.ok(alice.queued > 0, 'some messages wait for the rate limit'); + await all; + assert.deepEqual(got, Array.from({ length: 9 }, (_, i) => `msg ${i}`)); + } finally { + alice.disconnect(); + bob.disconnect(); + } +}); + +test('voice packets are relayed through the TCP tunnel in the negotiated format', { skip: !target }, async () => { + const alice = await connect('voiceA' + Date.now() % 1000); + const bob = await connect('voiceB' + Date.now() % 1000); + try { + assert.equal(alice.protobufVoice, true, '1.5 server uses the protobuf voice format'); + const frames: { session: number; frame: number; last: boolean; bytes: number }[] = []; + const done = until(res => bob.on('voice', raw => { + const p = decodeVoice(raw); + if (!p) return; + frames.push({ session: p.session, frame: p.frame, last: p.last, bytes: p.opus.length }); + if (p.last) res(); + })); + // Opus TOC byte 0x78: SILK wideband 20 ms frame, followed by filler + const opus = new Uint8Array([0x78, ...new Array(40).fill(7)]); + for (let i = 0; i < 5; i++) alice.sendVoiceTunnel(encodeVoice({ target: 0, frame: i * 2, opus, last: i === 4 }, alice.protobufVoice)); + await done; + assert.equal(frames.length, 5); + assert.ok(frames.every(f => f.session === alice.session && f.bytes === opus.length)); + assert.deepEqual(frames.map(f => f.frame), [0, 2, 4, 6, 8]); + assert.equal(frames[4].last, true); + } finally { + alice.disconnect(); + bob.disconnect(); + } +}); + diff --git a/test/voice-packet.test.ts b/test/voice-packet.test.ts new file mode 100644 index 0000000..8243918 --- /dev/null +++ b/test/voice-packet.test.ts @@ -0,0 +1,38 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { writeVarint, readVarint, encodeVoice, decodeVoice, relayAsServer } from '../src/core/voice-packet.ts'; + +test('Mumble varints round trip at every size boundary', () => { + for (const v of [0, 1, 0x7f, 0x80, 0x3fff, 0x4000, 0x1fffff, 0x200000, 0xfffffff, 0x10000000, 0xffffffff, 0x100000000, 2 ** 40 + 5]) { + const out: number[] = []; + writeVarint(out, v); + assert.deepEqual(readVarint(new Uint8Array(out), 0), [v, out.length], `value ${v}`); + } + const small: number[] = []; + writeVarint(small, 300); + assert.deepEqual(small, [0x81, 0x2c], 'matches PacketDataStream encoding'); +}); + +for (const protobuf of [false, true]) { + test(`${protobuf ? 'protobuf' : 'legacy'} voice packets survive a server relay`, () => { + const opus = new Uint8Array([0xfc, 1, 2, 3, 250]); + for (const last of [false, true]) { + const sent = encodeVoice({ target: 0, frame: 1234, opus, last }, protobuf); + const got = decodeVoice(relayAsServer(sent, 42, protobuf)); + assert.deepEqual(got, { session: 42, target: 0, frame: 1234, opus, last }); + } + }); +} + +test('legacy header layout: opus type, terminator bit in the size field', () => { + const p = encodeVoice({ target: 3, frame: 5, opus: new Uint8Array(10), last: true }, false); + assert.equal(p[0], (4 << 5) | 3); + assert.equal(p[1], 5); + assert.deepEqual([p[2], p[3]], [0x80 | 0x20, 10], 'size 10 | 0x2000 as a 2-byte varint'); +}); + +test('non-audio packets are ignored', () => { + assert.equal(decodeVoice(new Uint8Array([1, 2, 3])), null, 'protobuf ping'); + assert.equal(decodeVoice(new Uint8Array([0x20, 5])), null, 'legacy ping'); + assert.equal(decodeVoice(new Uint8Array([0x80, 1])), null, 'truncated'); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..7b82203 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "erasableSyntaxOnly": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "types": ["node", "svelte", "vite/client"] + }, + "include": ["src/**/*", "electron/**/*", "test/**/*"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..44208e2 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; + +export default defineConfig({ + base: './', + plugins: [svelte()], + build: { target: 'chrome120', outDir: 'dist', emptyOutDir: true } +});

    I1&{yFZ)b!(9mTTIv7 z|M2E<{NI;b;%lqEy?MRw>&vO(^Xrb&>hW>TT2Is&*=Bzhdpv z36HBR&CGl`xBT9&^^*U7o** z^C9u@(Wj{Z&{q0kz-7{nJEpz?&sjH;}=9b+m-;y7{vF!A4XoaE|FJWEUrof)8=qgi|NrxOX?_T6S5HQK z&1>`gd0$_zpJVjvZv4MLi(c2=Jni%Pf6?dDU&HrSZ}TxXdM&^I=j!;K`OaY%BAy2P zdazYKc2~(q?$7h4p63m`lHOxmdh5$%Kbx<;Z%vo^&+j^U+_&=8O7-aI=x@fio9p+! z-}Tzg^5>3B{k=c-SmdM_-Q~CcWBzk}{r`VEW7e&Gd*Y3*#rEx~pJ#~)#)oaIe7q`+ zk>S9_b)CmF4+J(hEH+myJswwn^UFrnpI80u3O_eptKVo9U3NJ9yyX9@AD*7tZC`Wh z?!nXi=lSN_|DIZ`R_AK__w3oPk6*hUKGjxMuUP)N_z|yZ)fdCt+w+6Z=O((`H_7^S zO{VzGjF43--;Z6*nR2nAp!)XR|2ffS){D1(e}6q*W?I?XTdJU$ss|rFu(8YhyZhcl z@S=gso+;-nzKbkBb>v*={(bq$r=zdD*ta+FsaK=9yIsEOHO@{ zCY7eNa$bkIU+I0RpEqvoNdCY1R)StT(rKka6qgmCX}xxADI2T2@k4wkj~3&;RGu{y%TktC!V3?n*S) zv;KKUmH$s=wc`ViYZo@8etWa?@2{`bk2>A$KFG`edo+FDx@Grkzsrh>PJMjLKVoOm zP79M?AzvhIDm=78@0>gZO1`V4%l8~Scq;L*2w!Xai|L3R8k7ky5$gFujud?df8{yO~A797+|0DhX^HRfPbrqq` zt*gV!O3LaU%;Nw4GWg?{%l`%156msUXSQSAyW01^6V|_97rXh_w%c{TXP&>O(Z_VP z)-As3mZIeeP{8*IvB>Pz?l>n~es6QdyXVXM=N6vYdU<=@+oRjA-)DBdxnpN>koNq@ zTeI%J&pG*Udfl^AoA&?xv+n5IUr%NUulsvJQ#=3nLF3!s{ul14vz|TsU&;Bo|G&L| z|NqYOeLsFY?$?RlwItw#?;MM#bBgs}TweZX-~KVR=3jSCKeyZZ?&I-U@#)S}Q*Qnc_Seg5r?|?RmARTW|9JD@W#9m;d`$zTaxj>|j~OO*^-_$L)v#dGEmfwg%_xJHIZI&fDi% z{rAfI{F#5N3p1wh%{2IVV`1o`wTVw3h5FX1uUWaN@v+~Gu=smdH`Kgbbu6zu%Fl0| zjB)O}3w4W9-(GT^y?fQMv$LeaI9JLTfB#W8JFcoQdi#O>Nw24!{r`LaeF>8l@80I` z-?L@QoBs0q`)Z?`Elfhx7pu>&$#QjF`g_-ONw(`(=T_fq6%`FVWD!;M2;{hi>t{tO zxTo;ie-@tqyT91IW8J!0GvEJup{{Sc?9AMGZ_NK~@=oVJSFYM``+8S@yyfC!ybFR- zozL%ib0;|{HkLVk&uii9b0g>b^jiG96YM^9m%OCK&n9E_aL%muJ&sb++tWWs-rmL+ zyGwCSndG^KQ|fbTZe7W|eE0g^GX@nOCVW1(d%>bbPB*rJ+`{li+|=S8*VJUcIiXu$ z&6B^gdsS@5Pu`#Yaiy=OEH^(p{r!{ZxE-(0{oelc=;_zH>^?M3KK?!0y1wSsEBkjp{`s!g%Tsz#@%YV+ZMpuDGcBfw z=~sRI{~`>b2H z-nohXTo?OxQB6Xs*OncJcbRP6Y5e@w>{~&Pe@pl3uQ?N2`lsWRudc9qxY@ovMdCk? zNxxXwE(b9?Lh(U`_LHK@iCUlgYd5Wld9v-<=XWPHysIWpe!A3Y%hRhLwxmv7Ii(Mz?u{1L%h~buUVB>HEVk@w$J70{ zuIPa*W3bpISRhmNb6R!&u6Oqyt<=Bwb+7pQ)hpKv>FTbHU3I(nZ2j+dXU|Ped3xaA z$!*8NOy6X`?%x0VUiY~xm+JnWD$-s1*0FfXx|sCCr@}!aR}2gc3J)r@OShYqd^fVZ zfA7kT(^uY2Q_FpKNzm9|_Tslsx!G0GkacJ7;!J%KTC$bT>T7|0SusAnjk*^A9y(0sI#UmL} zM)$|>#kSgP@RF$t6X$gU8N*P)4H8d_%}$#O<}FVdQ&MBb@04R)I6951J literal 0 HcmV?d00001 diff --git a/docs/screenshots/mobile.png b/docs/screenshots/mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f612a601278cc1b8c270641bfaf79e55ed0caa GIT binary patch literal 107629 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/profile.png b/docs/screenshots/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..578923677229bee77a3f772762684f6ac863ed7b GIT binary patch literal 251917 zcmeAS@N?(olHy`uVBq!ia0y~yU|qn#z}&*Y#K6FCL!YsgfkA-5)5S5QV$Pep+%dx8 z`z$^r&#<|`$;RX*@I+BxQNe9VgILXiith8L;xeoPbzAuE*xc=@yVvf%d+Tl3 z|JW;&4hbV4O6;!RFqZYIT%3TPP~uWYpq?k>RKHb8YUia z0Es~`za>WjgvG$X@L(Z3BOjb+^F`qRBaGM3F2`a4<1l=<(9FON=gCzGJb-f!IP){f zz)o1Q~G_G19vC4m*4hM(h za{p62UyR<(|8w-*^}BxiHvW1WBMM4l;E=+}SxOT&*&!44JeJ{w@+}gaqep+ANj8*(~pHB8oHhLl^Bx`?mO6;ZEY)!4) zd-mL&uxyuGscyO0eS4Lb{wbzUP1)9kH;Bt;rd~DLb&`Fq%>iD`^{U7BIyvpx;Zo|k zbDC@VQB%#;saj2bresZ3amD0kqQ>Q+^wQbXn%R={m z9?sspclYko8LKw$|NCUJZTi+UG5bHQ`|Cu`ueJNJS<%Yy&dpsn12+BM%(VXgKD)!) zR%rfsQ=VTN?YCi%_}gS8<^u0glJ@fC$?QO34YHShWD_@+d&abTqNlU9d z`v2YK>&`c4z1beNfBIUZ&37K%Uow3v`~8T&ag3{fFQ~4&=AwSCV6*JfobT29f3FG1 zKE^Ecf5TtP{E+?CzNh&A{QvuF@zD~dvLD><+k@M!zg*N?9&YYd?3+4&P1VbGDPvL3 znSX!l-<$8dKEjvPLICP@h7S!56FJ&>%egro1phakDsQX1dtFkTY=kN1$H|P1P z%Bp&m?TL)Q|KH#5&(Tfzs*=dA|dZ;e>C@#*K=>B~P}oUnmeNH~4Nip3$9cU!gFegCzY z@dt0_maE%(CVECr`1{^=_xCv#;RPEUoZs8n&(Ra^mN(LF@n%guRj)U}@iQ;X-TV`d zn;&qT^kt2rPul<7hzNZ$KslZZUU&1-AJPuWFpt~$GGdf3{Z zOM1AHcev_zmA&qbQgA*fe|_(kXG=}r&%IKjzi&&`S#SNlTirc%3->bpQgQvd`+mgN zOWvBV_pN=mdB?M*`=?yEC}^H>zZonH3=9p&MJJ!EN?A68<-x})+S=Z!X=# zbtJ7Y(%elvB1YfN_R|W-(Dh5D%V%u$lDs>)`Sl%jA;1y?R)@H$Gr(#CgQlj@SOi6LBd3-NoOU2FT{Qd265{4T$*L{C>d$D`} z%kqzcM~GIyL>%N?^ym2-BVpNx9rH!~`=uA@ zSX6|ue(XKo)OLC( zP>}I*a|Qp#0{_4iAD^BR=Q~aBtOaL+=AyE~nfCwppE~9B|Kn3}_x^v++wb0gdw257 z$B(521w-S@KX#wrCim0-+6==Vb1VyAEIj<^_xY$VZ?f0#{q|;&M!ntE4>_MUe|G*+ zBI;<6dvUYA&F`E&rJM~Dk3YP@zvtz*>aN87|Ei9C^NP}r{ds5ei^4?#F;&m!mS4KG zujchyUshJuD^lg(Isd=^Ut8y=^Y8oq|F#eE(n7yIpMRF?XTrA4-yijV)2(w~>==`- zcRS?U%~#X+>E0;bkaO*SOV$5pm+PzMU;VVa^>S>&tK#n$*2=NGm}iika#c#?Tx$Ei zf3C-rc#FQ3NqfDYTxYcDYfYlHe#P_G4fkiAdHVmxhlhbvBP)L;bgETtGqyeG_1Ci_ z|BmaoZ;KZ%PM5Q#Ne}=4R(xx7S~}etn_fqXSP(&CTPYOC)YzxnePg=fi`R zP|kxpBInKDxjsYUZC$~`t}D6z+!Mat*sVFcIPXs32WS|7`n0HizPPyf*L4#;PKoJ7 zS)IJTeaDUoQGdQ(Z<=u$>eF$BO%pqC#s=p0us*yC$%GqPVxg z|G!`QAMNh`>-6_zbK8rf3qw>}eM5t$#C_af``J8i#lPFHE@t4JI#_r=s{{NhR z|KAq#$-lnb-Ei{qzyJI0{W4q5S{^DbTh_k$!j$RPgG1{dy|KSn_xt`; zwjIFPHt*b-P6lEM~fse{z@k^xt-;7H_eW zVcR7r^Zv(_`)YT(rCWBM^Qg=&-Ld)Z0ncMB>werXJ*{qgX7R0?JMF*T{tky+3cAb=hwBh3j9fW{wXn$Tx7i`{DGPdkMvV|1$5%WpX;a_;LN`U+ypC_n5sc z+sFQsar5$v7kPaTzVo;Hz2D#Nf7bi+H&w5u?liDxsQ6%Fx=MuWr}6o9LTx@Tci%gG zJH7PNtYgRAX8N?{ardln??3W!_WeK4{(iq-uViGD>f80>&CP{xT&KMM8T@G;e_>;I zgY@kMYo@R4n5U>0vQyq}@`uA)1k9JL)my()Ou=;Zru*~e|NXXA=Um;6npf?6yPwUH zJvq_3YTB0h>aMkQxwCWL@4B(~df&RUwfXyA+{&1e7JBgh5DEt&h_likyBGX96R$x`D+Qs#C1FN*>u}X+^4+1bIJ7M=W8lc6K<}1cT}*|KknbB zqPW0ceZjqR_i9%L&-d=T`sTk@blR4+8;bklb{Z`)dp!GcuX0?H$uZj_bEkxvOI_?x zxEktuG-FBMKaI+Wbt+#AD=aTw7Yi|ZB_%DoRkd>GB)j?36JK4qK3!y`)Vm+~D!0pz z?wY#rT32uDg%w%eeov-&tiSV?|3!g)UirtzmD}~M>~(pS`bf!Xt^AKow?FP-p357$ zb=K{=!#qzl9^9K4t?f6NxmnL#BPUy}s%qoSH}}#uD_tykW$1s`RdZMUl$-Nw$}T+- z+xw#R=)yY}j)=mp>)b-02Hy^Ctl=|Up`Smk%1hrSM z*R~8c31HgmSN`Tky^zo}3yU7vxXYclLt|sF-ny1n{r1Tdm!n3jR%?f9{gORb{;0jh z?`7-~lT{%v`Zm}kUt1S%?f>Lx`s^*Hu8}V@U;g~``hJ4WI*ruNT`dyzcVZ^b-&T3r zPSfy4*v^E=SIb1}ECN6NeWn|EZBN8J&e=ip`Im*Sy*sCLd4Bw>=NW7B(iX7uuU_sX zQD!6mD^vB^^P}1smnLvL-ue5HOY@_~A6va9Et&YQT~5m8{>+Vsv|Mu+f8^8RDQ{4D zGO3v3&d&B1UQ$F zfPdxHv+3u>&d-o^K58l@GX2N7bNB8|j*5!v;`0CeQ*ZP0GrW9!3nz(+{Aqe8J$d1- zKTj?eeU4nJQ1d(g&W^l)HP<{3ZhoKtpLc)N_jdcwljEZwoDGw!NxnMY>&~?OKhM4H zu6|}^aAp3VZ|-MM6$Tab(G z=Fk}e$NFRDimaG6(atGeye}|z>g>=i_v5Xh+wmCBLNrF+ZXeV#17%fzIphPigmMm}HX$af15iGOoPT%Tk zdAr*tRdL$qw}mwqPjlD44Sewaer(ptyZdz)htwCJJif#I_}Q)xUl-}S=4O7Ic;{4D zi+`8T3{k(kf;|_mco*?Kxl)wA)aJSB&5L(SSU=CWUA}R9N+PGe-j;V)BjRTjD{K$D z-}zhDGpG~)xYuUboJ1lsfM%eB>7d; zESYX-{&%&~A?2cnlRSR$E?717$YEQG*8!P)t#^+ZwYa?QM z^tEnJtqZ7o`}1$_`-hY6>0V#A*m*!#O%WLaIlYUSVP=g*{F?2W&7 z_skZ4r~N?S>(ZS!ElaYwUy0dFe-Sn9@&jRWZI=8SzeC$Z_-D(T8+TNtn}vx!kT$*vb{Q1`_k`LxR{J2?3z53&u zlgBRaE|ZxiZTYx8a)aOEIPKj5w*)p{@oo^${IFyCcw3D`%{)SxxHHU!|zFA zo15pif6C8S_$%%G_v?EB^YZ<(s~`Wh@@iS@C+1cD=EU`Te^i50OM0W{+7v6b)!gH8 zZb`WwUab|l|Nc*z>zdp`k6XS>Z}wUC=+2Ms+5ea}%DTR{x?ukHtMv{y^}TQ2KJ}{2 zyz)fuR`sl3n_hkPTi}1>7whWfvtKIy`YR^sqN-+EIw?4^^~s&*k5A0&x0F(@(OY_6 z>DBwiM+DEsOQ?T(bn*Ir74zLLZV~T|+V7vQiYo{zTC%aPfcMi@vGp%J7!`ZwOJ>-X zdwyG}{50y*H2FWj-(EP+zAn!7;X^?=IpLK@+fH}c{y(=Qu1DT}URR!psi~aJhsj<` zUA{|qzklod-^xgG3!Cw#e||~qHs9+Q_PRyJ#$Pr|yEa>Xud{un$<^soSKMH{$arsa z{Qr(zkIL6;w(VJPBzt4&rNfhyS+AP1dI^_5cwF*4d6oUn=jk(xYm#bS6u;lUe$w7w z&b%hq*}h-x%ikZj^_8pEu|%`kp{q_?|9k)1x-(CKqoBbt^K|{a&CBnE)S8)ZXK+*A zHQPq5N@W?VvRm zc|-4AJDcgc=ET<7W=FUdUCWD7jhr1;s5|%1^0U!K*(};Y!SlbRb0i4(m6{d!%VyOTdIrYb{^M>*;S?be0S{fkP_eX+8p+q%>Pa}Xj$a>s41oV=1XU5 zzKjnSSiPSgX`Oz$NMyzR!!LDNJRdzNsIv+B`gzitFV4Lx$E|B#c10Th&H6q?TJTsQ zFV~e6S+D!64>muV7G!F&GN*p&Mbo60L4skEe!5QVdMv%UAW;Cq4SLWRPEUW+1^7^9nzj$*m7+l}LYPgP|7zQo#RUgHMRG4%eTo16qs1QESBHBRUFtWHvRtRgJ^4{OXSR{oi!Pn><{i_E z6Rr!2J~J(U*z~h-)2zEoe{DRZ>bY5FHDB$%#f&?-AB!I=%&W;e_HoA49Y@0Jldf+w zvOS-Ftx475+T<4HjyaN3W>5a-$>x~U6sbL*+gR-V|5Xl$KhEA-;90cDR*U)9 z_NN%0u`CITsPj9v&9*8zeSZ1nv+on1+^gpckqMYzoN!!G^y{&>T?I#-lxp)um+z0R zTrKUg%S}y>U;Wef<>^v$7mMq~?3}V>lhT^=my(q`ABSAT55Q=4?%2Y+vKbeD8JL{gCVC{0~3GR8Df< z&41D=CS5OnS4nH(@$&Sqf78>CbN6?EY^-+tK&wj$e zn(~(MW~uzY*LGez3VxnyWx6>rf7{hEi*{8VU$4S@ljntc2gK+7UAw&O_+92$zqj`b zT@H)t#mG(H(zL5qGX9G4{gxxFA14ZBhB3bvlm9buLg|YGALr!Q-9MU;@j6#adurJ7 z<@Hx@mp=WM$iC;p^&ZzRF^t#z)UK+gPrb{?*Y)g4{I$K?+xu)jr2jR&WA*O;yYTS; ze{~KD>HNxm_IvZr%VK8>PXGHRZymw7`S9GGZLe(S*H(nIu2{<~+b1oQe|Gt=_V4$8 z@0pV@_u8lOeUfqp_IGmqeR=;pVgG(pe|b@@ns3s^h;;9BcM?mOZJ%8}(iClweg56w zCx`df?=u%)Bwa3p=gDa&AGi7vyT^G) zeNV@{kP|BBJnpMcJKg3>fhE*9D<+x~3M zdwQyS(~&PB4kazkM}<0){;v4Z<~S!*Wxx0P1gFr|j_3C2B^UHNq%U3*c2#4tRORHo z1$Sl*P}S0#}Bt&R?UaHBHbeGO(_6aa^>v-YQiK zi*t_5vVHI7C+)F3aImn`$FKIifBnY4)#b5G;{7-GcB;&hlJX6i$kFPv>~O)lx0TAC zE4=(f z{d+Ue zC@j=&udCDg^3bF!JO7Po$^=o_=_gFqN@bp0$z643qWP47{Tl=CdB{%LvuNe|OA2>( zRwo(1Vwtt)YZF@q$9Db;MrC0mp`b&2#iWqNO9uW_pdrEWK z>&~#q$~@27`}cqSTD2!=<~^55GhSbDnD^_-L}77Lm+Zqkl`W?(c^z{9-J_uNiRugW z*1JVbnY{ktPj;*LY>lKW9qp^uZLF7+XZIC~?^Jf}^f@o5v;AM<72{7zuigpIy}oyP zUL8Mw&CRNH{*#}$_=$cJs_K9FKkVDp^SnvByADu`NcQ%r>oHuISq+q?Ztti zK`ymrD+GAnNx$pO@_*tbvi8@nOTpqCuQtE5`M??X+hWN+o9^i9RSPa!oM>G4^1buL zbYne%UqwXgWTFVq;fjTx`9Vvo{-1qfIcF8KJVNub{c+KhJ|_=kNM@THM<#^muM+$ivs{Rn-$(4tDJP!B%Dc_{5UycYYYuH{>sA zy!Z2q@5!a_q`uzMJ7>A{K}GAXXz#1vZSVX)`}TPq@9PxyA41#Gv`?S4yYC=Ab(bt} z^Eb&oM`xd!Pax#g2DWUPEI?i3i6 zUBdfWzWX9`2S;r0)=AP#{W5%fi5CvrC?fX-Vt#aPz-2mY2UDx;ic=CudKDc5T(q`gXsWUGI3dJYYy*(U|&$ zIoW(W=hsqkcF$)oUS#CwuMaU@@cYp-N4NU_zwKkT@A!D@(Oe#*Q-^k5Gn?EJmd!nP zCa37%rrsSjcHCci-Z@I}Y}?SX(ACvd_eaOkN1Lktzx%dZbmfYKHnS`_dyB9q>W0UE z6~6r8*7xJx*L6l_S5{d*oP2lho4FU4E^=Gt7piaU#`3GmWXIzwPuZ_$?#?}a^kt=S z+Lt#;nGXuq{pC4oapiro)3VpWPnU+>RCc-?d{nj5jaf3o|G%7ziqWg;>%orPi+-yc zdFm?uDmQEUUT^WrJi7hkGe*YU?6N!ZCR}{yE7Px8_&J@e%Hna!iRPRanIbvQeYmjq&LgeP8)_qKOex(OrzI$)cd0wUJPX`QMiAkrn%{zU0p}ErY*Tsvov#+GS z-Z@+4;__F{QeSQD{~Gq$y1n{pEA6?r%YkXms^^kx(=P@Kzg8)!np7OSxBE)S)K$ud zonyUwEWWM?n|9Sf;Y@AA9X2AV{@y+Hy6n|+ zwu|9B^LHfN{moq!B$>V2xgg~12J0plQJ&|YY9`;`WoEQ#Ry%J^dG)ae5|7`=O2`>& z8%n&)C=8KaErajO{?W%KshU&o6{%x3 z+x36%(zp_KJ)hct>o)DU+b_7ouO?bOX!FgQ?zL%JhbAtc^?i#%MVwR9%)b1L?oIEK zYMOsJUJqD5UsOu&m?JOynqaOKtEGCpnVk#gOfbD*f1P8mpT72ut*aewe}ArX?=tVS ze}#P(=VEximc3bCr&6Y%|BG|_S3#j;4+{lXzS{p&uQIsum#xerlPO~SKPLZ8lgK}H zNpy3-!GE&V(qCEhKOLRg*t}$!R>F1B8NU?kgLxaLx(KFQIPD^GfE=-*n~ZtiB0TuT122 z-M4Rvc#zD?@@;Jo&3cci>wEY-2$j82x+KoIpv6<)oo~{Ne{=g+%)U|EZCHKJcdF~_ z&Dq%njr-0@$nrTIIeT>Rq>0xj1%^+o3b}hx)?h)FsEyVn*LJ5j7JVV1uYTR)x)~LH z$DlYbVu4(_YWDYN`Kx?Wq}xtpZ`Itjt*ASm4V3SkSgT`JOqh^6OL0!RzmV*;NB0Y~ z%fs(nxHRw0^De<(-0o#}CI~&gA7HR|-9|HGTX(}bUBaHW3HGzIOTI$Ufd zZOwI`i`VV_nZG~b`tz<|H4X;9v&&x|JAd@u!oJB@<{q4|zkb){15_xUE{b5B1wiLHy-RIn_|-Oqn^ljFXLY*o*T-^^W^o%i?B z;|DQk!fx-|cQNAsd!?FBz28@#x8#2asu_>TuD#!QH~ehh;fHr#>gWABv(jeG^p4Yq z1p~d^&0pjT_?0``Soe6#UMMS?>+<)e^Vjs^nB_V#I};k0P1KtA%xR^XlFpg_$L|(R zPvJG2v+k{N-COUTU3L`ON{u>j|^NA*E*-wM93ShsG8+@+YkncDd}=j{_d zonF6Z-oMf)clX~<*;>!5+`s=vO>^_)HLF&+e4kP};o_Z7(SH&QrKcFFa(#dHtDXHr z{j`-4_Y@UN{DmiPit@I7`*4w>k@TyzKQ9Cu|9dPfk;>o0qqS?|rZipAyDwxzOO9`k z4>s&uvSjL&*SGr$@0?!tUVn z#ji(HPyNyT=Z8+!67BsS_1TMkW`>l$U2bqaKW>S9U&Opcl}g#BZmWZ0t4|nQxF+W5 zC-=3dS9gxNzsu8=T2^X1SJ!X1HvMXJ=;n1<)3B9m>`i)St@1umyUDn6<+OhXJzk|w zt$O}qhr#uC+ZIWD)p);a^K{P;ne{IYykmPcLpJR$D}UFPZRX3^EqD%_E=_fweI~Kt zaA8GUqhs7U=l4Q~N}nbEx;2Zfcixe`hg+D=EnvTTLd&!wV8_I?Gji2w%&E;LV@)e6?_zBA$#?y251ZZE5akRN_@c*7g)5?c2YcD2W)3Fay+t+(j z<88rp&b!B7MIJ7ElIY?bT08mPi9&wfV);F*oR)?Z*SKE0Cof@dVD(|yvwznP#;_zN zUVGh8-SR!IU3zlpH6gu+5AT(TbDps@xFnzb;%#B_dp(hhvV{h556*C;*PiW_P3-s; zBq?U0eQc`68qoZDch0HpEvDWdF+=PcWkcV z%G*0Hm1mcdnc1-4l;?8N5`u z@9}s4XTv@PgEP%_`H$-+8t?Utj6Cf7vFqP`*S~kx$1%^-$yBjCcW>J{!@u>M!mFZQ zSsUn-*rdHZDx_Dm|1t-ATXiSXOJn!s8fB)!SlzqJk6n9z_;8fa9c`mScfW-mDxCMA z>$1Aj(Q98qQZ82&div(BWD-Bt{`tz%?HRU-e|v)6H`X0HzQes`r%-6g^l6RP_+9Pa zUwv4^@~$uQppLVA=H5{!1~e*a+2I=^S$ ztj-lHirj5~o%i=x<$A6zW0SZQ`&n}ahZRrGtpE3~vH0;bX&pt?mut69NRgea^I1IV z`f0BI&gcuVuB)=8J7(@!wQBjRoUAoD23jgO1-_t*`IJd+D$8Us_+fXJNwmx}va@PqRDqW(0f{W;H$gP^!NA2rQG*x`se*yu*YlJ zzLiV$18Y?#3rlW(@YH_i<>t5D{V6hgJ>m^q1M`-?zcgk0Azqe+lTT_%=Zdlg1&1o} zMsN6Z*1q(L+^?+pYF37sNiX}>`4+xJK7t4LVA zW6;u%Qd`XTh82AYc~IQ>`o8}XZLXwMaz)82PDa#gE!WZf_;h>PC0W%~Dwo{Kz3nX} zUl)H*Z$01RS*Ja7UeB^G6>jHtzLPUwvT&k+PVHy?b2D1!c_*FkJZ&EK{KZ1I-bBG8 zE4lAZz1momE%Mw;Og_8{0(Hm9zR~G<;*`eG0SL zyF~oG*Zu0k2-esB*;hLkZFoLyUA1|iLdP+wSH7;_t6x1Yc3c$AX14zSj?^h%e*ZO2 z_*KvUW#{gRAB!&Di&;N~mD{yf^60JEeu9sE<7Rx>l)Hq-Y1;PZA@eUn{pkh^*PpVL+hO$aX}Pe#-RR|O!t@==o332ckMBAg=1aqTPlO(ym=AKx$_h@wA zFO9c%o6pXi`Qw>WIN!>Z_FL=2Cw_fwcA)Cq+SB*%SBrj@J?8#k-G>h|Zd_aSey+i~ zc$UN!YxW4p$sJ5d663Di=@=NT&C4ZZB+;{Oou0|3j#;+v_a6QKVzKz4yH4pl0?)Ut z>aY2IGu>X~5`S@<@En8dZ~i`hf8+h1m)p7bEEcbh4$nO0^&(Ay;f^>jZ`bAJpFS7) z-?3Ts;@w^AXXkp?uV3%HJ$1^Wg%`iATDGg|W%s`e zK9lv!mot|b>$?l@IJrzdG3(H&dCQGu91C2&l;p2jy6J~_;of(4e_I*Da?H|? zc0FfeQonxf+8pcfqMt?03(p!9E?QpikPvdkXRhD(!~FL(_01O~Cf&Hn`^}}4W6qo( z>-YXUroaEmT#LFXQBOX{Ufa9P&ffm}lg{MBCt9EG%<=xUY=!h}?;>zXXuQ5PamIA%KH2uI^Uw` z`@y!Lm{&8kjy>$z=X7UoV~D(Zg~OxMg-;s4{Jr$hUHDgPFK@kGWW@Z9*&3hYzsx`U zW2U~^&uRCs6sK#fxa>L8Rpv(Fl7D)0&)F8N_RP(_5!XF=dXfKIiJ4^&YSRy1IW%9a zAe`sJx&3*4aRwYUpFTaQ_~h}c@z(JYxeL$3)*U-u@c(1KKAXQ;y5F72hMVpGzqve3 zEcgAR_2Av5gI29wi93pq%zFCU?96TR57*}O2X`4Yx6Z3s5_w#xBOOAKcJ-rMj|ZAY@y%(i*IkJ(l&6TepB zQv3Z7qfB_Y-{S!5mtPK_i!{-`v(fPTp|@97Tk6H_Someiql3M9Jc7rSYr+K7ZfiGd z$ul&x`OmVv-o55zM#Y~0dVNm)Y)+wZ73|Fmza}nQq!Pt)VDaO5tQKzskDEQ%A|@%n z$K8BS>*R=ceCBIR!nS`AesJK5*tm^!H^XkQ$o*i=Kt^Fj^AE4;2X}-(%)3J$Bfx4k3=2H$-2><=F{xsu7 zS#{<=f9|sM#VlU*%&&99&ju&*9ifx3wm1w5vXD{^DU9yZTyho+p=lpBBGfufT91neTD?`nt-6{BGY* zo!tLN;(wU7zV-Q}d%L9FYhz>6uV3x!`?jx}-|fE$!-2JTH#4-ePQ1oAM+ z&F9xXD<{4d+?&F;-L-Jxl1mT7HW$@>`KZ5NJ4`w5#wT&H&w780{7n6}eDS>aQg(Ou z)EUQvHBb5%UAg*o6(3*UXO_t^J0xDMeD$c#J4i@<<`Ri-Xp$AXoO;)apyU8Kg zcROiggp|ni74C9?XvAy3)Pyv;$*k1<_3XVXN5k&4hVr`f!w>6ooD&k3 zY~9ofWZ>UXEmrfwVU}6T4~}won`)Pm1??hj)g8Cie0|NA??<{z=Uh;?EpflhFY=yXk$v?`EbmB8 z;NOQvvgRgH8V^k3|F>JzJcr z`qky6CCh;hafaNzLEd8`&5Dx!movi06dc(QQe{Ml|b3eg)>$~=o&HtuvQ zj7&C&tIu9Hm(R0og4NPf33qc8JyZPWw(QHvpLTjui>b8kt5r>p-A{*JsAKNY*sS&Z z@m9+h+hX6U$S-=Y2K8m>yTtDkkHud+8SrI_{HGbcb>_m7RszQv4c}i{qV=73<>c2F zWb(!HcJ6yWgQMg|bMoBqIqUdu-YyPscW=+lGxPp$x1g`LKbeYm{d2bhANrXYQd$rZX-0T$>cAl5(2)HIKVoG+gBQV}f_HW&7FQ2iN{a+3uNnVy)`}zoka+TedW7Kj2GLDuIM21H%Kk z9ov~3Cb5O=U>1GnbnacrV>aK*hb<)99jhL^X8zduaeeKUJ2%{lWDH9GnZINgJ<86d zwl3yxnaJJ9<_R)4LT`91O1%1>^X0`ivzF}4Haq7kasFbX#qY1-)vHA-BU3xQ!{%3CJ-~DW!2B-QC zrfs@-;l@YH#T%s65ADl(_v*?_wma;Pt%4m{oj14bxORf^aO@n*C2@;)|D9!f?BUJ= z&#k-s*OhFuIkVupbamR~(qcE=-e2>Y3uNXNy1XbowvY8;p=YhX;fBu7!IO4W#=l!D z<8+|uRIe55-iKz#*$r|lgPfO-8hFoPYK8A^Muzg! z$x+;|uJG-*@{=-ICH1Q9(gA5_lcRz-&irQp`cBQcFo84^eY9$YKB3}2nL1+8w>T>C1E?p7#McwNbFz$H1Ujn_`$GbOeZf%nJkc<-ioEOfX{cRy65KjYPY{lB1S0t36$(E~FA zRx&e`mQ9**m-*L4Hjw=lEv03peMvn{QJf6QPcN=yEiEk-Y71il?-9N3ISID6(noDI zcWmx{Ck2KB9tjE{onYM1E`w+5r?XV^;!ltGdtVv9kdqcYm7te^2*rj(si20%p4EN7 z+TR(z`@wlnv|r zTaMpijX}BMki=33g|@k}Y2O>Z*@4TniWb9}YgWI=`Yp=D$l!K}IfVO_(wVoS20a=e z8^E}&w-HQ(3ArNYtb+&BidWQUxNO}Xujt7QjuNok4$dtPzzh&^z?t7o2^#$kzw<&6UQt0YWr6-m3=Z}N z*VV(++OxkclbU zrc%#ytS=>xuKh3(vJv<}UNgh-x0|=i|GoeJZ%_S!Cv)%D8h_clgUP%x**)^+Qog>& zM>-S#1ut{&-n8#l;iiwh}-d;R;ONL2SiT;G% zr8`p-y^{~cynfli_Dsf1Tg21IJO4Mcvry5=od<)rT$`8e+HZH}ptX)tNAUFU0QZuc zVTNwI{rWfrCA{h_SDVFppWGn-USDKaU+S%e>%KkXemaS5QFmkYxt^JilCqyC?TMLC zA9i&!`{9G;YPb56O_Y|+b=966a?P}K!NqwKKRX{cn|oF_r0m8d!^(r3=g(5VAI!*i4;#m7mBJ`Akb zuut8lv2bqejuRKwDCVs@R9JD&Pv+8si_%rw3u6u?xiGGprNeUIuTg4O#+Mh_cl9|A z6?{4pSdu>@<>yXb%|c^!?{CwU@9%tAQJWWN8#+C0x4TY+f%}Vds-~us771IbatR*- zE!2Gyb?2@NQ*m8VYS)Ic<9)%s*JmX^sPmpQJ;8n7t!QtB9&v+g&zK$ijhAJw&^mqA zGBMZZD7T;2%%$i5yz1x@-)VI+Tvu70?H5{0WZxx(cLb!nyaW! z6yW@ggO2d(3Vlo;$U#gyVY3E}#8eSRT2hbpN%iPQ7gk7Dh+v=S1DfNHm!E>Cx zt!w|Xs_(j`KVMrT`_&>P<>2Kkv;8{t7yET@ylZsrY-P#fMRV`5O22-1A|t*QSs_kaVu-<-#TGsW#9hSSg1Y~{bj${ zt+M*}6|d}V`Ty(l_fGX%`{2=?>2<$fEp%q*;;wT%?C>ho>(HaL^NC8kjE)rcdU(ZY zZQ)&(6Bs`C#{8M_`5RP^?oD4GG4nxke(Z}3z0>C`0>ZW~J^&jFsNwvn8~@#Din5dN z^*=v3TT1rV{XE*(9gxh>FSf{RyFyKB&XVbZXTKU{LdDS;)<#`hzZ~4T&gSvLp4_c&(>Ji5o~|ZU z{?_W2$J%48>r$@$`*OF+FCZq#DM)7Gyl5Te=`EEXSE+`)tla0s7+LLL_9DJ~^15GV z^m*J9r{uq1rRP*>w}0YeJKZxYpTC*Qq`a)?mETmeZ6)R}47O%;`h~a2PMvi!Eutg( z%j1`?0?c1oIm@~m>unE?&s;0@_yy-<_xN?{y991uOxC%%#JJBD6x9q2cU1d-D=Zei zb4Q)MwZlbl+tCLP04~5<`@K)KDm9~zUF^^d|HRK&2tsIr|GgO0>U;s zlb+V(oo)Q$fB*mM}V1yYa6tvT&&HaxNWlLJHcnCCq7O2t93d4 z;`RBqlVZCox%cMDT)DhrXTho^n>^R=*RhPdlyGG3&aw~|#XHhh=bf0U5%u-!(&c&r zdrroklbILZVXS!W&%W@I{{v&+wQgF`)>k~Uo?4wb%bI>c*F&vORd02Epa&%O+8!6?A1sW# zsWAO&bycOgxp{1+I+Hs0)w90h*{j)aKK=8v_%EO4tZF57qoTI?^Z)NGPQSQdMjzuw z&Tni&iG6vFb$zSe$R_b_eITSVt3`7YpGe4sw--7m9gcjgwyeedhlST^o~8>L{F|(d zUr(?4wQ|iui`NaS{fkzdFpdx8Z5C}h-te*L47*xtO8A z{MM3#SNTADp~Z|q=Pz#(A?t(Q1l;cz@m%}fj_c;;Mk|YRPk*ZI7ri#y=j`DdGIF6R zrT&{aFL_LOBJj-Wpv5dIoP;4+huzT#BD68?tAScWl`g z56Ps2#UBe97cO*KwBr2+*)tpCjQ^irefh?!ypSnVG&}T6ZiU4xJ$JocCj8>j;^gh8 zN{+kjm{hq%3do=In<;twh zsU07ylGr#7ubh5mRkZ&+r?)Gvn_f#>_FUta%CR5sLMFzn6Xle@^yQ*TqJm+z%i*Xh zp7Li4`rcKrPi5~M%uDZ0e{w%x` z`(={O*}Hr-MmL%sWGdzyUH|BHbZp7Qx4CD#!saj7nA3La%I$xLFKJna23#vyD{}2v z)7&dnOWAzC&1u+i=33U=joC7wM&JQuw(s-*AL8!Zyu7u-dh(x0|cAD_cbDN&Mcf8##U#*DpW2z3b1>$NQN20xFYo>3O=u5H0-Z+^*}cJ=)pcIj3`1RPWlKT?z(gX3cvnCGpPDEN+4NURBer zOSxhsF_ijEOVePy+Q^R;+ z$;7o>riYU^@w+c?Sy{x$z|i2%e>(dodwk6o`;QMxN}3Oqe&d_FH({Fj>1{KmH)Rx- ztT30oyI{l4JjTuO|G%u?Klj@9$p*Kx56b`B_xJ44hxcMyc%oh%mrdGzHg1oC&4IH! ztL@X@f4INr|4a7nJrOT<$%_Af_?4CM8gp=D`?3B1Ue2$RZc_db(a2@=*2_9DCdPqP zCu++q$4P+;Cpbd-(R;ux2SO4=F>as|Nmz1PJLnMlw2D(%_JlB z&z*#$_qdvJ0$-ju$z(29cJkX7(c&*94<}?zZCo<%#VXzthl39|N=45Ql79ZMN%Hlq z^}bt}%7yN@i))>F`>Tb|A@beH%}WV)pj-I^-Eq`r)zkmM?>7B0n{ohVayBcF{HM{$j|GRt9 z3%mBgC{$;*58>$Z1>%Be5j!MFXL+Bu{?=4k~^x0{AHe9U&mugEyD`TW{% zU%o7hd;jO%>{qY6UJ1?g+5YBx-%s89Kjtj>vU>e5AK}>#RPKGe`LIe^|I5xPPbXht zt={Y(Z)C-GL`6sNrgvHWTus##B@@rDjeNAoqUM3e$}Smklk%Uz3#T=G(eKylnelnD z{=QElr+$Ch{m0wjkcPvT7yV^3WL@^KT_~S*!=1;jva-mgQswV~#pPKH3=9XHn;@qm zwO`AeYk95m(4Lep2ZHC`$-Tr^xX$X|8vD0@N(}E7#|M9VU;pQE`Sf74)$6x^ z{>orxH1*HZnc?40MQqd4x*`^QGJW;^AKTg_UP#pc{dk!*yZ4juFvUPjsuG=B|=1S?&q=}Ljlv}E7{+zGR ziQiHYnev3^_AEsg^E|h#Q+?06<7Q4aSZ?!o!=jvgwRu~V{41-=wyfaUTN+7zAx$wcdA%uTuTq?6)$%W|wdK|4i2T>p}m2 zKRmx@NLHNqBRzDPZ~ycA4;TyWnPeW@cNlqXIs0C8q5HY>?B6v-KAk(au)IQjX|?^I;QOM- zynn{;oqK=t0*xCVJsI1qt&>`!>T3_Qtg!!cHlDw@LeFC5Wr5mN=}Xqtyg&Z6GOy2L z`6Y=3(bf!q4_5?Fx~BVetNFDw+02S5QPzonK3vt;|8lTrx?k#(__nebkk=$E({7&6 zw-288_qO@{nzA-&(YOa}I(7Bd;%h5^r!T$!sefNZI@@%=)Jq}r?V@wV&difN^;Vs~ zdExoRg>_$M$LIKe*|yK@%Jiurt8XxFUbOc&XY34~>u$j{Nkc>miNA&-k_D$3=9nAT?>^`*iBG1!#=3%unRxeHW<(wfaRnUFrhhleH>#59vdJG8Px}9%{fTSfznW>0p>^9_ZkA7J zdN-rxWP-uP&ud-OkKNbWRVW+1o3GBJCdopa@q)cXCuoEKe8$?2t#*1fJX<89B5&GsiOzF3{UDS7NF zLvw?e3@E%o_}z?~3fdZ)tHZT;?+qs;l=s8^VP)qzi%nt zr?>I(=EgMDLe=dH-+Ntd6?<%HDz%9{cUA<0T!ewI4#@HY9TGD$lQv#Flqs0~%;!_N z)M0tw{~RV;<1cPA5uY~YZ-~ldsWv-#r~hrnzB&xbZ{A&R`tYN34#RTkuuXRgu5E6t zy}sq$R6gwkkfA9Ch6Va!*I!?~Z}+w5dnx~nn~RU{==~P=?%m#+eUBFB+W#&2>6a|S zV59S{uEBZt-X6oYo8@PJ*t^b3&D|v{{%hTvknQj>#_jCI9lmp_ol6$$2Rr9h3cHve zNPhB;-9kq^IzQ&>)vGttjHWueYl3{iz`(G>I-=%#t7CHYG>=r@uNyaWNlHC_`tHfg zcXCgAMa51&QDJ)Ukx}+5)R_++9xjqlm$>`)R>0)n`){BA)n**=ZE@tZGGnF(hMzjv zE&lZXHUIiw_y4+Ue?HrQT7jS=mfYEIO7BlFys4wM_0cV}Vs?;=*q3!e2d5j_`4@(s zytONS^WMexym^F*-U=}E8*;q)9J~-V763bs?|}1)r4N@YOcKXv7h1|mP|6PCo{Fs$vzvzdGM)<*gHd{`Vom}~N z{hzPD%l)pLzO{aB+HU`w8;*$IDr`8;g&4zByuQ$GTlxL^{eRzD?>G70bE@&qvX*0g z?QSv;44L5P309~~*p*zp$!=G|o46D!&Yz$o3YnvHph11$F#G%mroA_VG_sB3x8HKv zQvOYE#>KyflQvm?<3GZqCoB6_?DSuo(hmz77>@r{E||R_C=NDyT(JBN%fHM2=e%g# zvT6_a)y!l_xsoU|H2FYeqX)X zUgwGuBp?qcH=GqeQ$Oj~_48^^TQ@o7s_*Kz(iNM0vcpYe@=2!$g{;X1cZ!pbf4cUk zEViKF#D;H+nnch4+w7rp?*DHk#u^8x&krZ95U(#;5az1HASZvJDY-&|XZN~w?-Vpd zrDRq-oP2sm;SY&9RfbhxW*qevx_Y+vYpHnd?3P0p_>zwwjnafAy4zPY|Em6;y3LdG za?SFc)*oe$70lfB)h)I5@W%MAdYjufm@e{un9;~^JRs30&F4+b+OXn(F`c=-K5t~0 z9Yw_F?y~%N$MUnY)8U-;#l`*d*1zU2Su%B-YvY03sEQ;1Z-4VV{#{@7&R2b&zrMYFSE28$O>fTI{dw|SYEk*(+mF5*-vd`aiHv8Ubvm4uXp6z&kZTcMBwO{57O8vXzUY{-*_v^{?`QAdzhZc*s za&v78O`CRm%hAg_P6QNeaA3RGdz|@j-^o&^?>9AG$b*N?Kg>8#@czRL$;*Fj@5Jm_ z@-8UU@!P?sD&}3eGrT>Hs61{JT3NRvv5PPCrv6cv&lAcH$1DntvnpYJ}QS%++N z7W5hN9NjNgQnJN=zTDf_;t!sS-?(!pA~?3O?PSu%n0;$zym;A~$1i74FDQC9K(0pl z<;>FjHQsR>^U6&{FL}hsoqO*ay#IIalB=(;t&RKp%~4hKaz`Kk^Y1;66SaQl_+IjU zeQocTOY;6%0-xpy${(6K_fGHv$8!(67u}8Mcxsv*$RVA{^=*nn4R}6y@I`L-3&Hqo|C7Iq8 zS#)F9Eb)E6wyNY`otJCf#WDS+{=PX6Djwd}H`4Ce)9|9z-}Sfe0||X^e|fur0N(;N zS9KfFx9>YApA9O!Hj!)jQqMp=pC_B1oj1PH`ZE6AT6woUhYVAmY8RL8-gjbGi_N^M z!jl%Qr|#KjOya(_Fl>t4{rUwl#jm$X$@HISY5A!rEbCDkdh_LC_ip`CdHKg|x;44$ zwl7z{woJ=<&cx6~hTrzj`{M7{xjm(J=k7~ZlNjV?{VAI7TAsC!+@e`XSBF<;Tcz8JQ%7Jr%dqJ?MD zBkrssj!t#`7{T}HI@bH#A6nF&YZCSTl6kzcTXeB$vp zs-4+k#rwAPzGy5|=g?vQR=3kRU0!DXmXy>z4_7l^{kz^iF2Y|={HI0Ow3jPpbjPod zj@-OmZjp5P;R#GKX_GJ7T-q#YZ=t1iszci)`EmlUjFEA9@c$L!@7~FsU+WY1{nmSq zLksfq7F`pWuW42N&8Iu8Ij{TXf;HibUNEdLsQ(uy8OnA?`%ZWFgrKnXrpoI~dBX(` zJ^!b3S*gyWq{CQrYG7FQnG-j6^}c`mv`ty}U=ercx8>i1vv||AZog8l=AKt;U-fPC zxxAd9v{vqKTl?jCQb;5__u+(dj+a^6jCc1>Hw$uKXH&DI;?k=N z2GbvTYgw6FPK~y`%eF-0_l^%wZy50VmDcWmy_vrw+iF@jQ-ydJM@`U*1&g0;k$H8y zoV6ryr)*K=U4dXT6ODa8{#;HEU-#|Pmx~!!uFSgkGpW5zdc%va_AL@Qwf;Vv-pE#; z`u@&R^8dLvKg{iuT*IYr+X>48guVmZWm2HusABr1`zCB_vmxvPq)eZ~{1=A<6O+DAN z=PpZ(cj3KtvRx}$j=Y@ndUAry@_CkdYfGN<$!J}SWaf4I`c&=jyWCS-E{c&X1&n_$8WaFi*qvs7yG3jk+Gc9 zcuiXS=+d^S!G9~4mf9uiwOz_#J!1ZjkE7sDarnBJpTFcYxy5x47s~L?kN(kg^x@t0 zzE@Yx|2}8!&ELmM+r;BM=Gf}~Gyh_7Ikqw96~5|o=aJ$Rr#zb5R)Wl`7Yd9jOP_T2CdE)ZxF zhc+(n@Ge;w7nA!z{FwUsLd)0)=Ue6BjxTrFeG>QS){)X&Jr?igzlzjQ} zXOZz~<1|;Vpr#Y&yU)9_O|__h{_X8=ttbI+f$6jUJwGu^clNi3r-LRX{W%-?`v3E4 z6Z=%rsn>!Jq)LZOS~UOCWuxwpy%TMwDJYgcKR)qa%{E6hyKjH5ZP9s|@Hf;z{r$>^ z`;r6M7w*-WdL?^z`>}&Et(VnjuhyG!r@7{5&hB;V{JdB1*|aGv-zmra{mIF-6*+0) z?#@RoJ-^HKT+9nrjtOlQm6bbq(5_F0?UhN^>vNt@)_%Ef!S+r};K@PxvuR88jmbvfc!?!tnc_LhMWJEAGX3i7o@39NY&e<(1o3BTU))bOLf>w;&G#Y+V4?}%17Q22kv)w3@gTYl?TDHhHu zKk?>fp2y6;{rQO%fgcBP?{@4~eO`5NKjCGO6#XaHXk99R?Z+fyV zdBfgkwz><1#IpV_{^RPO@1vU1%yaVKgGx^Ih*SP^14<3%HZSk8@!fxlbJf1{GOwTA zxmt1VLgSRF%e6|D=^e}Xo@vY+Gc{eW{~PbuWDozR+SWf88aFdvVNLbDGT)Hx_R+KV zE-WxD-Nf6qY4Rg8?%Dct>_T7Min)>SXoo*<`PDhr!8ffQaGZxvdvCR1oBUi@@YSuW ziLc)5F)U3FuXav7Xu0>~xr6FSzf#UWYnoN2w%l9woMrU=i|-9}Ud`IvT6E~#!Q@pM zB}MLmk=n1eY>7|oD=we1Ey7u`=i+0VH@e|E;F+ETfhEg6Jt&{bo*%JV^WMk6kG`3m zuNJ?QmwCI}ZR^*$e_mgHq0LwK@tb3b{0;w@566CU?-IYV-2S)H>*;4~pWKnmzUL*? zE~y{>?Cp)%1xwt8TvLuOE#}Jk_lrM%!}7`VPTp|l&$hTw^-JZI*Q<*m`@P$jR(0gx zF%@`F@n+)=#?5t;EoNu0u;2SzfBxUcE4X$oZ(!%*7XNVbL`s0CO65<{-$vEuGoJo7 zTYD?Ly0_bG*>c;rPt`>p{0zFSWfnerYvI*tf8LdEsVVmIE5G&N`Q=M-U%v}+ewfF= zZsb|EF4n)*B%-P1taWg*ZL1UGYNuQO(;E*Sl%4suOUz0mAuBg8{r3lVZH`6VZ=XEN z$ebeW5j=fuBU|#8$;P*Dctu>uP-kDV_Ug9a>K7uuu?HU?Px6hL)Wx@>_*Rywn#-(N zSGE;xSry%zJhQCi&7tPIL6tj8H~d_^i{t6fKW=@$w-_v+7dma5_fgjAZol1p-s-N~ z>;B^l=dVkTW|`#%f6v=>tt?!ux$(^mpDU?5ugXMDGwYr7;p-90p0KRvWn25Kxb5X& zV*!qHHG@}g3rK&Vl&~%HR-rYxxBtQ5!qoS_Hr)9ZRQREL|JQZu(%g3cmpu5jWy!7w ztG9FKopRFuo4WqXbm_23U5Eew=&CEMct7DSeLKRk6F(d`&}ECZ?$%p; zFv)x#SKqw?Y| zAKj71x_9@{8+E!}2TKY{ovb(=mDCRR+2(oqI9Xg?5*{*tb;y=)ZK30tj`d^aZ0dvD+C_dVc(@jyYr-=yc&(W}a|c{uLag0458ol}zdsb6uL__2Jd* zD=B8*`4kFY7jJm6Gdt5QwlIDE zg^m*!j~+cc_qzF{4apJhrwURtw4&F$YTT$e>+)pYjew$_IU&5*g4mX348O29tm3pfi zT0g1W?RV&lX1O?Mpy=>plgex1ua{MP)!8I_>=(OlWb;-LuhLJ|SL!dUS#`q8`>dD0 zzsKEaR_B8ybPAGKe}5L7B