diff --git a/.gemini/config.yaml b/.gemini/config.yaml index 18045fbba..5536dc86c 100644 --- a/.gemini/config.yaml +++ b/.gemini/config.yaml @@ -1,12 +1,22 @@ -have_fun: false -memory_config: - disabled: false code_review: disable: false - comment_severity_threshold: LOW + comment_severity_threshold: MEDIUM max_review_comments: -1 pull_request_opened: help: false summary: false code_review: false include_drafts: false + +ignore_patterns: + - "pnpm-lock.yaml" + - "pnpm-workspace.yaml" + - "dist/**" + - "browser/**" + - "packages/**" + - "patches/**" + - "misc/**" + - "scripts/**" + - ".vscode/**" + - ".github/**" + - "*.map" diff --git a/.gemini/styleguide.md b/.gemini/styleguide.md index 9665cd377..51258faee 100644 --- a/.gemini/styleguide.md +++ b/.gemini/styleguide.md @@ -1,134 +1,383 @@ -title: Equicord Review Guidelines +# Equicord Code Review Style Guide -rules: - critical: - licenseHeader: NEVER edit existing license headers, new files use 2026 - checkDeprecated: always verify components/functions arent deprecated before using - noAnyTypes: NEVER use any for Discord objects, import proper types from @vencord/discord-types - minimalChanges: fix with smallest possible change, no refactoring unless explicitly asked - noOverengineering: solve the problem at hand only, no patterns for patterns sake - humanText: write natural human text in errors, descriptions, messages. No dashes or robotic formatting. Write like "Module not found" not "Module - not found". Keep it simple and conversational - code: - deleteNotComment: DELETE dead code, dont comment it, git preserves history - noHardcoded: no hardcoded values, unused imports, magic numbers - useClassNameFactory: import classNameFactory from @utils/css (NOT @api/Styles which is deprecated), ALWAYS use cl() for class names, never hardcode strings like "vc-plugin-name-class" - useClasses: when combining multiple class names use classes() from @utils/misc, not template strings like `${a} ${b}` - useExisting: use utilities from @utils/, @api/, @components/ - logger: use Logger from @utils/Logger, not console.log - descriptions: capital first letter, end with period - minimal: less code with same functionality is ALWAYS better - noComments: NEVER add comments unless explicitly asked - preserveComments: keep existing comments, they contain important context - performance: use Map/Set, .some/.find, no spread in loops, Promise.all - simple: KISS over clever, flat over nested, explicit over implicit - typescript: - prefer: optional chaining (?.), nullish coalescing (??), const, arrow functions - use: destructuring, template literals, object shorthand, array methods - style: early returns, trust inference, inline single-use variables - react: - errorBoundary: wrap complex components with ErrorBoundary.wrap(Component, { noop: true }) - nullNotUndefined: return null for conditional rendering not undefined - forbidden: React.cloneElement, React.isValidElement, React.memo(), React.lazy, React.Children - cleanup: always return cleanup functions in useEffect - forbidden: - DOM: direct DOM manipulation (use patches) - cssOnly: CSS-only plugins - emptyCatch: empty catch blocks - hardcodedVars: hardcoded minified vars in patches (e,t,n) - settingsArrays: NEVER use settings.use() with arrays, mutate then reassign - antiPatterns{bad ⟹ good}: - "value !== null && value !== undefined" ⟹ "value" - "array && array.length > 0" ⟹ "array.length" - "settings?.store?.value" ⟹ "settings.store.value" - "value || defaultValue" ⟹ "value ?? defaultValue" +You are reviewing PRs for **Equicord**, a Discord client mod built on Vencord. It uses TypeScript, React, and webpack patching to inject into Discord. The codebase has extensive built-in utilities that contributors MUST use. Be direct, actionable, no pleasantries. Use natural, human language. Be blunt when code is bad. -patching: - core: - surgical: minimum code touched, stability over cleverness, one patch per concern - iterate: try multiple approaches, keep simplifying until you find the cleanest solution - minimize: remove any regex character that doesnt change the match result - balanced: not overengineered, not overlooked, just clean and future-proof - find: - preferIntl: use #{intl::KEY} in find when possible, most stable anchor - makeUnique: if find matches multiple modules, add nearby stable string like "),icon:" or function name - combine: "#{intl::PIN_MESSAGE}),icon:" is better than generic strings - match: - shortestPath: match only what you need to replace, let find do the targeting - intlInMatch: can use #{intl::KEY} in match too, gets canonicalized to hash - simpleWins: /#{intl::KEY}\)/ beats /label:\i\.pinned\?.{0,60}#{intl::KEY}\)/ - useAmpersand: $& keeps original, append/prepend to it - boundedGaps: .{0,50} not .+? or .*? - captureOnlyIfNeeded: only use capture groups if reusing in replace - NEVER: - hardcodedMinified: e,t,n,r,i,o,s,l,c,u,$_,xx,eD,eH,eW ⟹ use \i instead - minifiedChains: \i\.\i alone ⟹ surround with stable strings - unboundedGaps: .+? or .*? ⟹ use .{0,N} - genericPatterns: /className:\i/ alone ⟹ add anchor - rawIntlHash: .aA4Vce ⟹ #{intl::KEY_NAME} - examples: - clean: | - find: "#{intl::PIN_MESSAGE}),icon:" - match: /#{intl::PIN_MESSAGE}\)/ - replace: "$self.getPinLabel(arguments[0]))" - append: | - find: "#{intl::VIEW_AS_ROLES_MENTIONS_WARNING}" - match: /#{intl::VIEW_AS_ROLES_MENTIONS_WARNING}.{0,100}(?=])/ - replace: "$&,$self.renderTooltip(arguments[0].guild)" - wrap: | - find: "#{intl::THREE_USERS_TYPING}" - match: /(?<="aria-atomic":!0,children:)\i/ - replace: "$self.renderTypingUsers({ children: $& })" +--- -intl: - syntax: "#{intl::KEY}" or "#{intl::HASH::raw}" if key unknown - workflow: hash in code → reverse to get key → use #{intl::KEY} or fallback to #{intl::HASH::raw} +## Plugin Acceptance (Instant Reject) -pluginInterop: - checkEnabled: isPluginEnabled(name) from @api/PluginManager takes a string, checks required/isDependency/enabled - import: import the plugin directly from its path to access .name and functions - avoid: dont use Vencord.Plugins.plugins or plugin.started, dont use "as unknown as" casting - example: | - import { isPluginEnabled } from "@api/PluginManager"; - import otherPlugin from "@equicordplugins/otherPlugin"; - if (!isPluginEnabled(otherPlugin.name)) return null; - otherPlugin.someFunction(); +If a plugin breaks ANY of these, reject the entire PR. These are non-negotiable: -reference: - types: Channel, Guild, GuildMember, User, Role, Message from @vencord/discord-types - components: Paragraph, BaseText, Flex, Button, ErrorCard from @components/ - settings: use definePluginSettings from @api/Settings, not inline settings object - utilities: - clipboard: copyToClipboard from @utils/clipboard - discord: insertTextIntoChatInputBox, getCurrentChannel, getCurrentGuild, getIntlMessage, openUserProfile, openPrivateChannel, sendMessage, copyWithToast, getUniqueUsername, fetchUserProfile from @utils/discord - css: classNameFactory, classNameToSelector from @utils/css - misc: classes, sleep, isObject, isObjectEmpty, pluralise, parseUrl, identity from @utils/misc - text: formatDuration, formatDurationMs, humanFriendlyJoin, makeCodeblock, toInlineCode, escapeRegExp from @utils/text - modal: openModal, closeModal, ModalRoot, ModalHeader, ModalContent, ModalCloseButton from @utils/modal - margins: Margins from @utils/margins (Margins.top8, Margins.bottom16, etc.) - guards: isTruthy, isNonNullish from @utils/guards - web: saveFile, chooseFile from @utils/web - webpackCommon: - icons: IconUtils from @webpack/common, NEVER hardcode cdn.discordapp.com URLs - getUserAvatarURL: IconUtils.getUserAvatarURL(user, canAnimate?, size?) - getDefaultAvatarURL: IconUtils.getDefaultAvatarURL(id) - getUserBannerURL: IconUtils.getUserBannerURL({ id, banner, canAnimate?, size }) - getGuildIconURL: IconUtils.getGuildIconURL({ id, icon, size?, canAnimate? }) - getGuildBannerURL: IconUtils.getGuildBannerURL(guild, canAnimate?) - getChannelIconURL: IconUtils.getChannelIconURL({ id, icon }) - getEmojiURL: IconUtils.getEmojiURL({ id, animated, size }) - getApplicationIconURL: IconUtils.getApplicationIconURL(data) - getGameAssetURL: IconUtils.getGameAssetURL(data) - stores: UserStore, GuildStore, ChannelStore, GuildMemberStore, SelectedChannelStore, SelectedGuildStore, PresenceStore, RelationshipStore, MessageStore, EmojiStore, ThemeStore, PermissionStore, VoiceStateStore from @webpack/common - actions: RestAPI, FluxDispatcher, MessageActions, NavigationRouter, ChannelRouter, ChannelActionCreators, SettingsRouter from @webpack/common - utils: Constants (Constants.Endpoints), SnowflakeUtils, Parser, PermissionsBits, moment, lodash, ColorUtils, ImageUtils, DateUtils, UsernameUtils, DisplayProfileUtils from @webpack/common - components: Tooltip, TextInput, TextArea, Select, Slider, Avatar, Menu, Popout, ScrollerThin, Timestamp from @webpack/common - toasts: Toasts, showToast from @webpack/common - imports: - lazy: findByPropsLazy, findStoreLazy, findComponentByCodeLazy, findExportedComponentLazy from @webpack - common: useState, useEffect, useCallback, useStateFromStores from @webpack/common - neverHardcode: - cdnURLs: NEVER use "cdn.discordapp.com/avatars/", "cdn.discordapp.com/banners/", "cdn.discordapp.com/emojis/", "cdn.discordapp.com/icons/", "cdn.discordapp.com/channel-icons/" ⟹ use IconUtils - apiEndpoints: NEVER hardcode "/api/v9", "/users/@me" ⟹ use Constants.Endpoints or RestAPI - console: NEVER use console.log/warn/error ⟹ use Logger from @utils/Logger - classConcat: NEVER use `${a} ${b}` for class names ⟹ use classes(a, b) from @utils/misc - defaultAvatars: NEVER hardcode "/assets/*.png" for default avatars ⟹ use IconUtils.getDefaultAvatarURL(id) +1. **No simple slash-command plugins** (e.g. `/cat`). Should be a [user-installable Discord app](https://discord.com/developers/docs/change-log#userinstallable-apps-preview) instead. +2. **No simple text replacement plugins.** The built-in TextReplace plugin already covers this. +3. **No raw DOM manipulation.** Always use patches and React. +4. **No FakeDeafen or FakeMute.** +5. **No StereoMic-related plugins.** +6. **No UI-only hide/redesign plugins.** Use CSS for that. (Negotiable in rare cases.) +7. **No plugins targeting specific third-party Discord bots.** Official Discord apps are fine. +8. **No selfbot or API abuse.** Auto-replies, animated statuses, message pruning, Nitro snipers, etc. +9. **No untrusted third-party APIs.** Well-known services (Google, GitHub) are acceptable. +10. **No plugins requiring users to provide their own API keys.** +11. **No new dependencies** unless strictly necessary and well justified. + +--- + +## Plugin Structure + +Default export via `definePlugin` from `@utils/types`. Non-negotiable. + +```typescript +import definePlugin from "@utils/types"; +import { EquicordDevs } from "@utils/constants"; + +export default definePlugin({ + name: "PluginName", // PascalCase, matches directory name + description: "Does something.", // Capital first, period at end + authors: [EquicordDevs.Name], // EquicordDevs for new, Devs for upstream +}); +``` + +**Settings** must use `definePluginSettings` from `@api/Settings`. Reject inline `options` objects. + +```typescript +// GOOD +const settings = definePluginSettings({ + myOption: { type: OptionType.BOOLEAN, description: "Enables the feature.", default: true } +}); +export default definePlugin({ settings, /* ... */ }); + +// BAD +export default definePlugin({ options: { myOption: { /* ... */ } } }); +``` + +**Prefer declarative APIs** over manual registration: + +- `flux: { EVENT_NAME(data) {} }` not manual FluxDispatcher subscribe +- `contextMenus: { "nav-id": fn }` not manual addContextMenuPatch +- `chatBarButton: { render, icon }` not addChatBarButton +- `messagePopoverButton: { render, icon }` not addMessagePopoverButton +- `managedStyle` for CSS not manual enableStyle/disableStyle + +**Reject deprecated fields:** `renderChatBarButton`, `renderMessagePopoverButton`, `options` + +**Lifecycle balance:** anything registered in `start()` must be cleaned up in `stop()`. + +--- + +## Forbidden Patterns + +Flag these and suggest the fix: + +| Bad | Good | Reason | +|-----|------|--------| +| `value !== null && value !== undefined` | `value` or `isNonNullish(value)` | Verbose | +| `array && array.length > 0` | `array.length` | Redundant check | +| `settings?.store?.value` | `settings.store.value` | Store is always defined | +| `value \|\| defaultValue` | `value ?? defaultValue` | `\|\|` falsifies `0`, `""`, `false` | +| `` `${classA} ${classB}` `` | `classes(classA, classB)` | Handles null/false gracefully | +| `"vc-plugin-class"` hardcoded | `cl("class")` via `classNameFactory` | Consistent, typo-proof | +| `console.log/warn/error` | Remove it | No logging in plugin code | +| `new Logger(...)` / `logger.log(...)` | Remove it | No logging in plugin code | +| `cdn.discordapp.com/avatars/...` | `IconUtils.getUserAvatarURL(user)` | Handles animated, sizing, CDN | +| `cdn.discordapp.com/icons/...` | `IconUtils.getGuildIconURL(...)` | Same | +| `cdn.discordapp.com/banners/...` | `IconUtils.getUserBannerURL(...)` | Same | +| `cdn.discordapp.com/emojis/...` | `IconUtils.getEmojiURL(...)` | Same | +| `/api/v9/...` or `/users/@me` | `Constants.Endpoints.*` or `RestAPI` | Endpoints change | +| `@api/Styles` for classNameFactory | `@utils/css` | `@api/Styles` is deprecated | +| `any` for Discord objects | Import from `@vencord/discord-types` | Type safety | +| `as unknown as` casting | Find the correct type | Unsafe | +| `React.memo()` | Remove it | Not needed | +| `React.cloneElement` / `React.isValidElement` / `React.Children` | Find another approach | Forbidden | +| `React.lazy(() => import(...))` | `LazyComponent` from `@utils/lazyReact` | Framework-integrated | +| Empty `catch {}` | Handle the error (toast, fallback, rethrow) | Silent failures | +| CSS-only plugins | Must have actual logic/patches | Not allowed | +| Commented-out dead code | Delete it | Git has history | +| `document.querySelector(...)` | Use webpack patches | DOM manipulation forbidden | +| `Vencord.Plugins.plugins["X"]` | `isPluginEnabled` + direct import | Proper interop | +| `plugin.started` check | `isPluginEnabled(plugin.name)` | Proper interop | +| Unexplained magic numbers | Named constants | Readability | +| Unused imports | Remove them | Cleanliness | + +--- + +## TypeScript and Code Style + +**Prefer:** `?.` optional chaining, `??` nullish coalescing, `const`, arrow functions, destructuring, template literals, object shorthand, array methods (`.map`, `.filter`, `.find`, `.some`). + +**Style:** early returns over nested conditions, trust TypeScript inference (don't annotate obvious types), inline single-use variables, flat over nested, explicit over implicit. + +**Less is more.** Less code with the same functionality is always better. KISS over clever. + +**No comments.** Never add comments unless explicitly asked. However, preserve existing comments as they contain important context. + +```typescript +// GOOD — early return, destructuring, inference, no comments +const getUser = (id: string) => { + const user = UserStore.getUser(id); + if (!user) return null; + const { username, discriminator } = user; + return `${username}#${discriminator}`; +}; + +// BAD — nested, verbose, unnecessary annotations +function getUser(id: string): string | null { + // Get the user from the store + const user = UserStore.getUser(id); + if (user) { + const username: string = user.username; + const discriminator: string = user.discriminator; + return username + "#" + discriminator; + } else { + return null; + } +} +``` + +Note: ESLint already enforces `prefer-const`, `prefer-destructuring`, `eqeqeq`, strict equality, unused imports, and import sorting. Focus review on patterns ESLint cannot catch: code philosophy, unnecessary complexity, missing early returns, and unnecessary comments. + +--- + +## React + +**Conditional rendering:** return `null`, never `undefined` or bare `return;` + +**ErrorBoundary:** wrap complex components: `ErrorBoundary.wrap(MyComponent, { noop: true })` + +**useEffect cleanup:** always return cleanup when subscribing to events, timers, or resources: + +```typescript +useEffect(() => { + const handler = () => { /* ... */ }; + window.addEventListener("resize", handler); + return () => window.removeEventListener("resize", handler); +}, []); +``` + +--- + +## Discord Types + +Never use `any` for Discord objects. Import proper types: + +```typescript +import { User, Channel, Guild, GuildMember, Message, Role } from "@vencord/discord-types"; +``` + +Store types, component prop types, and action types are all available. Never use `as unknown as` casting as a workaround. + +--- + +## CSS and Class Names + +**Every plugin** must use `classNameFactory` from `@utils/css` for class names: + +```typescript +import { classNameFactory } from "@utils/css"; +const cl = classNameFactory("vc-my-plugin-"); +cl("container") // "vc-my-plugin-container" +``` + +**Combining classes** from different sources: use `classes()` from `@utils/misc`: + +```typescript +className={classes(cl("wrapper"), someDiscordClass, isActive && cl("active"))} +``` + +--- + +## Settings + +- `settings.store.key` — reactive, auto-persists (React components) +- `settings.plain.key` — non-reactive raw value (performance-critical code) +- **Never** `settings.use()` with arrays in variables. Mutate then reassign instead. + +--- + +## Patch Quality + +Patches modify Discord's minified webpack modules. Stability is paramount. + +- **One patch per concern.** Each replacement does one thing. +- **Surgical.** Match only what needs replacing, let `find` target the module. +- **No hardcoded minified vars.** Never `e`, `t`, `n`, `r`, `i`, `eD`, `eH` etc. Use `\i`. +- **Bounded gaps.** `.{0,50}` not `.+?` or `.*?` (unbounded = cross-match bugs). +- **No generic patterns.** `/className:\i/` alone is too broad. Add stable anchors. +- **No raw intl hashes.** Use `#{intl::KEY_NAME}` not `.aA4Vce`. +- **Capture groups only when reused** in replace via `$1`, `$2`. +- **`$&`** for append/prepend, **`$self`** for plugin method calls. + +```typescript +// GOOD +patches: [{ + find: "#{intl::PIN_MESSAGE}),icon:", + replacement: { + match: /#{intl::PIN_MESSAGE}\)/, + replace: "$self.getPinLabel(arguments[0]))" + } +}] + +// BAD +patches: [{ + find: "pinMessage", + replacement: { + match: /label:e\.pinned\?.+?pinMessage\)/, + replace: "$self.getPinLabel(e))" + } +}] +``` + +--- + +## Plugin Interop + +```typescript +// GOOD +import { isPluginEnabled } from "@api/PluginManager"; +import otherPlugin from "@equicordplugins/otherPlugin"; +if (!isPluginEnabled(otherPlugin.name)) return null; +otherPlugin.someFunction(); + +// BAD +Vencord.Plugins.plugins["OtherPlugin"].someFunction(); +(somePlugin as unknown as { method(): void }).method(); +``` + +--- + +## Text and Descriptions + +- Plugin and setting descriptions: capital first letter, end with period. +- Error messages and toasts: natural human text, no dashes or robotic formatting. + +```typescript +// GOOD +description: "Adds a button to copy message content." +showToast("Module not found"); + +// BAD +description: "adds a button to copy message content" +showToast("Module - not found"); +``` + +--- + +## Performance + +- `Map`/`Set` for frequent lookups, not arrays +- `.find()` / `.some()` not `.filter()[0]` +- No spread `...` in loops +- `Promise.all()` for parallel async + +--- + +## Memory Leaks and Cleanup + +Plugins that don't use patches don't require a Discord restart to apply. Their `start()` and `stop()` must work cleanly so users can toggle them on/off without leaking resources. + +**Every `start()` must have a matching `stop()`.** If `start()` subscribes, registers, or creates anything, `stop()` must undo it. Common leaks to flag: + +- Event listeners added but never removed (FluxDispatcher, DOM events, MessageEvents) +- Intervals/timeouts set but never cleared +- MutationObservers created but never disconnected +- Context menu patches added but never removed (use declarative `contextMenus` instead) +- Chat bar buttons added but never removed (use declarative `chatBarButton` instead) +- Styles enabled but never disabled (use `managedStyle` instead) +- Flux subscriptions without corresponding unsubscriptions + +**Prefer declarative APIs** that handle cleanup automatically: `flux`, `contextMenus`, `chatBarButton`, `messagePopoverButton`, `managedStyle`. These don't need manual cleanup. + +**useEffect must return cleanup** when it creates subscriptions, timers, observers, or any persistent resource. No exceptions. + +**Watch for stale closures and references.** If a plugin stores references to DOM nodes, channels, or users in module scope, check that they're nulled out in `stop()`. + +```typescript +// GOOD — clean start/stop, no leaks +start() { + this.interval = setInterval(this.update, 5000); + document.addEventListener("visibilitychange", this.onVisibilityChange); +}, +stop() { + clearInterval(this.interval); + document.removeEventListener("visibilitychange", this.onVisibilityChange); +} + +// BAD — leaks interval and listener forever +start() { + setInterval(this.update, 5000); + document.addEventListener("visibilitychange", this.onVisibilityChange); +}, +stop() {} +``` + +--- + +## Code Hygiene + +- **Delete dead code**, don't comment it out. Git preserves history. +- **No overengineering.** No premature abstractions, no "just in case" handling, no features not requested. Three similar lines beats a one-use helper. If code can be half the size and do the same thing, it should be. +- **No bloat.** Flag unnecessary wrapper functions, redundant type annotations, excessive error handling for things that can't fail, useless try/catch around synchronous code, or 50 lines doing what 10 could do. Code should be lean. +- **No unused imports.** Every import must be referenced. +- **No logging in plugin code.** No `console.log/warn/error`, no `Logger`. Remove all logging statements. +- **No empty catch blocks.** Handle every error (show toast, return fallback, rethrow, etc.). + +--- + +## AI Slop Detection + +If a PR shows signs of being AI-generated, mention it but **still review the code fully**. Do not reject or stop reviewing just because it looks AI-generated. Note it as an observation, then continue reviewing every issue as you normally would. Common AI slop patterns: + +- Excessive comments explaining obvious code ("// get the user", "// check if null", "// return the result") +- Overly verbose variable names that read like sentences (`isUserCurrentlyLoggedInToTheApplication`) +- Unnecessary abstractions and wrapper functions for trivial operations +- "Just in case" error handling everywhere, including places that can never fail +- Reimplementing utilities that already exist in the codebase (check the Built-in Utilities section) +- Generic, boilerplate-heavy code that looks like it was prompted with "write a Discord plugin that..." +- Excessive JSDoc/TSDoc on every function, even internal one-liners +- Overly defensive coding: null checks on things that are never null, type guards on known types +- Cookie-cutter patterns repeated without understanding (e.g. wrapping every single line in try/catch) +- Descriptions and messages that sound robotic or templated rather than human-written + +If you suspect it, say something like: "This looks like it might be AI-generated. There's a lot of unnecessary comments, over-engineering, and reimplemented utilities." Then proceed with the full review, flagging every concrete issue as usual. + +--- + +## Built-in Utilities Reference + +If a PR reimplements any of these, flag it. They already exist: + +**@utils/misc:** `classes`, `sleep`, `isObject`, `isObjectEmpty`, `parseUrl`, `pluralise`, `identity` +**@utils/guards:** `isTruthy`, `isNonNullish` +**@utils/text:** `formatDuration`, `formatDurationMs`, `humanFriendlyJoin`, `makeCodeblock`, `toInlineCode`, `escapeRegExp` +**@utils/discord:** `getCurrentChannel`, `getCurrentGuild`, `getIntlMessage`, `openPrivateChannel`, `insertTextIntoChatInputBox`, `sendMessage`, `copyWithToast`, `openUserProfile`, `fetchUserProfile`, `getUniqueUsername`, `openInviteModal` +**@utils/css:** `classNameFactory`, `classNameToSelector` +**@utils/clipboard:** `copyToClipboard` +**@utils/modal:** `openModal`, `closeModal`, `ModalRoot`, `ModalHeader`, `ModalContent`, `ModalFooter`, `ModalCloseButton` +**@utils/margins:** `Margins.top8`, `.top16`, `.bottom8`, `.bottom16` etc. +**@utils/web:** `saveFile`, `chooseFile` +**@utils/lazy:** `proxyLazy`, `makeLazy` +**@utils/lazyReact:** `LazyComponent` +**@utils/react:** `useAwaiter`, `useForceUpdater`, `useTimer` +**@api/DataStore:** `get`, `set`, `del` (IndexedDB, async) +**@api/Commands:** `sendBotMessage`, `findOption` + +**@webpack/common:** + +- Stores: `UserStore`, `GuildStore`, `ChannelStore`, `GuildMemberStore`, `SelectedChannelStore`, `SelectedGuildStore`, `PresenceStore`, `RelationshipStore`, `MessageStore`, `EmojiStore`, `ThemeStore`, `PermissionStore`, `VoiceStateStore`, 30+ more +- Actions: `RestAPI`, `FluxDispatcher`, `MessageActions`, `NavigationRouter`, `ChannelRouter`, `ChannelActionCreators`, `SettingsRouter` +- Utils: `Constants` (`.Endpoints`), `SnowflakeUtils`, `Parser`, `PermissionsBits`, `moment`, `lodash`, `IconUtils`, `ColorUtils`, `ImageUtils`, `DateUtils`, `UsernameUtils`, `DisplayProfileUtils` +- Components: `Tooltip`, `TextInput`, `TextArea`, `Select`, `Slider`, `Avatar`, `Menu`, `Popout`, `ScrollerThin`, `Timestamp`, `MaskedLink`, `ColorPicker` +- Toasts: `Toasts`, `showToast` +- React: `useState`, `useEffect`, `useCallback`, `useStateFromStores` + +**@webpack finders:** `findByPropsLazy`, `findByCodeLazy`, `findStoreLazy`, `findComponentByCodeLazy`, `findExportedComponentLazy` + +**@components/:** `ErrorBoundary`, `Flex`, `Button`, `Paragraph`, `Heading`, `BaseText`, `Span`, `ErrorCard`, `Link`, `CodeBlock`, `FormSwitch` + +--- + +## Review Severity + +1. **CRITICAL** — `any` types, hardcoded CDN/API URLs, direct DOM manipulation, security issues, massive overengineering/bloat, suspected AI slop (note it, but still review everything) +2. **HIGH** — Missing useEffect cleanup, forbidden React APIs, hardcoded class names, logging statements (console or Logger), missing definePluginSettings, unnecessary abstractions +3. **MEDIUM** — Anti-patterns (`||` instead of `??`), utility reimplementations, commented-out code, bad description format, excessive comments +4. **LOW** — Style preferences, minor performance wins, organization diff --git a/.rules b/.rules new file mode 100644 index 000000000..061408c20 --- /dev/null +++ b/.rules @@ -0,0 +1,212 @@ +# Equicord Development Guidelines + +## Critical Rules + +- **NEVER** edit existing license headers. New files use 2026. +- Push back when the user idea is wrong or not correct. +- **NEVER** git checkout files without explicit permission. +- Always verify components/functions arent deprecated before using. +- **NEVER** use `any` for Discord objects. Import proper types from `@vencord/discord-types`. +- Fix with smallest possible change. No refactoring unless explicitly asked. +- Solve the problem at hand only. No patterns for patterns sake. +- **NEVER** overengineer. No premature abstractions, no helpers for one-time operations, no building for hypothetical futures. Three similar lines is better than a premature abstraction. +- Write modern, robust, professional code. Use current language features, proper error handling, and clean structure. +- Write natural human text in errors, descriptions, messages. No dashes or robotic formatting. Write like "Module not found" not "Module - not found". Keep it simple and conversational. + +## Code Rules + +- **DELETE** dead code, dont comment it. Git preserves history. +- No hardcoded values, unused imports, magic numbers. +- Import `classNameFactory` from `@utils/css` (NOT `@api/Styles` which is deprecated). **ALWAYS** use `cl()` for class names, never hardcode strings like `"vc-plugin-name-class"`. +- When combining multiple class names use `classes()` from `@utils/misc`, not template strings like `` `${a} ${b}` ``. +- Use utilities from `@utils/`, `@api/`, `@components/`. +- Use `Logger` from `@utils/Logger`, not `console.log`. +- Descriptions: capital first letter, end with period. +- Less code with same functionality is **ALWAYS** better. If it can be done in fewer lines without losing clarity, do it. +- Keep logic flat. Avoid deep nesting, prefer early returns, guard clauses, and simple control flow. +- **NEVER** add comments unless explicitly asked. +- Keep existing comments, they contain important context. +- Use `Map`/`Set`, `.some`/`.find`, no spread in loops, `Promise.all`. +- KISS over clever, flat over nested, explicit over implicit. + +## TypeScript + +- **Prefer:** optional chaining (`?.`), nullish coalescing (`??`), `const`, arrow functions +- **Use:** destructuring, template literals, object shorthand, array methods +- **Style:** early returns, trust inference, inline single-use variables + +## React + +- Wrap complex components with `ErrorBoundary.wrap(Component, { noop: true })`. +- Return `null` for conditional rendering, not `undefined`. +- **Forbidden:** `React.cloneElement`, `React.isValidElement`, `React.memo()`, `React.lazy`, `React.Children` +- Always return cleanup functions in `useEffect`. + +## Forbidden + +### Code + +- **No raw DOM manipulation.** No `document.querySelector`, no `MutationObserver`, no `element.style`. Always use webpack patches and React. +- Empty catch blocks. +- Hardcoded minified vars in patches (`e,t,n`). +- **NEVER** use `settings.use()` with arrays. Mutate then reassign. + +### Plugins + +- **No selfbot or API abuse.** Nothing that automates user actions, spoofs client state, or abuses Discord's API in any way. +- No plugins that only do something trivially achievable with existing built-in plugins or Discord features. +- No CSS-only plugins that only hide or redesign UI elements. +- No plugins targeting specific third-party bots (official Discord apps are fine). +- No untrusted third-party APIs. No plugins requiring users to supply their own API keys. +- Do not introduce new dependencies unless strictly necessary and well justified. + +## Anti-Patterns + +- `value !== null && value !== undefined` ⟹ `value` +- `array && array.length > 0` ⟹ `array.length` +- `settings?.store?.value` ⟹ `settings.store.value` +- `value || defaultValue` ⟹ `value ?? defaultValue` + +## Patching + +### Core Principles + +- Minimum code touched. Stability over cleverness. One patch per concern. +- Try multiple approaches, keep simplifying until you find the cleanest solution. +- Remove any regex character that doesnt change the match result. +- Not overengineered, not overlooked, just clean and future-proof. + +### Find Strings + +- Use `#{intl::KEY}` in find when possible, most stable anchor. +- If find matches multiple modules, add nearby stable string like `"),icon:"` or function name. +- `"#{intl::PIN_MESSAGE}),icon:"` is better than generic strings. + +### Match Patterns + +- Match only what you need to replace, let find do the targeting. +- Can use `#{intl::KEY}` in match too, gets canonicalized to hash. +- `/#{intl::KEY}\)/` beats `/label:\i\.pinned\?.{0,60}#{intl::KEY}\)/` +- `$&` keeps original, append/prepend to it. +- Use bounded gaps: `.{0,50}` not `.+?` or `.*?` +- Only use capture groups if reusing in replace. + +### NEVER Do + +- **Hardcoded minified vars:** `e,t,n,r,i,o,s,l,c,u,$_,xx,eD,eH,eW` — use `\i` instead +- **Minified chains:** `\i\.\i` alone — surround with stable strings +- **Unbounded gaps:** `.+?` or `.*?` — use `.{0,N}` +- **Generic patterns:** `/className:\i/` alone — add anchor +- **Raw intl hashes:** `.aA4Vce` — use `#{intl::KEY_NAME}` + +### Patch Examples + +**Clean replacement:** + +```js +find: "#{intl::PIN_MESSAGE}),icon:" +match: /#{intl::PIN_MESSAGE}\)/ +replace: "$self.getPinLabel(arguments[0]))" +``` + +**Appending:** + +```js +find: "#{intl::VIEW_AS_ROLES_MENTIONS_WARNING}" +match: /#{intl::VIEW_AS_ROLES_MENTIONS_WARNING}.{0,100}(?=])/ +replace: "$&,$self.renderTooltip(arguments[0].guild)" +``` + +**Wrapping:** + +```js +find: "#{intl::THREE_USERS_TYPING}" +match: /(?<="aria-atomic":!0,children:)\i/ +replace: "$self.renderTypingUsers({ children: $& })" +``` + +## Plugin Interop + +- `isPluginEnabled(name)` from `@api/PluginManager` takes a string, checks required/isDependency/enabled. +- Import the plugin directly from its path to access `.name` and functions. +- Dont use `Vencord.Plugins.plugins` or `plugin.started`. Dont use `"as unknown as"` casting. + +```ts +import { isPluginEnabled } from "@api/PluginManager"; +import otherPlugin from "@equicordplugins/otherPlugin"; +if (!isPluginEnabled(otherPlugin.name)) return null; +otherPlugin.someFunction(); +``` + +## Reference + +### Types + +`Channel`, `Guild`, `GuildMember`, `User`, `Role`, `Message` from `@vencord/discord-types` + +### Components + +`Paragraph`, `BaseText`, `Flex`, `Button`, `ErrorCard` from `@components/` + +### Settings + +Use `definePluginSettings` from `@api/Settings`, not inline settings object. + +### Utilities + +- **@utils/clipboard** — `copyToClipboard` +- **@utils/discord** — `insertTextIntoChatInputBox`, `getCurrentChannel`, `getCurrentGuild`, `getIntlMessage`, `openUserProfile`, `openPrivateChannel`, `sendMessage`, `copyWithToast`, `getUniqueUsername`, `fetchUserProfile` +- **@utils/css** — `classNameFactory`, `classNameToSelector` +- **@utils/misc** — `classes`, `sleep`, `isObject`, `isObjectEmpty`, `pluralise`, `parseUrl`, `identity` +- **@utils/text** — `formatDuration`, `formatDurationMs`, `humanFriendlyJoin`, `makeCodeblock`, `toInlineCode`, `escapeRegExp` +- **@utils/modal** — `openModal`, `closeModal`, `ModalRoot`, `ModalHeader`, `ModalContent`, `ModalCloseButton` +- **@utils/margins** — `Margins` (`Margins.top8`, `Margins.bottom16`, etc.) +- **@utils/guards** — `isTruthy`, `isNonNullish` +- **@utils/web** — `saveFile`, `chooseFile` + +### Webpack Common + +#### IconUtils + +From `@webpack/common`. **NEVER** hardcode `cdn.discordapp.com` URLs. + +- `IconUtils.getUserAvatarURL(user, canAnimate?, size?)` +- `IconUtils.getUserBannerURL({ id, banner, canAnimate?, size })` +- `IconUtils.getGuildIconURL({ id, icon, size?, canAnimate? })` +- `IconUtils.getGuildBannerURL(guild, canAnimate?)` +- `IconUtils.getChannelIconURL({ id, icon })` +- `IconUtils.getEmojiURL({ id, animated, size })` +- `IconUtils.getApplicationIconURL(data)` +- `IconUtils.getGameAssetURL(data)` + +#### Stores + +`UserStore`, `GuildStore`, `ChannelStore`, `GuildMemberStore`, `SelectedChannelStore`, `SelectedGuildStore`, `PresenceStore`, `RelationshipStore`, `MessageStore`, `EmojiStore`, `ThemeStore`, `PermissionStore`, `VoiceStateStore` from `@webpack/common` + +#### Actions + +`RestAPI`, `FluxDispatcher`, `MessageActions`, `NavigationRouter`, `ChannelRouter`, `ChannelActionCreators`, `SettingsRouter` from `@webpack/common` + +#### Utils + +`Constants` (`Constants.Endpoints`), `SnowflakeUtils`, `Parser`, `PermissionsBits`, `moment`, `lodash`, `ColorUtils`, `ImageUtils`, `DateUtils`, `UsernameUtils`, `DisplayProfileUtils`, `URLUtils`, `Humanize`, `EmojiUtils` from `@webpack/common` + +#### Components + +`Tooltip`, `TextInput`, `TextArea`, `Select`, `Slider`, `Avatar`, `Menu`, `Popout`, `ScrollerThin`, `Timestamp` from `@webpack/common` + +#### Toasts + +`Toasts`, `showToast` from `@webpack/common` + +### Imports + +- **Lazy** from `@webpack` — `findByPropsLazy`, `findStoreLazy`, `findComponentByCodeLazy`, `findExportedComponentLazy` +- **Common** from `@webpack/common` — `useState`, `useEffect`, `useCallback`, `useStateFromStores` + +### Never Hardcode + +- `"cdn.discordapp.com/avatars/"` etc. ⟹ `IconUtils` +- `"/api/v9"`, `"/users/@me"` ⟹ `Constants.Endpoints` or `RestAPI` +- `console.log/warn/error` ⟹ `Logger` from `@utils/Logger` +- `` `${a} ${b}` `` for class names ⟹ `classes(a, b)` from `@utils/misc` diff --git a/AGENTS.md b/AGENTS.md new file mode 120000 index 000000000..8a63b64bd --- /dev/null +++ b/AGENTS.md @@ -0,0 +1 @@ +.rules \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 000000000..8a63b64bd --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +.rules \ No newline at end of file diff --git a/GEMINI.md b/GEMINI.md new file mode 120000 index 000000000..8a63b64bd --- /dev/null +++ b/GEMINI.md @@ -0,0 +1 @@ +.rules \ No newline at end of file diff --git a/browser/VencordNativeStub.ts b/browser/VencordNativeStub.ts index 139bcd972..46cba9d0c 100644 --- a/browser/VencordNativeStub.ts +++ b/browser/VencordNativeStub.ts @@ -139,6 +139,5 @@ window.VencordNative = { setUpdateState: NOOP, onCheckUpdates: NOOP, onRepair: NOOP, - onAbout: NOOP, }, }; diff --git a/misc/keys-mapping.json b/misc/keys-mapping.json index 97d12f7b8..38aa8e301 100644 --- a/misc/keys-mapping.json +++ b/misc/keys-mapping.json @@ -1,4 +1,5 @@ { + "323362": "MEMBER_VERIFICATION_FORM_VERIFICATION_SETTINGS", "hPBScv": "A11Y_ANDROID_DISMISS_CONTEXT_MENU_LABEL", "ZqK0uI": "A11Y_ANDROID_POPUP_WINDOW_ANNOUNCEMENT", "NstziV": "A11Y_ANNOUNCEMENT_AVATAR_CHANGED", @@ -10,21 +11,30 @@ "YdUwBS": "A11Y_ANNOUNCEMENT_CUSTOM_STATUS_DELETED", "nRbucl": "A11Y_ANNOUNCEMENT_DM_CLOSED", "ndXVI5": "A11Y_ANNOUNCEMENT_DM_CLOSED_FAILED", + "L3UUha": "A11Y_ANNOUNCEMENT_EMOJI_DELETED", "3goNa5": "A11Y_ANNOUNCEMENT_FRIEND_ACCEPT_REQUEST", "pLUaxR": "A11Y_ANNOUNCEMENT_FRIEND_CANCEL_REQUEST", "vGSLa2": "A11Y_ANNOUNCEMENT_FRIEND_REMOVED", + "taJiuc": "A11Y_ANNOUNCEMENT_GAME_FRIEND_ACCEPT_REQUEST", + "XMf21q": "A11Y_ANNOUNCEMENT_GAME_FRIEND_CANCEL_REQUEST", + "zRf8cO": "A11Y_ANNOUNCEMENT_GAME_FRIEND_REMOVED", "n6Jo3E": "A11Y_ANNOUNCEMENT_GENERIC_FAIL", "RYMs7s": "A11Y_ANNOUNCEMENT_MESSAGE_DELETED", "0x1HBD": "A11Y_ANNOUNCEMENT_MESSAGE_EDITED", "Hym4ix": "A11Y_ANNOUNCEMENT_MESSAGE_EDITED_AUTOMOD_BLOCKED", "Atp7FP": "A11Y_ANNOUNCEMENT_MESSAGE_EDITED_FAILED", + "FY/yLY": "A11Y_ANNOUNCEMENT_SERVER_CREATED_SUCCESS", "dO2aLi": "A11Y_ANNOUNCEMENT_STATUS_CHANGED", "cU0t1F": "A11Y_ANNOUNCEMENT_USER_ADDED_TO_GROUP_DM", "8GEdej": "A11Y_ANNOUNCEMENT_USER_ADDED_TO_GROUP_DM_FAILED", + "mU0Vrp": "A11Y_ANNOUNCEMENT_USER_BLOCKED", + "Us93Ca": "A11Y_ANNOUNCEMENT_USER_IGNORED", "9t1au7": "A11Y_ANNOUNCEMENT_USER_UNBLOCKED", + "QlH5w6": "A11Y_ANNOUNCEMENT_USER_UNIGNORED", "8rmtbd": "A11Y_ANNOUNCEMENT_VOICE_CHANNEL_EFFECTS_DOUBLE", "/okjv0": "A11Y_ANNOUNCEMENT_VOICE_CHANNEL_EFFECTS_MULTIPLE", "yZYxzF": "A11Y_ANNOUNCEMENT_VOICE_CHANNEL_EFFECTS_SINGLE", + "bM+M/m": "A11Y_BREADCRUMB_LABEL", "xb78ZZ": "A11Y_CHECKBOX_CHECKED", "wviqA6": "A11Y_CHECKBOX_UNCHECKED", "Xkfav5": "A11Y_DISMISS_ALERT_MODAL", @@ -41,6 +51,7 @@ "f5bxam": "A11Y_ROLE_SWITCH", "/SCpvi": "A11Y_ROLE_VIDEO_BUTTON", "CI0vSJ": "ABOUT", + "fcYgiY": "ABOUT_AND_POLICIES", "GfRGrd": "ABOUT_THIS_APP", "MMlhsr": "ACCEPT", "qzGIIj": "ACCEPT_DM_HEADER", @@ -53,10 +64,15 @@ "itI+hs": "ACCEPT_SPAM_DM_SUBTEXT", "ozgtNp": "ACCEPT_SPAM_DM_SUBTEXT_MOBILE", "G0neg7": "ACCESSIBILITY", + "XVR0Rb": "ACCESSIBILITY_AUDIO_AND_SCREEN_READER", + "rT3Pq5": "ACCESSIBILITY_CHAT_TEXT_SIZE_LABEL", + "LXUhen": "ACCESSIBILITY_CHAT_TEXT_SIZE_DESCRIPTION", + "NamzcL": "ACCESSIBILITY_COLOR", "yF54Ks": "ACCESSIBILITY_DARK_SIDEBAR", "2RHHgz": "ACCESSIBILITY_EXAMPLE_BUTTON_LABEL", "OU3q8a": "ACCESSIBILITY_FONT_SCALE_CLASSIC_HINT", "gFob3e": "ACCESSIBILITY_FONT_SCALE_CLASSIC_LABEL", + "XrtbPo": "ACCESSIBILITY_FONT_SCALING_DESCRIPTION", "qPOqoK": "ACCESSIBILITY_FONT_SCALING_LABEL", "NWq6XF": "ACCESSIBILITY_FONT_SCALING_USE_APP", "x3KGJu": "ACCESSIBILITY_FONT_SCALING_USE_OS", @@ -64,6 +80,8 @@ "AdSAD7": "ACCESSIBILITY_FORCED_COLORS_MODAL_BODY", "/nmBUl": "ACCESSIBILITY_FORCED_COLORS_MODAL_HEADER", "P7DkgR": "ACCESSIBILITY_FORCED_COLORS_MODAL_LEARN_MORE", + "aZlePv": "ACCESSIBILITY_HIGH_CONTRAST_MODE_ENABLE", + "v2qF8+": "ACCESSIBILITY_HIGH_CONTRAST_MODE_DESCRIPTION", "Ex79K6": "ACCESSIBILITY_LOADING_TIP_1", "FVVp79": "ACCESSIBILITY_LOADING_TIP_10", "+v5zsT": "ACCESSIBILITY_LOADING_TIP_2", @@ -81,11 +99,22 @@ "2l9U2j": "ACCESSIBILITY_PREFERS_REDUCED_MOTION_DESCRIPTION", "b3XBzg": "ACCESSIBILITY_PREFERS_REDUCED_MOTION_ENABLE", "1dT9V4": "ACCESSIBILITY_REDUCED_MOTION_SETTINGS_OVERRIDE", + "DIX3ke": "ACCESSIBILITY_SETTINGS_ALWAYS_SHOW_LINK_DECORATIONS_DESCRIPTION", "OLZFB8": "ACCESSIBILITY_SETTINGS_ALWAYS_SHOW_LINK_DECORATIONS_LABEL", "72i5GI": "ACCESSIBILITY_SETTINGS_ALWAYS_SHOW_LINK_DECORATIONS_NOTE", "DHpTjT": "ACCESSIBILITY_SETTINGS_APPEARANCE_LINK", "TYyfO/": "ACCESSIBILITY_SETTINGS_CONTRAST", "Ax4Pgn": "ACCESSIBILITY_SETTINGS_CONTRAST_MOBILE_DESCRIPTION", + "+Isihb": "ACCESSIBILITY_SETTINGS_CUSTOM_CURSOR_LABEL", + "nNZ1Tz": "ACCESSIBILITY_SETTINGS_CUSTOM_CURSOR_NOTE", + "HEO0s3": "ACCESSIBILITY_SETTINGS_DESATURATE_CUSTOM_COLORS_DESCRIPTION", + "OCJg5f": "ACCESSIBILITY_SETTINGS_DESATURATE_CUSTOM_COLORS_TITLE", + "O/Gjvn": "ACCESSIBILITY_SETTINGS_HDR_DESCRIPTION", + "Qj75ck": "ACCESSIBILITY_SETTINGS_HDR_NO_LIMIT_DESCRIPTION", + "D5Fma9": "ACCESSIBILITY_SETTINGS_HDR_NO_LIMIT_LABEL", + "+V/bDk": "ACCESSIBILITY_SETTINGS_HDR_STANDARD_DESCRIPTION", + "ldcGIH": "ACCESSIBILITY_SETTINGS_HDR_STANDARD_LABEL", + "nemtgW": "ACCESSIBILITY_SETTINGS_HDR_TITLE", "etAGEi": "ACCESSIBILITY_SETTINGS_INCREASE_CONTRAST", "BT8Bmp": "ACCESSIBILITY_SETTINGS_PROFILE_COLORS_TITLE", "sSY+mD": "ACCESSIBILITY_SETTINGS_PROFILE_THEMES_DESCRIPTION", @@ -104,23 +133,30 @@ "bB80LC": "ACCESSIBILITY_SETTINGS_SATURATION_LINK_PREVIEW_MESSAGE", "h0MJQp": "ACCESSIBILITY_SETTINGS_SATURATION_PREVIEW_MESSAGE", "5PWWCY": "ACCESSIBILITY_SETTINGS_SATURATION_TITLE", + "XYvMIX": "ACCESSIBILITY_SETTINGS_SHOW_IMAGE_DESCRIPTIONS_TITLE", "GwEVE2": "ACCESSIBILITY_SETTINGS_SYNC_FORCED_COLORS_DESCRIPTION", "GEFB0k": "ACCESSIBILITY_SETTINGS_SYNC_FORCED_COLORS_DESCRIPTION_WITH_FEEDBACK", "cguiec": "ACCESSIBILITY_SETTINGS_SYNC_FORCED_COLORS_LABEL", - "UPwh1I": "ACCESSIBILITY_SETTINGS_TAGS_LABEL", - "UQt6de": "ACCESSIBILITY_SETTINGS_TAGS_TITLE", + "Ci4wMS": "ACCESSIBILITY_SETTINGS_TTS_RATE_DESCRIPTION", "ZSZEdS": "ACCESSIBILITY_SETTINGS_TTS_RATE_FASTER", "lsW5Ev": "ACCESSIBILITY_SETTINGS_TTS_RATE_LABEL", "hymc8s": "ACCESSIBILITY_SETTINGS_TTS_RATE_PREVIEW", "493lwX": "ACCESSIBILITY_SETTINGS_TTS_RATE_SLOWER", "PKaNJL": "ACCESSIBILITY_SETTINGS_TTS_RATE_TEST", + "3QuI9+": "ACCESSIBILITY_SWITCH_ICONS_DESCRIPTION", + "S3z+pV": "ACCESSIBILITY_SWITCH_ICONS_ENABLE", + "bxh/R7": "ACCESSIBILITY_TEXT_READABILITY", + "VKYWk8": "ACCESSIBILITY_VISUAL_DENSITY", + "x9PK/3": "ACCESSIBILITY_ZOOM_LEVEL_DESCRIPTION", "i19n5L": "ACCESSIBILITY_ZOOM_LEVEL_LABEL", "zR3S91": "ACCESSIBILITY_ZOOM_LEVEL_VALUE_LABEL", "ldCE/p": "ACCOUNT", "StREWK": "ACCOUNT_A11Y_LABEL", "6eNTWe": "ACCOUNT_DISABLED_DESCRIPTION", "j3rC+U": "ACCOUNT_DISABLED_TITLE", + "18wnuD": "ACCOUNT_INPUT_DEVICE_CHANGED", "5V0AkP": "ACCOUNT_MANAGEMENT", + "f+DDY/": "ACCOUNT_OUTPUT_DEVICE_CHANGED", "7x+jYV": "ACCOUNT_REVERT_CONFIRM_CERTAIN_TEXT", "GgCRqR": "ACCOUNT_REVERT_CONFIRM_PROCEED", "bChnKs": "ACCOUNT_REVERT_ERROR_ACCOUNT_NOT_FOUND", @@ -166,13 +202,10 @@ "LCutYV": "ACTIVE_CHANNELS_MANY_MESSAGES", "z0qML2": "ACTIVE_FORUM_POST_COUNT", "TxqPQR": "ACTIVE_NOW", - "24VUR9": "ACTIVE_ON_MOBILE", "TM6err": "ACTIVE_THREADS", "VNYs2v": "ACTIVE_THREADS_POPOUT_HEADER", "ioVdO2": "ACTIVE_THREADS_POPOUT_HEADER_FORUM", "4qdZ93": "ACTIVE_THREADS_POPOUT_LINK", - "ahWaPW": "ACTIVE_THREADS_UPSELL_CONTENT", - "hLUL3s": "ACTIVE_THREADS_UPSELL_HEADER", "JaQt8W": "ACTIVITIES_EARLY_USER_COACH_MARK_BODY", "S1e4lK": "ACTIVITIES_EARLY_USER_COACH_MARK_HEADER", "z1YqQL": "ACTIVITIES_EXPERIMENT_SUNSET_ANCHOR", @@ -217,7 +250,6 @@ "sau5tt": "ACTIVITY_FEED_NOW_PLAYING_MULTIPLE_GAMES", "rmnkz4": "ACTIVITY_FEED_NOW_PLAYING_SPOTIFY", "4eazb6": "ACTIVITY_FEED_NOW_PLAYING_STAGE_CHANNEL", - "0PyKSX": "ACTIVITY_FEED_NOW_PLAYING_WATCHING", "tO8wOx": "ACTIVITY_FEED_NOW_PLAYING_XBOX", "HyGHj7": "ACTIVITY_FEED_NOW_STREAMING_TWITCH", "mIx+gG": "ACTIVITY_FEED_OTHER_MEMBER_LIST_HEADER", @@ -239,8 +271,6 @@ "MAxtks": "ACTIVITY_INVITE_PRIVATE", "FeUKeA": "ACTIVITY_PANEL_GO_LIVE", "AB5gTy": "ACTIVITY_PANEL_GO_LIVE_STREAM_GAME", - "n3feNG": "ACTIVITY_PANEL_GO_LIVE_TOOLTIP_NOT_IN_GUILD", - "fBXEoJ": "ACTIVITY_PANEL_GO_LIVE_TOOLTIP_NO_PERMISSION_IN_GUILD", "uQn9B8": "ACTIVITY_PANEL_GO_LIVE_TOOLTIP_NO_PERMISSION_IN_VOICE", "VOszPA": "ACTIVITY_PARTY_PRIVACY", "WEWQQl": "ACTIVITY_PARTY_PRIVACY_FRIENDS", @@ -275,6 +305,39 @@ "+5/xu2": "ACTIVITY_RESTRICTION_DEFAULT_NOTE", "EFu2Km": "ACTIVITY_RESTRICTION_MODAL_DESC", "SmHCFf": "ACTIVITY_SETTINGS", + "yAk8ZT": "ACTIVITY_SHARE_COMMAND_NOT_FOUND", + "DF+q2l": "ACTIVITY_SHARE_HEADER", + "6x5uWQ": "ACTIVITY_SHARING", + "Wspazk": "ACTIVITY_SHARING_ALL", + "eVdoI1": "ACTIVITY_SHARING_ALLOW_FRIENDS_TO_JOIN", + "IjucAO": "ACTIVITY_SHARING_ALLOW_FRIENDS_TO_JOIN_DESCRIPTION", + "JW4KKf": "ACTIVITY_SHARING_ALLOW_OTHERS", + "XXksWu": "ACTIVITY_SHARING_BLOCKED_PEOPLE_DESCRIPTION", + "NOIHs8": "ACTIVITY_SHARING_CURRENTLY_SHARING", + "C2uz/s": "ACTIVITY_SHARING_CUSTOMIZE_SETTINGS", + "VN4Spg": "ACTIVITY_SHARING_CUSTOMIZE_SETTINGS_DESCRIPTION", + "nEgjjj": "ACTIVITY_SHARING_DESCRIPTION", + "CQkyMm": "ACTIVITY_SHARING_DESKTOP_GAMES", + "YjQQjk": "ACTIVITY_SHARING_DISABLE", + "Ay/Nhp": "ACTIVITY_SHARING_ENABLE", + "iT/e8Y": "ACTIVITY_SHARING_HOW_IT_WORKS", + "5gexRV": "ACTIVITY_SHARING_JOIN_REQUESTS_FOR_GAMES", + "YldX6N": "ACTIVITY_SHARING_LARGE_SERVERS", + "dtkj8M": "ACTIVITY_SHARING_LARGE_SERVERS_DESCRIPTION", + "LKPFFT": "ACTIVITY_SHARING_MANAGE", + "vfamcV": "ACTIVITY_SHARING_MANAGE_ALL", + "kJFenS": "ACTIVITY_SHARING_MANAGE_SERVER_SHARING", + "GlYjeR": "ACTIVITY_SHARING_MANAGE_SERVER_SHARING_DESCRIPTION", + "jfrLLb": "ACTIVITY_SHARING_NOT_SHARING", + "mDJcn4": "ACTIVITY_SHARING_PLAY_MEDIA", + "KY0ilj": "ACTIVITY_SHARING_SHARE_ACTIVITY", + "BzqoHB": "ACTIVITY_SHARING_SHARE_DETAILS", + "RgzRPE": "ACTIVITY_SHARING_SHARE_DETAILS_DESCRIPTION", + "PRjSRi": "ACTIVITY_SHARING_SHARE_WHAT_YOU_PLAY", + "gbo4ly": "ACTIVITY_SHARING_SPECIFIC_SERVERS", + "nUsCOo": "ACTIVITY_SHARING_SPECIFIC_SERVERS_DESCRIPTION", + "Qyjz8V": "ACTIVITY_SHARING_VIEW_SETTING", + "UPLpRV": "ACTIVITY_SHARING_VIEW_SETTINGS", "WkcHT9": "ACTIVITY_SHELF_ITEM_ACTIONS_MENU_LABEL", "8ka8li": "ACTIVITY_STATUS", "OYkgVk": "ADD", @@ -298,7 +361,9 @@ "/yqgqs": "ADD_EMAIL_BANNER_TITLE", "YXXMxK": "ADD_EMAIL_DESCRIPTION", "ydw5nX": "ADD_EMAIL_SHORT", + "iMJO37": "ADD_EMOJI", "N2c/Un": "ADD_FAVORITE", + "s7oPyG": "ADD_FILE", "w5uwoI": "ADD_FRIEND", "zIJnA6": "ADD_FRIENDS", "gc9aSx": "ADD_FRIEND_ADD_MANUALLY", @@ -319,6 +384,7 @@ "6p7Mhh": "ADD_FRIEND_INPUT_HINT", "PJf9P9": "ADD_FRIEND_INVITE_LINK_SHARE_MESSAGE", "qj7o/y": "ADD_FRIEND_MAKE_FRIENDS", + "IuMx1Y": "ADD_FRIEND_MAKE_FRIENDS_TITLE", "Zya3Jh": "ADD_FRIEND_NEARBY_BODY", "1T7VqW": "ADD_FRIEND_NEARBY_CONNECTION_ERROR", "ra1CMk": "ADD_FRIEND_NEARBY_CONNECTION_ERROR_IOS", @@ -334,6 +400,7 @@ "kFe4Lm": "ADD_FRIEND_PLACEHOLDER", "P3mDze": "ADD_FRIEND_STUDENT_HUB", "Rtl1Ep": "ADD_FRIEND_SUCCESS", + "X76oLM": "ADD_GAME_FRIEND", "zk6Xbs": "ADD_KEYBIND", "NoKjWP": "ADD_KEYBIND_WARNING", "6Phf4K": "ADD_MORE_FRIENDS", @@ -348,6 +415,7 @@ "XPGZXP": "ADD_ROLE_PLACEHOLDER", "N5vP9F": "ADD_TAG_FORUM_POST", "k5pvjo": "ADD_TO_CALENDAR", + "xlwRY6": "ADD_TO_CALL", "HJmG1G": "ADD_TO_DICTIONARY", "JKSLRH": "ADD_TO_GOOGLE_CALENDAR", "rQe8EE": "ADD_TO_OUTLOOK", @@ -386,6 +454,9 @@ "udnqh6": "AGE_GATE_INVALID_BIRTHDAY", "n3QjDE": "AGE_GATE_NSFW_BODY", "E4Cd5I": "AGE_GATE_NSFW_DESCRIPTION", + "ZtuRts": "AGE_GATE_NSFW_SERVER_DESCRIPTION", + "6++3cX": "AGE_GATE_NSFW_SERVER_UNDERAGE_BODY", + "H0SG/g": "AGE_GATE_NSFW_SERVER_UNDERAGE_HEADER", "2kHZes": "AGE_GATE_NSFW_UNDERAGE_BODY", "NEabBa": "AGE_GATE_NSFW_UNDERAGE_HEADER", "uBFuok": "AGE_GATE_SUBMIT", @@ -393,6 +464,7 @@ "b0QzXe": "AGE_GATE_UNDERAGE_BODY", "WqEH4D": "AGE_GATE_UNDERAGE_BODY_DEFAULT_REG_MESSAGE", "GDQgHL": "AGE_GATE_UNDERAGE_BODY_POST_REGISTER_MESSAGE", + "ukclM1": "AGE_GATE_UNDERAGE_EXISTING_BODY", "D+rEw6": "AGE_GATE_UNDERAGE_EXISTING_BODY_DELETION", "3axQdB": "AGE_GATE_UNDERAGE_EXISTING_BODY_DELETION_WITH_DAYS", "NR/zrG": "AGE_GATE_UNDERAGE_EXISTING_HEADER", @@ -423,6 +495,7 @@ "i9IRUc": "ALL_ALBUMS", "MSYhgh": "ALL_CHANNELS", "wYi2lL": "ALL_DONE", + "t/IjXY": "ALL_PHOTOS", "wxbhEe": "ALL_SERVERS", "G6GWZ4": "ALPHA", "r/jzu1": "ALREADY_HAVE_ACCOUNT", @@ -492,8 +565,6 @@ "qxiBnZ": "APPLICATION_CANCEL_GUILD_SUBSCRIPTION_MODAL_DESCRIPTION", "KSqyfW": "APPLICATION_CANCEL_SUBSCRIPTION_MODAL_CANCEL_CTA", "LZunzZ": "APPLICATION_CANCEL_SUBSCRIPTION_MODAL_HEADER", - "05jDxl": "APPLICATION_CANCEL_SUBSCRIPTION_MODAL_NEVERMIND_CTA", - "irka9o": "APPLICATION_CANCEL_SUBSCRIPTION_MODAL_TITLE_V2", "6YxNV8": "APPLICATION_CANCEL_SUBSCRIPTION_PREMIUM_BENEFITS", "+HdfB/": "APPLICATION_CANCEL_USER_SUBSCRIPTION_MODAL_DESCRIPTION", "3eF5/L": "APPLICATION_COMMAND", @@ -623,6 +694,7 @@ "azZaZa": "APPLICATION_MANAGE_SUBSCRIPTION_PAYMENT_METHOD_LABEL", "fFyGiA": "APPLICATION_MANAGE_SUBSCRIPTION_PERSONAL_SUBSCRIPTIONS", "sqkbMK": "APPLICATION_MANAGE_SUBSCRIPTION_PLAN_NAME_UNAVAILABLE", + "nn88hB": "APPLICATION_MANAGE_SUBSCRIPTION_PLAN_START_DATE", "goe+hk": "APPLICATION_MANAGE_SUBSCRIPTION_PLAN_SWITCH_NOTICE", "KI7ERx": "APPLICATION_MANAGE_SUBSCRIPTION_PRICE", "Ms+6Zq": "APPLICATION_MANAGE_SUBSCRIPTION_RENEWAL_DATE", @@ -636,6 +708,7 @@ "7ZD8p1": "APPLICATION_MANAGE_SUBSCRIPTION_SUBSCRIPTION_USED_IN", "R74ZBR": "APPLICATION_MANAGE_SUBSCRIPTION_SWITCH_PLAN", "+KwmBt": "APPLICATION_MANAGE_SUBSCRIPTION_SWITCH_TO_PLAN", + "hIhAM3": "APPLICATION_MANAGE_SUBSCRIPTION_UPCOMING_DOWNGRADE", "HOaZu8": "APPLICATION_MANAGE_SUBSCRIPTION_USER_CANCELLED", "n7eBZn": "APPLICATION_PREORDER_PURCHASE_CONFIRMATION_BUTTON", "p+2sE+": "APPLICATION_PROGRESS_INDICATOR_INSTALLING", @@ -647,6 +720,12 @@ "aTdq44": "APPLICATION_PROGRESS_INDICATOR_UPDATING_HOURS", "mgQg1L": "APPLICATION_PROGRESS_INDICATOR_UPDATING_MINUTES", "2OVgVq": "APPLICATION_PROGRESS_INDICATOR_UPDATING_SECONDS", + "Bd10bR": "APPLICATION_REPORT_TITLE", + "eyEkG1": "APPLICATION_REPORT_PROFILE_TITLE", + "atP0yX": "APPLICATION_REPORT_BEHAVIOR_TITLE", + "UGg603": "APPLICATION_REPORT_BEHAVIOR_DESCRIPTION", + "ptItsj": "APPLICATION_REPORT_PROFILE_DESCRIPTION", + "jhJzez": "APPLICATION_REPORT_BUTTON", "tluX4B": "APPLICATION_STORE_ABOUT_HEADER", "L2hDwT": "APPLICATION_STORE_BUNDLE_PURCHASE_CONFIRMATION_BLURB", "pi7PDT": "APPLICATION_STORE_BUY", @@ -1071,6 +1150,7 @@ "T48fKW": "APP_DIRECTORY_PROFILE_EMPTY_HEADING", "sSEhHb": "APP_DIRECTORY_PROFILE_IMAGE_CAROUSEL_ALT", "5UVm92": "APP_DIRECTORY_PROFILE_IMAGE_DEFAULT_ALT", + "mD+J/i": "APP_DIRECTORY_PROFILE_INFORMATION_HEADING", "Fbjlu3": "APP_DIRECTORY_PROFILE_LANGUAGES_HEADING", "l6DP2n": "APP_DIRECTORY_PROFILE_LINKS_HEADING", "kH3JR5": "APP_DIRECTORY_PROFILE_PRIVACY_LINK", @@ -1092,6 +1172,10 @@ "eoUw+o": "APP_DIRECTORY_SHORT_GUILD_COUNT", "8JiYOT": "APP_DIRECTORY_SPOTIFY_DESCRIPTION", "LcNDLa": "APP_DIRECTORY_SPOTIFY_TITLE", + "KUsDNI": "APP_DM_MANAGE", + "VeIJWg": "APP_DM_NOTIFICATIONS_ENABLED", + "GFEn82": "APP_DM_NOTIFICATIONS_TURN_OFF", + "JFu44b": "APP_DM_NOTIFICATIONS_TURN_ON", "9PUXpM": "APP_ICON_ANGRY", "IoLViw": "APP_ICON_BEANIE", "nmd90m": "APP_ICON_BLUSH", @@ -1315,6 +1399,9 @@ "g7Sm/Z": "AUDIO_FILE_A11Y_LABEL", "Mkj4op": "AUDIO_FILE_NOT_PLAYING_VALUE", "q7tHa4": "AUDIO_FILE_PLAYING_VALUE", + "aYrsiB": "AUDIO_MACOS_DEFAULT", + "Q3YKwS": "AUDIO_SYSTEM_DEFAULT", + "n4dQ2c": "AUDIO_WINDOWS_DEFAULT", "ZmrHfK": "AUDIT_LOG", "ylmkM5": "AUD_NAME", "hZ+CvQ": "AUTHORIZATION", @@ -1324,6 +1411,7 @@ "vTVC5T": "AUTHORIZED_APP", "f6kk+r": "AUTHORIZED_APPS", "yOApCK": "AUTHORIZED_APPS_AUTHORIZED_ON", + "NkwaBs": "AUTHORIZED_APPS_MUTE_DIRECT_MESSAGES", "okSwq9": "AUTHORIZED_APPS_PRIVACY_POLICY", "lx+Gec": "AUTHORIZED_APPS_TERMS_OF_SERVICE", "jUhnwb": "AUTHORIZED_APP_IS_CONNECTED_ACCOUNT", @@ -1346,6 +1434,7 @@ "6U6OMQ": "AUTH_DISABLE_EMAIL_NOTIFICATIONS_SUCCESS_HEADER", "NTBo33": "AUTH_EXPIRED_SUGGESTION", "Nusip4": "AUTH_HIDE_PASSWORD", + "pzCe7h": "AUTH_INVALID_CREDENTIALS_TITLE", "+qUJAj": "AUTH_INVALID_INVITE_BODY", "urIwn4": "AUTH_INVALID_INVITE_TIP", "kux01N": "AUTH_INVALID_INVITE_TITLE", @@ -1355,6 +1444,10 @@ "ENSuN3": "AUTH_MESSAGE_INVITED_TO_PLAY", "UW1Cav": "AUTH_MESSAGE_INVITED_TO_PLAY_USERNAME", "x2L32Q": "AUTH_MESSAGE_INVITED_TO_STREAM", + "2fmTpT": "AUTH_PASSWORD_MEDIUM", + "5gbdUX": "AUTH_PASSWORD_STRENGTH", + "Xraqqc": "AUTH_PASSWORD_STRONG", + "w/8TuV": "AUTH_PASSWORD_WEAK", "+1h0k/": "AUTH_SESSIONS", "TXCmfL": "AUTH_SESSIONS_ACTIVE_RECENTLY", "LLS19o": "AUTH_SESSIONS_CURRENT", @@ -1394,14 +1487,12 @@ "yaMlSf": "AUTO_ARCHIVE_THREAD_AFTER", "8b20ZM": "AUTO_ARCHIVE_THREAD_AT_LONG", "mHuG9o": "AUTO_ARCHIVE_THREAD_PINNED", - "479+Pd": "AUTO_SUGGEST_STICKERS", - "r3uQUX": "AUTO_SUGGEST_STICKERS_DESCRIPTION", "ZPi4lM": "AUTO_TOGGLE_STREAMER_MODE_DESCRIPTION", "PKDAJ/": "AUTO_TOGGLE_STREAMER_MODE_LABEL", "ldIeAd": "AVATAR_ACTIONS_MENU_LABEL", + "ncslie": "AVATAR_BOOM", + "p5Z3Ol": "AVATAR_CHERRY", "jXBD7A": "AVATAR_CONVERT_FAILURE_MOBILE", - "d6sv6o": "AVATAR_DECORATION_MODAL_APPLY", - "R3blbG": "AVATAR_DECORATION_SELECTION_SECTION_A11Y", "7eZ3ji": "AVATAR_IN_ONBOARDING_ADD_PICTURE_CTA", "yP28YL": "AVATAR_IN_ONBOARDING_DEFAULT_SELECT_SUBTITLE", "XyLlVm": "AVATAR_IN_ONBOARDING_FILE_TYPE_ERROR", @@ -1412,12 +1503,16 @@ "nhJ8OC": "AVATAR_IN_ONBOARDING_SKIP_FOR_NOW", "1EPySE": "AVATAR_IN_ONBOARDING_SKIP_STEP_ALERT_SUBTITLE", "DnKHuV": "AVATAR_IN_ONBOARDING_SKIP_STEP_ALERT_TITLE", + "g5Dumi": "AVATAR_LOCKE", + "SbKDHi": "AVATAR_MALLOW", + "LMSo+F": "AVATAR_PHIBI", "A+0H1f": "AVATAR_PROFILE_BANNER_MARKETING", "YcOxtr": "AVATAR_SIZE_OPTION_LARGE", "BKIKqx": "AVATAR_SIZE_OPTION_SMALL", "ZSHmKD": "AVATAR_UPLOAD_APPLY", "9TG40l": "AVATAR_UPLOAD_CANCEL", "DxAYCF": "AVATAR_UPLOAD_EDIT_MEDIA", + "E36Wd4": "AVATAR_UPLOAD_ROTATE", "B944yq": "AVATAR_UPLOAD_SKIP", "13/7kX": "BACK", "4SnBzF": "BACKSPACE", @@ -1425,6 +1520,7 @@ "vxFYaM": "BACK_BUTTON_MENTIONS_ACCESSIBILITY_LABEL", "UTypEu": "BACK_TO", "j3cG2p": "BACK_TO_LOGIN", + "l6w3Vj": "BADGES", "jnHyYU": "BAD_LINK_WARNING_BODY_V2", "2B3wj8": "BAD_LINK_WARNING_TITLE_V2", "5MBJ5M": "BAN", @@ -1518,6 +1614,7 @@ "8b+FXG": "BILLING_CODE_REDEMPTION_REDIRECT", "s9TZM1": "BILLING_COLLECTIBLES_REFUND_TEXT_UNABLE", "eZFTbu": "BILLING_CONFIRM_PRICE_CHANGE_TITLE", + "jCqvk/": "BILLING_CONNECT_YOUR_ACCOUNT", "Z2c+aV": "BILLING_DISCOUNT_LEGAL_COPY", "TpEf5O": "BILLING_DISCOUNT_MONTHLY_PRICE", "VeE/4E": "BILLING_DISCOUNT_MONTHLY_PRICE_GENERIC", @@ -1551,6 +1648,7 @@ "6mIX6s": "BILLING_EXTERNAL_HEADER", "EOa8ei": "BILLING_EXTERNAL_MANAGE_ELSEWHERE", "Om31w8": "BILLING_FINAL_PRICE_MAY_CHANGE", + "vfUW65": "BILLING_GIFT_CLAIMED_DESCRIPTION", "XVvPjU": "BILLING_GIFT_COPIED", "qS+yMo": "BILLING_GIFT_LINK", "QddTpm": "BILLING_GIFT_PURCHASE_TOOLTIP", @@ -1582,6 +1680,7 @@ "obRG6Y": "BILLING_MANAGE_SUBSCRIPTION", "aRHpAB": "BILLING_NO_PAYMENT_METHOD", "o9bOIl": "BILLING_NO_PAYMENT_METHOD_DESCRIPTION", + "jGL0O5": "BILLING_NO_STORE_COUNTRY_SET", "Ogvn5o": "BILLING_ONLINE_PURCHASE_WAIVER", "DFCVN+": "BILLING_ONLINE_PURCHASE_WAIVER_CHECKBOX", "jhu6zm": "BILLING_ONLINE_PURCHASE_WAIVER_DISCLAIMER", @@ -1694,6 +1793,8 @@ "qU3ALJ": "BILLING_STEP_ADDRESS", "IOA4mp": "BILLING_STEP_AWAITING_AUTHENTICATION", "Fo2YP7": "BILLING_STEP_CREDIT_CARD_INFORMATION", + "ovf4EC": "BILLING_STEP_NITRO_BASIC_PLAN_AND_PAYMENT", + "H6nk1k": "BILLING_STEP_NITRO_PLAN_AND_PAYMENT", "Sb6wI1": "BILLING_STEP_PAYMENT", "DDPRXs": "BILLING_STEP_PAYMENT_INFO", "YH7B+D": "BILLING_STEP_PAYMENT_METHOD", @@ -1701,10 +1802,12 @@ "xpDOHY": "BILLING_STEP_PAYPAL", "ihyo1E": "BILLING_STEP_PLAN", "UKbp1N": "BILLING_STEP_PLAN_AND_PAYMENT", + "6bEcYr": "BILLING_STEP_POPULAR", "QBnNHq": "BILLING_STEP_REVIEW", "r+SebU": "BILLING_STEP_SELECT_PLAN", "xj9ooX": "BILLING_STEP_SHOP", "4ma2fu": "BILLING_STEP_VENMO", + "3pIjBH": "BILLING_STORE_COUNTRY", "YScQSF": "BILLING_SUBSCRIBE_TO_PLAN", "2GKrvn": "BILLING_SUBSCRIPTION_CREDIT", "0YJHm5": "BILLING_SUBTOTAL", @@ -1719,7 +1822,6 @@ "nLI1Kr": "BILLING_SWITCH_PLAN_CONFIRM_TIER_1_YEAR_TO_MONTH", "aTUr3Z": "BILLING_SWITCH_PLAN_CONFIRM_TIER_2", "qSZZVA": "BILLING_SWITCH_PLAN_CONFIRM_TIER_2_GENERIC_TO_MONTH", - "g52y/r": "BILLING_SWITCH_PLAN_CONFIRM_TIER_2_NO_PAYMENT_TRIAL", "PNX4NM": "BILLING_SWITCH_PLAN_CONFIRM_TIER_2_TO_TIER_1", "RNjcNg": "BILLING_SWITCH_PLAN_CONFIRM_TIER_2_YEAR_TO_MONTH", "XEoQ7+": "BILLING_SWITCH_PLAN_CONFIRM_TO_TIER_0", @@ -1748,11 +1850,14 @@ "RqUv86": "BILLING_SWITCH_PLAN_UPGRADE_BODY_TIER_2_YEAR", "122kWB": "BILLING_SWITCH_PLAN_YEARLY_FREE_MONTHS", "ttkBhy": "BILLING_TAG_CANCELED", + "lIsIFo": "BILLING_TAG_CLAIMED", "Yo4ru6": "BILLING_TAG_FAILED", "lYbZzz": "BILLING_TAG_PARTIALLY_REFUNDED", "y7F0Re": "BILLING_TAG_PENDING", + "Osji1u": "BILLING_TAG_REDEEMED", "ZBb6NK": "BILLING_TAG_REFUNDED", "YQv9Li": "BILLING_TAG_REVERSED", + "+tqSi3": "BILLING_TAG_UNCLAIMED", "IodJKT": "BILLING_THIRD_PARTY_EULA_LABEL", "MI1rHs": "BILLING_TRIAL_1_WEEK_PERIOD", "Z1V2cs": "BILLING_TRIAL_2_WEEK_PERIOD", @@ -1770,6 +1875,7 @@ "MHlpoJ": "BILLING_TRIAL_REDEMPTION_DISABLED", "ECT4A5": "BILLING_TRIAL_YEARLY_PRICE_AFTER_TRIAL", "0HQxKW": "BILLING_TRIAL_YEARLY_PRICE_AFTER_TRIAL_TAX_EXCLUSIVE", + "EeFkoB": "BILLING_UPDATE_STORE_COUNTRY", "rtLTJP": "BILLING_YEARLY_PLAN_SAVINGS", "wHvOi8": "BITRATE_KBPS", "w1gmLt": "BITRATE_KBPS_NO_SPACE", @@ -1787,6 +1893,7 @@ "frCwaT": "BLOCKING_CONTEXT_MESSAGES_HIDDEN", "D0pstn": "BLOCKING_CONTEXT_NOTIFICATIONS", "66d4UA": "BLOCKING_CONTEXT_PROFILE_INFO", + "fjFJFV": "BLOCKING_CONTEXT_STOP_DMS", "lR4Mc6": "BLOCKING_CONTEXT_UNFRIENDED", "hSaJoX": "BLOCK_SPAMMER_HEADER", "e/Bj2V": "BLOCK_SPAMMER_SUBHEADER", @@ -1803,8 +1910,6 @@ "Ea2ZbH": "BLOG_POST", "JqBqKz": "BLUE", "eNfBGl": "BOGO_ANNOUNCEMENT_MODAL_HEADER", - "OWqqE2": "BOGO_ANNOUNCEMENT_MODAL_REMIXING_CARD_BODY_FORMATTED", - "9h9otv": "BOGO_ANNOUNCEMENT_MODAL_REMIXING_CARD_HEADER", "z15nl1": "BOGO_ANNOUNCEMENT_MODAL_SOUNDBOARD_CARD_BODY_FORMATTED", "bpVW5l": "BOGO_ANNOUNCEMENT_MODAL_SOUNDBOARD_CARD_HEADER", "joqC69": "BOGO_ANNOUNCEMENT_MODAL_SUBHEADER", @@ -1817,7 +1922,6 @@ "+LdvPq": "BOGO_CHANGE_LOG_FILE_BODY_INCREASE", "gk9XK8": "BOGO_CHANGE_LOG_FILE_SUBTITLE", "G80WJT": "BOGO_CHANGE_LOG_MORE", - "MtTjnf": "BOGO_CHANGE_LOG_REDEEM", "6amg2J": "BOGO_CHANGE_LOG_STREAM_BODY", "Q9NnNh": "BOGO_CHANGE_LOG_STREAM_SUBTITLE", "lMkoZA": "BOGO_CHANGE_LOG_TITLE", @@ -1932,7 +2036,6 @@ "K2a57Z": "BOT_GDM_EXPLICIT_CONTENT", "tBPMpG": "BOT_GUILD_EXPLICIT_CONTENT", "A//N4k": "BOT_PROFILE_CREATED_ON", - "nA/W+p": "BOT_PROFILE_REMOVE_PRIVATE_CHANNEL_INTEGRATION", "LcbJVs": "BOT_PROFILE_SLASH_COMMANDS", "VEfKyb": "BOT_PROFILE_VIEW_ALL_COMMANDS_CTA", "k1Cjqr": "BOT_REQUIRES_EMAIL_VERIFICATION", @@ -1960,9 +2063,11 @@ "UVpg3U": "BROWSER_NOT_SUPPORTED", "Ow0dbF": "BROWSER_OUTPUT_DEVICE_WARNING", "MWmtj8": "BROWSE_CHANNELS_TAB", + "/tZh0A": "BUG_REPORTER", "HVxmOD": "BUG_REPORT_ADD_ATTACHMENTS", "tM969v": "BUG_REPORT_ATTACHMENTS", "jB8yOL": "BUG_REPORT_BUG_SUBMITTED", + "ZP/hEx": "BUG_REPORT_BUILD_OVERRIDE", "f7kbVu": "BUG_REPORT_CLIENT_BUILD_NUMBER", "wy1M/t": "BUG_REPORT_CLIENT_VERSION", "1SplH2": "BUG_REPORT_DESCRIPTION", @@ -1987,8 +2092,8 @@ "rYfJop": "BUG_REPORT_PRIORITY_HIGH_TITLE", "D4rbgX": "BUG_REPORT_PRIORITY_LOW_DESCRIPTION", "Ia0ska": "BUG_REPORT_PRIORITY_LOW_TITLE", - "Kmg64O": "BUG_REPORT_PRIORITY_VERY_LOW_DESCRIPTION", - "KGsyFy": "BUG_REPORT_PRIORITY_VERY_LOW_TITLE", + "nC7pvx": "BUG_REPORT_PRIORITY_MEDIUM_DESCRIPTION", + "9LSuy3": "BUG_REPORT_PRIORITY_MEDIUM_TITLE", "wC/0Lz": "BUG_REPORT_REMOVE_SCREENSHOT", "Nxha5h": "BUG_REPORT_SELECT_FEATURE_AREA", "6mpW05": "BUG_REPORT_SOMETHING_IS_BROKEN", @@ -2051,6 +2156,8 @@ "XIjusn": "BUY_ONE_GET_ONE_FREE_NEWLINE", "xSbnFn": "BUY_ONE_GET_ONE_MONTH_FREE", "1j/4SO": "BUY_ONE_GET_ONE_MONTH_FREE_NEWLINE", + "1i1bUl": "BYPASS_JOIN_APPLICATIONS", + "kqcjeV": "BYPASS_SLOWMODE", "2t8L04": "CALENDAR_CHANNEL_LOCATION", "JJogjm": "CALL", "v05Xd6": "CALL_ENDED", @@ -2072,7 +2179,6 @@ "Xcb4cF": "CALL_FEEDBACK_SENTIMENT_NEUTRAL", "1Vyb5J": "CALL_FEEDBACK_SENTIMENT_POSITIVE", "Ss6tlb": "CALL_FEEDBACK_SHEET_TITLE", - "W6HwU6": "CALL_HIGH_FIVE_EXCLAMATION", "IdKo2z": "CALL_INVITE_NOT_FRIENDS", "aUT3+M": "CALL_MOBILE_TAP_TO_RETURN", "/yA6Qd": "CALL_SOUNDS_CONTEXT_MENU_GLOBAL", @@ -2107,6 +2213,7 @@ "x9mtl4": "CAMERA_DISABLED_LIMIT_REACHED", "jlZ+0h": "CAMERA_DISABLED_STAGE_LIMIT_REACHED", "j6h0/8": "CAMERA_DISABLED_STAGE_LIMIT_REACHED_MAX", + "z+mxvo": "CAMERA_FAILED_TO_START", "OS/8dX": "CAMERA_INTENT_RESULT_ERROR", "bhqSWl": "CAMERA_NO_DEVICE", "4xAQ5w": "CAMERA_OFF", @@ -2130,6 +2237,7 @@ "Qx0tFc": "CAMERA_PREVIEW_VIDEO_BACKGROUND_UPLOAD_TOOLTIP_PREMIUM", "IqE0T/": "CAMERA_PREVIEW_VIDEO_BACKGROUND_UPSELL_TOOLTIP", "Y879q8": "CAMERA_SWITCH", + "hxmQ/e": "CAMERA_TRY_AGAIN", "8jSzSe": "CAMERA_UNAVAILABLE", "KXYLmI": "CAMERA_UNKNOWN_ERROR", "YTnrbV": "CAMERA_UPLOADS_LABEL", @@ -2208,12 +2316,6 @@ "N0bC3P": "CHANGE_BANNER", "t9eQ/g": "CHANGE_CAMERA", "+caQHK": "CHANGE_CATEGORY", - "DIJLzI": "CHANGE_DECORATION_MODAL_PREMIUM_STARTER_HEADER", - "UROtt/": "CHANGE_DECORATION_MODAL_PREVIEW_PURCHASE_PREMIUM", - "ucqOV6": "CHANGE_DECORATION_MODAL_PREVIEW_STARTER", - "zrBmQK": "CHANGE_DECORATION_MODAL_PREVIEW_STARTER_CHURNED", - "L5hyzz": "CHANGE_DECORATION_MODAL_PREVIEW_STARTER_PREMIUM", - "JEimX1": "CHANGE_DECORATION_MODAL_PURCHASE_HEADER", "UewH9O": "CHANGE_DECORATION_MODAL_STARTER_DESC", "6t3CyN": "CHANGE_DM_OWNER", "oP5zGA": "CHANGE_EMAIL", @@ -2239,10 +2341,7 @@ "qP/i6k": "CHANGE_ONLINE_STATUS", "FRep5/": "CHANGE_PASSWORD", "x5tG4V": "CHANGE_PASSWORD_DESCRIPTION", - "bGl9ty": "CHANGE_PFX_MODAL_PREVIEW_STARTER", - "ZVTtBi": "CHANGE_PFX_MODAL_PREVIEW_STARTER_CHURNED", "Ulqq6K": "CHANGE_PHONE_NUMBER", - "PXzyvg": "CHANGE_PROFILE_EFFECT_MODAL_PREVIEW_PURCHASE_PREMIUM", "uPvxqJ": "CHANGE_SPLASH", "ckQidX": "CHANGE_VANITY_URL_ERROR", "GK18KJ": "CHANNEL", @@ -2300,6 +2399,7 @@ "xQHMph": "CHANNEL_NOTICE_SERVER_DISCOVERY_NEWLY_ELIGIBLE", "i7bfzM": "CHANNEL_NOTICE_SERVER_DISCOVERY_NOT_YET_ELIGIBLE", "JrySi3": "CHANNEL_NOTIFICATION_OVERRIDES", + "OBr7Cw": "CHANNEL_OPTIONS", "9mysCh": "CHANNEL_OPT_IN", "NlhxRl": "CHANNEL_OPT_IN_ALL_CHANNELS", "3zySTA": "CHANNEL_OPT_OUT", @@ -2359,15 +2459,6 @@ "Icu3bf": "CHANNEL_SLOWMODE_DESC_SHORT", "AUyDKP": "CHANNEL_STATE_BUSY", "e2Ife6": "CHANNEL_STATE_OPEN", - "18DFqk": "CHANNEL_SYNCING_ADDED_BY", - "/ZBO3Z": "CHANNEL_SYNCING_ADDED_BY_NO_LINK", - "v6plRI": "CHANNEL_SYNCING_ADDED_BY_UNKNOWN_USER", - "8Hfy44": "CHANNEL_SYNCING_CURRENTLY_SYNCING_WITH", - "AmrSuJ": "CHANNEL_SYNCING_STOP_SYNCING", - "JKCMYU": "CHANNEL_SYNCING_STOP_SYNCING_ALERT_BODY", - "XImiS9": "CHANNEL_SYNCING_STOP_SYNCING_ALERT_TITLE", - "WR3p/W": "CHANNEL_SYNCING_STOP_SYNCING_ERROR", - "43yFy8": "CHANNEL_SYNCING_STOP_SYNCING_ERROR_TITLE", "GtDRi2": "CHANNEL_TOOLTIP_ANNOUNCEMENTS", "EHLQwl": "CHANNEL_TOOLTIP_ANNOUNCEMENTS_LIMITED", "eRc6o9": "CHANNEL_TOOLTIP_ANNOUNCEMENTS_NSFW", @@ -2412,14 +2503,19 @@ "gHD/nZ": "CHAT_DISABLED_CHANNEL_LIST", "9cs5LM": "CHAT_DISABLED_CTA", "k0CGYK": "CHAT_DISABLED_HOME_BACK", + "Yi2xuY": "CHAT_DISABLED_THREADS_ONLY", "4NDJgM": "CHAT_GESTURES", "uKZtC/": "CHAT_INPUT", "Xy+S02": "CHAT_WHEEL_PAGINATION_HINT", "a9ngnE": "CHECKING_FOR_UPDATES", + "q9EGps": "CHECKOUT", + "hws7bC": "CHECKOUT_ORDER_SUMMARY", "O9GI+k": "CHECKOUT_RECOVERY_NAGBAR_CONTENT", "Zi69D4": "CHECKOUT_RECOVERY_NAGBAR_CTA", "RzWDqY": "CHECK_IT_OUT", + "8bX9n/": "CHECK_YOUR_INBOX", "ypc3Yp": "CHOOSE_AN_APPLICATION", + "PfnxqD": "CHURN_CONTINUE_TO_CANCEL", "zrCzVB": "CHURN_DISCOUNT_CLAIM", "Eq1RHL": "CHURN_DISCOUNT_CONFIRM_DESCRIPTION", "CKSuZJ": "CHURN_DISCOUNT_CONFIRM_DISCOUNT", @@ -2437,14 +2533,6 @@ "sW28gZ": "CLAIM_ACCOUNT_REQUIRED_BODY", "D7trIB": "CLAIM_ACCOUNT_REQUIRED_EMAIL_TO", "BleMPB": "CLAIM_ACCOUNT_SHORT", - "UfpB2d": "CLAN_DISCOVERY_CARD_TAG_TOOLTIP", - "IZZohv": "CLAN_SETUP_PLAYSTYLE_CASUAL_TITLE", - "Zo1X5n": "CLAN_SETUP_PLAYSTYLE_COMPETITIVE_TITLE", - "cxUHv0": "CLAN_SETUP_PLAYSTYLE_SOCIAL_TITLE", - "xfySB6": "CLAN_SETUP_PLAYSTYLE_VERY_HARDCORE_TITLE", - "AUnyz/": "CLAN_USER_WAITLISTED", - "rwOhLP": "CLAN_USER_WAITLIST_CTA", - "OV9jYb": "CLAN_USER_WAITLIST_TOAST_SUCCESS", "VkKicb": "CLEAR", "O8k7O4": "CLEAR_ALL", "xLNQnl": "CLEAR_ATTACHMENTS", @@ -2493,6 +2581,8 @@ "a22o48": "CLIENT_THEMES_GRADIENT_UNDER_THE_SEA", "z2jK6X": "CLIPS", "x+/nmN": "CLIPS_ADD_A_TITLE", + "BfLmm+": "CLIPS_ADD_TO_LIBRARY", + "dPVrEv": "CLIPS_ALL_CLIPS", "xiv8wA": "CLIPS_ATTACHMENT_TOOLTIP", "MskAXa": "CLIPS_ATTACHMENT_UTILITIES_REMOVE", "MYgdY2": "CLIPS_ATTACHMENT_UTILITIES_SPOILER", @@ -2500,20 +2590,23 @@ "Rv0sxT": "CLIPS_CALL_TOOLTIP_LINK_CTA", "zrZ5VX": "CLIPS_CALL_TOOLTIP_TITLE", "aCDfgk": "CLIPS_CANNOT_ATTACH_FILE_TO_CHANNEL", + "GPxI1G": "CLIPS_CHANNEL_LABEL", "VBv+GP": "CLIPS_CHANNEL_NOTICE_EDUCATION_BODY", "rWKv+e": "CLIPS_CLIPPING", "5/zsn8": "CLIPS_CONNECTIVITY_ALL", "FsbKOz": "CLIPS_CONNECTIVITY_FRIENDS", "bBgBYo": "CLIPS_CROP_END", "+BTvw8": "CLIPS_CROP_START", - "VRWPDm": "CLIPS_DELETE_CLIP", "yxCBqo": "CLIPS_DELETE_MODAL_SUBTITLE", "Lzhuiz": "CLIPS_DELETE_MODAL_TITLE", "g8pDeY": "CLIPS_EDIT_DATE_TITLE", "WH/V85": "CLIPS_EDIT_EXPORT", + "hWr+7Z": "CLIPS_EDIT_EXPORT_SOUND_FILE", + "EVPuO8": "CLIPS_EDIT_EXPORT_VIDEO_FILE", "GnQui9": "CLIPS_EDIT_GAME_AUDIO", "s52pju": "CLIPS_EDIT_SAVE_CLIP", "I8lglT": "CLIPS_EDIT_SHARE_CLIP", + "8K7Ges": "CLIPS_EDIT_SOUNDBOARD_AUDIO", "v6XAgu": "CLIPS_EDIT_TIME_TITLE", "SJKc5n": "CLIPS_EDIT_TITLE", "WTozwe": "CLIPS_EDIT_USER_LIST_TITLE", @@ -2521,8 +2614,12 @@ "pCMkDb": "CLIPS_ENABLED_BADGE", "DJXW3G": "CLIPS_ENABLED_VIEWER_TOOLTIP", "5b63sK": "CLIPS_ENABLED_VIEWER_TOOLTIP_NITRO_EA", - "l9qpzm": "CLIPS_EXPORT_TO_FILE", - "HH4Tjj": "CLIPS_EXPORT_TO_SOUNDBOARD", + "db0NKG": "CLIPS_EXPORT_AUDIO_FILE", + "7NOhjN": "CLIPS_EXPORT_CLIPBOARD", + "y5FgMk": "CLIPS_EXPORT_IMAGE_FILE", + "sFgmNy": "CLIPS_EXPORT_VIDEO_FILE", + "nPywqO": "CLIPS_FAVORITE", + "9rlCk1": "CLIPS_FAVORITES", "xY/8K5": "CLIPS_GALLERY_NO_CLIPS", "3iveao": "CLIPS_GALLERY_NO_CLIPS_CLIPS_NOT_ENABLED", "xrEs6/": "CLIPS_GALLERY_NO_CLIPS_MATCH_QUERY", @@ -2537,12 +2634,12 @@ "bTFv/3": "CLIPS_LENGTH_SECONDS", "JmYczQ": "CLIPS_LOAD_ERROR_BODY", "yjoSOD": "CLIPS_LOAD_ERROR_TITLE", - "KLhk6s": "CLIPS_NOTIFICATION_TITLE", "DWeRm1": "CLIPS_ONBOARDING_CLIP_BUTTON_ACTIVITY_PANEL_COACHMARK_BODY", "o+srEw": "CLIPS_ONBOARDING_CLIP_BUTTON_ACTIVITY_PANEL_COACHMARK_TITLE", "6Vwf7W": "CLIPS_ONBOARDING_GO_LIVE_DEFAULT_DISABLED_COACHMARK_BODY", "JNuK+L": "CLIPS_ONBOARDING_GO_LIVE_DEFAULT_DISABLED_COACHMARK_HARDWARE_IMPACT_WARNING", "ONtUeR": "CLIPS_ONBOARDING_GO_LIVE_DEFAULT_DISABLED_COACHMARK_TITLE", + "mIkeS2": "CLIPS_PHRASE", "2Fp7OP": "CLIPS_PROCESSING_BADGE", "AZ8jXY": "CLIPS_QUALITY_DEFAULT", "S5uhCN": "CLIPS_REMINDER_NOTIFICATION_TITLE", @@ -2550,13 +2647,16 @@ "U4URzP": "CLIPS_SAVE", "HIMcv1": "CLIPS_SAVE_CLIP_TOOLTIP", "1ZbZuh": "CLIPS_SAVE_ERROR_NOTIFICATION_TITLE", + "+WloFH": "CLIPS_SAVE_SCREENSHOT", "NBMK9m": "CLIPS_SAVE_START_NOTIFICATION_TITLE", + "m0zd57": "CLIPS_SCREENSHOT_KEYBIND_DESCRIPTION", "7XX0/X": "CLIPS_SESSION_ENDED_TOOLTIP_BODY", "md4qKz": "CLIPS_SESSION_ENDED_TOOLTIP_PRIMARY_CTA", "7r5Z19": "CLIPS_SESSION_ENDED_TOOLTIP_SECONDARY_CTA", "J1hsY2": "CLIPS_SETTINGS", "kScUbP": "CLIPS_SETTINGS_ALLOW_VIEWER_CLIPS", "KxkQAW": "CLIPS_SETTINGS_ALLOW_VIEWER_CLIPS_HELP", + "sA0WKL": "CLIPS_SETTINGS_AUTOMATIC_CLIPPING", "vjyyLP": "CLIPS_SETTINGS_EDUCATION_BANNER_BODY", "zR0+/l": "CLIPS_SETTINGS_EDUCATION_BANNER_TITLE", "jZIEVd": "CLIPS_SETTINGS_EDUCATION_BANNER_TITLE_WITH_KEYBIND", @@ -2568,17 +2668,27 @@ "m4Cjj9": "CLIPS_SETTINGS_ENABLE_REMINDERS_HELP", "2wScL1": "CLIPS_SETTINGS_FRAMERATE", "Rf9+fy": "CLIPS_SETTINGS_FRAMERATE_NOTE", + "iV6KcI": "CLIPS_SETTINGS_GAME_SIGNALS", + "dJ2tX+": "CLIPS_SETTINGS_GAME_SIGNALS_HELP", "tCizcg": "CLIPS_SETTINGS_HELP_IN_GO_LIVE_CTA", "kiaF4f": "CLIPS_SETTINGS_HW_ENCODING_MUST_BE_ENABLED_INFOBOX", "pf54EU": "CLIPS_SETTINGS_KEYBIND", "QyB/jK": "CLIPS_SETTINGS_KEYBIND_HELP", "OgfUio": "CLIPS_SETTINGS_LENGTH", "H7j4tY": "CLIPS_SETTINGS_LENGTH_HELP", + "yfsrDI": "CLIPS_SETTINGS_MAX_AUTO_CLIPS", + "vlDHdC": "CLIPS_SETTINGS_MAX_AUTO_CLIPS_HELP", "AGDDkH": "CLIPS_SETTINGS_OPT_OUT_OF_VOICE_RECORDING", "wW9/zQ": "CLIPS_SETTINGS_OPT_OUT_OF_VOICE_RECORDING_DESCRIPTION", + "nHsilt": "CLIPS_SETTINGS_PHRASE_SIGNALS", + "s6wq+m": "CLIPS_SETTINGS_PHRASE_SIGNALS_HELP", + "GcIeET": "CLIPS_SETTINGS_PRIVACY", "Z+MfqT": "CLIPS_SETTINGS_QUALITY_INFOBOX", + "iIwmV5": "CLIPS_SETTINGS_RECORDING", "aFudZJ": "CLIPS_SETTINGS_RESOLUTION", "nIrkW5": "CLIPS_SETTINGS_RESOLUTION_NOTE", + "0U/hj7": "CLIPS_SETTINGS_SCREENSHOT_KEYBIND", + "5zxkdo": "CLIPS_SETTINGS_SCREENSHOT_KEYBIND_HELP", "s4773E": "CLIPS_SETTINGS_STORAGE_LOCATION", "svjwGh": "CLIPS_SETTINGS_STORAGE_LOCATION_HELP", "iMONTj": "CLIPS_SETTINGS_STORAGE_LOCATION_LABEL", @@ -2594,6 +2704,7 @@ "fdx7aF": "CLIPS_SORT_OLDEST", "0XtAW0": "CLIPS_SORT_PLACEHOLDER", "SCsC5m": "CLIPS_SORT_RECENT", + "wDnlod": "CLIPS_UNFAVORITE", "qtSJxb": "CLIPS_UNKNOWN_SOURCE", "Cyxddp": "CLIPS_UNTITLED", "MhrVg8": "CLIPS_USER_EDUCATION_DISABLED_BODY", @@ -2606,6 +2717,7 @@ "wSS1yN": "CLIPS_VIEWERSIDE_BUTTON_ENABLE_CLIPS_TOOLTIP", "eg5qtV": "CLIPS_VIEWERSIDE_BUTTON_FOCUS_TOOLTIP", "+qxkzC": "CLIPS_YOU_HAVE_NEW_CLIPS", + "JugHO7": "CLIPS_YOU_HAVE_NEW_CLIPS_TITLE", "Ey7mOU": "CLIP_SHARE_MODAL_SUBTITLE", "6EcIlH": "CLIP_SHARE_MODAL_TITLE", "SOtDeZ": "CLIP_SHARE_SELECT_CHANNEL", @@ -2638,52 +2750,61 @@ "jsudFd": "COLLAPSED", "9dqzUr": "COLLAPSE_ALL_CATEGORIES", "SvVRsj": "COLLAPSE_CATEGORY", + "z9VPrQ": "COLLAPSE_GAME_TAGS", "XnXtCt": "COLLAPSE_ROLES", "3nWhcJ": "COLLECTIBLES_ACCEPT_GIFT", "gW9R4B": "COLLECTIBLES_ACQUIRED_DATE", "zp6caO": "COLLECTIBLES_ADD_TO_YOUR_COLLECTION", + "6cfuDj": "COLLECTIBLES_ALREADY_ACQUIRED", "/bUsx+": "COLLECTIBLES_ALREADY_OWNED", - "Or1Ug7": "COLLECTIBLES_ARCADE_COACHTIP_DESCRIPTION", - "MBhTQO": "COLLECTIBLES_ARCADE_COACHTIP_TITLE", - "hORo2W": "COLLECTIBLES_AVATAR_DECORATION_PREVIEW_A11Y_LABEL", "zOA4ax": "COLLECTIBLES_AVATAR_DECO_UPDATED_NOTIFICATION", "gn7SZe": "COLLECTIBLES_BANNER_DESCRIPTION_2024", "4Emkuj": "COLLECTIBLES_BANNER_TITLE_2024", "V1AWw0": "COLLECTIBLES_BUNDLE_BUY_BUNDLE", - "AjFeqQ": "COLLECTIBLES_BUNDLE_DECORATION", - "jM8/71": "COLLECTIBLES_BUNDLE_DESCRIPTION", - "R37vyu": "COLLECTIBLES_BUNDLE_DESCRIPTION_ALT", - "SKj9We": "COLLECTIBLES_BUNDLE_DESCRIPTION_PRFIX", - "hTwKEY": "COLLECTIBLES_BUNDLE_PROFILE_EFFECT", "qu71BP": "COLLECTIBLES_BUNDLE_PURCHASE_BUNDLE_AT_PRICE", + "BEjTij": "COLLECTIBLES_BUNDLE_UNAVAILABLE", "AQ0Veg": "COLLECTIBLES_BUY_DECORATION", + "gmnzqM": "COLLECTIBLES_BUY_GIFT", + "H3vhqU": "COLLECTIBLES_BUY_NAMEPLATE", "kAeDcK": "COLLECTIBLES_BUY_PROFILE_EFFECT", "hEsdA9": "COLLECTIBLES_CATEGORY_BANNER_A11Y_LABEL", "d5YwK5": "COLLECTIBLES_CHAT_PREVIEW_TEXT", "sB3lwG": "COLLECTIBLES_CLAIM", + "r+izf4": "COLLECTIBLES_CLAIM_FOR_FREE", "TYw+9s": "COLLECTIBLES_COLLECTING", "Pg1UP5": "COLLECTIBLES_COLLECTING_FINISHED", "fYfGgK": "COLLECTIBLES_CTA_GO_TO_SHOP", - "JgplD7": "COLLECTIBLES_DARK_FANTASY_COACHTIP_DESCRIPTION", - "lUIP4c": "COLLECTIBLES_DARK_FANTASY_COACHTIP_NEUTRAL_TEXT", - "tCzA8f": "COLLECTIBLES_DARK_FANTASY_COACHTIP_TITLE", "Io7ozn": "COLLECTIBLES_DAYS_LEFT", "8gsP5M": "COLLECTIBLES_DAYS_LEFT_IN_SHOP", - "Ifvd7F": "COLLECTIBLES_DETAILS_MODAL_BUNDLE_PURCHASE_DISCLAIMER", "O2K0xJ": "COLLECTIBLES_DETAILS_MODAL_INCLUDED_WITH_PREMIUM_DISCLAIMER", - "IA8col": "COLLECTIBLES_DETAILS_MODAL_PREMIUM_PURCHASE_DISCLAIMER", - "pxunjn": "COLLECTIBLES_DETAILS_MODAL_PROFILE_EFFECT_PREMIUM_PURCHASE_DISCLAIMER", - "Vrbnnu": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_BODY", - "fmqMEd": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_CTA_1", - "x8T+k9": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_CTA_2", - "Kup5Gf": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_HEADER_1", - "xz81oy": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_HEADER_2", "eZSTa5": "COLLECTIBLES_EXPIRE_DATE", - "YvcCKk": "COLLECTIBLES_FEELIN_RETRO_PIRATES_COACHTIP_DESCRIPTION", - "g/YzHN": "COLLECTIBLES_FEELIN_RETRO_PIRATES_COACHTIP_TITLE", + "dMey+v": "COLLECTIBLES_FILTER_COLOR_BLACK", + "qQTRae": "COLLECTIBLES_FILTER_COLOR_BLUE", + "Sd/BMa": "COLLECTIBLES_FILTER_COLOR_BROWN", + "f/Ylk6": "COLLECTIBLES_FILTER_COLOR_GREEN", + "ZE7weD": "COLLECTIBLES_FILTER_COLOR_ORANGE", + "HvLEGM": "COLLECTIBLES_FILTER_COLOR_PINK", + "kqUD4P": "COLLECTIBLES_FILTER_COLOR_PURPLE", + "hKJGOM": "COLLECTIBLES_FILTER_COLOR_RED", + "ceaZK9": "COLLECTIBLES_FILTER_COLOR_TEAL", + "K1xGoG": "COLLECTIBLES_FILTER_COLOR_TITLE", + "CB+lNO": "COLLECTIBLES_FILTER_COLOR_WHITE", + "0fevYz": "COLLECTIBLES_FILTER_COLOR_YELLOW", + "w0nSG/": "COLLECTIBLES_FILTER_THEME_ANIMALS_PETS", + "aVBOKh": "COLLECTIBLES_FILTER_THEME_ANIME", + "yuEmLj": "COLLECTIBLES_FILTER_THEME_CUTE_COZY", + "MB9H5Z": "COLLECTIBLES_FILTER_THEME_DARK_MOODY", + "4IaUIM": "COLLECTIBLES_FILTER_THEME_FANTASY", + "TlhOQC": "COLLECTIBLES_FILTER_THEME_FOOD_DRINKS", + "3WoZBc": "COLLECTIBLES_FILTER_THEME_GAMING", + "5mUvyM": "COLLECTIBLES_FILTER_THEME_MOVIES_TV", + "cJng7v": "COLLECTIBLES_FILTER_THEME_NATURE", + "mMvCHo": "COLLECTIBLES_FILTER_THEME_SCI_FI", + "t1Ztrp": "COLLECTIBLES_FILTER_THEME_TITLE", + "fYtm6f": "COLLECTIBLES_FILTERS_HIDE", + "TeTYE+": "COLLECTIBLES_FILTERS_SHOW", + "nBtvYB": "COLLECTIBLES_FREE", "6yrIzU": "COLLECTIBLES_FROM_SENDER", - "bbQ4Hz": "COLLECTIBLES_GALAXY_COACHTIP_DESCRIPTION", - "t/ddtR": "COLLECTIBLES_GALAXY_COACHTIP_TITLE", "AW3uQm": "COLLECTIBLES_GIFT_COACHMARK_DESC", "lDbi6H": "COLLECTIBLES_GIFT_COACHMARK_HEADING", "twSHte": "COLLECTIBLES_GIFT_CODE_MODAL_UPSELL", @@ -2696,29 +2817,23 @@ "kD2gft": "COLLECTIBLES_LAST_CHANCE", "Bc13HF": "COLLECTIBLES_LAST_DAY", "TlZULM": "COLLECTIBLES_LIMITED_TIME_BADGE_A11Y_LABEL", - "qIeHBb": "COLLECTIBLES_LOFI_VIBES_COACHTIP_DESCRIPTION", - "QgBqwK": "COLLECTIBLES_LOFI_VIBES_COACHTIP_TITLE", "qU+Gj1": "COLLECTIBLES_MOBILE_IAP_NOTICE", "bXfVBs": "COLLECTIBLES_MOBILE_IAP_NOTICE_EDIT_HEADER", "DkxLY0": "COLLECTIBLES_MOBILE_SHOP_DAYS_LEFT", "WJieZ2": "COLLECTIBLES_MOBILE_SHOP_HOURS_LEFT", - "nHOGt2": "COLLECTIBLES_MOBILE_SHOP_IAP_CONFIRMATION", - "MQkmBQ": "COLLECTIBLES_MOBILE_SHOP_IAP_DESCRIPTION_1", - "oa0TmU": "COLLECTIBLES_MOBILE_SHOP_IAP_DESCRIPTION_2", - "gxEIl3": "COLLECTIBLES_MOBILE_SHOP_IAP_DESCRIPTION_3", - "Lh3QfV": "COLLECTIBLES_MOBILE_SHOP_IAP_NEW_DESCRIPTION_2", - "RUtg4j": "COLLECTIBLES_MOBILE_SHOP_IAP_TITLE", "8O30fC": "COLLECTIBLES_MOBILE_SHOP_MARKETING_COACHTIP_DESCRIPTION", "864PkX": "COLLECTIBLES_MOBILE_SHOP_MARKETING_COACHTIP_TITLE", "LH22J3": "COLLECTIBLES_MOBILE_SHOP_MARKETING_SHEET_USER_DESCRIPTION_1", "zvRKYw": "COLLECTIBLES_MOBILE_SHOP_MARKETING_SHEET_USER_DESCRIPTION_2", "7yqdFT": "COLLECTIBLES_MOBILE_SHOP_USUAL_PRICE", "PHioKd": "COLLECTIBLES_NEW_BADGE", + "x41/Vw": "COLLECTIBLES_NEW_DROP", "soka7y": "COLLECTIBLES_NEW_RELEASE", "X3Ekj8": "COLLECTIBLES_NITRO_EXCLUSIVE", "W3gIWI": "COLLECTIBLES_NON_PREMIUM_PRICE", "Sv8iic": "COLLECTIBLES_NON_PREMIUM_PRICE_SUBSCRIBE_NOW", "Kxw2LT": "COLLECTIBLES_NON_PREMIUM_PRICE_SUBSCRIBE_NOW_MOBILE", + "wu4gyV": "COLLECTIBLES_NOT_AVAILABLE", "5b+Jhc": "COLLECTIBLES_PARTIALLY_OWNED", "2MCxfd": "COLLECTIBLES_PARTIALLY_OWNED_DISCLAIMER", "44b50t": "COLLECTIBLES_PERMANENT_COLLECTION", @@ -2727,52 +2842,55 @@ "ivaAA7": "COLLECTIBLES_POPULAR_PICKS", "MPFyJ5": "COLLECTIBLES_PREMIUM_DISCOUNT_TOOLTIP_TEXT", "2GnJQL": "COLLECTIBLES_PREVIEW_GIFT_PROFILE", + "6C36MF": "COLLECTIBLES_PRICE_A11Y_LABEL", "f9M1YB": "COLLECTIBLES_PROFILE_EFFECT_PERMANENT_COLLECTION", - "HSX4HR": "COLLECTIBLES_PROFILE_EFFECT_PREVIEW_A11Y_LABEL", + "mbHmX2": "COLLECTIBLES_PROFILE_EFFECT_PREVIEW_A11Y", + "ayozFl": "COLLECTIBLES_PROFILE_PREVIEW_A11Y", "tf1ZZ4": "COLLECTIBLES_PROFILE_UPDATE_NOTIFICATION", "cNSL/j": "COLLECTIBLES_PURCHASE", - "ofqyUg": "COLLECTIBLES_PURCHASE_DISCLAIMER_GIFT_PAYMENT", - "G3l0s4": "COLLECTIBLES_PURCHASE_DISCLAIMER_PAYMENT", - "zFXJX9": "COLLECTIBLES_PURCHASE_DISCLAIMER_PAYMENT_MOBILE", - "qAWS4G": "COLLECTIBLES_QUEUING_UP", - "Z4SDvB": "COLLECTIBLES_ROBERT_COACHTIP_DESCRIPTION", - "phhjIZ": "COLLECTIBLES_ROBERT_COACHTIP_TITLE", - "EDi1u3": "COLLECTIBLES_ROBERT_SETTINGS_BANNER_DESCRIPTION", - "pAJTKr": "COLLECTIBLES_ROBERT_SETTINGS_BANNER_TITLE", + "J6HsXs": "COLLECTIBLES_PURCHASE_OPTIONS", + "/FaMSE": "COLLECTIBLES_SEARCH_LOADING", + "arz34K": "COLLECTIBLES_SEARCH_THE_SHOP", + "567s2g": "COLLECTIBLES_SEE_MORE", "rSXaxY": "COLLECTIBLES_SEE_WHATS_NEW", + "JUV1tL": "COLLECTIBLES_SENDER_GIFTED_YOU_BUNDLE", + "iJ8823": "COLLECTIBLES_SENDER_GIFTED_YOU_BUNDLE_UNKNOWN_SENDER", "SKduyh": "COLLECTIBLES_SENDER_GIFTED_YOU_DECORATION", "2ZO6CC": "COLLECTIBLES_SENDER_GIFTED_YOU_DECORATION_UNKNOWN_SENDER", "1w42T2": "COLLECTIBLES_SENDER_GIFTED_YOU_EFFECT", "2NxdjX": "COLLECTIBLES_SENDER_GIFTED_YOU_EFFECT_UNKNOWN_SENDER", + "vFiQlU": "COLLECTIBLES_SENDER_GIFTED_YOU_NAMEPLATE", + "v7F232": "COLLECTIBLES_SENDER_GIFTED_YOU_NAMEPLATE_UNKNOWN_SENDER", "ktsDS4": "COLLECTIBLES_SEND_ITEM_AS_A_GIFT", - "46KvZ8": "COLLECTIBLES_SFA_BANNER_DESCRIPTION", - "6MDGOa": "COLLECTIBLES_SFA_HERO_BANNER_SUBTITLE", - "9hafRs": "COLLECTIBLES_SFA_STARTER_BANNER_DESCRIPTION", - "r7ftiL": "COLLECTIBLES_SFA_TITLE", "pWG4ze": "COLLECTIBLES_SHOP", + "5upuqx": "COLLECTIBLES_SHOP_A11Y_LABEL", + "yzW/fZ": "COLLECTIBLES_SHOP_ADMINS_HEADER", "xFcotU": "COLLECTIBLES_SHOP_ALL", "CpyW8Y": "COLLECTIBLES_SHOP_AUTUMN_EQUINOX_COLLECTION", "wvKYCu": "COLLECTIBLES_SHOP_CATEGORY_COLLECTION", "i5SQ74": "COLLECTIBLES_SHOP_ERROR_HEADING", "LuhKs2": "COLLECTIBLES_SHOP_ERROR_SHOP_LOAD", + "xNiB/O": "COLLECTIBLES_SHOP_FEATURED_PAGE", + "zMqLH9": "COLLECTIBLES_SHOP_FEATURED_PAGE_A11Y_LABEL", "AfrvRD": "COLLECTIBLES_SHOP_FEED_END_OF_SCROLL_BUTTON", + "i/yzHs": "COLLECTIBLES_SHOP_FEED_END_OF_SCROLL_BUTTON_BROWSE", "Wl+Ypz": "COLLECTIBLES_SHOP_FEED_END_OF_SCROLL_BUTTON_NEW", "Yr70c4": "COLLECTIBLES_SHOP_FEED_END_OF_SCROLL_TEXT", "JbRd5s": "COLLECTIBLES_SHOP_GIFT_MODAL_REVIEW_HEADER", "JCFN/y": "COLLECTIBLES_SHOP_GIFT_MODAL_SELECT_HEADER", "S383hM": "COLLECTIBLES_SHOP_HERO_BANNER_SUBTITLE_ALT", "n0DdQy": "COLLECTIBLES_SHOP_HERO_BANNER_TITLE", + "nSFuC0": "COLLECTIBLES_SHOP_MENU", + "P0DpSf": "COLLECTIBLES_SHOP_MENU_A11Y_LABEL", + "NG43/6": "COLLECTIBLES_SHOP_ONLINE_HEADER", + "rSfoC+": "COLLECTIBLES_SHOP_ORBS_EXCLUSIVES_A11Y_LABEL", + "RSyoZu": "COLLECTIBLES_SHOP_SHOP_ALL", + "bG3n/t": "COLLECTIBLES_SHOP_SHOP_ALL_A11Y_LABEL", + "xYKa1T": "COLLECTIBLES_SHOP_THE_COLLECTION", "/35Yzx": "COLLECTIBLES_SHOP_THE_VAULT_COLLECTION", "qV+hLm": "COLLECTIBLES_SHOP_VIEW_ALL", - "7TMPXi": "COLLECTIBLES_SHY_COACHTIP_DESCRIPTION", - "SKThFM": "COLLECTIBLES_SHY_COACHTIP_TITLE", - "kDb9hV": "COLLECTIBLES_SHY_FOR_A_LIMITED_TIME", - "ZDfl3Z": "COLLECTIBLES_STORM_MYSTERY_CARD_TITLE", - "sFMS6J": "COLLECTIBLES_TIDE_CAROUSEL_SLIDE_DESCRIPTION", - "KdNbQ9": "COLLECTIBLES_TIDE_COACHTIP_DESCRIPTION", - "xU2dMx": "COLLECTIBLES_TIDE_COACHTIP_TITLE", - "PgDVTl": "COLLECTIBLES_TIDE_SETTINGS_BANNER_DESCRIPTION", - "qFKNgE": "COLLECTIBLES_TIDE_SETTINGS_BANNER_TITLE", + "X3tnc4": "COLLECTIBLES_SHUFFLE_BUTTON", + "uaX705": "COLLECTIBLES_SORT_BY", "MAS7uK": "COLLECTIBLES_USE_NOW", "YNaxMp": "COLLECTIBLES_YOU_COLLECTED", "/fkc8a": "COLOR_PICKER_CUSTOM", @@ -2871,6 +2989,7 @@ "BwbW/Q": "COMMUNITY_GUIDELINES_AND_TYPES_OF_SPACES_POLICIES", "xhDMzR": "COMMUNITY_POLICY_HELP", "6+nTjd": "COMPACT_MODE", + "DbPgAd": "COMPARE_OUR_PLANS", "QQ2wVE": "COMPETING", "JOBw0y": "COMPLETED", "NpHUi1": "CONFIGURE", @@ -2888,6 +3007,7 @@ "pegItC": "CONFIRM_USER_BLOCK_BODY", "x5pOn9": "CONFIRM_USER_BLOCK_TITLE", "S0W8Z5": "CONNECT", + "LV+CXH": "CONNECTED", "+/hZM/": "CONNECTED_ACCOUNTS", "WenGZ2": "CONNECTED_ACCOUNTS_NONE", "aoLS84": "CONNECTED_ACCOUNTS_NONE_TITLE", @@ -2903,10 +3023,12 @@ "hKHZhO": "CONNECTED_ACCOUNT_HELP_CENTER_ARTICLE", "0EikXi": "CONNECTED_ACCOUNT_HELP_CENTER_ARTICLE_MOBILE", "COW3Xn": "CONNECTED_ACCOUNT_IS_AUTHORIZED_APP_DISCONNECT_WARNING", + "flvacA": "CONNECTED_ACCOUNT_OPEN_DISCORD", "6C4lgA": "CONNECTED_ACCOUNT_REVOKED", "AOKOe7": "CONNECTED_ACCOUNT_VERIFYING", "E62dXo": "CONNECTED_ACCOUNT_VERIFY_FAILURE", "Ra6lcp": "CONNECTED_ACCOUNT_VERIFY_FAILURE_DETAILS", + "LElyIL": "CONNECTED_ACCOUNT_VERIFY_FAILURE_ERROR_CODE", "3dIn2A": "CONNECTED_ACCOUNT_VERIFY_FAILURE_PSN_CHILD_ACCOUNT_DETAILS", "nQPJdL": "CONNECTED_ACCOUNT_VERIFY_FAILURE_YOUTUBE_PROFILE", "RzEB5v": "CONNECTED_ACCOUNT_VERIFY_SUCCESS", @@ -2920,6 +3042,7 @@ "GGlM3e": "CONNECTED_DEVICE_DETECTED_OPTION_OUTPUT", "jyhYp1": "CONNECTED_DEVICE_DETECTED_OUTPUT_BODY", "AbnGI5": "CONNECTED_DEVICE_DETECTED_TITLE", + "YpCiMt": "CONNECTED_GAMES", "IyYqqY": "CONNECTED_ON_ANOTHER_CLIENT", "7LkwqE": "CONNECTING", "AG2zPM": "CONNECTING_PROBLEMS_CTA", @@ -3049,13 +3172,11 @@ "Da+3NJ": "CONNECT_CRUNCHYROLL_LANDING_TITLE", "YwXceg": "CONNECT_CRUNCHYROLL_SUCCESS_BODY", "Fnvxvk": "CONNECT_CRUNCHYROLL_SUCCESS_TITLE", - "lDqYJ0": "CONNECT_PLAYSTATION", "qE9nqE": "CONNECT_PS_ERROR_BODY", "EVyQLc": "CONNECT_PS_LANDING_BODY", "n2I5mI": "CONNECT_PS_LANDING_TITLE", "clqrYm": "CONNECT_TO_VIDEO", "BSDZL8": "CONNECT_TO_VOICE", - "bkvb+E": "CONNECT_XBOX", "zcKE8W": "CONNECT_XBOX_APP_INSTALLED", "zMpLEe": "CONNECT_XBOX_DISPLAY_GAME_VALUE_PROP", "rPyQhy": "CONNECT_XBOX_EDUCATION_TITLE", @@ -3067,18 +3188,11 @@ "7FGNVK": "CONNECT_XBOX_LANDING_TITLE", "aGRPVq": "CONNECT_XBOX_ONE_MORE_THING", "M5yEcb": "CONNECT_XBOX_SUCCESS_APP_BODY", - "SaIjYG": "CONNECT_XBOX_SUCCESS_APP_BUTTON_ANDROID", - "Jvi61o": "CONNECT_XBOX_SUCCESS_APP_BUTTON_IOS", - "9gp9dU": "CONNECT_XBOX_SUCCESS_APP_TITLE", "byYNPX": "CONNECT_XBOX_SUCCESS_BODY", "7QsHmh": "CONNECT_XBOX_SUCCESS_TITLE", "VU+McV": "CONNECT_XBOX_TRANSFER_VOICE_VALUE_PROP", "SS+ebO": "CONSOLE_CONNECTING", "2Ne/Y1": "CONSOLE_CONNECTING_DISABLED", - "zQN4xU": "CONSOLE_DETECT_DEVICE_FOUND", - "zdizVF": "CONSOLE_DETECT_DEVICE_FOUND_DESCRIPTION", - "72jgfV": "CONSOLE_DETECT_NO_DEVICES_FOUND", - "wYbrS6": "CONSOLE_DETECT_NO_DEVICES_FOUND_DESCRIPTION", "GSZ+HI": "CONSOLE_DEVICE_COMMUNICATION_RESTRICTED", "cYX/3E": "CONSOLE_DEVICE_COMMUNICATION_RESTRICTED_BODY", "M6Vzat": "CONSOLE_DEVICE_IN_USE", @@ -3091,9 +3205,6 @@ "QL1y93": "CONSOLE_DEVICE_UNKNOWN_ERROR", "6ZyNH/": "CONSOLE_DEVICE_UNKNOWN_ERROR_BODY", "1Bi9Cf": "CONSOLE_ERROR_CODE_SUPPORT", - "02gscF": "CONSOLE_LAN_DETECT_CTA", - "QywP7v": "CONSOLE_LAN_SEARCHING", - "egQIYJ": "CONSOLE_LAN_SEARCHING_DESCRIPTION", "O2WA4u": "CONSOLE_NUX_MOBILE", "fr5bJy": "CONSOLE_NUX_MOBILE_SUBTITLE", "HYgaeZ": "CONSOLE_NUX_TOOLTIP_ACCEPT", @@ -3123,24 +3234,6 @@ "QN7HXV": "CONSOLE_VOICE_MOBILE_UPSELL_REDESIGN_XBOX", "/uR9x1": "CONSOlE_VOICE_MOBILE_UPSELL_REDESIGN_SUBTITLE_PLAYSTATION", "M/Ld86": "CONSOlE_VOICE_MOBILE_UPSELL_REDESIGN_SUBTITLE_XBOX", - "tZyXgy": "CONSUMABLE_HD_STREAMING_APPLYING_TO", - "yKw8Du": "CONSUMABLE_HD_STREAMING_BANNER_BUTTON_COPY", - "vNbVXP": "CONSUMABLE_HD_STREAMING_BANNER_COPY", - "JkWoqL": "CONSUMABLE_HD_STREAMING_BANNER_COPY_STREAMERS", - "r6xhB5": "CONSUMABLE_HD_STREAMING_BANNER_DISMISS_BUTTON_COPY", - "IjKvNS": "CONSUMABLE_HD_STREAMING_BANNER_SELF_COPY", - "Qwq08L": "CONSUMABLE_HD_STREAMING_LIST_ITEM", - "htEhYu": "CONSUMABLE_HD_STREAMING_LIST_ITEM_IMG_ALT", - "1wV4qt": "CONSUMABLE_HD_STREAMING_MENU_LEARN_MORE", - "bVbBTx": "CONSUMABLE_HD_STREAMING_MENU_TITLE", - "S9LAdf": "CONSUMABLE_HD_STREAMING_MODAL_BUY_BUTTON_COPY", - "sl6Tck": "CONSUMABLE_HD_STREAMING_MODAL_BUY_FREEBIE_COPY", - "Avt5Kf": "CONSUMABLE_HD_STREAMING_MODAL_CANCEL_BUTTON_COPY", - "xwRQWq": "CONSUMABLE_HD_STREAMING_MODAL_DESCR", - "sIA0OC": "CONSUMABLE_HD_STREAMING_MODAL_ERROR_MESSAGE", - "Ddigca": "CONSUMABLE_HD_STREAMING_MODAL_IMAGE_ALT", - "sxVfia": "CONSUMABLE_HD_STREAMING_MODAL_LINK", - "K04rOB": "CONSUMABLE_HD_STREAMING_MODAL_TITLE", "sR/ug+": "CONTACTS", "ucWATl": "CONTACTS_ON_DISCORD", "OXdOPf": "CONTACT_SYNC_ADD_FRIENDS_SUBTITLE", @@ -3194,6 +3287,7 @@ "xCHh/t": "CONTACT_SYNC_UPDATE_NAME_SUBTITLE", "/OywGQ": "CONTACT_SYNC_UPDATE_NAME_TITLE", "+o1pDZ": "CONTENT_AND_SOCIAL", + "Q4BGAM": "CONTENT_FAILED_TO_RENDER", "zFfUhF": "CONTENT_INVENTORY_ACTIVITY_CARD_ARIA_ROLE_DESCRIPTION", "V5y3qZ": "CONTENT_INVENTORY_COACHTIP_HEADER", "9wkT13": "CONTENT_INVENTORY_COACHTIP_IMAGE_ALT", @@ -3202,14 +3296,9 @@ "wmUSiy": "CONTENT_INVENTORY_GAME_STATE_SIZE", "5y0wym": "CONTENT_INVENTORY_JOIN_LIVE_CHANNEL", "6gwSFY": "CONTENT_INVENTORY_MEMBERLIST_GROUP_TITLE", - "AWkQTq": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_ALT", "WKxo8n": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_DESCRIPTION", - "5Ey5Dy": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_DISCLOSURE", "vXBrdg": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_FRIEND_NOTE", - "x/26dy": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_GOT_IT", - "gb37Kz": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_HEADER", "ZmBfKJ": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_MANAGE_NOTE", - "aExjO+": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_PLAYED_NOTE", "i7/QHN": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_REPLY_NOTE", "pWLGnF": "CONTENT_INVENTORY_MEMBERLIST_SETTINGS_ABOUT", "w2jvOf": "CONTENT_INVENTORY_MEMBERLIST_SETTINGS_ALT", @@ -3236,19 +3325,23 @@ "79qal8": "CONVERT_EMOTICONS", "20dvuQ": "CONVERT_EMOTICONS_HELP", "t5VZ88": "COPIED", + "bhUpvC": "COPIED_IMAGE", "L/PwZf": "COPIED_LINK", "mGZ66D": "COPIED_TEXT", "OpuAlK": "COPY", "Tb3Vst": "COPY_CHANNEL_TOPIC", "1ACdYL": "COPY_CODE", "42H+Nb": "COPY_COMMAND", + "ZYLVKo": "COPY_EMAIL_ADDRESS", "ad58UB": "COPY_EMOJI", "9o+VKx": "COPY_EVENT_LINK", "IHTjzA": "COPY_ID", "+NP/b2": "COPY_ID_APP", "FfCL+6": "COPY_ID_APPLICATION", + "nwg3lR": "COPY_ID_ATTACHMENT", "Muw4wm": "COPY_ID_AUTHOR", "F64hjn": "COPY_ID_AUTOMOD_RULE", + "2visC6": "COPY_ID_CATEGORY", "gFHI3k": "COPY_ID_CHANNEL", "oJ1Muw": "COPY_ID_COMMAND", "Ap2oVy": "COPY_ID_EMOJI", @@ -3258,17 +3351,23 @@ "94lLD7": "COPY_ID_GUILD", "zBoHlf": "COPY_ID_MESSAGE", "sMsaLg": "COPY_ID_ROLE", + "rka/KS": "COPY_ID_SERVER_INFO", "HJikXp": "COPY_ID_SOUND", "SJ3249": "COPY_ID_STICKER", "DQ797g": "COPY_ID_THREAD", "rCazna": "COPY_ID_UNKNOWN", "/AXYnE": "COPY_ID_USER", + "QvQeLv": "COPY_ID_USER_INFO", + "8xHmxo": "COPY_IMAGE_LINK", "tvUqWn": "COPY_IMAGE_MENU_ITEM", "WqhZss": "COPY_LINK", "92CPQ+": "COPY_MEDIA_LINK", "Xrt5Po": "COPY_MESSAGE_LINK", + "3zozoR": "COPY_PHONE_NUMBER", "QLtDqP": "COPY_RECURRENCE_LINK", "AYnhB7": "COPY_SERIES_LINK", + "2FoUnk": "COPY_SERVER_BANNER_LINK", + "7H30wR": "COPY_SERVER_ICON_LINK", "XEb+Sj": "COPY_STATS", "MSaeTe": "COPY_SUCCESS_1", "bLXdcY": "COPY_SUCCESS_10", @@ -3285,6 +3384,7 @@ "y5MwJy": "COPY_USERNAME", "9Al4Qd": "COPY_VERSION", "/FnP7L": "COP_NAME", + "FTmi9y": "COUNT", "QJyuxY": "COUNTDOWN_UNITS_DAYS", "1LyF1h": "COUNTDOWN_UNITS_HOURS", "n7dksO": "COUNTDOWN_UNITS_MINUTES", @@ -3591,10 +3691,12 @@ "1X8SK/": "CREATE_FORUM_CHANNEL", "nJwAHX": "CREATE_FORUM_POSTS", "ZGMNA8": "CREATE_GROUP_DM", + "h1/FMu": "CREATE_GROUP_MESSAGE", "DtspPx": "CREATE_GUILD_WITH_TEMPLATES_TITLE", "zJrgTG": "CREATE_INSTANT_INVITE", "jwpXqE": "CREATE_LINK", "JyCrwS": "CREATE_MEDIA_CHANNEL_DESCRIPTION", + "bA875g": "CREATE_MESSAGE", "gBkfzu": "CREATE_NEWS_CHANNEL_DESCRIPTION", "Flr51u": "CREATE_POLL", "mULZgc": "CREATE_POLL_ADD_ALT_ARIA_LABEL", @@ -3643,6 +3745,7 @@ "IhMxgu": "CREATE_POLL_REMOVE_EMOJI", "CZeRhU": "CREATE_POLL_REPLACE_EMOJI", "X8JJ/v": "CREATE_POLL_REPLACE_IMAGE", + "OPsckI": "CREATE_POLL_SUCCESS", "Ri/gGf": "CREATE_POLL_TEXT_PRECEDING_DURATION_SELECTION", "cV+h7B": "CREATE_POLL_UPDATE_EMOJI_MENU_ARIA", "QwbTSa": "CREATE_PRIVATE_THREADS", @@ -3764,10 +3867,9 @@ "r6Vm8T": "CUSTOMIZE_TAB_SUBTITLE", "BGkaer": "CUSTOMIZE_TAB_TITLE", "FHBa/1": "CUSTOM_COLOR", - "xcVcFZ": "CUSTOM_HANGS_STATUS_COPY_CTA", + "7BFCRR": "CUSTOM_COLOR_ARIA_LABEL", "Q7eoCR": "CUSTOM_HANG_STATUS", "B/dHXL": "CUSTOM_HANG_STATUS_CTA", - "k6lfDp": "CUSTOM_HANG_STATUS_PLACEHOLDER", "Z43V9S": "CUSTOM_IMAGE_SELECTOR_DELETE_CUSTOM_IMAGE_ARIA_LABEL", "WxqWU0": "CUSTOM_IMAGE_SELECTOR_DELETE_IMAGE_TOOLTIP", "Qc9Lg6": "CUSTOM_IMAGE_SELECTOR_EDIT_CUSTOM_IMAGE_ARIA_LABEL", @@ -3790,17 +3892,23 @@ "H8zoFG": "CUSTOM_STATUS_CLEARS_IN_HOURS", "F8TWH+": "CUSTOM_STATUS_CLEARS_IN_MINUTES", "E45wvP": "CUSTOM_STATUS_CLEAR_AFTER", + "YizuvW": "CUSTOM_STATUS_CLEAR_AFTER_HOURS", + "/XUoq5": "CUSTOM_STATUS_CLEAR_AFTER_MINUTES", + "TOEOae": "CUSTOM_STATUS_CLEAR_AFTER_TODAY", + "DN91Jz": "CUSTOM_STATUS_CLEAR_AFTER_TOMORROW_AT_TIME", + "+14vvU": "CUSTOM_STATUS_CLEAR_AT", + "+3jw2j": "CUSTOM_STATUS_CLEAR_AT_TIME", "3DagBC": "CUSTOM_STATUS_CLEAR_CUSTOM_STATUS", "wfYTHe": "CUSTOM_STATUS_CLEAR_CUSTOM_STATUS_A11Y_LABEL", "mLs2cz": "CUSTOM_STATUS_CLEAR_IN_HOURS", "pB9E0R": "CUSTOM_STATUS_CLEAR_IN_MINUTES", "2OyT5H": "CUSTOM_STATUS_CLEAR_TOMORROW", + "/Avy4C": "CUSTOM_STATUS_CLEAR_TOMORROW_AT_TIME", "UpF5Qa": "CUSTOM_STATUS_CUSTOM_STATUS_A11Y_LABEL", "wO53tu": "CUSTOM_STATUS_DELETE", "bRn8cq": "CUSTOM_STATUS_DONT_CLEAR", "3h5PB5": "CUSTOM_STATUS_DURATION", "QdHxos": "CUSTOM_STATUS_EDIT_CUSTOM_STATUS_A11Y_LABEL", - "d/HLji": "CUSTOM_STATUS_EDIT_CUSTOM_STATUS_PLACEHOLDER", "WkfRZP": "CUSTOM_STATUS_EMOJI_BUTTON_A11Y_LABEL", "Rea2gR": "CUSTOM_STATUS_HOURS", "TS3eJb": "CUSTOM_STATUS_MINUTES", @@ -3809,9 +3917,11 @@ "7gNAs8": "CUSTOM_STATUS_OPEN_ACTION_SHEET_YOUR_STATUS_A11Y_HINT", "TM2l8B": "CUSTOM_STATUS_PLACEHOLDER", "/UonHN": "CUSTOM_STATUS_SET_CUSTOM_STATUS", - "ezAcP9": "CUSTOM_STATUS_SET_CUSTOM_STATUS_CTA", + "Iuzg8R": "CUSTOM_STATUS_SET_STATUS", + "Zx4jzN": "CUSTOM_STATUS_SET_YOUR_STATUS", "zOdg0A": "CUSTOM_STATUS_STATUS_TITLE", "GQmLrZ": "CUSTOM_STATUS_TODAY", + "bI7n9i": "CUSTOM_STATUS_TOMORROW_AT_TIME", "s7vKRz": "CUSTOM_STATUS_UPDATE_SUCCESS", "vD0ny2": "CUSTOM_TABS_MOBILE_BODY", "m7wsEv": "CUSTOM_TABS_MOBILE_HEADER", @@ -3859,6 +3969,7 @@ "R7r9VN": "DATE_ABOVE_MAX_ALERT_BODY", "FsJO55": "DATE_BELOW_MIN_ALERT_BODY", "OvfBgA": "DATE_GENERIC_ERROR", + "ixASa2": "DAYS", "+j6eZf": "DEADCHAT_ACTION_CAMERA", "WZ+NyG": "DEADCHAT_ACTION_STICKER", "wjcRFX": "DEAFEN", @@ -3869,6 +3980,7 @@ "Sodsus": "DEB", "KBoWg9": "DEBUG", "BVN4pL": "DECLINE", + "k+ohJm": "DECREMENT", "ghBJz9": "DEEPLINK_BROWSER_APP_OPENED", "SXCxye": "DEEPLINK_BROWSER_PROMPT", "qllnGm": "DEEPLINK_BROWSER_TITLE", @@ -3913,6 +4025,7 @@ "8D8Rsb": "DELETE_CHANNEL", "a6Gz9J": "DELETE_CHANNEL_BODY", "iWlB6h": "DELETE_DEFAULT_CHANNEL_BODY", + "+euLPe": "DELETE_EMOJI", "B9sJLX": "DELETE_EVENT", "GuhMa5": "DELETE_FAVORITES_CATEGORY_BODY", "xOscRh": "DELETE_FAVORITES_CATEGORY_CONFIRM", @@ -3983,13 +4096,16 @@ "CY6q/Q": "DEVELOPER_MODE_HELP_TEXT", "CbItOL": "DEVELOPER_SETTINGS", "H66MEk": "DEVELOPER_SETTINGS_APP_VERSION", + "ZVZVwR": "DEVELOPER_SETTINGS_CACHE_ACTIONS", "tgwiMO": "DEVELOPER_SETTINGS_CLEAR_CACHES", + "Na2lF9": "DEVELOPER_SETTINGS_CLIENT_INFO", "7dqZ6H": "DEVELOPER_SETTINGS_COPY_CLIENT", "YXQKzA": "DEVELOPER_SETTINGS_DATABASE_CONTROLS", "XpPGhL": "DEVELOPER_SETTINGS_DEBUG_LOGS", "+ynK0W": "DEVELOPER_SETTINGS_DEVICE_INFO", "Ni2jKp": "DEVELOPER_SETTINGS_ENABLE_ANIMATION", "zuaWIt": "DEVELOPER_SETTINGS_JS_BUILD_NUMBER", + "BUOCPi": "DEVELOPER_SETTINGS_LOGS", "4bhpIV": "DEVELOPER_SETTINGS_MANIFEST", "xnJtgG": "DEVELOPER_SETTINGS_OS", "Ljj0ps": "DEVELOPER_SETTINGS_PUSH_NOTIF_LOGS", @@ -4025,6 +4141,7 @@ "R9GHya": "DISABLE", "jf5GGb": "DISABLE_ACCOUNT", "gk7h32": "DISABLE_ACCOUNT_BODY", + "EAKdPr": "DISABLE_ALL_NOTIFICATION_SOUNDS_DESCRIPTION", "wrDmA/": "DISABLE_DMS", "P0/9ga": "DISABLE_DMS_DESCRIPTION", "ashbTF": "DISABLE_EMAIL_NOTIFICATIONS", @@ -4078,7 +4195,6 @@ "zJlwvV": "DISCORD_SYSTEM_MESSAGES", "JZ73IY": "DISCORD_SYSTEM_MESSAGE_BOT_TAG_TOOLTIP", "7s687k": "DISCORD_SYSTEM_MESSAGE_BOT_TAG_TOOLTIP_OFFICIAL", - "7dMBj4": "DISCORD_U_COMING_SOON_TO_MOBILE", "4nEZLk": "DISCOVER", "gHPk3I": "DISCOVERABILITY_ALLOW_FIND_ME", "DGZg+k": "DISCOVERABILITY_LANDING_INFO", @@ -4092,16 +4208,6 @@ "O8lDI2": "DISCOVERABLE_GUILD_HEADER_PUBLIC_INFO", "emP/5T": "DISCOVERABLE_GUILD_PROFILE_PUBLIC_LABEL", "oGaVGy": "DISCOVERY", - "7R5eKv": "DISCOVERY_ENTRYPOINT_EMBED_CTA", - "34PBmH": "DISCOVERY_ENTRYPOINT_EMBED_DESCRIPTION", - "uPeLWs": "DISCOVERY_ENTRYPOINT_EMBED_ERROR_CTA", - "yHp/y0": "DISCOVERY_ENTRYPOINT_EMBED_ERROR_DESCRIPTION", - "ZDg1eP": "DISCOVERY_ENTRYPOINT_EMBED_ERROR_TITLE", - "KH2azq": "DISCOVERY_ENTRYPOINT_EMBED_LABEL", - "DOeucI": "DISCOVERY_ENTRYPOINT_EMBED_TITLE", - "SfO+xm": "DISCOVERY_FIND_GAMING_GUILD_CTA", - "kYjB7c": "DISCOVERY_FIND_GAMING_GUILD_HEADER", - "PwNiSJ": "DISCOVERY_FIND_GAMING_GUILD_SUBHEADER", "kGlQGF": "DISCOVERY_LANDING_PAGE", "ozSi8g": "DISCOVERY_LANDING_PAGE_ABOUT_DESCRIPTION", "TduTbs": "DISCOVERY_LANDING_PAGE_ABOUT_HINT", @@ -4140,12 +4246,12 @@ "duVdqn": "DISCOVERY_LANDING_PAGE_UPSELL_BUTTON_DISMISS", "SorTPA": "DISCOVERY_LANDING_PAGE_UPSELL_DESCRIPTION", "Hgd22r": "DISCOVERY_LANDING_PAGE_UPSELL_TITLE", - "x0rBe2": "DISCOVERY_SAMPLE_GUILDS_LABEL", "HtxGAL": "DISCOVERY_SPEAKER_COUNT", "5RL4CD": "DISCOVERY_UPSELL_DESCRIPTION", "DwDxDU": "DISCOVERY_UPSELL_HEADER", "WAI6xu": "DISMISS", "tgi+nm": "DISMISS_BUTTON_TEXT", + "q62UVy": "DISMISS_REPLY_NUDGE", "o+efY9": "DISPATCH_ERROR_MODAL_BODY", "NnE/6P": "DISPATCH_ERROR_MODAL_DESCRIPTION", "BiSnZ9": "DISPATCH_ERROR_MODAL_ERROR_LABEL", @@ -4166,6 +4272,7 @@ "jN2DfZ": "DM", "ACgJhM": "DM_ABBREVIATED", "5IlFpu": "DM_NO_FRIENDS", + "d+e27s": "DM_OPTIONS", "LzcpeZ": "DM_SEARCH_PLACEHOLDER", "QuPY4s": "DM_SEND_MESSAGE", "Depjkv": "DM_SETTINGS_UPSELL_BODY", @@ -4270,6 +4377,7 @@ "c5zfWZ": "DURATION_HOURS_AGO", "LnvrA3": "DURATION_HOURS_CAPITALIZE", "rhY1Rs": "DURATION_HOURS_SHORT", + "0QN7cZ": "DURATION_IMMEDIATE", "opVZ9q": "DURATION_MINS", "iXLF9W": "DURATION_MINUTES", "GqQ/Y9": "DURATION_MINUTES_AGO", @@ -4374,14 +4482,6 @@ "WsOisp": "E2EE_VOICE_DETAILS", "cTQI5t": "E2EE_VOICE_PRIVACY_CODE", "EYxi0o": "EARLY_ACCESS", - "dwPBWT": "EARN_AN_EXCLUSIVE_ITEM", - "rBTUVG": "EARN_AN_EXCLUSIVE_ITEM_EXCLAIMATION", - "DGJVuW": "EARN_AN_EXCLUSIVE_ITEM_EXCLAIMATION_PLURAL", - "YVZp8N": "EARN_AN_EXCLUSIVE_ITEM_PLURAL", - "mETI3F": "EARN_A_REWARD", - "LCpIZG": "EARN_A_REWARD_EXCLAIMATION", - "y8KW9G": "EARN_A_REWARD_EXCLAIMATION_PLURAL", - "S8RZU/": "EARN_A_REWARD_PLURAL", "iWTwu6": "ECHO_CANCELLATION", "bt75uw": "EDIT", "rtNXxN": "EDITING_MESSAGE", @@ -4389,7 +4489,9 @@ "BW1Qoh": "EDIT_ALL_EVENTS", "zdPFs9": "EDIT_CATEGORY", "3gUsJb": "EDIT_CHANNEL", - "Qq+kXD": "EDIT_CHANNEL_SYNCING_TITLE", + "YP/OUo": "EDIT_CURRENT_AVATAR", + "hZDpuy": "EDIT_CURRENT_BANNER", + "FOYn8U": "EDIT_EMOJI", "Rgy2dU": "EDIT_EVENT", "N0Ktr+": "EDIT_FOLDER", "m3N56M": "EDIT_FOLDER_A11Y_LABEL", @@ -4400,6 +4502,7 @@ "grBcM8": "EDIT_FOLLOWED_NEWS_BODY", "NP1yHG": "EDIT_FORUM_POST", "SGuVbR": "EDIT_FORUM_POST_SETTINGS", + "5Q9+/L": "EDIT_GDM", "b0y3DL": "EDIT_IMAGE", "HmFaFB": "EDIT_MAIN_PROFILE", "fsBWmS": "EDIT_MESSAGE", @@ -4407,9 +4510,12 @@ "X70lV6": "EDIT_ONBOARDING", "W1vqbL": "EDIT_OVERVIEW", "s5vZlQ": "EDIT_PROFILE", + "Ip9nBS": "EDIT_PROFILES", "kPHroX": "EDIT_PROFILE_CATEGORY_GUILD_IDENTITY", - "OU3/Po": "EDIT_PROFILE_CATEGORY_USER_PROFILE", + "apVial": "EDIT_PROFILE_FULL_PROFILE_PREVIEW", + "Vs0dLi": "EDIT_PROFILE_PROFILE_PREVIEW", "+riKdA": "EDIT_ROLES", + "9ESaO7": "EDIT_SERVER_PROFILE", "YPdQOp": "EDIT_STAGE_CHANNEL_TITLE", "I+9bLx": "EDIT_STAGE_SUBTITLE", "5BKP4y": "EDIT_STAGE_TITLE", @@ -4444,31 +4550,23 @@ "6u5hQ9": "EMAIL_VERIFICATION_INSTRUCTIONS_BODY", "f5Pi7A": "EMAIL_VERIFICATION_INSTRUCTIONS_HEADER", "v5X4fZ": "EMBEDDED_ACTIVITES_THERMAL_ALERT_HEADER", - "Xt/LcD": "EMBEDDED_ACTIVITIES_ACTIVITIES_AVAILABLE_IN_TEXT", - "U9a92w": "EMBEDDED_ACTIVITIES_ACTIVITIES_OPEN_TO_EVERYONE_BANNER_A11Y_LABEL", "YTgRvn": "EMBEDDED_ACTIVITIES_ACTIVITY", "7XR9+7": "EMBEDDED_ACTIVITIES_ACTIVITY_ENDED", "qaIFpn": "EMBEDDED_ACTIVITIES_ACTIVITY_ENTRY_POINT_TILE_CHOOSE_AN_ACTIVITY", "0vIh/A": "EMBEDDED_ACTIVITIES_ACTIVITY_INFO_TILE_TITLE", + "7vb6nw": "EMBEDDED_ACTIVITIES_ACTIVITY_INVITE", "9rnmem": "EMBEDDED_ACTIVITIES_ACTIVITY_URL_OVERRIDE", "OgmIqy": "EMBEDDED_ACTIVITIES_AGE_GATED_DESCRIPTION", "SSDPOF": "EMBEDDED_ACTIVITIES_AGE_GATED_TITLE", - "wJNK8H": "EMBEDDED_ACTIVITIES_ALREADY_IN_ACTIVITY", "H8HG2t": "EMBEDDED_ACTIVITIES_ALT_TREASURE_CHEST", "uGDCcw": "EMBEDDED_ACTIVITIES_APPLICATION_UNSUPPORTED_OS", "bST/Y4": "EMBEDDED_ACTIVITIES_ARE_YOU_SURE_WANT_TO_LEAVE", "f3Cz25": "EMBEDDED_ACTIVITIES_AUTO_SUGGEST_ACTIVITIES_TITLE", "K8+z4S": "EMBEDDED_ACTIVITIES_AUTO_SUGGEST_SEE_ALL", "HET4fh": "EMBEDDED_ACTIVITIES_AVAILABLE_NOW", - "FqHEaq": "EMBEDDED_ACTIVITIES_BOOSTING_BADGE_TOOLTIP", - "c1THWh": "EMBEDDED_ACTIVITIES_BOOST_SUBSCRIBE_CTA", - "pVr7Cu": "EMBEDDED_ACTIVITIES_CAREFUL", + "B8pz37": "EMBEDDED_ACTIVITIES_CANCEL", "tCdFGp": "EMBEDDED_ACTIVITIES_CHANNEL_LABEL", - "LeDe2e": "EMBEDDED_ACTIVITIES_CONCURRENT_ACTIVITIES_LIMITED_UPSELL_MODAL_BODY", - "o8Q/b2": "EMBEDDED_ACTIVITIES_CONCURRENT_ACTIVITIES_UNLIMITED_UPSELL_MODAL_BODY", - "spW7PJ": "EMBEDDED_ACTIVITIES_CONCURRENT_ACTIVITIES_UPSELL_MODAL_TITLE", "SpP1eK": "EMBEDDED_ACTIVITIES_CONFIGURE_DEVELOPER_ACTIVITY_SHELF", - "Zdvmqd": "EMBEDDED_ACTIVITIES_CURRENTLY_TESTING_NITRO_ACTIVITIES", "CfTySQ": "EMBEDDED_ACTIVITIES_DEVELOPER_ACTIVITY", "AlJyI+": "EMBEDDED_ACTIVITIES_DEVELOPER_ACTIVITY_SHELF_FETCH_ERROR", "p0PRFD": "EMBEDDED_ACTIVITIES_DEVELOPER_ACTIVITY_SHELF_FILTER_ERROR", @@ -4479,14 +4577,13 @@ "xAW71b": "EMBEDDED_ACTIVITIES_DM_TOOLTIP_BODY", "HOPqzR": "EMBEDDED_ACTIVITIES_DM_TOOLTIP_HEADER", "GmfQ8j": "EMBEDDED_ACTIVITIES_DONT_ASK_ME_THIS_AGAIN", + "wGAwOS": "EMBEDDED_ACTIVITIES_DONT_SHOW_AGAIN", "JBnc7N": "EMBEDDED_ACTIVITIES_EMBED_ENDED", "lEvDDa": "EMBEDDED_ACTIVITIES_EMBED_START", "1ckx+P": "EMBEDDED_ACTIVITIES_EMBED_TITLE_INVITED_TO_JOIN", "nvhauu": "EMBEDDED_ACTIVITIES_ENDED", - "7qBEMd": "EMBEDDED_ACTIVITIES_END_ACTIVITY", "hbiAO6": "EMBEDDED_ACTIVITIES_ERROR_TITLE", "3ejJer": "EMBEDDED_ACTIVITIES_EXPAND_A11Y_LABEL", - "ElsOBI": "EMBEDDED_ACTIVITIES_EXTERNAL_APP_CONFIRM_ANNOUNCEMENT_BIRD_A11Y_LABEL", "06YebE": "EMBEDDED_ACTIVITIES_EXTERNAL_APP_CONFIRM_HEADS_UP", "z81WwD": "EMBEDDED_ACTIVITIES_EXTERNAL_APP_CONFIRM_SUBTITLE", "Z/eMDT": "EMBEDDED_ACTIVITIES_EXTERNAL_APP_CONFIRM_TITLE", @@ -4495,12 +4592,7 @@ "E0gf5l": "EMBEDDED_ACTIVITIES_EXTERNAL_APP_LEARN_MORE", "PlAffn": "EMBEDDED_ACTIVITIES_FALLBACK_CHANNEL_NAME", "fijcEL": "EMBEDDED_ACTIVITIES_FEEDBACK_SURVEY", - "Idm4cb": "EMBEDDED_ACTIVITIES_FREE_FOR_EVERYONE_BANNER_TEXT", - "Vs2EeY": "EMBEDDED_ACTIVITIES_FREE_PREVIEW_TOOLTIP", "YOslsE": "EMBEDDED_ACTIVITIES_GAMEPLAY_ALT", - "6eFGZR": "EMBEDDED_ACTIVITIES_GAME_NIGHT", - "1s1xdF": "EMBEDDED_ACTIVITIES_GAME_NIGHT_BODY", - "+4M1ZW": "EMBEDDED_ACTIVITIES_GAME_NIGHT_HEADING", "/1hPUG": "EMBEDDED_ACTIVITIES_GUILD_LABEL", "UxGFH4": "EMBEDDED_ACTIVITIES_IAP_NON_REFUNDABLE", "+ywPmZ": "EMBEDDED_ACTIVITIES_IAP_NON_REFUNDABLE_SUBSCRIPTION_MONTHLY_V2", @@ -4534,7 +4626,6 @@ "YV/hE8": "EMBEDDED_ACTIVITIES_JOIN_ACTIVITY_NAME", "kF7LUp": "EMBEDDED_ACTIVITIES_KEEP_THE_FUN_GOING_SUBTITLE", "cE4jh/": "EMBEDDED_ACTIVITIES_KEEP_THE_FUN_GOING_TITLE", - "VfI6Oy": "EMBEDDED_ACTIVITIES_LAST_HOST_LEAVING_MODAL", "QO7rO6": "EMBEDDED_ACTIVITIES_LAUNCH", "x8g+Ty": "EMBEDDED_ACTIVITIES_LAUNCHING_ACTIVITY", "Ri0Myp": "EMBEDDED_ACTIVITIES_LAUNCH_ACTIVITY_IN_VOICE_CHANNEL", @@ -4553,36 +4644,27 @@ "k0Aph0": "EMBEDDED_ACTIVITIES_LEAVE_ACTIVITY_A11Y_LABEL", "p/YmkR": "EMBEDDED_ACTIVITIES_MAX_PARTICIPANTS", "brPQ5U": "EMBEDDED_ACTIVITIES_MINIMIZE_A11Y_LABEL", - "V1y2CA": "EMBEDDED_ACTIVITIES_MINI_SHELF_GAME_NIGHT_POSTER_ALT", "2lnYtB": "EMBEDDED_ACTIVITIES_MINI_SHELF_TITLE", - "bg1V8I": "EMBEDDED_ACTIVITIES_MINI_SHELF_TUNE_IN_POSTER_ALT", "Yw5Hr2": "EMBEDDED_ACTIVITIES_MOBILE_ACTIVITY_PREVIEW_A11Y_LABEL", - "GK2DmM": "EMBEDDED_ACTIVITIES_MOBILE_NUX_BODY", - "fhm5x3": "EMBEDDED_ACTIVITIES_MOBILE_NUX_HEADING", "OWJfkc": "EMBEDDED_ACTIVITIES_NITRO_BANNER_HEADER", "DcZRXJ": "EMBEDDED_ACTIVITIES_NITRO_BANNER_IMG_ALT", - "z/DfBl": "EMBEDDED_ACTIVITIES_NITRO_END_WARNING", "gmq7FM": "EMBEDDED_ACTIVITIES_NITRO_PERKS_BACKGROUNDS", "uN1mtc": "EMBEDDED_ACTIVITIES_NITRO_PERKS_BOOSTS", "ZhhHae": "EMBEDDED_ACTIVITIES_NITRO_PERKS_STREAMING", - "lJOmF8": "EMBEDDED_ACTIVITIES_NITRO_SUBSCRIBE_CTA", "UXoQTp": "EMBEDDED_ACTIVITIES_NOT_AVAILABLE_ON_OS", - "W4fGIV": "EMBEDDED_ACTIVITIES_NO_ELIGIBLE_HOST_MODAL", - "cce+HX": "EMBEDDED_ACTIVITIES_NO_ELIGIBLE_HOST_UPSELL_MODAL", "dehcUd": "EMBEDDED_ACTIVITIES_NUMBER_OF_MINUTES", "T3isFF": "EMBEDDED_ACTIVITIES_NUMBER_OF_PLAYERS", "TCM94S": "EMBEDDED_ACTIVITIES_NUM_PARTICIPANTS", - "EwoEOa": "EMBEDDED_ACTIVITIES_NVM", + "z8EAJW": "EMBEDDED_ACTIVITIES_NUM_PLAYERS", "tiNgAR": "EMBEDDED_ACTIVITIES_ONE_TO_N_PARTICIPANTS", "nCXbgP": "EMBEDDED_ACTIVITIES_OPEN_ACTIVITY_SHELF", "n/IJ6Y": "EMBEDDED_ACTIVITIES_PEOPLE_ARE_IN_AN_ACTIVITY", "4chKQu": "EMBEDDED_ACTIVITIES_PLAYING_IN_GUILD", - "ugSbNf": "EMBEDDED_ACTIVITIES_POP_IN_WARNING", - "Tfj536": "EMBEDDED_ACTIVITIES_POP_OUT_WARNING", "1LJjZD": "EMBEDDED_ACTIVITIES_PREMIUM_TIER_CUSTOM_EMOJI", - "RRYNF3": "EMBEDDED_ACTIVITIES_PREMIUM_TIER_EXTRA_BOOSTS", "Yildvz": "EMBEDDED_ACTIVITIES_PREMIUM_TIER_UPLOAD_SIZE", "gBZ7JY": "EMBEDDED_ACTIVITIES_PREMIUM_UPSELL_BANNER_A11Y_LABEL", + "makWn9": "EMBEDDED_ACTIVITIES_RELOAD", + "ye21jI": "EMBEDDED_ACTIVITIES_RELOAD_ACTIVITY", "LQx1UO": "EMBEDDED_ACTIVITIES_RESOLVING_ACTIVITY", "1fRDnT": "EMBEDDED_ACTIVITIES_RESUME_VIDEO", "VOgTjy": "EMBEDDED_ACTIVITIES_RESUME_VIDEO_EXPLANATION", @@ -4602,25 +4684,23 @@ "shUONg": "EMBEDDED_ACTIVITIES_SHELF_TITLE", "qv5/SP": "EMBEDDED_ACTIVITIES_SHOW_ACTIVITY_DEBUG_OVERLAY", "9mFd/B": "EMBEDDED_ACTIVITIES_START_ACTIVITY", - "16Lfrb": "EMBEDDED_ACTIVITIES_START_ACTIVITY_LABEL", "qJvTKQ": "EMBEDDED_ACTIVITIES_START_AN_ACTIVITY", "lfSF4L": "EMBEDDED_ACTIVITIES_START_OR_SHARE", "OXKMBY": "EMBEDDED_ACTIVITIES_SUBSCRIBE", "9owKLn": "EMBEDDED_ACTIVITIES_SUBSCRIBE_CTA", "/9T55m": "EMBEDDED_ACTIVITIES_SUBSCRIBE_TO_NITRO_AND_GET", - "5LMZtY": "EMBEDDED_ACTIVITIES_SUPPORTED_PLATFORMS_MOBILE", "6iscU7": "EMBEDDED_ACTIVITIES_THANKS_FOR_TRYING", "E/7kdU": "EMBEDDED_ACTIVITIES_THIS_ACTIVITY", "5SaQDz": "EMBEDDED_ACTIVITIES_TRY_IT_OUT", - "BQg4p6": "EMBEDDED_ACTIVITIES_TUNE_IN_PROMO_BANNER_ALT", "WCNe7F": "EMBEDDED_ACTIVITIES_UNKNOWN_ACTIVITY_NAME", "s1vQIL": "EMBEDDED_ACTIVITIES_UNLIMITED_PARTICIPANTS", "zMNEiF": "EMBEDDED_ACTIVITIES_UNLIMITED_PARTICIPANTS_SHORT", - "d2wMvX": "EMBEDDED_ACTIVITIES_UNLOCK_ACTIVITIES", + "RjceQU": "EMBEDDED_ACTIVITIES_UNLIMITED_PLAYERS", "GDjAkv": "EMBEDDED_ACTIVITIES_UNLOCK_ACTIVITIES_BOOSTING", "8nZJ7J": "EMBEDDED_ACTIVITIES_UNLOCK_ACTIVITIES_NITRO", "atsYXo": "EMBEDDED_ACTIVITIES_UNLOCK_WITH_NITRO", "cpe6CK": "EMBEDDED_ACTIVITIES_USERNAME_AND_OTHERS", + "vYZFzT": "EMBEDDED_ACTIVITIES_USERS_ARE_PLAYING", "3TSGuD": "EMBEDDED_ACTIVITIES_USE_ACTIVITY_URL_OVERRIDE", "6pKGKd": "EMBEDDED_ACTIVITIES_VC_TILE_ENTRY_POINT_INVITE", "7BKMcG": "EMBEDDED_ACTIVITIES_VC_TILE_ENTRY_POINT_TITLE", @@ -4629,12 +4709,10 @@ "tNm8AZ": "EMBEDDED_ACTIVITIES_VOICE_CONTROLS_TOGGLE_NUX_BODY", "pT6hue": "EMBEDDED_ACTIVITIES_VOICE_CONTROLS_TOGGLE_NUX_HEADER", "M/L8ot": "EMBEDDED_ACTIVITIES_WATCHING_IN_GUILD", - "efSOLA": "EMBEDDED_ACTIVITIES_YEP", "5/Xort": "EMBEDDED_ACTIVITY_CHANGE_ACTIVITY_CONFIRM_BODY", "XkIWkk": "EMBEDDED_ACTIVITY_CHANGE_CONFIRM_TITLE", "OGUjmt": "EMBEDDED_ACTIVITY_CURRENT_APPLICATION_CHANNEL_DEFAULT", "G99XFs": "EMBEDDED_ACTIVITY_CURRENT_APPLICATION_DEFAULT", - "n9Tkzf": "EMBEDDED_ACTIVITY_NOTICE_BASH_OUT_DESCRIPTION", "oFdLNF": "EMBEDDED_ACTIVITY_NOTICE_HALLOWEEN_DESCRIPTION", "j2SNA+": "EMBEDDED_ACTIVITY_NOTICE_HALLOWEEN_TITLE", "vMFr/4": "EMBEDDED_ACTIVITY_NOTICE_LEARN_MORE_LINK_A11Y_LABEL", @@ -4677,9 +4755,8 @@ "pAVHxa": "EMOJI_MODIFIER_MENU_BUTTON", "bGN1ow": "EMOJI_MODIFIER_NONE", "9FI9Z0": "EMOJI_NAMES_WITH_FAVORITED", + "pCaYID": "EMOJI_OPTIONS", "/K2RDH": "EMOJI_PICKER_COLLAPSE_EMOJI_SECTION", - "Z/r7IS": "EMOJI_PICKER_CREATE_EMOJI_TITLE", - "XCmLfG": "EMOJI_PICKER_CREATE_EMOJI_TITLE_DESCRIPTION", "kmmq64": "EMOJI_PICKER_DOUBLE_REACTION_ERROR_TITLE", "psMorl": "EMOJI_PICKER_DOUBLE_REACTION_SUPER_ERROR_BODY", "uaUU/g": "EMOJI_PICKER_DOUBLE_REACTION_SUPER_ERROR_TITLE", @@ -4764,6 +4841,7 @@ "IL7/no": "ENABLE_COMMUNITY_MODAL_STEP_3_BODY", "Pj/s/a": "ENABLE_COMMUNITY_MODAL_STEP_3_HEADER", "Pj9P8E": "ENABLE_COMMUNITY_MODAL_STEP_3_TITLE", + "EzGuSr": "ENABLE_COMMUNITY_MODAL_STEP_DEFAULT_SETTINGS_HEADER", "tInpJj": "ENABLE_COMMUNITY_MODAL_STEP_HEADER", "6U5XTu": "ENABLE_COMMUNITY_MODAL_TITLE", "0q344R": "ENABLE_COMMUNITY_MODAL_UPDATED_SETTINGS_LABEL", @@ -4773,11 +4851,11 @@ "yVayGn": "ENABLE_GUILD_COMMUNICATION_BODY", "dR5e4K": "ENABLE_GUILD_COMMUNICATION_BODY_HELP_TEXT", "csKeta": "ENABLE_GUILD_COMMUNICATION_FOR_USER", + "LYXRxL": "ENABLE_HARDWARE_ACCELERATION_BODY", + "/HIxyY": "ENABLE_HARDWARE_ACCELERATION_TITLE", "vSP6cx": "ENABLE_INGAME_OVERLAY", "/dbw3H": "ENABLE_INVITES", "znUpRP": "ENABLE_LEGACY_OVERLAY", - "3vPQ3/": "ENABLE_LOCAL_NETWORK_ACCESS", - "ARF2xo": "ENABLE_LOCAL_NETWORK_ACCESS_DESCRIPTION", "daih+S": "ENABLE_NOISE_CANCELLATION", "9kH25q": "ENABLE_NOTIFICATIONS", "a4bgO0": "ENABLE_NOTIFICATIONS_TITLECASE", @@ -4788,7 +4866,6 @@ "+Af+Vw": "ENABLE_PUBLIC_MODAL_RULES_CHANNEL_HELP", "dYrhCO": "ENABLE_PUBLIC_MODAL_RULES_CHANNEL_TITLE", "x4hbeZ": "ENABLE_PUBLIC_MODAL_VERIFICATION_LEVEL_DESCRIPTION", - "MLVL2M": "ENABLE_STREAMER_MODE_DESCRIPTION", "p9ZAJZ": "ENABLE_STREAMER_MODE_LABEL", "7r4OKg": "ENABLE_TWITCH_EMOJI_SYNC", "xc+Psz": "ENABLE_VIDEO", @@ -4800,13 +4877,16 @@ "saZaRb": "END_STAGE", "gW9je1": "END_STAGE_TITLE", "UrnEV6": "ENJOY_A_FREE_MONTH", + "1LTC8H": "ENTER_ACCOUNT_DETAILS", "o4JNrO": "ENTER_CODE", "ZLRYGU": "ENTER_EMAIL", "KW5DEh": "ENTER_EMAIL_BODY", + "j2MWLu": "ENTER_PHONE", "Vp9je2": "ENTER_PHONE_DESCRIPTION", "3BTmqX": "ENTER_PHONE_DESCRIPTION_NOTE", "WEdDgv": "ENTER_PHONE_OR_EMAIL", "uR76s6": "ENTER_PHONE_TITLE", + "a7oCBj": "ENTER_TO_SAVE", "Se4eFg": "ENTER_YOUR_EMAIL", "5c0bxw": "ENTER_YOUR_PHONE", "j2d6Km": "ERROR", @@ -4818,6 +4898,7 @@ "tx8CkI": "ERRORS_UNEXPECTED_CRASH", "CKsXk3": "ERROR_ANOTHER_TRY", "PTPbjx": "ERROR_COPYING_IMAGE", + "uVV00B": "ERROR_COPYING_LINK", "R0RpRX": "ERROR_GENERIC_TITLE", "yEvsK9": "ERROR_LOADING_STICKER", "fEptJP": "ERROR_OCCURRED_TRY_AGAIN", @@ -4825,6 +4906,8 @@ "CxkU+Z": "ESTIMATED_TAX_LABEL", "uhxR+U": "EUR_NAME", "fyBVRm": "EVENT_CANCELED", + "F9On+q": "EVENT_CHANGES_SAVED", + "5HzXO5": "EVENT_CREATED", "epxpiy": "EVENT_DETAILS_A11Y_HINT", "FXixvH": "EVENT_MARK_INTERESTED", "7M5gaN": "EVENT_MARK_NOT_INTERESTED", @@ -4849,9 +4932,9 @@ "kaPREZ": "EXPAND_BUTTONS", "brtoLr": "EXPERIMENTAL", "PjU/QQ": "EXPERIMENTAL_DESCRIPTION", - "AxnPm1": "EXPERIMENTAL_ENCODERS", "5iq4Hf": "EXPERIMENTAL_FEATURES", "q4MLdl": "EXPERIMENTAL_FEATURES_TOAST", + "LGynPs": "EXPERIMENTAL_UNREADS_DESCRIPTION", "98TEjf": "EXPERIMENT_MOBILE_ONLY_USER_HEADER", "bnrR+1": "EXPERIMENT_MOBILE_ONLY_USER_TEXT1", "PuSHfU": "EXPIRED_DATE", @@ -4897,198 +4980,12 @@ "P7WKHp": "EXPRESSION_PICKER_OPEN_EMOJI_PICKER_A11Y_LABEL", "8KkvwL": "EXPRESSION_PICKER_OPEN_GIF_PICKER_A11Y_LABEL", "z2s6/g": "EXPRESSION_PICKER_OPEN_STICKER_PICKER_A11Y_LABEL", + "EHlAMc": "EXPRESSION_PICKER_SOUNDMOJI", "nf1s3u": "EXPRESSION_PICKER_STICKER", + "f0Ezmv": "EXPRESSION_PICKER_TRY_SOUNDMOJI", "in1rga": "EXPRESSION_REMOVED_FROM_FAVORITES", - "XNMs5h": "EXPRESSION_SUGGESTIONS_STICKER_DISABLE", - "5gglIs": "EXPRESSION_SUGGESTIONS_STICKER_NAME", - "8DjNnM": "EXPRESSION_SUGGESTIONS_STICKER_SHORT_NAV_PROMPT", "h0or/l": "FACEBOOK", "i4GM3L": "FAILED", - "C4ScLD": "FAMILY_CENTER_ACCEPTED_REQUESTS_EMPTY_DESCRIPTION", - "pu6/U0": "FAMILY_CENTER_ACCEPTED_REQUESTS_TITLE_PARENT", - "+tnO34": "FAMILY_CENTER_ACCEPTED_REQUESTS_TITLE_TEEN", - "Y3ZYtM": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_DATE", - "WRtySz": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_DAYS", - "J18GbG": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_HOURS", - "kX3wJg": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_MINUTES", - "Bqsamd": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_SECONDS", - "Ln9zMn": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_YESTERDAY", - "snlFqR": "FAMILY_CENTER_ACCEPT_LINK_ACTIVITY_DISCLAIMER", - "pegSM5": "FAMILY_CENTER_ACCEPT_LINK_MODAL_ERROR", - "rlNJwZ": "FAMILY_CENTER_ACCEPT_LINK_MODAL_TITLE", - "wI/jo3": "FAMILY_CENTER_ACCEPT_REQUEST", - "jc1Ip7": "FAMILY_CENTER_ACCESSIBILITY_LABEL_ACCEPT_WITH_NAME", - "oUpA6X": "FAMILY_CENTER_ACCESSIBILITY_LABEL_CANCEL_WITH_NAME", - "4GtllP": "FAMILY_CENTER_ACCESSIBILITY_LABEL_DECLINE_WITH_NAME", - "T7DUoU": "FAMILY_CENTER_ACCESSIBILITY_LABEL_DISCONNECT_WITH_NAME", - "kIcKAj": "FAMILY_CENTER_ACTIVITY_ADD_FRIENDS_HEADER", - "TEvo+H": "FAMILY_CENTER_ACTIVITY_ADD_FRIENDS_SECTION_HEADER", - "HvsFJf": "FAMILY_CENTER_ACTIVITY_ADD_FRIENDS_TOOLTIP_PARENT", - "1/QpPy": "FAMILY_CENTER_ACTIVITY_ADD_FRIENDS_TOOLTIP_TEEN", - "EMCf6j": "FAMILY_CENTER_ACTIVITY_BANNER_DESCRIPTION_PARENT", - "MXjDSv": "FAMILY_CENTER_ACTIVITY_BANNER_DESCRIPTION_TEEN", - "goKE2b": "FAMILY_CENTER_ACTIVITY_BANNER_HEADER_PARENT", - "T7GyW+": "FAMILY_CENTER_ACTIVITY_BANNER_HEADER_TEEN", - "ffg6xd": "FAMILY_CENTER_ACTIVITY_BANNER_IMAGE_ALT", - "o4pfFA": "FAMILY_CENTER_ACTIVITY_DATA_CONFIRMATION_BANNER_ALT", - "eHQZuO": "FAMILY_CENTER_ACTIVITY_DATA_CONFIRMATION_BANNER_DESCRIPTION_PARENT", - "i4XFEH": "FAMILY_CENTER_ACTIVITY_DATA_CONFIRMATION_BANNER_DESCRIPTION_TEEN", - "XJabSN": "FAMILY_CENTER_ACTIVITY_DATA_CONFIRMATION_BANNER_HEADER", - "CcrbCw": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_HEADER", - "rcPInc": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_SECTION_HEADER", - "dcvNXx": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_TOOLTIP_PARENT", - "c0NgBX": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_TOOLTIP_PARENT_WITH_VC", - "823ugV": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_TOOLTIP_TEEN", - "DLVyFw": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_TOOLTIP_TEEN_WITH_VC", - "NulX9+": "FAMILY_CENTER_ACTIVITY_GUILD_JOIN_HEADER", - "7feG7T": "FAMILY_CENTER_ACTIVITY_GUILD_JOIN_SECTION_HEADER", - "Lmz9Vh": "FAMILY_CENTER_ACTIVITY_GUILD_JOIN_TOOLTIP_PARENT", - "MTFxYc": "FAMILY_CENTER_ACTIVITY_GUILD_JOIN_TOOLTIP_TEEN", - "5JmNgg": "FAMILY_CENTER_ACTIVITY_GUILD_ROW_MEMBER_COUNT", - "7dMmJY": "FAMILY_CENTER_ACTIVITY_MORE", - "n8n5Ba": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_PARENT_DAYS", - "2AtcIs": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_PARENT_TODAY", - "stOECr": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_PARENT_YESTERDAY", - "f1UJiC": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_TEEN_DAYS", - "g1ZX6m": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_TEEN_TODAY", - "s3qSVt": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_TEEN_YESTERDAY", - "hIErU3": "FAMILY_CENTER_ACTIVITY_OVERVIEW_NO_ACTIVITY", - "Q/D/0Q": "FAMILY_CENTER_ACTIVITY_OVERVIEW_PREFACE_PARENT", - "7hqFl9": "FAMILY_CENTER_ACTIVITY_OVERVIEW_PREFACE_TEEN", - "bdBmqy": "FAMILY_CENTER_ACTIVITY_TAB", - "fwQgE/": "FAMILY_CENTER_ACTIVITY_USER_ADDED_TIMESTAMP_DAYS", - "JUHIYZ": "FAMILY_CENTER_ACTIVITY_USER_ADDED_TIMESTAMP_TODAY", - "GiswUW": "FAMILY_CENTER_ACTIVITY_USER_ADDED_TIMESTAMP_YESTERDAY", - "D7Sngz": "FAMILY_CENTER_ACTIVITY_USER_CALLED_HEADER", - "0GE4Ni": "FAMILY_CENTER_ACTIVITY_USER_CALLED_SECTION_HEADER", - "oCk8c4": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TIMESTAMP_DAYS", - "IHd5cZ": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TIMESTAMP_TODAY", - "wOsfxv": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TIMESTAMP_YESTERDAY", - "w7j/Lt": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TOOLTIP_PARENT", - "SCIaWK": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TOOLTIP_TEEN", - "kvTgWP": "FAMILY_CENTER_ACTIVITY_USER_INTERACTION_HEADER", - "4T3zWT": "FAMILY_CENTER_ACTIVITY_USER_INTERACTION_SECTION_HEADER", - "cY19uR": "FAMILY_CENTER_ACTIVITY_USER_INTERACTION_TOOLTIP_PARENT", - "K5r+sN": "FAMILY_CENTER_ACTIVITY_USER_INTERACTION_TOOLTIP_TEEN", - "qvKjp8": "FAMILY_CENTER_ACTIVITY_USER_MESSAGED_TIMESTAMP_DAYS", - "fLBUx7": "FAMILY_CENTER_ACTIVITY_USER_MESSAGED_TIMESTAMP_TODAY", - "cHHgxI": "FAMILY_CENTER_ACTIVITY_USER_MESSAGED_TIMESTAMP_YESTERDAY", - "kFj4h1": "FAMILY_CENTER_AVATAR_ARIA", - "6gyAQZ": "FAMILY_CENTER_CANCEL_LINK_MODAL_ERROR", - "HynllX": "FAMILY_CENTER_CANCEL_LINK_MODAL_TITLE", - "mK40bk": "FAMILY_CENTER_CANCEL_REQUEST", - "czincX": "FAMILY_CENTER_CANCEL_REQUEST_BACK", - "1xBHHV": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_CONTENT_DESCRIPTION_PARENT", - "0QDVFN": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_CONTENT_DESCRIPTION_TEEN", - "82y87X": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_CONTENT_HEADER_PARENT", - "ASf7XN": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_CONTENT_HEADER_TEEN", - "2OqtJJ": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_HEADER_PARENT", - "TCzk/e": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_HEADER_TEEN", - "DxFKkd": "FAMILY_CENTER_DATA_CONFIRMATION_FRIEND_ADD_DESCRIPTION", - "/zMYZX": "FAMILY_CENTER_DATA_CONFIRMATION_FRIEND_ADD_HEADER", - "WrY56N": "FAMILY_CENTER_DATA_CONFIRMATION_GUILD_PARTICIPATION_DESCRIPTION", - "44NEx6": "FAMILY_CENTER_DATA_CONFIRMATION_GUILD_PARTICIPATION_HEADER", - "YU7aaf": "FAMILY_CENTER_DATA_CONFIRMATION_INCLUDED_HEADER_PARENT", - "Sm8Gq5": "FAMILY_CENTER_DATA_CONFIRMATION_INCLUDED_HEADER_TEEN", - "KBgArX": "FAMILY_CENTER_DATA_CONFIRMATION_USERS_MESSAGED_DESCRIPTION", - "Z3G+8h": "FAMILY_CENTER_DATA_CONFIRMATION_USERS_MESSAGED_HEADER", - "LcM8BS": "FAMILY_CENTER_DECLINE_LINK_MODAL_DISCLAIMER_TEEN", - "tJAUyn": "FAMILY_CENTER_DECLINE_LINK_MODAL_ERROR", - "cXgKMD": "FAMILY_CENTER_DECLINE_LINK_MODAL_NOTICE_HEADER", - "teIRCR": "FAMILY_CENTER_DECLINE_LINK_MODAL_TITLE", - "dKxFcn": "FAMILY_CENTER_DECLINE_REQUEST", - "cSb7U0": "FAMILY_CENTER_DISABLE_FEATURE_MODAL_DISABLE_BUTTON_TEXT", - "VGB30H": "FAMILY_CENTER_DISABLE_FEATURE_MODAL_HEADER_TEXT", - "CrZZ+p": "FAMILY_CENTER_DISABLE_FEATURE_MODAL_SUBTITLE_TEXT", - "c5L+sl": "FAMILY_CENTER_DISCONNECT_BUTTON", - "/MYCee": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_DISCLAIMER_PARENT", - "VJaHUb": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_DISCLAIMER_TEEN", - "krIDdy": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_ERROR", - "EvMGLT": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_NOTICE_DESCRIPTION_PARENT", - "f1SUeW": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_NOTICE_DESCRIPTION_TEEN", - "VKblNt": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_NOTICE_HEADER", - "NMSTb/": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_TITLE", - "Xt6oND": "FAMILY_CENTER_EMPTY_ACTIVITY_DAYS", - "VjIAQQ": "FAMILY_CENTER_EMPTY_ACTIVITY_TODAY", - "2a8xHY": "FAMILY_CENTER_EMPTY_ACTIVITY_YESTERDAY", - "GKzqWi": "FAMILY_CENTER_ERROR_CONNECTION_LIMIT_PARENT_DESCRIPTION", - "bS5x94": "FAMILY_CENTER_ERROR_CONNECTION_LIMIT_PARENT_HEADER", - "69F+eS": "FAMILY_CENTER_ERROR_CONNECTION_LIMIT_TEEN_DESCRIPTION", - "MzX4RP": "FAMILY_CENTER_ERROR_CONNECTION_LIMIT_TEEN_HEADER", - "Uss2dn": "FAMILY_CENTER_ERROR_GENERIC_DESCRIPTION", - "nGX8Co": "FAMILY_CENTER_ERROR_GENERIC_HEADER", - "Wu8BK2": "FAMILY_CENTER_ERROR_GENERIC_TOAST", - "xNEkdx": "FAMILY_CENTER_ERROR_REQUEST_PENDING_DESCRIPTION", - "Xyjnwn": "FAMILY_CENTER_ERROR_REQUEST_PENDING_DESCRIPTION_NO_EMAIL", - "tu0MRv": "FAMILY_CENTER_ERROR_REQUEST_PENDING_HEADER", - "On5iRI": "FAMILY_CENTER_ERROR_TEEN_TO_TEEN_LINK_DESCRIPTION", - "W9JLJh": "FAMILY_CENTER_ERROR_TEEN_TO_TEEN_LINK_HEADER", - "6JkHSg": "FAMILY_CENTER_FEATURE_CARDS_HEADER", - "bmhCnL": "FAMILY_CENTER_FEATURE_CARD_MESSAGES_DESCRIPTION_PARENT", - "5RZ8Tq": "FAMILY_CENTER_FEATURE_CARD_MESSAGES_DESCRIPTION_TEEN", - "001l3m": "FAMILY_CENTER_FEATURE_CARD_MESSAGES_HEADER", - "1xPTwE": "FAMILY_CENTER_FEATURE_CARD_PAIRING_DESCRIPTION_PARENT", - "Rm/6a0": "FAMILY_CENTER_FEATURE_CARD_PAIRING_DESCRIPTION_TEEN", - "hhOuMe": "FAMILY_CENTER_FEATURE_CARD_PAIRING_HEADER", - "68zfxD": "FAMILY_CENTER_FEATURE_CARD_SHARING_DESCRIPTION_PARENT", - "XKnFFq": "FAMILY_CENTER_FEATURE_CARD_SHARING_DESCRIPTION_TEEN", - "yipAeP": "FAMILY_CENTER_FEATURE_CARD_SHARING_HEADER", - "KOwsf/": "FAMILY_CENTER_HELP_LINE_CONTENT", - "7/tVhv": "FAMILY_CENTER_HELP_LINE_HEADER", - "krWQZK": "FAMILY_CENTER_LINK_ACTION_ACCEPT", - "e5iHmZ": "FAMILY_CENTER_LINK_ACTION_CANCEL", - "bBDeNI": "FAMILY_CENTER_LINK_ACTION_DECLINE", - "l20ZZp": "FAMILY_CENTER_LINK_ACTION_DISCONNECT", - "Q8XnAa": "FAMILY_CENTER_PENDING_REQUESTS_TITLE_PARENT", - "IkAgkG": "FAMILY_CENTER_PENDING_REQUESTS_TITLE_TEEN", - "MP3khg": "FAMILY_CENTER_PENDING_TIMESTAMP_DATE", - "pWig18": "FAMILY_CENTER_PENDING_TIMESTAMP_DAYS", - "ErkYCI": "FAMILY_CENTER_PENDING_TIMESTAMP_HOURS", - "InzMn3": "FAMILY_CENTER_PENDING_TIMESTAMP_MINUTES", - "CJdoee": "FAMILY_CENTER_PENDING_TIMESTAMP_SECONDS", - "GvfssA": "FAMILY_CENTER_PENDING_TIMESTAMP_YESTERDAY", - "wg2xwQ": "FAMILY_CENTER_QR_CODE_MODAL_BUTTON_HIDE", - "10dX6U": "FAMILY_CENTER_QR_CODE_MODAL_BUTTON_SHOW", - "LyyCsE": "FAMILY_CENTER_QR_CODE_MODAL_DESCRIPTION", - "AVTZaN": "FAMILY_CENTER_QR_CODE_MODAL_HEADER", - "iHYMAz": "FAMILY_CENTER_QR_CODE_MODAL_NOTICE", - "goDyoe": "FAMILY_CENTER_QR_CODE_MODAL_REMINDER", - "z4a9HP": "FAMILY_CENTER_QR_CODE_SCAN", - "RcTgiE": "FAMILY_CENTER_REQUESTS_LIMIT_INFO_PARENT", - "1/PzIj": "FAMILY_CENTER_REQUESTS_LIMIT_INFO_TEEN", - "1J/gZ4": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_DESCRIPTION_PARENT", - "JsAEDi": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_DESCRIPTION_PARENT_MOBILE", - "yMnoDl": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_DESCRIPTION_TEEN", - "pHEnV5": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_HEADER_PARENT", - "B0NPbp": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_HEADER_PARENT_MOBILE", - "zUCWEL": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_HEADER_TEEN", - "1M9So2": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_1_DESCRIPTION", - "7xxAni": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_1_HEADER", - "GzMFnb": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_2_DESCRIPTION", - "AXgx+a": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_2_HEADER", - "8rLBxD": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_3_DESCRIPTION", - "MZn1tG": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_3_HEADER", - "r+PDmu": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_TEEN_ASSET_ALT", - "Ta9byS": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_TEEN_BUTTON", - "gVWG+6": "FAMILY_CENTER_REQUESTS_TAB", - "ISg34l": "FAMILY_CENTER_REQUEST_LINK_BUTTON", - "GH11eI": "FAMILY_CENTER_REQUEST_LINK_MODAL_TITLE_PARENT", - "dVtWId": "FAMILY_CENTER_REQUEST_SUCCESS_DESCRIPTION", - "EpwfZl": "FAMILY_CENTER_REQUEST_SUCCESS_HEADER", - "irvJKR": "FAMILY_CENTER_SETTINGS_EMAIL_DIGEST_ENABLE_SWITCH", - "y34S46": "FAMILY_CENTER_SETTINGS_EMAIL_DIGEST_ENABLE_SWITCH_NOTE", - "cUIXFY": "FAMILY_CENTER_SETTINGS_ENABLE_CTA", - "xAVm7K": "FAMILY_CENTER_SETTINGS_ENABLE_PROMPT", - "zkEceS": "FAMILY_CENTER_SETTINGS_ENABLE_SWITCH", - "5MdB3j": "FAMILY_CENTER_SETTINGS_ENABLE_SWITCH_NOTE", - "USIXU7": "FAMILY_CENTER_SETTINGS_FORM_TITLE", - "gntCQT": "FAMILY_CENTER_SETTINGS_TITLE", - "Rkdixs": "FAMILY_CENTER_SIDEBAR_TITLE", - "vORl9Q": "FAMILY_CENTER_TEEN_SELECT_TITLE", - "6tsC8u": "FAMILY_CENTER_THROUGHLINE_CONTENT", - "RZqaJn": "FAMILY_CENTER_TITLE", - "JNLpDZ": "FAMILY_CENTER_TOOLTIP_MODAL_HEADER_PARENT", - "q3IRal": "FAMILY_CENTER_TOOLTIP_MODAL_HEADER_TEEN", "k8fFjp": "FAVORITES", "6uDHk6": "FAVORITES_ADD_A_CHANNEL", "D5SN5/": "FAVORITES_EMPTY_BODY", @@ -5130,9 +5027,9 @@ "EaBfeq": "FILE_UPLOAD_LIMIT_PREMIUM_TIER_2_INCREASE", "pEasFX": "FILTER", "X0SZ/t": "FILTERING_ON_GUILD", + "UdhTtk": "FILTERS", "xKCveL": "FILTER_MENTIONS", "+B9e11": "FILTER_OPTIONS", - "C6S5jQ": "FIND_CONSOLES", "8SuVoE": "FINISH", "uQShv/": "FINISH_SIGNING_UP", "7pNhXe": "FLASH_AUTO", @@ -5185,7 +5082,6 @@ "mUbulW": "FORM_DESCRIPTION_MOBILE_GUILD_NOTIFICATION_ALL_MESSAGES", "GGAdHV": "FORM_DESCRIPTION_MOBILE_GUILD_NOTIFICATION_ONLY_MENTIONS", "t0mEt2": "FORM_DESCRIPTION_MOBILE_NOTIFICATION_MUTED", - "Xytv9C": "FORM_DESCRIPTION_PUSH_AFK_TIMEOUT", "oWF6eQ": "FORM_DESCRIPTION_REACTION_NOTIFICATIONS", "+4dnA5": "FORM_DESCRIPTION_TTS", "aTVNes": "FORM_ERROR_GENERIC", @@ -5222,9 +5118,6 @@ "dbTs+z": "FORM_HELP_REGION_OVERRIDE", "UfqmIb": "FORM_HELP_SERVER_BANNER", "/B6PRw": "FORM_HELP_SERVER_DESCRIPTION", - "HEA/DU": "FORM_HELP_SLOWMODE", - "a+1pdO": "FORM_HELP_SLOWMODE_FORUM", - "OMmNCv": "FORM_HELP_SLOWMODE_THREAD", "kBXuW+": "FORM_HELP_STREAM_INFO_OVERLAY", "BT9zR3": "FORM_HELP_SYSTEM_CHANNEL", "3yOX1/": "FORM_HELP_SYSTEM_CHANNEL_DEADCHAT_PROMPT_MESSAGE", @@ -5261,6 +5154,7 @@ "YeGdQ5": "FORM_LABEL_ANDROID_OPENSL_FORCE_ENABLED", "jG5maY": "FORM_LABEL_ANDROID_OPENSL_FORCE_ENABLED_DESC", "oSdBvW": "FORM_LABEL_ATTENUATION", + "AlybXj": "FORM_LABEL_ATTENUATION_STRENGTH", "I1Zuq0": "FORM_LABEL_AUTOMATIC_VAD", "Z4oaN0": "FORM_LABEL_AUTOMATIC_VAD_MOBILE", "dnvZSg": "FORM_LABEL_AVATAR_SIZE", @@ -5275,6 +5169,7 @@ "iQG2KC": "FORM_LABEL_CONFIRM_NEW_PASSWORD", "7qKDrE": "FORM_LABEL_CONFIRM_PASSWORD", "WBqMRQ": "FORM_LABEL_CURRENT_PASSWORD", + "PTtxi9": "FORM_LABEL_CUSTOM_STATUS_NOTIFICATIONS", "bZBLBs": "FORM_LABEL_CUSTOM_TWITCH_EMOTICON", "OFpL3c": "FORM_LABEL_DEBUG", "1Wn2M4": "FORM_LABEL_DEFAULT", @@ -5299,6 +5194,7 @@ "LKCupB": "FORM_LABEL_INPUT", "hHMYbb": "FORM_LABEL_INPUT_DEVICE", "pS+K2L": "FORM_LABEL_INPUT_MODE", + "LM3U3k": "FORM_LABEL_INPUT_PROFILE", "sqUm+k": "FORM_LABEL_INPUT_SENSITIVTY", "OX2Bnr": "FORM_LABEL_INPUT_VOLUME", "LUo0Q8": "FORM_LABEL_INSTANT_INVITE_CHANNEL", @@ -5313,6 +5209,8 @@ "DTXoJQ": "FORM_LABEL_MENTIONABLE", "kRg5W5": "FORM_LABEL_MENTIONABLE_DESCRIPTION", "DD6gNd": "FORM_LABEL_MENTIONS", + "UTM8VP": "FORM_LABEL_MICROPHONE", + "Rtsr6w": "FORM_LABEL_MICROPHONE_VOLUME", "6+wqqt": "FORM_LABEL_MOBILE_CATEGORY_MUTED", "N2NXMd": "FORM_LABEL_MOBILE_CATEGORY_MUTED_UNTIL", "+wDAo2": "FORM_LABEL_MOBILE_CATEGORY_OVERRIDE_MUTE", @@ -5329,7 +5227,6 @@ "zViLy+": "FORM_LABEL_MOBILE_NOTIFICATIONS_EVERY_TIME_DESC", "rqEZdu": "FORM_LABEL_MOBILE_NOTIFICATIONS_INAPP_DESC", "clE4PU": "FORM_LABEL_MOBILE_NOTIFICATIONS_INAPP_LABEL", - "5Gjde9": "FORM_LABEL_MOBILE_NOTIFICATIONS_LABEL", "V6Mj32": "FORM_LABEL_MOBILE_NOTIFICATIONS_OS_CONTROL_JUMP", "iIyiGD": "FORM_LABEL_MOBILE_NOTIFICATIONS_OS_CONTROL_JUMP_HELP", "1CWknJ": "FORM_LABEL_MOBILE_NOTIFICATIONS_SOUND_DISABLE", @@ -5357,6 +5254,7 @@ "ksYouy": "FORM_LABEL_NOTIFICATION_FREQUENCY", "IQv8Eo": "FORM_LABEL_NOTIFICATION_POSITION", "Es25Yf": "FORM_LABEL_NSFW_CHANNEL", + "N9xEJF": "FORM_LABEL_NSFW_SERVER", "Yl1D84": "FORM_LABEL_OFF", "L2hmYy": "FORM_LABEL_ONLY_MENTIONS", "6fQPhu": "FORM_LABEL_ONLY_MENTIONS_PLAIN", @@ -5370,7 +5268,6 @@ "CIGa+7": "FORM_LABEL_PASSWORD", "eJnn0+": "FORM_LABEL_PHONE_NUMBER", "XVGbn1": "FORM_LABEL_PREMADE_WIDGET", - "TTvjd9": "FORM_LABEL_PUSH_AFK_TIMEOUT", "uancuJ": "FORM_LABEL_QOS", "w4Ivys": "FORM_LABEL_REASON_BAN", "+2QEPt": "FORM_LABEL_REASON_KICK", @@ -5401,6 +5298,8 @@ "piZgKF": "FORM_LABEL_SLOWMODE_COOLDOWN", "zvDu4h": "FORM_LABEL_SLOWMODE_OFF", "dBqQu4": "FORM_LABEL_SLOWMODE_SEARCH_PLACEHOLDER", + "xuYQ0n": "FORM_LABEL_SPEAKER", + "aUJ062": "FORM_LABEL_SPEAKER_VOLUME", "0CEP6e": "FORM_LABEL_STREAM_INFO_OVERLAY", "pEAl4b": "FORM_LABEL_STREAM_VOLUME", "wVBHr0": "FORM_LABEL_SUBSYSTEM", @@ -5448,6 +5347,7 @@ "nBNJ/L": "FORM_POST_CREATED_AGO_TIMESTAMP_MORE_THAN_MONTH", "Wy5RIQ": "FORM_PRIVATE_THREAD_DESCRIPTION", "p/9crb": "FORM_REPORT_HELP_TEXT", + "eJEUvD": "FORM_REQUIRED_ERROR", "FGjMZS": "FORM_THREAD_AUTO_ARCHIVE_SECTION_LABEL", "Nb2/RE": "FORM_THREAD_NAME_PLACEHOLDER", "uXA573": "FORM_THREAD_NAME_REQUIRED_ERROR", @@ -5467,9 +5367,7 @@ "/p3ssF": "FORTNITE_REWARD_NAME", "0sDXdm": "FORUM", "d611xH": "FORUM_ADD_MEDIA_TO_ORIGINAL_POST_ADD", - "zMsUsu": "FORUM_ADD_MEDIA_TO_ORIGINAL_POST_DESCRIPTION", "8rKVHL": "FORUM_ADD_MEDIA_TO_ORIGINAL_POST_DONT_ADD", - "hMWWMV": "FORUM_ADD_MEDIA_TO_ORIGINAL_POST_TITLE", "OrdtCe": "FORUM_ANDROID_WARNING", "vv4lqc": "FORUM_BEFORE_YOU_POST", "GbryDd": "FORUM_CHANNEL", @@ -5498,7 +5396,6 @@ "6A0O64": "FORUM_CHANNEL_ONBOARDING_CHECKLIST_FIRST_POST_TITLE", "3C6/G1": "FORUM_CHANNEL_ONBOARDING_CHECKLIST_GUIDELINES_DESCRIPTION", "UgJu1e": "FORUM_CHANNEL_ONBOARDING_CHECKLIST_GUIDELINES_TITLE", - "oMIexV": "FORUM_CHANNEL_ONBOARDING_CHECKLIST_PERMISSION_DESCRIPTION", "/Ax2gs": "FORUM_CHANNEL_ONBOARDING_CHECKLIST_PERMISSION_TITLE", "wCv4Oz": "FORUM_CHANNEL_ONBOARDING_CHECKLIST_TAGS_DESCRIPTION", "xiBFCi": "FORUM_CHANNEL_ONBOARDING_CHECKLIST_TAGS_TITLE", @@ -5510,7 +5407,6 @@ "kPwwA/": "FORUM_CHANNEL_ONBOARDING_PERMISSION_MODAL_LET_EVERYONE_POST", "8kKqCW": "FORUM_CHANNEL_ONBOARDING_PERMISSION_MODAL_ROLE_INPUT_PLACEHOLDER", "TFGnmk": "FORUM_CHANNEL_ONBOARDING_PERMISSION_MODAL_TITLE", - "NjCtHz": "FORUM_CHANNEL_ONBOARDING_PERMISSION_MODEL_DESCRIPTION", "mgZKZP": "FORUM_CHANNEL_ONBOARDING_PERMISSION_MODEL_ERROR", "zfq9V4": "FORUM_CHANNEL_ONBOARDING_SHOW", "znhX2R": "FORUM_CHANNEL_ONBOARDING_VISIBILITY", @@ -5593,6 +5489,7 @@ "3NnH6V": "FORUM_POST_CREATE_CLOSE_ALERT_DISCARD", "Rnli6C": "FORUM_POST_CREATE_CLOSE_ALERT_SAVE", "Fz1512": "FORUM_POST_CREATE_CLOSE_ALERT_TITLE", + "7EjFCk": "FORUM_POST_CREATE_TITLE", "w/BT3G": "FORUM_POST_EMPTY_MESSAGE_ERROR", "71wuR0": "FORUM_POST_EMPTY_TITLE_ERROR", "4d4T4l": "FORUM_POST_GUIDELINES_TITLE", @@ -5628,7 +5525,6 @@ "Iy2gnS": "FORUM_SEARCH_PLACEHOLDER", "3+LO1w": "FORUM_SECTION_ARCHIVED", "fkY5+l": "FORUM_SETTING_SLOW_MODE_MESSAGES", - "kdZU6H": "FORUM_SETTING_SLOW_MODE_MESSAGE_TEXT", "O1c02q": "FORUM_SETTING_SLOW_MODE_POSTS", "9yE8Ga": "FORUM_SLOWMODE_DESC", "oEwLez": "FORUM_SLOWMODE_DESC_HOURS", @@ -5654,11 +5550,9 @@ "T8sBLJ": "FORUM_TAG_EDIT_ERROR", "jhSvB9": "FORUM_TAG_EDIT_LABEL", "o8lsHe": "FORUM_TAG_EDIT_RESET_LABEL", - "PYZlEr": "FORUM_TAG_FILTER_CLEAR", "TdqRTh": "FORUM_TAG_FILTER_HEADER", "112vVE": "FORUM_TAG_FILTER_LABEL", "39DnOU": "FORUM_TAG_FILTER_SEARCH_PLACEHOLDER", - "Yh05IS": "FORUM_TAG_FILTER_SUBMIT", "436ZFw": "FORUM_TAG_POST_EDIT", "NcKv8s": "FORUM_TAG_POST_MAX_REACHED", "MbhGm7": "FORUM_TAG_POST_SEARCH_PLACEHOLDER", @@ -5736,7 +5630,10 @@ "AKBgPy": "FOR_YOU_EMPTY_BODY", "MwjTvn": "FOR_YOU_EMPTY_TITLE", "+cGVV6": "FREQUENTLY_USED", + "V0w2ap": "FREQUENTLY_USED_COMMANDS", + "G7jMpU": "FRIEND", "TdEu5X": "FRIENDS", + "GbsGCp": "FRIENDSHIP_MANAGEMENT", "rHRrhC": "FRIENDS_ALL_HEADER", "M83kK4": "FRIENDS_BLOCKED_HEADER", "nAsWKy": "FRIENDS_COLUMN_NAME", @@ -5752,13 +5649,17 @@ "3dV4Df": "FRIENDS_EMPTY_STATE_PENDING_FRIENDS_COPY", "rClTvM": "FRIENDS_EMPTY_STATE_SUBTITLE", "1AUTCI": "FRIENDS_EMPTY_STATE_SUGGESTIONS", + "rrZTqK": "FRIENDS_FRIEND_ANNIVERSARY_HEADER", "DYMZ/p": "FRIENDS_FRIEND_SUGGESTIONS_HEADER", "QLzahJ": "FRIENDS_OFFLINE_HEADER", "BagU2U": "FRIENDS_ONLINE_HEADER", "XIpar2": "FRIENDS_PENDING_HEADER", + "g+3FIa": "FRIENDS_PENDING_RECEIVED_HEADER", "WclcU4": "FRIENDS_PENDING_REQUEST_EXPAND", "t8geR1": "FRIENDS_PENDING_REQUEST_EXPAND_COLLAPSE", "zsVtft": "FRIENDS_PENDING_REQUEST_HEADER", + "npJsRl": "FRIENDS_PENDING_SENT_HEADER", + "IJa+46": "FRIENDS_PLAYED", "6QQCQ+": "FRIENDS_REQUEST_STATUS_INCOMING", "s/+byI": "FRIENDS_REQUEST_STATUS_OUTGOING", "ed99+i": "FRIENDS_ROW_ACTION_BUTTON_ACCESSIBILITY_LABEL_ACCEPT_SUGGESTION", @@ -5773,7 +5674,9 @@ "PfjFjR": "FRIENDS_SECTION_ALL", "b9w3bO": "FRIENDS_SECTION_ONLINE", "p6IHGE": "FRIENDS_SECTION_PENDING", + "OAC0Z4": "FRIENDS_SECTION_PENDING_WITH_COUNT", "8rSi1/": "FRIENDS_SECTION_SUGGESTIONS", + "AbMQp7": "FRIENDS_SECTION_SUGGESTIONS_WITH_COUNT", "2F78xP": "FRIENDS_SHARE_SHEET_SCANNING_TEXT_BOTTOM", "xCvNYT": "FRIENDS_SHARE_SHEET_SCANNING_TEXT_TOP", "6E9a1J": "FRIENDS_SHARE_TABBAR_TITLE", @@ -5791,17 +5694,21 @@ "21vmYl": "FRIEND_HAS_BEEN_DELETED", "pqG6GS": "FRIEND_NICKNAME", "NdQ+lP": "FRIEND_NICKNAME_DESCRIPTION", + "sQQgFj": "FRIEND_ONLINE_NOTIFICATIONS_TITLE", "vyodkM": "FRIEND_PERMITTED_SOURCE", "mGr3CX": "FRIEND_PERMITTED_SOURCE_ALL", "IqlCSq": "FRIEND_PERMITTED_SOURCE_MUTUAL_FRIENDS", "mozb8f": "FRIEND_PERMITTED_SOURCE_MUTUAL_GUILDS", "fyA115": "FRIEND_REQUESTS", "1IEawz": "FRIEND_REQUESTS_COMBINED_COUNT", + "TWpqpC": "FRIEND_REQUESTS_OTHER_COMBINED_COUNT", "rIMT+v": "FRIEND_REQUESTS_SPAM_REQUESTS", + "NHpP/k": "FRIEND_REQUESTS_TAB_OTHER_SUBHEADING", "bekioP": "FRIEND_REQUESTS_TAB_RECIEVED", "tWqcIF": "FRIEND_REQUESTS_TAB_SENT", "fUQoqD": "FRIEND_REQUESTS_TAB_SPAM_CTA", "ElohwE": "FRIEND_REQUESTS_TAB_SPAM_SUBHEADING", + "R40bU2": "FRIEND_REQUESTS_VIEW_OTHER_REQUESTS", "rXl8fj": "FRIEND_REQUESTS_VIEW_SPAM_REQUESTS", "Zcibdf": "FRIEND_REQUEST_ACCEPT", "/+7xky": "FRIEND_REQUEST_ACCEPTED_A11Y_ANNOUNCEMENT", @@ -5877,6 +5784,8 @@ "03mIHW": "GAME_FEED_USER_PLAYING_FOR_MINUTES", "EluAd9": "GAME_FEED_USER_PLAYING_JUST_ENDED", "ahzZr+": "GAME_FEED_USER_PLAYING_JUST_STARTED", + "Uv/eTx": "GAME_FRIEND", + "ujfP6f": "GAME_FRIEND_REQUEST", "apq3cU": "GAME_INVITES", "Zy3MR/": "GAME_INVITES_DELETE_ALL", "5I4fSm": "GAME_INVITES_DELETE_INVITES", @@ -5968,7 +5877,6 @@ "55S/OM": "GAME_PROFILE_FEEDBACK_TIP_TY", "44R0Iw": "GAME_PROFILE_FEEDBACK_TIP_WRONG_GAME", "RSATCJ": "GAME_PROFILE_FEEDBACK_VISIT_IGDB", - "wdpm4+": "GAME_PROFILE_FOLLOW_TOOLTIP", "ak8OHk": "GAME_PROFILE_FRIENDS_WHO_PLAY_TAB", "COYYrn": "GAME_PROFILE_GAME_ARTWORK_ALT", "nh+jWk": "GAME_PROFILE_GAME_ICON_ALT", @@ -5980,7 +5888,6 @@ "fOUKvg": "GAME_PROFILE_LINK_OFFICIAL", "INic4y": "GAME_PROFILE_LINK_TWITTER", "lNmxbE": "GAME_PROFILE_LINK_YOUTUBE", - "WHLC4B": "GAME_PROFILE_NONE", "kBDZSL": "GAME_PROFILE_OFFICIAL_GUILD", "PNqxNe": "GAME_PROFILE_PLATFORMS", "KT6uCJ": "GAME_PROFILE_PLATFORM_DESKTOP", @@ -5988,35 +5895,19 @@ "fzMz2s": "GAME_PROFILE_PLATFORM_PLAYSTATION", "DDWUJp": "GAME_PROFILE_PLATFORM_XBOX", "4Byy/G": "GAME_PROFILE_PUBLISHER", - "9c6NEX": "GAME_PROFILE_Q1_ACHIEVEMENTS", - "dYKMZb": "GAME_PROFILE_Q1_NEWS", - "g2eNLd": "GAME_PROFILE_Q1_WHEN_FRIENDS_PLAY", - "WkNZBZ": "GAME_PROFILE_Q2_FOLLOW_DEV", - "T4fRgn": "GAME_PROFILE_Q2_GAMES_FRIENDS_PLAY", - "8ZRk+O": "GAME_PROFILE_Q2_GAMES_I_PLAY_NOW", - "X8IaMI": "GAME_PROFILE_Q2_GAMES_I_WANT_TO_PLAY", - "Oa8FUC": "GAME_PROFILE_Q2_GENRES", - "sXBGoq": "GAME_PROFILE_QUESTION_BENEFITS", - "+HKaiL": "GAME_PROFILE_QUESTION_GAME_TYPES", "bNdK5x": "GAME_PROFILE_SCREENSHOTS", "yohc6E": "GAME_PROFILE_SEE_ALL_ENTRIES", "qP2cXd": "GAME_PROFILE_SOMETHING_WENT_WRONG", - "QnieV0": "GAME_PROFILE_SURVEY_INTRO", - "z24eqT": "GAME_PROFILE_SURVEY_NOTIFY_ME", - "ItxxYd": "GAME_PROFILE_SURVEY_PROGRESS", - "x4JN+m": "GAME_PROFILE_SURVEY_SELECT_ALL", - "i3JNE2": "GAME_PROFILE_SURVEY_TY", - "3VsJyR": "GAME_PROFILE_SURVEY_TY_MORE", - "+HTQyi": "GAME_PROFILE_UNFOLLOW_GAME", - "oINSKA": "GAME_PROFILE_UNFOLLOW_TOOLTIP", "IzVXxY": "GAME_PROFILE_USER_AVATAR_ALT", "PNeFgW": "GAME_PROFILE_VIEW_MORE", "BadOYv": "GDM_BLOCKED_USER_WARNING_BANNER_DESCRIPTION", + "SN1hrl": "GDM_BLOCKED_USER_WARNING_DESCRIPTION", "bejNWN": "GDM_BLOCKED_USER_WARNING_INVITE_NEEDED", "I4q1kA": "GDM_BLOCKED_USER_WARNING_LEAVE", "mwJJ+f": "GDM_BLOCKED_USER_WARNING_LEAVE_GROUP_MODAL", "RIMw54": "GDM_BLOCKED_USER_WARNING_NO_NOTIFY", "DRJhmT": "GDM_BLOCKED_USER_WARNING_STAY", + "6AKLRt": "GDM_IGNORED_USER_WARNING_DESCRIPTION", "RswDbS": "GDM_MULTIPLE_BLOCKED_USERS_WARNING_HEADER_BANNER", "aJRlSZ": "GDM_MULTIPLE_BLOCKED_USERS_WARNING_HEADER_MODAL", "Zqlt5Z": "GDM_MULTIPLE_BLOCKED_USERS_WARNING_PRESENCE", @@ -6037,6 +5928,7 @@ "4cJV9S": "GEO_RESTRICTED_MODAL_BODY", "aCAiGl": "GEO_RESTRICTED_MODAL_TITLE", "nTmm2v": "GET_FREE_TRIAL", + "3mgEQf": "GET_REWARD", "LhlgY9": "GET_STARTED", "n+VrqG": "GET_THE_APP", "12Kx2v": "GET_XBOX_APP", @@ -6210,13 +6102,17 @@ "nIH0v8": "GIF_TOOLTIP_ADD_TO_FAVORITES", "mE2e8A": "GIF_TOOLTIP_FAVORITED_PICKER_BUTTON", "5/NS74": "GIF_TOOLTIP_REMOVE_FROM_FAVORITES", - "wDEPGW": "GLOBAL_DISCOVERY_APPS_CATEGORY_TITLE_END", + "DkyHMK": "GLOBAL_DISCOVERY_APPS_ABOUT", "ijDDwz": "GLOBAL_DISCOVERY_APPS_FEATURED_CATEGORY", "XxFts9": "GLOBAL_DISCOVERY_APPS_FEATURED_DESCRIPTION", "kEcZ97": "GLOBAL_DISCOVERY_APPS_FEATURED_TITLE", "wchkc1": "GLOBAL_DISCOVERY_APPS_FEATURED_TITLE_PART_ONE", "iQmSky": "GLOBAL_DISCOVERY_APPS_FEATURED_TITLE_PART_THREE", "tqD+Iq": "GLOBAL_DISCOVERY_APPS_FEATURED_TITLE_PART_TWO", + "VJRr3Y": "GLOBAL_DISCOVERY_APPS_GAMES_DESCRIPTION", + "HPQXEM": "GLOBAL_DISCOVERY_APPS_SEARCH_PLACEHOLDER", + "3NxHC4": "GLOBAL_DISCOVERY_APPS_SERVER_COUNT", + "jgEXGB": "GLOBAL_DISCOVERY_APPS_STORE", "bGwCoR": "GLOBAL_DISCOVERY_APPS_TITLE", "5gt4SN": "GLOBAL_DISCOVERY_ENTERTAINMENT_SERVERS", "PSLMWa": "GLOBAL_DISCOVERY_FIND_THE_PERFECT_SERVER", @@ -6224,6 +6120,10 @@ "riPnr0": "GLOBAL_DISCOVERY_MORE_MENU_A11Y", "OMjJ1e": "GLOBAL_DISCOVERY_MUSIC_SERVERS", "oWCrBq": "GLOBAL_DISCOVERY_QUESTS_HOME_DESCRIPTION", + "1Wm127": "GLOBAL_DISCOVERY_QUESTS_HOME_ORBS_EXPLORE", + "BCBIlp": "GLOBAL_DISCOVERY_QUESTS_HOME_ORBS_INTRO_TITLE", + "U9FY0J": "GLOBAL_DISCOVERY_QUESTS_HOME_ORBS_INTRO_DESCRIPTION", + "7kTAgJ": "GLOBAL_DISCOVERY_QUESTS_HOME_ORBS_TERMS", "lmMBfy": "GLOBAL_DISCOVERY_QUESTS_HOME_TITLE", "EcaD4e": "GLOBAL_DISCOVERY_QUESTS_TITLE", "tHpHPk": "GLOBAL_DISCOVERY_SEARCH_DISCOVERABLE_SERVERS", @@ -6241,7 +6141,6 @@ "AAJ5ov": "GLOBAL_DISCOVERY_SERVERS_GAMING_DESCRIPTION", "fEs+vB": "GLOBAL_DISCOVERY_SERVERS_GAMING_TITLE", "hmHbST": "GLOBAL_DISCOVERY_SERVERS_GENERIC_ERROR", - "B5tf+g": "GLOBAL_DISCOVERY_SERVERS_GUILDS_CATEGORY", "b+qgxQ": "GLOBAL_DISCOVERY_SERVERS_GUILDS_HERO_DESCRIPTION", "JWBE0f": "GLOBAL_DISCOVERY_SERVERS_GUILDS_HERO_DESCRIPTION_NUX_COMPLETED", "e70zcK": "GLOBAL_DISCOVERY_SERVERS_GUILDS_HERO_TITLE", @@ -6292,9 +6191,11 @@ "1hKIah": "GO_LIVE_MODAL_DESCRIPTION_GENERIC", "sbbPhW": "GO_LIVE_MODAL_DESCRIPTION_SELECT_NATIVE_SOURCE", "aC4/Zi": "GO_LIVE_MODAL_DESCRIPTION_SELECT_SOURCE", + "MhJ43A": "GO_LIVE_MODAL_DEVICES", "JE73jB": "GO_LIVE_MODAL_DISABLE_STREAM_PREVIEWS", "gRpbRF": "GO_LIVE_MODAL_ENABLE_APP_SOUNDSHARE_LABEL", "5AdrtW": "GO_LIVE_MODAL_ENABLE_SCREEN_SOUNDSHARE_LABEL", + "slM8rG": "GO_LIVE_MODAL_ENTIRE_SCREEN", "zCLXwj": "GO_LIVE_MODAL_HARDWARE_WARNING_INFOBOX", "FiBjwU": "GO_LIVE_MODAL_NATIVE_SELECT_CTA", "Cef4t7": "GO_LIVE_MODAL_NOTIFY_FRIENDS_CHECKBOX_LABEL", @@ -6321,6 +6222,8 @@ "RDkJQ6": "GO_LIVE_MODAL_TITLE", "+SLJCh": "GO_LIVE_MODAL_WINDOW", "dG2A1E": "GO_LIVE_MODAL_WINDOW_CTA", + "pW4TMp": "GO_LIVE_NOTIFICATIONS", + "t9GFrr": "GO_LIVE_RESET_ZOOM", "1b0Gm7": "GO_LIVE_SCREENSHARE_NO_SOUND", "v2y9PY": "GO_LIVE_SCREENSHARE_UPDATE_MACOS_FOR_SOUNDSHARE", "voRPTF": "GO_LIVE_SCREENSHARE_UPDATE_WINDOWS_FOR_SOUNDSHARE", @@ -6330,6 +6233,11 @@ "9jpVOZ": "GO_LIVE_USER_PLAYING", "q65tSw": "GO_LIVE_VIDEO_DRIVERS_OUTDATED", "Fb0eT9": "GO_LIVE_WATCHING_USER", + "9hMafy": "GO_LIVE_ZOOM_IN", + "grzPmr": "GO_LIVE_ZOOM_LEVEL", + "M6Cmwy": "GO_LIVE_ZOOM_OUT", + "fwPurU": "GO_ONLINE", + "MubYG8": "GO_TO_ACCOUNT_SETTINGS", "aW2YlJ": "GO_TO_CHANNEL", "LFFx5G": "GPLAY_BILLING_ALERT_BODY", "U+H+kd": "GPLAY_BILLING_ALERT_TITLE", @@ -6341,11 +6249,13 @@ "wE+9dr": "GRANT_TEMPORARY_MEMBERSHIP", "z5AZKW": "GREEN", "Ve0Lip": "GREY", + "3jrUBj": "GRID_VIEW", "Pe0DBx": "GROUPS", "e5y+gm": "GROUP_DM", "qGlQrW": "GROUP_DMS", "N/9OFy": "GROUP_DM_ADD_ERROR", "Xjlbvs": "GROUP_DM_ADD_FRIENDS", + "AQAPts": "GROUP_DM_ADD_FRIENDS_TO_GROUP", "LR+Ptf": "GROUP_DM_ADD_MEMBERS", "YUhnoy": "GROUP_DM_ADD_MEMBERS_COUNT", "9Uk8PF": "GROUP_DM_ALONE", @@ -6375,10 +6285,9 @@ "kOguHH": "GROUP_DM_INVITE_WILL_FILL_MOBILE", "1UgGdm": "GROUP_DM_INVITE_WITH_NAME", "ABMKx3": "GROUP_DM_MEMBER_COUNT", - "MOwYWD": "GROUP_DM_MULTIPLE_USER_SUMMARY", + "nlunn9": "GROUP_DM_NO_SEARCH_RESULTS", + "Et8qwj": "GROUP_DM_OPTIONS", "Wxnb6q": "GROUP_DM_SEARCH_PLACEHOLDER", - "fhiMzZ": "GROUP_DM_SINGLE_USER_SUMMARY", - "tZon8K": "GROUP_DM_TWO_USER_SUMMARY", "XKbf2G": "GROUP_DM_UPSELL_LINK_NOTICE", "Fq3DJb": "GROUP_DM_UPSELL_MSG_NOTICE", "N6TdqN": "GROUP_DM_UPSELL_TEXT", @@ -6431,31 +6340,13 @@ "1zmw/H": "GUILD_ANTIRAID_RESOLVE_TITLE", "htioQo": "GUILD_ANTIRAID_SAFETY_CHANNEL_DESCRIPTION", "sMkYE8": "GUILD_ANTIRAID_SAFETY_CHANNEL_TITLE", - "HZosQr": "GUILD_ANTIRAID_SAFETY_JOIN_RAIDS_TITLE", - "y1ZrSw": "GUILD_ANTIRAID_SAFETY_MENTION_RAIDS_TITLE", - "D28L93": "GUILD_ANTIRAID_SAFETY_SETUP_CHANNEL_MANAGE_ACTION", "VP/IqX": "GUILD_ANTIRAID_SAFETY_SETUP_CHANNEL_MODAL_CHANNEL_PERMISSIONS_NOTICE", "wZEuLd": "GUILD_ANTIRAID_SAFETY_SETUP_CHANNEL_MODAL_DESCRIPTION", "LsLNuw": "GUILD_ANTIRAID_SAFETY_SETUP_CHANNEL_MODAL_ENABLE_ALERTS", "yLv2yS": "GUILD_ANTIRAID_SAFETY_SETUP_CHANNEL_MODAL_TITLE", - "7o1Lvp": "GUILD_ANTIRAID_SAFETY_SETUP_CHANNEL_SETUP_ACTION", "vNYn7Y": "GUILD_ANTIRAID_SAFETY_SETUP_DESCRIPTION", - "4TJPA2": "GUILD_ANTIRAID_SAFETY_SETUP_ENABLE_TIP", "46Rs3v": "GUILD_ANTIRAID_SAFETY_SETUP_ERROR", - "L7iB87": "GUILD_ANTIRAID_SAFETY_SETUP_IN_AUTOMOD_ACTION", - "v6ErHG": "GUILD_ANTIRAID_SAFETY_SETUP_NO_EXPERIMENT_ACTION", "jwrGzu": "GUILD_ANTIRAID_SAFETY_SETUP_TITLE", - "CQ1Wk3": "GUILD_ANTIRAID_SETTING_CHANNEL_LABEL", - "HqZEYc": "GUILD_ANTIRAID_SETTING_CHANNEL_NONE", - "YT+Jol": "GUILD_ANTIRAID_SETTING_CHANNEL_NONE_LABEL", - "BBR1sh": "GUILD_ANTIRAID_SETTING_ENABLED", - "LYY1tT": "GUILD_ANTIRAID_SETTING_ENABLED_ALERTS", - "aJ+tpy": "GUILD_ANTIRAID_SETTING_PROTECTION_LABEL", - "ikljSO": "GUILD_ANTIRAID_UPSELL_ASSET_HEADER", - "QUUAeV": "GUILD_ANTIRAID_UPSELL_CONTENT", - "YJl/Hq": "GUILD_ANTIRAID_UPSELL_CTA", - "rwAUNh": "GUILD_ANTIRAID_UPSELL_DISMISSAL", - "GY/xJS": "GUILD_ANTIRAID_UPSELL_HEADER", "QupmYY": "GUILD_AUTOMOD_ACTIONS_BLOCK_MESSAGE_CUSTOM_MESSAGE_CTA", "Oa9oWJ": "GUILD_AUTOMOD_ACTIONS_BLOCK_MESSAGE_CUSTOM_MESSAGE_HELPER", "xAAoci": "GUILD_AUTOMOD_ACTIONS_BLOCK_MESSAGE_DESCRIPTION", @@ -6584,6 +6475,7 @@ "1YgPj/": "GUILD_AUTOMOD_ML_SPAM_FILTER_TRIGGER_HEADER", "hpgzEq": "GUILD_AUTOMOD_MODERATOR_REPORT_BUTTON", "tEttXd": "GUILD_AUTOMOD_NAGBAR_QUARANTINED_ACCOUNT_USERNAME_CTA", + "Zqlecb": "GUILD_AUTOMOD_NAGBAR_QUARANTINED_SERVER_TAG", "6ndMcq": "GUILD_AUTOMOD_NAGBAR_QUARANTINED_USER_PROFILE", "S09nw4": "GUILD_AUTOMOD_NAGBAR_QUARANTINED_USER_PROFILE_CTA", "0eiu6J": "GUILD_AUTOMOD_NAGBAR_QUARANTINED_USER_PROFILE_NO_PERMS", @@ -6703,6 +6595,7 @@ "vgUjKR": "GUILD_AUTOMOD_VISIBILITY_MESSAGE", "ff/gx7": "GUILD_AUTOMOD_WARNING_UNSAVED_CHANGES_DESCRIPTION", "kknTmH": "GUILD_AUTOMOD_WARNING_UNSAVED_CHANGES_TITLE", + "HHYPgJ": "GUILD_BADGE", "AcaNYw": "GUILD_BANNER_NOTICE", "oPAx73": "GUILD_BANNER_NOTICE_CTA", "ZuItcI": "GUILD_BANNER_UPSELL_MODAL_PERK_INTRO", @@ -6846,6 +6739,7 @@ "RY2iKH": "GUILD_DISCOVERY_SEARCH_RESULTS_HEADER", "xN7gkr": "GUILD_DISCOVERY_TOOLTIP", "UQbJW7": "GUILD_DMS_DISABLE_ACTION_SHEET_DESCRIPTION", + "x2UVBM": "GUILD_DM_APPLICANT", "2Ow2Cj": "GUILD_DOCK", "gofCRW": "GUILD_DOCK_LABEL", "KtENkK": "GUILD_ENABLE_COMMUNICATION_CTA", @@ -6970,7 +6864,6 @@ "PIikks": "GUILD_HEADER_ONLINE_COUNT", "3DzP7x": "GUILD_HEADER_ONLINE_COUNT_UNKNOWN", "p5jg9S": "GUILD_HIGHLIGHTS_NOTIFICATIONS_CATEGORY", - "6YriCC": "GUILD_HOME_ABOUT", "xwY4La": "GUILD_HOME_RESOURCES", "95hPAe": "GUILD_IDENTITY_BANNER_A11Y_LABEL", "qRi5YW": "GUILD_IDENTITY_BIO_EDIT_A11Y_HINT", @@ -7038,6 +6931,7 @@ "qv5o56": "GUILD_MEMBERSHIP_AUTOMATION_VERIFICATION_VERIFYING", "khwGwN": "GUILD_MEMBERS_HEADER", "oB9grQ": "GUILD_MEMBERS_SEARCH_NO_RESULT", + "cf5lgh": "GUILD_MEMBER_MOD_VIEW", "93hqln": "GUILD_MEMBER_MOD_VIEW_AGREE_TO_RULES", "mvsi9n": "GUILD_MEMBER_MOD_VIEW_AUDIT_LOG_SOURCE_USER", "SaDIpL": "GUILD_MEMBER_MOD_VIEW_DISCORD_JOIN_DATE", @@ -7069,11 +6963,6 @@ "kj3tz2": "GUILD_MEMBER_MOD_VIEW_TITLE", "0x6aTm": "GUILD_MEMBER_MOD_VIEW_VIEW_ALL_PERMISSIONS", "26dTyb": "GUILD_MEMBER_REQUIRED_FOR_EVENT", - "/T0C9P": "GUILD_MENTION_RAID_LIMIT_UPSELL_ASSET_HEADER", - "jAO/LC": "GUILD_MENTION_RAID_LIMIT_UPSELL_CONTENT", - "Mtl9zP": "GUILD_MENTION_RAID_LIMIT_UPSELL_CTA", - "RdsKd6": "GUILD_MENTION_RAID_LIMIT_UPSELL_DISMISSAL", - "wUmMu2": "GUILD_MENTION_RAID_LIMIT_UPSELL_HEADER", "kHMgaK": "GUILD_MONETIZATION_ENABLE_CONFIRMATION_SUBTITLE", "AP/2qe": "GUILD_MONETIZATION_ENABLE_CONFIRMATION_TITLE", "5k6FfR": "GUILD_MONETIZATION_ENABLE_CREATE_TEAM", @@ -7097,13 +6986,11 @@ "l1Jc1n": "GUILD_ONBOARDING_COMPLETED_ROLES", "og4NNr": "GUILD_ONBOARDING_COMPLETED_SUBTITLE", "PFWIYe": "GUILD_ONBOARDING_COMPLETED_TITLE", - "k0COZY": "GUILD_ONBOARDING_DEFAULT_CHANNELS_MIN_CHANNELS", "PwXgSy": "GUILD_ONBOARDING_DEFAULT_CHANNELS_MIN_CHATTABLE_CHANNELS", "3Uuql+": "GUILD_ONBOARDING_DEFAULT_CHANNELS_RECOMMENDED_DESCRIPTION", "ZC3PJ2": "GUILD_ONBOARDING_DEFAULT_CHANNELS_RECOMMENDED_DISMISS_ALL", "2XWEK9": "GUILD_ONBOARDING_DEFAULT_CHANNELS_RULES_DISCOURAGED", "t6iJLY": "GUILD_ONBOARDING_DEFAULT_CHANNELS_VOICE_TOOLTIP", - "QAdRCy": "GUILD_ONBOARDING_HOME_GUILD_MEMBERS_RATIO", "3SkNVY": "GUILD_ONBOARDING_NAGBAR_MESSAGE", "eqZ1lW": "GUILD_ONBOARDING_NEW_MEMBER_PROGRESS_BAR_COUNTER", "SnrR3x": "GUILD_ONBOARDING_NEW_MEMBER_PROGRESS_BAR_GET_STARTED", @@ -7155,7 +7042,6 @@ "ockHVS": "GUILD_ONBOARDING_SETUP_REVIEW_DESCRIPTION", "u/ji07": "GUILD_ONBOARDING_SETUP_REVIEW_DESCRIPTION_INCOMPLETE", "Yz7hsB": "GUILD_ONBOARDING_SETUP_REVIEW_ENABLE_ONBOARDING", - "ey3uVZ": "GUILD_ONBOARDING_SETUP_REVIEW_NOT_ENOUGH_DEFAULT_CHANNELS", "N7vTg4": "GUILD_ONBOARDING_SETUP_REVIEW_NO_STARTER_QUESTIONS", "rkREld": "GUILD_ONBOARDING_SETUP_REVIEW_NO_WELCOME_CHANNELS", "HxEwSv": "GUILD_ONBOARDING_SETUP_REVIEW_NUM_DEFAULT_CHANNELS", @@ -7235,16 +7121,12 @@ "IqxCMv": "GUILD_POPOUT_EMPTY_PROMPT_HEADER", "3YedRe": "GUILD_POPOUT_INVITES_PAUSED", "/YuDAs": "GUILD_POPOUT_JOINED", - "Yn1+xo": "GUILD_POPOUT_UNAVAILABLE_FLAVOR", - "+kdPH2": "GUILD_POPOUT_UNAVAILABLE_HEADER", "Mmzqe3": "GUILD_POPOUT_USERS_IN_VOICE", "5vikgO": "GUILD_POPOUT_USERS_ON_VIDEO", "3XWX3y": "GUILD_POPOUT_USERS_STREAMING", "hUmrzx": "GUILD_POPOUT_USER_IN_VOICE", "JkAjB7": "GUILD_POPOUT_USER_ON_VIDEO", "+W8njI": "GUILD_POPOUT_VIEWING_AS_ROLES", - "K+WeR3": "GUILD_POPOUT_VIEW_SERVER_BUTTON", - "8+VX4z": "GUILD_PREMIUM", "RtqjeB": "GUILD_PRODUCTS_ACTION_MENU_BUTTON_ARIA_LABEL", "Z146dM": "GUILD_PRODUCTS_ACTION_MENU_LABEL", "w27QAR": "GUILD_PRODUCTS_BASIC_INFO_SECTION", @@ -7408,6 +7290,8 @@ "lvU6sr": "GUILD_PRODUCT_UPLOAD_ATTACHMENT_INSTRUCTIONS_ARCHIVES_ALLOWED", "23LeCD": "GUILD_PRODUCT_UPLOAD_FILE_BUTTON", "riu2R5": "GUILD_PROFILE_JOIN_SERVER_BUTTON", + "wZmueu": "GUILD_PROFILE_PRIVATE_SERVER", + "stcSfI": "GUILD_PROFILE_ROLES_GRANTED", "J2+r16": "GUILD_PROGRESS_CTA", "zhHW5c": "GUILD_PROGRESS_CURRENT_STEP", "PbNxaW": "GUILD_PROGRESS_DISMISS", @@ -7474,7 +7358,6 @@ "HRtfn9": "GUILD_ROLE_SUBSCRIPTIONS_MANAGE_EMOJI_ROLES_MODAL_ARCHIVED_BADGE", "I4SYUF": "GUILD_ROLE_SUBSCRIPTIONS_MANAGE_EMOJI_ROLES_MODAL_DESCRIPTION", "nP7nDY": "GUILD_ROLE_SUBSCRIPTIONS_MANAGE_EMOJI_ROLES_MODAL_HEADER", - "8aYImI": "GUILD_ROLE_SUBSCRIPTIONS_MANAGE_EMOJI_ROLES_MODAL_NEEDS_ONE_ROLE", "Ve/y5z": "GUILD_ROLE_SUBSCRIPTIONS_MANAGE_EMOJI_ROLES_MODAL_SELECT_ALL_LABEL", "AuPtov": "GUILD_ROLE_SUBSCRIPTIONS_MANAGE_EMOJI_UPLOAD_CTA", "H9Jxp6": "GUILD_ROLE_SUBSCRIPTIONS_MANAGE_EMOJI_UPLOAD_DESCRIPTION", @@ -8296,6 +8179,8 @@ "MWp6H7": "GUILD_SETTINGS_AUDIT_LOG_INVITE_TEMPORARY_ON", "ja3kGS": "GUILD_SETTINGS_AUDIT_LOG_INVITE_UPDATE", "Q/LSXp": "GUILD_SETTINGS_AUDIT_LOG_LOAD_MORE", + "WxyOtj": "GUILD_SETTINGS_AUDIT_LOG_MANUAL_VERIFICATION_DISABLED", + "jzSvVd": "GUILD_SETTINGS_AUDIT_LOG_MANUAL_VERIFICATION_ENABLED", "XklUm/": "GUILD_SETTINGS_AUDIT_LOG_MEMBER_BAN_ADD", "o3Y6HD": "GUILD_SETTINGS_AUDIT_LOG_MEMBER_BAN_REMOVE", "zATost": "GUILD_SETTINGS_AUDIT_LOG_MEMBER_BYPASSES_VERIFICATION_OFF", @@ -8344,6 +8229,7 @@ "yONu/l": "GUILD_SETTINGS_AUDIT_LOG_ONBOARDING_UPDATE", "Br0y5w": "GUILD_SETTINGS_AUDIT_LOG_PRIVATE_THREAD_CREATE", "2FQFiw": "GUILD_SETTINGS_AUDIT_LOG_ROLE_COLOR", + "U44ttm": "GUILD_SETTINGS_AUDIT_LOG_ROLE_COLORS_NONE", "92xIQp": "GUILD_SETTINGS_AUDIT_LOG_ROLE_COLOR_IOS", "TK6E1H": "GUILD_SETTINGS_AUDIT_LOG_ROLE_COLOR_NONE", "UTLTx6": "GUILD_SETTINGS_AUDIT_LOG_ROLE_CREATE", @@ -8427,6 +8313,8 @@ "PSsy4t": "GUILD_SETTINGS_AUDIT_LOG_THREAD_UPDATE", "c2KGY0": "GUILD_SETTINGS_AUDIT_LOG_TIME_AT_ANDROID", "ojZKhj": "GUILD_SETTINGS_AUDIT_LOG_UNKNOWN_ACTION", + "WYT6ka": "GUILD_SETTINGS_AUDIT_LOG_VERIFICATION_DISABLED", + "fnkzDY": "GUILD_SETTINGS_AUDIT_LOG_VERIFICATION_ENABLED", "MWjnU7": "GUILD_SETTINGS_AUDIT_LOG_VOICE_CHANNEL_STATUS_CREATED", "aS8Krq": "GUILD_SETTINGS_AUDIT_LOG_VOICE_CHANNEL_STATUS_DELETED", "HyCSnI": "GUILD_SETTINGS_AUDIT_LOG_VOICE_CHANNEL_STATUS_STATUS_CREATE", @@ -8446,6 +8334,7 @@ "fyMWli": "GUILD_SETTINGS_AUTOMOD_MESSAGE_FILTER_TITLE", "uRelgx": "GUILD_SETTINGS_AUTOMOD_TITLE", "vBcWUv": "GUILD_SETTINGS_BANNER_RECOMMEND", + "UKgg5N": "GUILD_SETTINGS_BOOST_PERKS", "Cryi10": "GUILD_SETTINGS_CHANNEL_SETTINGS", "nRtNqn": "GUILD_SETTINGS_COMMUNITY", "pjG+T3": "GUILD_SETTINGS_COMMUNITY_ADMINISTRATOR_ONLY", @@ -8476,6 +8365,7 @@ "Fg6O/5": "GUILD_SETTINGS_COMMUNITY_MOD_CHANNEL_HELP_MOBILE", "VqhxxN": "GUILD_SETTINGS_COMMUNITY_MOD_CHANNEL_SELECTOR_TITLE", "vAyDGU": "GUILD_SETTINGS_COMMUNITY_MOD_CHANNEL_TITLE", + "8nY2LE": "GUILD_SETTINGS_COMMUNITY_OVERVIEW", "BtwmYB": "GUILD_SETTINGS_COMMUNITY_RULES_CHANNEL_HELP", "3q1TEo": "GUILD_SETTINGS_COMMUNITY_RULES_CHANNEL_HELP_MOBILE", "V+Yo1l": "GUILD_SETTINGS_COMMUNITY_UPSELL_BODY", @@ -8587,6 +8477,10 @@ "X9TKsB": "GUILD_SETTINGS_EMOJI_UPLOAD_TO_SERVER_MESSAGE", "XU0S6k": "GUILD_SETTINGS_ENABLE_DISCOVERABLE", "Tn7Koo": "GUILD_SETTINGS_ENABLE_MONETIZATION_TAB_TITLE", + "6TAHbx": "GUILD_SETTINGS_ENGAGEMENT", + "XCGZFk": "GUILD_SETTINGS_ENGAGEMENT_DESCRIPTION", + "Cv6AN/": "GUILD_SETTINGS_ENGAGEMENT_SYSTEM_MESSAGES", + "dNn/1i": "GUILD_SETTINGS_ENGAGEMENT_WIDGET_DESCRIPTION", "aHNFSM": "GUILD_SETTINGS_EXAMPLE_TOOLTIP", "W5tpcc": "GUILD_SETTINGS_FILTERED_ACTION", "4LEVqk": "GUILD_SETTINGS_FILTERED_USER", @@ -8644,7 +8538,7 @@ "fp0j+b": "GUILD_SETTINGS_HOME_HEADER", "0ldZlw": "GUILD_SETTINGS_HOME_HEADER_DESCRIPTION", "Vwintv": "GUILD_SETTINGS_HOME_HEADER_RECOMMEND", - "R/9yQF": "GUILD_SETTINGS_ICON_RECOMMEND", + "YOt3Om": "GUILD_SETTINGS_INVITES", "nJegc0": "GUILD_SETTINGS_KEEP_STARTED_APPLICATIONS_DESCRIPTION", "hw21+z": "GUILD_SETTINGS_KICK_STARTED_APPLICATIONS_DESCRIPTION", "SPWLyT": "GUILD_SETTINGS_LABEL_AUDIT_LOG", @@ -8689,6 +8583,7 @@ "Du+2bU": "GUILD_SETTINGS_MEMBER_VERIFICATION_ENABLED_SECOND_LINE", "dSqqL6": "GUILD_SETTINGS_MEMBER_VERIFICATION_ENABLE_REMINDER", "Fpv3b4": "GUILD_SETTINGS_MEMBER_VERIFICATION_EXAMPLE_GUILD_NAME", + "KQeYoC": "GUILD_SETTINGS_MEMBER_VERIFICATION_INTERVIEW", "tX8S35": "GUILD_SETTINGS_MEMBER_VERIFICATION_INTRO_BUTTON", "OCorGf": "GUILD_SETTINGS_MEMBER_VERIFICATION_LIST_DESCRIPTION", "7ooyR7": "GUILD_SETTINGS_MEMBER_VERIFICATION_MANUAL_APPROVAL", @@ -8741,6 +8636,7 @@ "w9/qGY": "GUILD_SETTINGS_ONBOARDING_ADD_A_RESOURCE", "qce3EM": "GUILD_SETTINGS_ONBOARDING_ADD_A_TASK", "aTzTDt": "GUILD_SETTINGS_ONBOARDING_CUSTOMIZE_ACTION", + "ncTLSo": "GUILD_SETTINGS_ONBOARDING_EDIT_TASK", "BBj1nY": "GUILD_SETTINGS_ONBOARDING_HOME_BANNER", "6A1spA": "GUILD_SETTINGS_ONBOARDING_HOME_BANNER_EXPLAINER_1", "Q5ugi+": "GUILD_SETTINGS_ONBOARDING_HOME_BANNER_EXPLAINER_2", @@ -8867,6 +8763,7 @@ "ZikTt+": "GUILD_SETTINGS_PREMIUM_UPSELL_SUBHEADING_TIER_2_MOBILE", "g2RnpV": "GUILD_SETTINGS_PRE_JOIN_QUESTIONS_HEADER", "bLDQ1Q": "GUILD_SETTINGS_PRE_JOIN_QUESTIONS_SUBHEADER", + "txdaxf": "GUILD_SETTINGS_PROFILE", "G4mFWf": "GUILD_SETTINGS_PUBLIC_NO_OPTION_SELECTED", "MDtgYB": "GUILD_SETTINGS_PUBLIC_UPDATE_FAILED", "2rkmDr": "GUILD_SETTINGS_PUBLIC_WELCOME", @@ -8880,16 +8777,6 @@ "JbB7Ql": "GUILD_SETTINGS_PUBLIC_WELCOME_ENABLED", "TA1g7z": "GUILD_SETTINGS_PUBLIC_WELCOME_ENABLED_SECOND_LINE", "nc6r1B": "GUILD_SETTINGS_PUBLIC_WELCOME_ENABLE_REMINDER", - "s/entz": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_DESCRIPTION_1", - "Y9So0D": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_DESCRIPTION_2", - "wsJcws": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_DESCRIPTION_3", - "v/gQ4U": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_NAME_1", - "7mUf0d": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_NAME_2", - "vrGLjk": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_NAME_3", - "Xvsukx": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_DESCRIPTION", - "5NJlXn": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_TITLE", - "RWdjP0": "GUILD_SETTINGS_PUBLIC_WELCOME_INTRO_BUTTON", - "a59UeI": "GUILD_SETTINGS_PUBLIC_WELCOME_INTRO_TEXT", "zFuCsF": "GUILD_SETTINGS_PUBLIC_WELCOME_INVALID_CHANNEL", "VV2926": "GUILD_SETTINGS_PUBLIC_WELCOME_ONLY_VIEWABLE_CHANNELS", "fAQ/8h": "GUILD_SETTINGS_PUBLIC_WELCOME_PICK_CHANNEL", @@ -8952,19 +8839,15 @@ "QiONL5": "GUILD_SETTINGS_SAFETY_SPAM_SUSPICIOUS_DMS", "dSRTMB": "GUILD_SETTINGS_SAFETY_SPAM_SUSPICIOUS_DMS_DESCRIPTION", "EkSAHZ": "GUILD_SETTINGS_SAFETY_SPAM_SUSPICIOUS_LINKS", - "4mGq0u": "GUILD_SETTINGS_SAFETY_UPDATES_HEADER", - "yHVqK2": "GUILD_SETTINGS_SAFETY_UPDATES_ITEM_1", - "bxESrc": "GUILD_SETTINGS_SAFETY_UPDATES_ITEM_2", - "YPJ8F9": "GUILD_SETTINGS_SAFETY_UPDATES_ITEM_3", - "8C2EfU": "GUILD_SETTINGS_SAFETY_UPDATES_ITEM_4", - "783jaG": "GUILD_SETTINGS_SAFETY_UPDATES_LINE_1", - "Ilf4Zl": "GUILD_SETTINGS_SAFETY_UPDATES_LINE_2", "mA17eD": "GUILD_SETTINGS_SAFETY_VERIFICATION_DESCRIPTION", "hdCiOz": "GUILD_SETTINGS_SECTION_GROW_YOUR_SERVER", "l7YU3h": "GUILD_SETTINGS_SECTION_SERVER_DISCOVERY", "zrSbNj": "GUILD_SETTINGS_SECTION_TITLE_ADD_FUN_STUFF", + "wF3KJy": "GUILD_SETTINGS_SECTION_TITLE_APPS", + "m6lkGy": "GUILD_SETTINGS_SECTION_TITLE_EXPRESSION", "02hvfp": "GUILD_SETTINGS_SECTION_TITLE_KEEP_IT_SAFE", "WqkqPl": "GUILD_SETTINGS_SECTION_TITLE_MANAGE_USERS", + "bMAKMK": "GUILD_SETTINGS_SECTION_TITLE_PEOPLE", "e36lKR": "GUILD_SETTINGS_SERVER_BANNER_BACKGROUND", "tzGY0q": "GUILD_SETTINGS_SERVER_INVITE_BACKGROUND", "oBIZwQ": "GUILD_SETTINGS_SET_UP_DISCOVERY", @@ -8998,8 +8881,10 @@ "TiF7M4": "GUILD_SETTINGS_STICKERS_UPSELL_DESCRIPTION", "jcesAE": "GUILD_SETTINGS_STICKERS_UPSELL_DESCRIPTION_FREE_SLOTS", "hzCkyg": "GUILD_SETTINGS_STICKERS_UPSELL_TITLE", + "FOYxgr": "GUILD_SETTINGS_SUMMARIES_TITLE", "vmEDQs": "GUILD_SETTINGS_SUMMARIES_TOGGLE", "c6Cy/h": "GUILD_SETTINGS_SUMMARIES_TOGGLE_DESCRIPTION", + "2QmKZ2": "GUILD_SETTINGS_TAG", "qlhNb+": "GUILD_SETTINGS_TITLE_SERVER_WIDGET", "PggHmu": "GUILD_SETTINGS_UPDATE_PERMISSIONS", "+baN11": "GUILD_SETTINGS_WIDGET_EMBED_HELP", @@ -9071,7 +8956,9 @@ "bLykEe": "GUILD_STICKER_SETTINGS_ADDITIONAL_SLOTS", "psMYux": "GUILD_STICKER_SETTINGS_ADDITIONAL_SLOTS_WITHOUT_TOTAL", "dtFw5c": "GUILD_STICKER_SETTINGS_BUY_LEVEL", + "g7lkrU": "GUILD_STICKER_SETTINGS_ENABLE_LEVEL", "BAhswr": "GUILD_STICKER_SETTINGS_ICON_ALT_TEXT", + "hwPEJR": "GUILD_STICKER_SETTINGS_LEVEL_DISABLED", "wl4ntJ": "GUILD_STICKER_SETTINGS_PLACEHOLDER_ALT_TEXT", "ZLoNtm": "GUILD_STICKER_SETTINGS_REMAINING_SLOTS_AVAILABLE", "Vbkh2l": "GUILD_STICKER_SETTINGS_UNLOCK_SLOTS", @@ -9147,6 +9034,10 @@ "r0IGsP": "GUILD_SUBSCRIPTION_PURCHASE_MODAL_TRANSFERRED_DESCRIPTION_MOBILE2", "F8xlhr": "GUILD_SUBSCRIPTION_PURCHASE_MODAL_UNUSED_SLOT_NOTICE", "xtA71V": "GUILD_SUBSCRIPTION_REPORT", + "jwEaiX": "GUILD_TAG_AVAILABLE_COACHMARK_ADOPT_TAG", + "DrAXIr": "GUILD_TAG_AVAILABLE_COACHMARK_DESCRIPTION", + "VFqnyU": "GUILD_TAG_AVAILABLE_COACHMARK_HEADER", + "m/Tc3n": "GUILD_TAG_UPDATED_COACHMARK_HEADER", "KUw7Ss": "GUILD_TEMPLATES", "Wxdi8A": "GUILD_TEMPLATES_CREATE_LINK", "apCQv/": "GUILD_TEMPLATES_DELETE_DESCRIPTION", @@ -9317,19 +9208,18 @@ "QVhmG3": "HANGOUT_OVER_RECEIVER", "IE2uZe": "HANGOUT_OVER_SENDER", "d8R2VC": "HANG_STATUS", - "GFo2Gh": "HANG_STATUS_HELP", "IAZiW2": "HANG_STATUS_LOCATION", "pwvT9g": "HANG_STATUS_MOBILE_SET_ROW", "KPop4s": "HANG_STATUS_SET_CUSTOM_STATUS_PLACEHOLDER", "qstQuS": "HANG_STATUS_VC_ROW_ADD", "1+boPi": "HAPPENING_NOW", + "Di0QQu": "HAPPY_NEW_YEAR", "eOC/F2": "HARDWARE_ACCELERATION", "Afc7l6": "HARDWARE_ACCELERATION_HELP_TEXT", "zSG3Qy": "HARMFUL_LINK_MESSAGE_BLOCKED_ERROR", "KO88BS": "HARVEST_BACKEND_ACTIVITIES", "j+d6RN": "HARVEST_BACKEND_ANALYTICS", "JN9c36": "HARVEST_BACKEND_GUILDS", - "M4ddeY": "HARVEST_BACKEND_HUBSPOT", "0dO1t+": "HARVEST_BACKEND_MESSAGES", "rfe/x8": "HARVEST_BACKEND_USERS", "DoCPyI": "HD_VIDEO_STREAMING_DESCRIPTION", @@ -9345,9 +9235,12 @@ "K+D+GF": "HELP_SINGULAR_PERMISSION", "xfkfTK": "HIDDEN_SPAM_MESSAGE_COUNT", "fgq1gs": "HIDE", + "RyimDk": "HIDE_ADVANCED_NOTIFICATION_SETTINGS", "5MstTl": "HIDE_CHAT", "mAdygU": "HIDE_CHAT_INPUT", "nAmmop": "HIDE_CHAT_INPUT_HINT", + "k3q+Ru": "HIDE_DM", + "oI64T4": "HIDE_DM_FOR_NOW", "m7mS2U": "HIDE_INSTANT_INVITES_DESCRIPTION", "q7WNGv": "HIDE_INSTANT_INVITES_LABEL", "UwOLJO": "HIDE_MUTED_CHANNELS", @@ -9358,6 +9251,7 @@ "/lFMWr": "HIDE_SELF_STREAM_CONFIRMATION_HEADER", "oU1p9O": "HIDE_SELF_VIDEO_CONFIRMATION_BODY", "xzxhZS": "HIDE_SELF_VIDEO_CONFIRMATION_HEADER", + "8fJE7w": "HIDE_SERVERS", "niD64e": "HIDE_USER_PROFILE", "P4vj0h": "HIDE_WINDOW_FROM_STREAM_DESCRIPTION", "iA81+a": "HIDE_WINDOW_FROM_STREAM_LABEL", @@ -9371,6 +9265,7 @@ "fgSHf8": "HOLIDAY_SOUNDPACK_LABEL", "Ym2Ri6": "HOME", "/l0Ezq": "HOME_ACTIONS_MENU_LABEL", + "8sNvNn": "HOURS", "DEn7nu": "HOW_TO_INVITE_OTHERS", "fuTmEJ": "HOW_YOU_SIGN_IN", "dsAxQj": "HUB_ADD_GUILD_CATEGORY_PLACEHOLDER", @@ -9421,7 +9316,6 @@ "hO6qJ3": "HUB_EMAIL_CONNECTION_CANCEL", "8vmKO0": "HUB_EMAIL_CONNECTION_CONTENT_BUTTON", "+KJMOX": "HUB_EMAIL_CONNECTION_CONTENT_CANCEL_BUTTON", - "YfeHRA": "HUB_EMAIL_CONNECTION_CONTENT_DESCRIPTION", "H1jCHH": "HUB_EMAIL_CONNECTION_CONTENT_HEADER", "Cv7mmI": "HUB_EMAIL_CONNECTION_CONTENT_INPUT_DESCRIPTION", "kmCxkf": "HUB_EMAIL_CONNECTION_CONTENT_INPUT_HEADER", @@ -9453,16 +9347,6 @@ "/5y0uV": "HUB_ENTRY_REMOVE_BODY", "XnuOvN": "HUB_ENTRY_UPDATE", "w9tsNk": "HUB_ENTRY_UPDATE_DESCRIPTION_TITLE", - "pdXYeC": "HUB_EVENTS_FOOTER_BUTTON_TEXT", - "to3MHE": "HUB_EVENTS_FOOTER_DESCRIPTION", - "mnDjks": "HUB_EVENTS_FOOTER_TITLE", - "N+TB5v": "HUB_EVENTS_GO_TO_GUILD", - "6hktHA": "HUB_EVENTS_HEADER_DESCRIPTION", - "RhXVpX": "HUB_EVENTS_HEADER_TITLE", - "4BiO8c": "HUB_EVENTS_JOIN_GUILD", - "gTgUmR": "HUB_EVENTS_SHARE_CHANNEL_EVERYONE_VIEWABLE_WARNING", - "V8Oq8B": "HUB_EVENTS_SHARE_DESCRIPTION", - "8GW688": "HUB_EVENTS_SHARE_TITLE", "48kg+O": "HUB_EXTRA_DESCRIPTION", "/o1IfA": "HUB_INVITE_ANOTHER_SCHOOL_LINK", "sSwlGQ": "HUB_INVITE_BUTTON_TITLE_INVITED", @@ -9523,124 +9407,6 @@ "WBXuJJ": "HUMANIZE_DURATION_HOURS", "CdIH2I": "HUMANIZE_DURATION_MINUTES", "NF2bJY": "HUMANIZE_DURATION_SECONDS", - "CpG10a": "HYPESQUAD_DESCRIPTION_HOUSE_1", - "VNPE6m": "HYPESQUAD_DESCRIPTION_HOUSE_2", - "KNfiTa": "HYPESQUAD_DESCRIPTION_HOUSE_3", - "4JWDXt": "HYPESQUAD_ERROR_BODY", - "8A8ry9": "HYPESQUAD_ERROR_HEADING", - "iZowCU": "HYPESQUAD_HEADING", - "e7fL7J": "HYPESQUAD_HEADING_EXISTING_MEMBER", - "ORKdHa": "HYPESQUAD_HOUSE_1", - "aKf3dt": "HYPESQUAD_HOUSE_2", - "21LOa8": "HYPESQUAD_HOUSE_3", - "1GWQKp": "HYPESQUAD_JOIN", - "WH+dhp": "HYPESQUAD_LEAVE_ACTION", - "UUcECC": "HYPESQUAD_LEAVE_ERROR", - "ziWmcA": "HYPESQUAD_LEAVE_PROMPT", - "yG0XAD": "HYPESQUAD_MEMBERSHIP_HEADING", - "3kUvgp": "HYPESQUAD_NEWSLETTER_WARNING", - "ITh5++": "HYPESQUAD_PERKS_HEADING", - "qqp5Zc": "HYPESQUAD_PERK_DESCRIPTION_NEWSLETTER", - "3N3YOF": "HYPESQUAD_PERK_DESCRIPTION_PROFILE_BADGE", - "noChoN": "HYPESQUAD_PERK_DESCRIPTION_SQUAD_CHALLENGES", - "vURCfz": "HYPESQUAD_PERK_TITLE_NEWSLETTER", - "j4RYIw": "HYPESQUAD_PERK_TITLE_PROFILE_BADGE", - "Yu1bAp": "HYPESQUAD_PERK_TITLE_SQUAD_CHALLENGES", - "wWV9E/": "HYPESQUAD_QUESTION_0_PROMPT", - "o6ELqw": "HYPESQUAD_QUESTION_0_RESPONSE_A", - "VVcLQv": "HYPESQUAD_QUESTION_0_RESPONSE_B", - "v/5qvm": "HYPESQUAD_QUESTION_0_RESPONSE_C", - "dMYFq7": "HYPESQUAD_QUESTION_0_RESPONSE_D", - "FAs+YJ": "HYPESQUAD_QUESTION_10_PROMPT", - "jD0Bbf": "HYPESQUAD_QUESTION_10_RESPONSE_A", - "zFZP2V": "HYPESQUAD_QUESTION_10_RESPONSE_B", - "AQi4BF": "HYPESQUAD_QUESTION_10_RESPONSE_C", - "HNGDgo": "HYPESQUAD_QUESTION_10_RESPONSE_D", - "dY+C+S": "HYPESQUAD_QUESTION_11_PROMPT", - "8PHLGl": "HYPESQUAD_QUESTION_11_RESPONSE_A", - "PAWXCl": "HYPESQUAD_QUESTION_11_RESPONSE_B", - "pyRWsp": "HYPESQUAD_QUESTION_11_RESPONSE_C", - "SfbdaG": "HYPESQUAD_QUESTION_11_RESPONSE_D", - "1DiI68": "HYPESQUAD_QUESTION_12_PROMPT", - "VdyT73": "HYPESQUAD_QUESTION_12_RESPONSE_A", - "9tQrr1": "HYPESQUAD_QUESTION_12_RESPONSE_B", - "E11H4x": "HYPESQUAD_QUESTION_12_RESPONSE_C", - "TRNpXH": "HYPESQUAD_QUESTION_12_RESPONSE_D", - "r23dpx": "HYPESQUAD_QUESTION_13_PROMPT", - "gFpEVr": "HYPESQUAD_QUESTION_13_RESPONSE_A", - "oqF1le": "HYPESQUAD_QUESTION_13_RESPONSE_B", - "itk+ip": "HYPESQUAD_QUESTION_13_RESPONSE_C", - "WyvPF8": "HYPESQUAD_QUESTION_13_RESPONSE_D", - "/cxmL/": "HYPESQUAD_QUESTION_14_PROMPT", - "zaKm/a": "HYPESQUAD_QUESTION_14_RESPONSE_A", - "SES9Zg": "HYPESQUAD_QUESTION_14_RESPONSE_B", - "ebblm8": "HYPESQUAD_QUESTION_14_RESPONSE_C", - "csrWfP": "HYPESQUAD_QUESTION_14_RESPONSE_D", - "ujB5uC": "HYPESQUAD_QUESTION_1_PROMPT", - "R2dI+d": "HYPESQUAD_QUESTION_1_RESPONSE_A", - "s0EqhB": "HYPESQUAD_QUESTION_1_RESPONSE_B", - "ex6tvp": "HYPESQUAD_QUESTION_1_RESPONSE_C", - "lk2Bt5": "HYPESQUAD_QUESTION_1_RESPONSE_D", - "zYNt1A": "HYPESQUAD_QUESTION_2_PROMPT", - "NOC4TT": "HYPESQUAD_QUESTION_2_RESPONSE_A", - "FlDBfC": "HYPESQUAD_QUESTION_2_RESPONSE_B", - "MLzlRR": "HYPESQUAD_QUESTION_2_RESPONSE_C", - "1j46Zr": "HYPESQUAD_QUESTION_2_RESPONSE_D", - "CQkJcr": "HYPESQUAD_QUESTION_3_PROMPT", - "NyWJLy": "HYPESQUAD_QUESTION_3_RESPONSE_A", - "uF0u85": "HYPESQUAD_QUESTION_3_RESPONSE_B", - "BZuLSe": "HYPESQUAD_QUESTION_3_RESPONSE_C", - "27zWTt": "HYPESQUAD_QUESTION_3_RESPONSE_D", - "dPgrQn": "HYPESQUAD_QUESTION_4_PROMPT", - "Aq4y+g": "HYPESQUAD_QUESTION_4_RESPONSE_A", - "rr72eO": "HYPESQUAD_QUESTION_4_RESPONSE_B", - "2v7Vv9": "HYPESQUAD_QUESTION_4_RESPONSE_C", - "H5wx2U": "HYPESQUAD_QUESTION_4_RESPONSE_D", - "uS4tV2": "HYPESQUAD_QUESTION_5_PROMPT", - "tld7Ia": "HYPESQUAD_QUESTION_5_RESPONSE_A", - "OOfrPi": "HYPESQUAD_QUESTION_5_RESPONSE_B", - "QbtUjw": "HYPESQUAD_QUESTION_5_RESPONSE_C", - "88DsQh": "HYPESQUAD_QUESTION_5_RESPONSE_D", - "DMzlBv": "HYPESQUAD_QUESTION_6_PROMPT", - "wURefk": "HYPESQUAD_QUESTION_6_RESPONSE_A", - "6abY0a": "HYPESQUAD_QUESTION_6_RESPONSE_B", - "VttdKM": "HYPESQUAD_QUESTION_6_RESPONSE_C", - "N9tGcB": "HYPESQUAD_QUESTION_6_RESPONSE_D", - "4A4ezb": "HYPESQUAD_QUESTION_7_PROMPT", - "pK+hm2": "HYPESQUAD_QUESTION_7_RESPONSE_A", - "fpfjDX": "HYPESQUAD_QUESTION_7_RESPONSE_B", - "QDZPw/": "HYPESQUAD_QUESTION_7_RESPONSE_C", - "DJBGuY": "HYPESQUAD_QUESTION_7_RESPONSE_D", - "wshlHU": "HYPESQUAD_QUESTION_8_PROMPT", - "b5ar8Y": "HYPESQUAD_QUESTION_8_RESPONSE_A", - "SBEThn": "HYPESQUAD_QUESTION_8_RESPONSE_B", - "WsXEqZ": "HYPESQUAD_QUESTION_8_RESPONSE_C", - "1jEI+A": "HYPESQUAD_QUESTION_8_RESPONSE_D", - "pxkSfj": "HYPESQUAD_QUESTION_9_PROMPT", - "Y+ztvA": "HYPESQUAD_QUESTION_9_RESPONSE_A", - "PCjFjO": "HYPESQUAD_QUESTION_9_RESPONSE_B", - "jjodpJ": "HYPESQUAD_QUESTION_9_RESPONSE_C", - "5tHTjF": "HYPESQUAD_QUESTION_9_RESPONSE_D", - "hNL/nL": "HYPESQUAD_QUIZ_BODY_HOUSE_1", - "jVomuj": "HYPESQUAD_QUIZ_BODY_HOUSE_2", - "+kg5zh": "HYPESQUAD_QUIZ_BODY_HOUSE_3", - "5NfNYm": "HYPESQUAD_QUIZ_CANCEL", - "Wc/k5H": "HYPESQUAD_QUIZ_CLOSE", - "mW2CN8": "HYPESQUAD_QUIZ_COMPLETED_MODAL_TITLE", - "fMgJM0": "HYPESQUAD_QUIZ_ERROR_MODAL_TITLE", - "cgonQG": "HYPESQUAD_QUIZ_NEXT_QUESTION", - "4n8Pby": "HYPESQUAD_QUIZ_ONGOING_MODAL_TITLE", - "5BGOBA": "HYPESQUAD_QUIZ_RETRY", - "YeiLeI": "HYPESQUAD_QUIZ_SELECT_ANSWER", - "j5vHoz": "HYPESQUAD_QUIZ_SHOW_MY_HOUSE", - "HrcQAO": "HYPESQUAD_QUIZ_TITLE", - "Uq6KRt": "HYPESQUAD_READY_TO_REP", - "6FaVFO": "HYPESQUAD_SUBHEADING", - "LzBgrs": "HYPESQUAD_SWITCH_HOUSES_ACTION", - "zD3mqF": "HYPESQUAD_SWITCH_HOUSES_PROMPT", - "vZU8Kq": "HYPESQUAD_UNCLAIMED_ACCOUNT_NOTICE", - "T7TYEB": "HYPESQUAD_UNVERIFIED_EMAIL_NOTICE", - "KZoEI8": "HYPESQUAD_YOUR_HOUSE", "7basa2": "I18N_LOCALE_LOADING_ERROR", "lTCb0c": "IAP_RESUBSCRIBE_BUTTON", "ZyXA0q": "IAR_FEEDBACK_PROBLEM_CONFUSING_LANGUAGE", @@ -9653,6 +9419,9 @@ "l+7PZY": "IAR_UPSELLS_BLOCK_BUTTON", "G08MKu": "IAR_UPSELLS_BLOCK_DESCRIPTION", "Q1o/f3": "IAR_UPSELLS_BLOCK_TITLE", + "ygG62M": "IAR_UPSELLS_DEAUTHORIZE_APPLICATION", + "xXpoGV": "IAR_UPSELLS_DEAUTHORIZE_APPLICATION_BUTTON", + "S51EKg": "IAR_UPSELLS_DEAUTHORIZE_APPLICATION_DESCRIPTION", "f3pnLL": "IAR_UPSELLS_DELETED_MESSAGE_BUTTON", "ch2xbt": "IAR_UPSELLS_DELETE_MESSAGE_BUTTON", "dK8S0w": "IAR_UPSELLS_DELETE_MESSAGE_DESCRIPTION", @@ -9660,6 +9429,12 @@ "43UEUh": "IAR_UPSELLS_DM_SPAM_FILTER_DESCRIPTION", "vJOqMB": "IAR_UPSELLS_DM_SPAM_FILTER_TITLE", "olebGx": "IAR_UPSELLS_GO_TO_SAFETY_SETTINGS", + "aqlmp8": "IAR_UPSELLS_GRAPHIC_MEDIA_FILTER_DESCRIPTION", + "RVX1zT": "IAR_UPSELLS_GRAPHIC_MEDIA_FILTER_TITLE", + "nDdxOG": "IAR_UPSELLS_IGNORED_BUTTON", + "ICYEfY": "IAR_UPSELLS_IGNORE_BUTTON", + "naWE6W": "IAR_UPSELLS_IGNORE_DESCRIPTION", + "U3yyFs": "IAR_UPSELLS_IGNORE_TITLE", "+Esd3D": "IAR_UPSELLS_LANGUAGE_FILTER_DESCRIPTION", "DPVOLW": "IAR_UPSELLS_LANGUAGE_FILTER_TITLE", "F3qExp": "IAR_UPSELLS_LEAVE_SERVER_BUTTON", @@ -9670,10 +9445,16 @@ "HITUcR": "IAR_UPSELLS_MUTE_BUTTON", "yM/+AJ": "IAR_UPSELLS_MUTE_DESCRIPTION", "TRp5wR": "IAR_UPSELLS_MUTE_TITLE", + "WV/CsH": "IAR_UPSELLS_REMOVE_APPLICATION", + "aCJlq4": "IAR_UPSELLS_REMOVE_APPLICATION_BUTTON", + "FlcC+3": "IAR_UPSELLS_REMOVE_APPLICATION_DESCRIPTION", "1yxTIJ": "IAR_UPSELLS_SECTION_TITLE", "Vzp5BE": "IAR_UPSELLS_SENSITIVE_MEDIA_DESCRIPTION", "5Qu1IU": "IAR_UPSELLS_SENSITIVE_MEDIA_TITLE", "UBrRGq": "IDR_NAME", + "ytCpKs": "IGNORE", + "tFY5Zb": "IGNORED", + "VFWjc+": "IGNORED_MESSAGE_COUNT", "xdx6OY": "IGNORE_FRIEND_REQUEST", "X4IxWL": "IMAGE", "Sp2NF+": "IMAGES", @@ -9732,6 +9513,7 @@ "RVyYCK": "INAPPROPRIATE_CONVERSATION_WUMPUS_LIGHTBULB_ALT", "GSmTKJ": "INBOX", "tq+6t/": "INCLUDED", + "hrSIhN": "INCLUDE_SOUNDMOJI_RESULTS_IN_AUTOCOMPLETE", "/eVrj8": "INCLUDE_STICKER_RESULTS_IN_AUTOCOMPLETE", "fk1/bX": "INCOMING_CALL", "IUH/Oe": "INCOMING_CALLS", @@ -9743,9 +9525,14 @@ "0E614Z": "INCOMING_FRIEND_REQUEST_ACCEPTED_SUBLABEL", "cRwkp7": "INCOMING_FRIEND_REQUEST_ACCEPTED_SUBLABEL_A11Y", "u6lp4x": "INCOMING_FRIEND_REQUEST_FROM", + "0eWeav": "INCOMING_GAME_FRIEND_REQUEST", + "0uVuaU": "INCOMING_GAME_FRIEND_REQUESTS", + "gRgJGR": "INCOMING_GAME_FRIEND_REQUEST_ACCEPTED_SUBLABEL", + "Ke6fRJ": "INCOMING_GAME_FRIEND_REQUEST_ACCEPTED_SUBLABEL_A11Y", "hhsg3m": "INCOMING_VIDEO_CALL", "KcnWCO": "INCOMING_VIDEO_CALL_ELLIPSIS", "wO1VBk": "INCOMPATIBLE_BROWSER", + "w8Sc4B": "INCREMENT", "DlcqlU": "INDICATE_RSVP", "ndsK4Z": "INIVTE_MODAL_NO_THANKS", "VP11No": "INLINE_ATTACHMENT_MEDIA", @@ -9754,6 +9541,7 @@ "U68Dgp": "INLINE_MEDIA_LABEL", "ElbIXN": "INPUT_DEVICE", "Q8gkVL": "INPUT_MODE_PTT", + "EGn1eN": "INPUT_MODE_PTT_LATCHING", "1AINrB": "INPUT_MODE_PTT_LIMITED", "y0ShVt": "INPUT_MODE_PTT_RELEASE_DELAY", "cHCEOJ": "INPUT_MODE_VAD", @@ -9764,7 +9552,6 @@ "ngRFjZ": "INSTANT_INVITES", "ohMvm1": "INSTANT_INVITE_ACCEPT", "6wsY16": "INSTANT_INVITE_ACCEPTING", - "5UKyUq": "INSTANT_INVITE_ACCEPT_STAGE", "SMJr+a": "INSTANT_INVITE_ASK_FOR_NEW_INVITE", "9Akp1s": "INSTANT_INVITE_ASK_USER_FOR_NEW_INVITE", "GzD/aa": "INSTANT_INVITE_BANNED", @@ -9789,6 +9576,7 @@ "RiiKV0": "INSTANT_INVITE_INVALID_CHANNEL", "EgHyKy": "INSTANT_INVITE_INVITER", "LBlFEN": "INSTANT_INVITE_INVITE_CODE", + "l7VISQ": "INSTANT_INVITE_INVITE_SOURCE", "kQ6fit": "INSTANT_INVITE_NOT_ALLOWED", "S6EgQT": "INSTANT_INVITE_PRE_REGISTRATION_SUBTITLE", "9+5IG7": "INSTANT_INVITE_REDIRECTING", @@ -9796,6 +9584,7 @@ "GePcbu": "INSTANT_INVITE_RESOLVED_TITLE", "B44+cH": "INSTANT_INVITE_RESOLVING", "y/lSC4": "INSTANT_INVITE_SEE_MESSAGES", + "BcAABv": "INSTANT_INVITE_SEND", "erWrmA": "INSTANT_INVITE_USES", "FDsl+J": "INSTANT_INVITE_YOU_ARE_ALREADY_A_MEMBER_OF", "4aF92R": "INSTANT_INVITE_YOU_HAVE_BEEN_INVITED_TO_CHAT", @@ -9804,6 +9593,7 @@ "spU2mI": "INSTANT_INVITE_YOU_HAVE_BEEN_INVITED_TO_JOIN_BY_USER", "OsdY8B": "INSTANT_INVITE_YOU_HAVE_BEEN_INVITED_TO_JOIN_GROUP_DM", "jpwYbt": "INSTANT_INVITE_YOU_HAVE_JOINED", + "zqh7ZM": "INSUFFICIENT_ORBS", "CIsNZw": "INTEGRATIONS", "BegylZ": "INTEGRATIONS_ACCOUNT_DESCRIPTION", "7YqSGx": "INTEGRATIONS_APPLICATION_ALL_CHANNELS", @@ -9865,6 +9655,7 @@ "JUNGIZ": "INTEGRATIONS_CHANNEL_FOLLOWING_SUMMARY", "M6q6eX": "INTEGRATIONS_DISABLE", "7sCN8m": "INTEGRATIONS_ENABLE", + "G8u3Jf": "INTEGRATIONS_FEATURES", "CMy0Cj": "INTEGRATIONS_FOLLOWED_CHANNEL_DELETE", "zO9jrD": "INTEGRATIONS_FOLLOWED_CHANNEL_DELETE_BODY", "gBKqZ0": "INTEGRATIONS_FOLLOWED_CHANNEL_DELETE_TITLE", @@ -9918,6 +9709,7 @@ "VXU4EU": "INTEGRATION_CONNECTED_PLATFORM_ACCOUNTS", "7mv59O": "INTEGRATION_CREATED_DATE", "7EcUbr": "INTEGRATION_CREATED_USER_DATE", + "mThMlB": "INTEGRATION_MISSING_KICK_PERMISSIONS", "sE5hSZ": "INTEGRATION_SETTINGS", "u2D2Uj": "INTERACTION_FAIL_TIMEOUT", "vGU8+r": "INTERACTION_FAIL_TIMEOUT_GENERIC", @@ -9940,6 +9732,7 @@ "IXk8Wz": "INVALID_ATTACHMENTS_FAILURE", "mY2R+F": "INVALID_CANNOT_FRIEND_SELF", "sRJGR1": "INVALID_COUNTRY_CODE", + "nr0MVZ": "INVALID_EMAIL", "Q87rI/": "INVALID_EXTERNAL_EMOJI_BODY", "FzugNl": "INVALID_EXTERNAL_EMOJI_BODY_UPGRADE", "IRq5ah": "INVALID_INVITE_LINK_ERROR", @@ -9948,6 +9741,8 @@ "XpUuoU": "INVALID_VOICE_CHANNEL", "Igv+LS": "INVENTORY_EMOJI_DETAILS_V2", "9F90ic": "INVITES", + "DjWsya": "INVITES_ACTIVE", + "KmK3q4": "INVITES_CREATE_LINK", "4FlZqw": "INVITES_DISABLED_ARTICLE_LABEL", "yD/zkn": "INVITES_DISABLED_CONFIRMATION", "IUlXle": "INVITES_DISABLED_DESCRIPTION", @@ -9960,9 +9755,11 @@ "jlLX2Z": "INVITES_DISABLED_MODAL_TITLE", "2LLbj9": "INVITES_DISABLED_TIP", "2n0/Fk": "INVITES_DISABLED_TOOLTIP", + "AmwmLg": "INVITES_NO_ACTIVE", "9GPbsV": "INVITES_PERMANENTLY_DISABLED_TIP", "QaAypP": "INVITE_APP_EMAIL", "AQKfCj": "INVITE_APP_MESSAGES", + "rriLm1": "INVITE_APP_QR_CODE", "f1+QIK": "INVITE_A_FRIEND", "siexRS": "INVITE_A_GUEST", "BlXIss": "INVITE_A_GUEST_EXPLANATION", @@ -9974,6 +9771,7 @@ "xhxnPn": "INVITE_BUTTON_ALREADY_FRIENDS", "2wimj5": "INVITE_BUTTON_BODY_IN_GUILD", "isTJ7A": "INVITE_BUTTON_EXPIRED", + "xdCLeM": "INVITE_BUTTON_HIDE_DETAILS", "Jhx/ud": "INVITE_BUTTON_INVALID", "F/OLvL": "INVITE_BUTTON_INVALID_OWNER", "N/g9Z4": "INVITE_BUTTON_RESOLVING", @@ -10022,23 +9820,21 @@ "3XVNyt": "INVITE_COPY_INVITE_LINK_HEADER_MOBILE", "VNe8P/": "INVITE_EDIT_LINK", "Ckxb6j": "INVITE_EMBED_ASK_TO_JOIN", - "VEtAtY": "INVITE_EMBED_FULL_GROUP", + "2Gbof+": "INVITE_EMBED_EXPIRED", + "jfrMtq": "INVITE_EMBED_FULL", "x1UXGR": "INVITE_EMBED_GAME_HAS_ENDED", - "I52SNU": "INVITE_EMBED_GAME_INVITE", + "pkq6Vq": "INVITE_EMBED_GAME_INVITATION", "hC/Zey": "INVITE_EMBED_INVITE_TO_JOIN", - "uWBvp/": "INVITE_EMBED_INVITE_TO_JOIN_GROUP", "/8czH4": "INVITE_EMBED_INVITE_TO_LISTEN", "BBJXVk": "INVITE_EMBED_INVITE_TO_WATCH", - "Y0TV5I": "INVITE_EMBED_IN_GROUP", "KC26NR": "INVITE_EMBED_JOINED", "5crb4n": "INVITE_EMBED_JOIN_VIA_ANDROID", "c3EWuF": "INVITE_EMBED_JOIN_VIA_DESKTOP_APP", "ZozYtu": "INVITE_EMBED_JOIN_VIA_IOS", + "/ak8Mu": "INVITE_EMBED_JOIN_VIA_PLAYSTATION", "HEY5dS": "INVITE_EMBED_JOIN_VIA_XBOX", - "EfJzLA": "INVITE_EMBED_LISTENING_INVITE", "84qx9r": "INVITE_EMBED_LISTEN_HAS_ENDED", "XWapne": "INVITE_EMBED_NUM_OPEN_SLOTS", - "Z2irYI": "INVITE_EMBED_SEND_INVITE", "B9kbnT": "INVITE_EMBED_WATCH_HAS_ENDED", "DXgdcD": "INVITE_EMPTY_BODY", "tQc0l8": "INVITE_EMPTY_TITLE", @@ -10084,6 +9880,7 @@ "x1SQZb": "INVITE_PRIVATE_CHANNEL_WARNING", "CmSHYx": "INVITE_SEARCH_FOR_FRIENDS", "kC3ZRG": "INVITE_SENDING", + "AWLVgR": "INVITE_SEND_LINK", "PuLLzP": "INVITE_SENT", "sVwWdV": "INVITE_SENT_EXCLAMATION", "99ISmn": "INVITE_SETTINGS_DESCRIPTION_NO_EXPIRATION", @@ -10091,16 +9888,15 @@ "Atdlyu": "INVITE_SETTINGS_TITLE", "HFbByJ": "INVITE_SHARE_LINK_OWN_SERVER", "CXpS1I": "INVITE_SHARE_LINK_TO_STREAM", - "DDzEVn": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_CONTENT", - "pMftkD": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_CONTENT_LOCKED", - "rOFcBt": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_CTA_PRIMARY_ROLE_SETTINGS", - "hBIHLc": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_CTA_SECONDARY", - "36wK83": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_TITLE", "1b9neu": "INVITE_STREAM_FOOTER_LINK_HEADER", "6VQaqd": "INVITE_STREAM_HEADER", "fg+ioQ": "INVITE_TAP_TO_INVITE", + "0jeAXt": "INVITE_TO_CHANNEL", + "taNYTF": "INVITE_TO_GROUP", "Sd8Ixw": "INVITE_TO_SERVER", "NvVBJU": "INVITE_TO_SERVER_NAME", + "EE+P0H": "INVITE_TO_VOICE", + "o53CL2": "INVITE_TO_VOICE_SUGGESTIONS", "6oJyq5": "INVITE_URL", "0M2U95": "INVITE_VANITY_USED", "gpqgah": "INVITE_VOICE_CHANNEL_JOIN", @@ -10110,14 +9906,6 @@ "qvicQ8": "INVITE_YOUR_CONTACTS_HEADER", "dHHb/2": "INVITE_YOUR_FRIENDS_CHANNEL_MOBILE", "ucY6yA": "INVITE_YOUR_FRIENDS_HEADER_MOBILE", - "hd/uCi": "IN_APP_EDUCATION_CHANNEL_HEADER", - "3HA76Z": "IN_APP_EDUCATION_CHANNEL_SUBHEADER", - "rqVMdL": "IN_APP_EDUCATION_DM_HEADER", - "Yq9fnY": "IN_APP_EDUCATION_DM_SUBHEADER", - "zOKuz+": "IN_APP_EDUCATION_MORE_HELP_HEADER", - "b7APqC": "IN_APP_EDUCATION_MORE_HELP_SUBHEADER", - "0zk2sS": "IN_APP_EDUCATION_SERVER_HEADER", - "NgKsgR": "IN_APP_EDUCATION_SERVER_SUBHEADER", "24xrGb": "IN_APP_REPORTING_FREE_TEXT_INPUT_ERROR", "VjAAuP": "IN_APP_REPORTING_SUBMIT_VALIDATION_ERROR", "L1zJgb": "IN_CATEGORY", @@ -10143,8 +9931,6 @@ "YOvRBZ": "IOS_MEDIA_KEYBOARD_NO_PHOTOS", "WCvaDu": "IOS_NOTIFICATION_SEE_FULL", "ZWXtAj": "IOS_PREMIUM_TRIAL_DISCLAIMER", - "1UiKPl": "IOS_PROFILE_IN_VOICE_CALL", - "SJSaoT": "IOS_PROFILE_OPEN_VOICE_CHANNEL", "xY6tIB": "IOS_SHARE_SUGGESTIONS_HINT", "J8foZq": "IOS_SHARE_SUGGESTIONS_TOGGLE", "8eBJ73": "IOS_STREAM_PARTICIPANTS_HIDDEN", @@ -10172,6 +9958,7 @@ "0yRXH4": "JOIN_LEADERBOARD", "Bd/Liz": "JOIN_MUTED", "E8euSk": "JOIN_ON_XBOX", + "2BP08E": "JOIN_SERVER", "yRjK4p": "JOIN_SERVER_BUTTON_CTA", "t58lNN": "JOIN_SERVER_BUTTON_CTA_MOBILE", "lVvN3A": "JOIN_SERVER_DESCRIPTION_MOBILE_REFRESH", @@ -10224,6 +10011,7 @@ "+Wem6h": "KEYBIND_DESCRIPTION_MODAL_NAVIGATE_CHANNELS", "bx4Uyz": "KEYBIND_DESCRIPTION_MODAL_NAVIGATE_SERVERS", "4I3pwW": "KEYBIND_DESCRIPTION_MODAL_NAVIGATE_TO_CALL", + "FiWl/T": "KEYBIND_DESCRIPTION_MODAL_OPEN_CONTEXT_MENU", "yYsRlD": "KEYBIND_DESCRIPTION_MODAL_QUICKSWITCHER", "L3RYYJ": "KEYBIND_DESCRIPTION_MODAL_SCROLL_CHAT", "FJvZ87": "KEYBIND_DESCRIPTION_MODAL_SEARCH", @@ -10255,6 +10043,7 @@ "mrIrVL": "KEYBIND_DESCRIPTION_SOUNDBOARD_HOLD_GLOBAL", "RRkZc9": "KEYBIND_DESCRIPTION_SOUNDBOARD_HOLD_NO_POPOUT_WHEEL_SUPPORT", "5wJefL": "KEYBIND_DESCRIPTION_SOUNDBOARD_NO_POPOUT_WHEEL_SUPPORT", + "v1JBtL": "KEYBIND_DESCRIPTION_TOGGLE_CAMERA", "MjREZV": "KEYBIND_DESCRIPTION_TOGGLE_DEAFEN", "s4C238": "KEYBIND_DESCRIPTION_TOGGLE_GO_LIVE_STREAMING", "X2fbUm": "KEYBIND_DESCRIPTION_TOGGLE_MUTE", @@ -10272,6 +10061,7 @@ "DkSwJ2": "KEYBIND_PUSH_TO_TALK_PRIORITY", "yPH4xm": "KEYBIND_SOUNDBOARD", "1xFbP/": "KEYBIND_SOUNDBOARD_HOLD", + "hf8JVT": "KEYBIND_TOGGLE_CAMERA", "NvGq1K": "KEYBIND_TOGGLE_DEAFEN", "ybdjJD": "KEYBIND_TOGGLE_GO_LIVE_STREAMING", "PlkYKD": "KEYBIND_TOGGLE_MUTE", @@ -10288,6 +10078,13 @@ "oQA/OB": "KEYBOARD_SHORTCUTS_EXPLAINER_MODAL_BODY", "V4fxrp": "KEYBOARD_SHORTCUTS_EXPLAINER_MODAL_TITLE", "zJg4FY": "KEYBOARD_SHORTCUTS_EXPLAINER_QUICKSWITCHER_SHORTCUT", + "CkGpcV": "KEY_ANY", + "L+36+h": "KEY_BACKSPACE", + "MIi0YT": "KEY_DELETE", + "SUweGy": "KEY_ENTER", + "cQmsQF": "KEY_ESCAPE", + "/tgxcr": "KEY_RETURN", + "L+jWo5": "KEY_SHIFT", "3glT6Z": "KICK", "fQUQIJ": "KICK_FROM_SERVER", "pBNv6i": "KICK_MEMBERS", @@ -10334,17 +10131,13 @@ "xSY9BH": "LAUNCH_PAD_STUFF_TO_CATCH_UP_ON", "yTnIfb": "LAUNCH_PAD_TAB_A11Y_LABEL", "+lFj35": "LAUNCH_PAD_UNREAD_CHANNELS_GUILD", - "P3huQP": "LAUNCH_WELCOME_CHOOSE_A_THEME", - "7lEuXo": "LAUNCH_WELCOME_LANDING_SUBTITLE", - "prQDM5": "LAUNCH_WELCOME_LANDING_TITLE", - "lmz9aO": "LAUNCH_WELCOME_LEARN_MORE", "lfpjfT": "LAUNCH_WELCOME_NUX_SUBTITLE", "MdrITN": "LAUNCH_WELCOME_NUX_TITLE", "BjCuf3": "LEADERBOARD_ACTIONS_MENU_LABEL", + "qIZICF": "LEADERBOARD_COACHMARK_SUBTITLE", + "wAtFS5": "LEADERBOARD_COACHMARK_TITLE", "QV4/6p": "LEADERBOARD_CONTEXT_MENU_SETTINGS_LABEL", "0ScUkQ": "LEADERBOARD_CURRENT_CHAMPION", - "vcisKb": "LEADERBOARD_GUILD_SETTINGS_MODAL_COMPETITION_SECTION_LABEL", - "R0X60o": "LEADERBOARD_GUILD_SETTINGS_MODAL_COMPETITION_SECTION_TITLE", "cH7QE1": "LEADERBOARD_GUILD_SETTINGS_MODAL_ENABLE_CROWN_LABEL", "HU4EKC": "LEADERBOARD_GUILD_SETTINGS_MODAL_REWARD_SECTION_TITLE", "IQO9F3": "LEADERBOARD_GUILD_SETTINGS_MODAL_STATISTIC_LABEL", @@ -10357,7 +10150,6 @@ "9x5Nah": "LEADERBOARD_LAST_WEEKS_CHAMPION", "PL48CJ": "LEADERBOARD_MODAL_CONNECT_RIOT", "OBuzJr": "LEADERBOARD_MODAL_SUBTITLE", - "WWBw57": "LEADERBOARD_MODAL_TITLE", "GLeQe7": "LEADERBOARD_POPOUT_PREVIEW_SHOW_FULL_LEADERBOARD", "MlT4+B": "LEADERBOARD_POPOUT_TITLE", "eU+JxD": "LEADERBOARD_RANK_CHANGE_CURRENT_USER", @@ -10412,6 +10204,7 @@ "1GX6P/": "LEAVE_SERVER_TITLE", "fa/84m": "LEAVE_THREAD", "jEqEhy": "LEAVE_VIDEO_OFF", + "l0CjbZ": "LEAVING_SOON", "TZ2hZH": "LEGACY_CHAT_INPUT", "Q7wgHc": "LEGACY_CHAT_INPUT_DESCRIPTION", "VdzwlA": "LEGACY_CHAT_INPUT_SLASH_COMMAND_EXPLANATION_MODAL_BUTTON_CTA", @@ -10447,8 +10240,6 @@ "5oIOLX": "LINK_OPTIONS", "Yx4IiC": "LINK_SETTINGS", "Ynxlhm": "LINK_YOUR_DISCORD_ACCOUNT", - "/lFHJn": "LINK_YOUR_XBOX_ACCOUNT_1", - "1gfPiv": "LINK_YOUR_XBOX_ACCOUNT_2", "tcawo3": "LINUX", "+v2pN2": "LISTENING_COUNT", "Vnuxue": "LISTENING_TO", @@ -10471,7 +10262,6 @@ "enCV6b": "LOADING_KEYBIND_TIP_8", "7Y1hFH": "LOADING_LINE_1", "KCmze1": "LOADING_LINE_10", - "C+hUcx": "LOADING_LINE_11", "I98MEE": "LOADING_LINE_12", "c0YCIx": "LOADING_LINE_13", "z8AvIN": "LOADING_LINE_14", @@ -10520,51 +10310,21 @@ "tWEtJl": "LOCALE_SELECTOR_TITLE", "dcK4Ch": "LOCALE_SUBTITLE", "1NOh1y": "LOCALE_TITLE", - "5kvQM5": "LOCALIZED_PRICING_BANNER_BODY_EXISTING_CURRENCY", - "4cHbQz": "LOCALIZED_PRICING_BANNER_BODY_NEW_CURRENCY", - "BrYPGn": "LOCALIZED_PRICING_BANNER_BODY_NEW_CURRENCY_WITH_AMBIGUOUS_SYMBOL", - "xnD0NZ": "LOCALIZED_PRICING_BANNER_BODY_WITHOUT_PRICE", - "BuFSar": "LOCALIZED_PRICING_BANNER_HEADER", - "XufWPt": "LOCALIZED_PRICING_BANNER_LINK_ONLY", - "N1xw/Y": "LOCALIZED_PRICING_BANNER_NO_LOWERED_PRICE", - "o60rUP": "LOCALIZED_PRICING_BANNER_NO_LOWERED_PRICE_SINGLE_STRING", - "YDdBe4": "LOCALIZED_PRICING_BANNER_SUB_NOTIF", - "8rM+To": "LOCALIZED_PRICING_GENERALIZED_PAYMENT_METHODS_PROMO", "9hnZoK": "LOCALIZED_PRICING_HRK_EURO_WARNING", - "M4FYRC": "LOCALIZED_PRICING_LEGACY_PRICING_BOOST_WARNING", - "MIY5dl": "LOCALIZED_PRICING_LEGACY_PRICING_WARNING", - "jwAcUD": "LOCALIZED_PRICING_LEGACY_PRICING_WARNING_NO_HELP_CENTER_LINK", - "jFY5lF": "LOCALIZED_PRICING_MOBILE_PRICE_CHANGE_NOTICE_HAS_SUB", - "58fjlZ": "LOCALIZED_PRICING_MOBILE_PRICE_CHANGE_NOTICE_HAS_SUB_AU", - "SKxUmb": "LOCALIZED_PRICING_MOBILE_PRICE_CHANGE_NOTICE_NO_SUB", - "olIY4h": "LOCALIZED_PRICING_MOBILE_PRICE_CHANGE_NOTICE_NO_SUB_AU", - "Tp5NkT": "LOCALIZED_PRICING_MORE_NEW_WAYS_TO_PAY", - "RJ4935": "LOCALIZED_PRICING_NOTICE", - "+5bXba": "LOCALIZED_PRICING_NOTICE_GENERALIZED_PAYMENT_METHODS_PROMO", - "0jblPl": "LOCALIZED_PRICING_NOTICE_NO_LOWERED_PRICE", "oZBduD": "LOCALIZED_PRICING_ON_CHANGE_PAYMENT_METHOD", - "QqRQPs": "LOCALIZED_PRICING_PAYMENT_METHODS_PROMO", - "hCpzie": "LOCALIZED_PRICING_PLN_LEGACY_PRICING_BOOST_WARNING", - "mTFLPD": "LOCALIZED_PRICING_PLN_LEGACY_PRICING_WARNING", - "0MAev8": "LOCALIZED_PRICING_PLN_LEGACY_PRICING_WARNING_NO_HELP_CENTER_LINK", - "9rb4Wz": "LOCALIZED_PRICING_TRY_LEGACY_PRICING_BOOST_WARNING", - "SQ4LyV": "LOCALIZED_PRICING_TRY_LEGACY_PRICING_WARNING", - "p2CqUj": "LOCALIZED_PRICING_TRY_LEGACY_PRICING_WARNING_NO_HELP_CENTER_LINK", "Q8Uzof": "LOCAL_MUTED", "hrDBa+": "LOCAL_PUSH_NOTIFICATION_GUILD_VERIFICATION_BODY", "iYQlwv": "LOCAL_PUSH_NOTIFICATION_SCREENSHARE_NOT_SUPPORTED", "PXMZ/+": "LOCAL_VIDEO_DISABLED", "Ur/0Na": "LOCK_FORUM_POST", "HoCqm8": "LOCK_THREAD", - "gbOKxn": "LOGGED_OUT_DISCOVERY_FIND_GAMING_GUILD_CTA", - "a2lbLr": "LOGGED_OUT_DISCOVERY_FIND_GAMING_GUILD_HEADER", - "/B+X5Q": "LOGGED_OUT_DISCOVERY_FIND_GAMING_GUILD_SUBHEADER", - "PrDDkp": "LOGGED_OUT_DISCOVERY_MOBILE_CTA", "HAkXzo": "LOGIN", "Cbl5JK": "LOGIN_AS", + "ayvCBh": "LOGIN_INCORRECT", "qHWea4": "LOGIN_REQUIRED", "5WuB9r": "LOGIN_STAGE", "7fNJgA": "LOGIN_TITLE", + "EiwJkN": "LOGIN_WITH_PASSKEY", "UPiHaL": "LOGIN_WITH_QR", "Qq+A6i": "LOGIN_WITH_QR_DESCRIPTION", "qxNX89": "LOGIN_WITH_QR_ERROR_SUBTITLE", @@ -10572,6 +10332,8 @@ "BUGkVF": "LOGIN_WITH_QR_LOADING_LABEL", "2jxGer": "LOGOUT", "V0Y8NJ": "LOG_IN_WITH_APP", + "4tLS33": "LOW_PERFORMANCE_MODE", + "HJ8uTI": "LOW_PERFORMANCE_MODE_DESCRIPTION", "XJYv/d": "LOW_QUALITY_IMAGE_MODE", "qRJFKF": "LOW_QUALITY_IMAGE_MODE_HELP", "RLch70": "LURKER_MODE_CHAT_INPUT_BUTTON", @@ -10593,6 +10355,7 @@ "E4u4n5": "MACOS", "q8VPLo": "MACOS_DEPRECATED_WARNING", "X9izyR": "MAGENTA", + "2p07FR": "MAIN_PROFILE", "nF0dYJ": "MAIN_TAB_FEEDBACK_ISSUE_SECTION_HEADER", "ijHjeY": "MAIN_TAB_FEEDBACK_OPTION_BUG", "E7Dg31": "MAIN_TAB_FEEDBACK_OPTION_CRASH", @@ -10635,12 +10398,14 @@ "XtjRuJ": "MANAGE_ROLES_DESCRIPTION", "QZRcfO": "MANAGE_SERVER", "LLBPpW": "MANAGE_SERVER_DESCRIPTION", + "IuSJT8": "MANAGE_SERVER_INTEGRATION", "kEqgr7": "MANAGE_THREADS", "QKe7Q3": "MANAGE_THREADS_AND_FORUM_POSTS", "lcXOAE": "MANAGE_USER", "HxrBOZ": "MANAGE_USER_SHORTHAND", "/ADKmM": "MANAGE_WEBHOOKS", "RSghT/": "MANAGE_WEBHOOKS_DESCRIPTION", + "V8ruvz": "MANAGE_YOUR_AUTHORIZED_APP", "NbhSI7": "MANUALLY_UNVERIFY_MEMBER", "6QlTeK": "MANUALLY_VERIFY_MEMBER", "M3tKAP": "MARKED_AS_READ", @@ -10671,10 +10436,12 @@ "Rj1Qys": "MARKETING_PAGE_COMPARISON_TABLE_EARLY_ACCESS", "PBUrx/": "MARKETING_PAGE_COMPARISON_TABLE_ENTRANCE_SOUNDS", "6vAhwn": "MARKETING_PAGE_COMPARISON_TABLE_ENTRANCE_SOUNDS_V2", + "u/NJKc": "MARKETING_PAGE_COMPARISON_TABLE_LARGER_FILE_UPLOADS", "aMqOdS": "MARKETING_PAGE_COMPARISON_TABLE_NO_LIMIT_ALL_FUN_SECTION_V2", "kpMomJ": "MARKETING_PAGE_COMPARISON_TABLE_PROFILE_THEMES_V2", "0VzPiw": "MARKETING_PAGE_COMPARISON_TABLE_SERVER_PROFILES_V2", "Ij3Zmv": "MARKETING_PAGE_COMPARISON_TABLE_SHOW_OFF_YOUR_STYLE_SECTION_V2", + "2RxrlE": "MARKETING_PAGE_COMPARISON_TABLE_VOICE_FILTERS", "2pECgi": "MARKETING_PAGE_COMPARISON_TABLE_YOUR_SPACE_SECTION_V2", "ncnV/3": "MARKETING_PAGE_CTA_BUY_NOW", "RGKlM0": "MARKETING_PAGE_CTA_GET_BASIC", @@ -10805,7 +10572,6 @@ "Kt4gZ6": "MEDIA_VIEWER_CTA_ZOOM_IN", "vOFof8": "MEDIA_VIEWER_CTA_ZOOM_OUT", "AMTX3j": "MEDIA_VIEWER_MODAL_ALT_TEXT", - "ujGN9Q": "MEDIA_VIEWER_REACTION_LABEL", "u1sEfz": "MEMBER", "9Oq93m": "MEMBERS", "CxSA5N": "MEMBERS_HEADER", @@ -10856,7 +10622,6 @@ "NXBtjF": "MEMBER_LIST_CONTENT_FEED_RESURRECTED_AFTER", "Klie/P": "MEMBER_LIST_CONTENT_FEED_STREAK_DAYS", "PwMe0s": "MEMBER_LIST_CONTENT_FEED_STREAK_TOOLTIP", - "l5PP/2": "MEMBER_LIST_CONTENT_FEED_TIMESTAMP_ACTIVE", "KkvKhi": "MEMBER_LIST_CONTENT_FEED_TIMESTAMP_DAYS_AGO", "Lru1rV": "MEMBER_LIST_CONTENT_FEED_TIMESTAMP_DAYS_AGO_A11Y", "D0cpo3": "MEMBER_LIST_CONTENT_FEED_TIMESTAMP_FOR_DAYS", @@ -11008,15 +10773,22 @@ "DyARHe": "MEMBER_VERIFICATION_ADD_QUESTIONS_DESCRIPTION", "Cq5JuR": "MEMBER_VERIFICATION_ADD_RULE", "2xbmoG": "MEMBER_VERIFICATION_AGREED_TO_RULES", + "Sqn+Wh": "MEMBER_VERIFICATION_ANSWER_PLACEHOLDER", + "0YV0YE": "MEMBER_VERIFICATION_APPLICATION_COACHMARK_TITLE", + "0UQVDL": "MEMBER_VERIFICATION_APPLICATION_COACHMARK_BODY", + "4r+amb": "MEMBER_VERIFICATION_APPLICATION_COACHMARK_CTA", "FdsK4h": "MEMBER_VERIFICATION_APPLICATION_CONFIRMATION_SUBTITLE", "5iLvSx": "MEMBER_VERIFICATION_APPLICATION_CONFIRMATION_TITLE", "0Qlu/6": "MEMBER_VERIFICATION_APPLICATION_CONFIRMATION_TITLE_WITH_GUILD_NAME", + "2eayRE": "MEMBER_VERIFICATION_APPLICATION_PLACEHOLDER", + "0sTyEb": "MEMBER_VERIFICATION_APPLICATION_INCOMPLETE_TITLE", "I1LYVk": "MEMBER_VERIFICATION_APPLICATION_REAPPLY", "bFPqMm": "MEMBER_VERIFICATION_APPLICATION_REJECTED_ICON", "1L1LCW": "MEMBER_VERIFICATION_APPLICATION_REJECTED_NOTICE_TITLE", "cf1psW": "MEMBER_VERIFICATION_APPLICATION_REJECTED_REASON", "gBPcuP": "MEMBER_VERIFICATION_APPLICATION_REJECTED_TITLE", "P+/gzA": "MEMBER_VERIFICATION_APPLICATION_REJECTED_TITLE_WITH_GUILD_NAME", + "g9tK0o": "MEMBER_VERIFICATION_APPLICATION_WITHDRAW", "NuzmOA": "MEMBER_VERIFICATION_APPROVED_APPLICATION_MODAL_CONFIRM", "nwpqyc": "MEMBER_VERIFICATION_APPROVED_APPLICATION_MODAL_DESC", "z9qozJ": "MEMBER_VERIFICATION_APPROVED_APPLICATION_MODAL_TITLE", @@ -11041,6 +10813,7 @@ "bx4Ewb": "MEMBER_VERIFICATION_DISABLE_CONFIRM_BODY", "SmjogN": "MEMBER_VERIFICATION_DISABLE_CONFIRM_KICK_ALL", "bs+W8E": "MEMBER_VERIFICATION_DISABLE_CONFIRM_TITLE", + "OQFlFD": "MEMBER_VERIFICATION_DISCARD_APPLICATION", "/Hw5ad": "MEMBER_VERIFICATION_EMAIL_CONFIRMATION_SUBTITLE", "v01XgL": "MEMBER_VERIFICATION_EMAIL_CONFIRMATION_TITLE", "MLk/mK": "MEMBER_VERIFICATION_EMAIL_RESEND", @@ -11070,7 +10843,6 @@ "v2z4c1": "MEMBER_VERIFICATION_FORM_PASSED_REQUIREMENTS", "1gklkn": "MEMBER_VERIFICATION_FORM_REQUIRED_ITEM", "9suSIA": "MEMBER_VERIFICATION_FORM_RULES_LABEL", - "323362": "MEMBER_VERIFICATION_FORM_VERIFICATION_SETTINGS", "5AelkX": "MEMBER_VERIFICATION_GET_STARTED_BUTTON", "3+rPki": "MEMBER_VERIFICATION_GET_STARTED_DESCRIPTION", "DPGebR": "MEMBER_VERIFICATION_GET_STARTED_SUBTITLE", @@ -11078,9 +10850,6 @@ "OpV87U": "MEMBER_VERIFICATION_GUILD_VERIFICATION_LEVEL", "fcDrN4": "MEMBER_VERIFICATION_ICON_DESC", "8RrsHr": "MEMBER_VERIFICATION_LEARN_MORE", - "TDi/ct": "MEMBER_VERIFICATION_LEAVE_APPLICATION_COMPLETE_LATER", - "DeDPr4": "MEMBER_VERIFICATION_LEAVE_APPLICATION_DESC", - "lhVad+": "MEMBER_VERIFICATION_LEAVE_APPLICATION_TITLE", "U3Dieb": "MEMBER_VERIFICATION_MANUAL", "PuCkTY": "MEMBER_VERIFICATION_MEMBER_APPLICATION", "tcvVXM": "MEMBER_VERIFICATION_MEMBER_APPLICATIONS", @@ -11101,6 +10870,7 @@ "Oj3M6w": "MEMBER_VERIFICATION_NUM_ONLINE", "knnkv0": "MEMBER_VERIFICATION_OFF", "pqqixk": "MEMBER_VERIFICATION_ON", + "h3aGmv": "MEMBER_VERIFICATION_OPEN_APPLICATION", "jnhD0S": "MEMBER_VERIFICATION_OTHER_RULES", "AiNSTz": "MEMBER_VERIFICATION_PENDING_APPLICATION_CANCEL_MODAL_TITLE", "SXZrB7": "MEMBER_VERIFICATION_PENDING_APPLICATION_ICON", @@ -11110,7 +10880,6 @@ "f293OM": "MEMBER_VERIFICATION_PENDING_APPLICATION_MODAL_CONFIRM", "SRM/e/": "MEMBER_VERIFICATION_PENDING_APPLICATION_MODAL_DESC", "bANR0R": "MEMBER_VERIFICATION_PENDING_APPLICATION_MODAL_DISMISS", - "Ip58Kh": "MEMBER_VERIFICATION_PENDING_APPLICATION_MODAL_LEAVE", "rpFCLs": "MEMBER_VERIFICATION_PENDING_APPLICATION_MODAL_REAPPLY", "A0f0P7": "MEMBER_VERIFICATION_PENDING_APPLICATION_MODAL_REAPPLY_COOLDOWN", "zhfXbs": "MEMBER_VERIFICATION_PENDING_APPLICATION_MODAL_TITLE", @@ -11138,6 +10907,7 @@ "0K5NJt": "MEMBER_VERIFICATION_RULE_SAFE", "HolIDy": "MEMBER_VERIFICATION_RULE_SAFE_FULL", "UKtBpC": "MEMBER_VERIFICATION_RULE_TOOLTIP", + "jDV3i6": "MEMBER_VERIFICATION_USERS_APPLICATION", "mGlP30": "MEMBER_VERIFICATION_VERIFICATION_FIELD_SETTINGS_TOOLTIP", "VoB8Oc": "MEMBER_VERIFICATION_VERIFICATION_ICON", "Li1pYI": "MEMBER_VERIFICATION_VERIFIED", @@ -11170,6 +10940,7 @@ "iX9SFD": "MENTION_HERE_AUTOCOMPLETE_DESCRIPTION_MOBILE", "nCN+3B": "MENTION_HERE_AUTOCOMPLETE_DESCRIPTION_THREADS", "HrUmDH": "MENTION_ROLE_AUTOCOMPLETE_DESCRIPTION_MOBILE", + "cpmP4L": "MENTION_SUGGESTIONS", "+xsVS6": "MENTION_USER", "/91tbr": "MENTION_USERS_WITH_ROLE", "sMEktT": "MERCHANDISE", @@ -11205,6 +10976,7 @@ "Wr4RIX": "MESSAGE_CHANNEL_EMBEDS_DISABLED", "0Yyrua": "MESSAGE_CHANNEL_EXTERNAL_STICKERS_DISABLED", "quj4DY": "MESSAGE_CHANNEL_VOICE_MESSAGES_DISABLED", + "IqqJNI": "MESSAGE_DETAILS", "ZEoGMd": "MESSAGE_DISPLAY_MODE_LABEL", "C8sXIM": "MESSAGE_EDITED", "CDzOFd": "MESSAGE_EDITED_TIMESTAMP_A11Y_LABEL", @@ -11353,7 +11125,6 @@ "LfCBZG": "MFA_SMS_DISABLED_NO_EMAIL", "Sq6Q1u": "MFA_SMS_DISABLED_PARTNER", "DZQe23": "MFA_SMS_ENABLE", - "pQioM5": "MFA_SMS_ENABLE_SHOULD_DO", "FfltIN": "MFA_SMS_PHONE_NUMBER_HIDE", "llArAg": "MFA_SMS_PHONE_NUMBER_REVEAL", "XnzdTe": "MFA_SMS_RECEIVE_CODE", @@ -11386,6 +11157,7 @@ "bmQU//": "MINIMUM_LENGTH", "62rk1K": "MINIMUM_LENGTH_ERROR", "AH4c7Y": "MINIMUM_SIZE", + "Gv6kP/": "MINUTES", "2CnhoI": "MISSED_CALL", "MM/7qx": "MISSING_ENTITLEMENT_MODAL_BODY", "IfQUx+": "MISSING_ENTITLEMENT_MODAL_BODY_UNKNOWN_APPLICATION", @@ -11431,6 +11203,7 @@ "f+8Dqt": "MOBILE_NOISE_CANCELLATION_FAILED", "ChUi9n": "MOBILE_NOISE_CANCELLATION_POPOUT_DESCRIPTION", "5iqgHe": "MOBILE_NOISE_CANCELLATION_POPOUT_TITLE", + "8rHeOr": "MOBILE_NOTIFICATION_DELAY", "VaD05h": "MOBILE_OUTBOUND_PROMOTION_CARD_CLAIMED_BODY", "/XWgfG": "MOBILE_OUTBOUND_PROMOTION_CARD_UNCLAIMED_BODY", "eleYb7": "MOBILE_REPLYING_TO", @@ -11485,6 +11258,7 @@ "MvfowF": "MORE_APPLICATION_SUBSCRIPTION_EXPIRATION_CHANNEL_NOTICE_CONTENT", "O1kYRQ": "MORE_DETAILS", "PdRCRg": "MORE_OPTIONS", + "FTLzdR": "MORE_SETTINGS", "o/oRJB": "MOST_POPULAR", "OqccVl": "MOVE_FROM_CATEGORY_TO", "YtjJPQ": "MOVE_MEMBERS", @@ -11494,6 +11268,7 @@ "z2RSv0": "MOVE_TO_SUCCESS", "LMOYUT": "MULTIPLE_ACTIVITIES_IN_CHANNEL", "uIKPiP": "MULTIPLE_GAMES_IN_CHANNEL", + "qD/0qZ": "MULTIPLE_USERS_TYPING_STRONG", "3eRBfB": "MULTI_ACCOUNT_ANNOUNCEMENT_SUBTITLE", "1c2QP7": "MULTI_ACCOUNT_ANNOUNCEMENT_TOOLTIP_TITLE", "wY4y0R": "MULTI_ACCOUNT_CHANGE_ACCOUNT_A11Y_HINT", @@ -11594,6 +11369,7 @@ "qr9dEP": "NEWS_CHANNEL_TYPE", "qTtUJZ": "NEW_ADDITIONS", "1rNDdX": "NEW_ARRIVALS", + "PsL3bW": "NEW_COLORS", "UJ9ksz": "NEW_DM", "O5R3hr": "NEW_DROP", "s0V7SV": "NEW_EVENT", @@ -11682,17 +11458,7 @@ "dT2wrl": "NITRODUCTION_ONBOARDING_HEADING_PROFILE_CUSTOMIZATION_BANNER", "bnymoA": "NITRODUCTION_ONBOARDING_HEADING_PROFILE_CUSTOMIZATION_GUILD_PROFILES", "whjsTd": "NITRODUCTION_ONBOARDING_HEADING_PROFILE_CUSTOMIZATION_THEME", - "TWxqHq": "NITROWEEN_DESKTOP_BILLING_SETTINGS_SUBTITLE", - "IelGKw": "NITROWEEN_DESKTOP_GIFT_CONFIRMATION_TITLE_MONTH", - "gausuY": "NITROWEEN_DESKTOP_GIFT_CONFIRMATION_TITLE_YEAR", - "DPwt6B": "NITROWEEN_DESKTOP_GIFT_PLAN_SELECT_DESCRIPTION", - "5vzYv/": "NITROWEEN_DESKTOP_GIFT_PURCHASE_DESCRIPTION", - "rX/m/d": "NITROWEEN_DESKTOP_GIFT_PURCHASE_PLACEHOLDER", "kMYVwv": "NITROWEEN_GIFT_CONFIRMATION_CTA", - "BIBwbh": "NITROWEEN_GIFT_UPSELL_DESCRIPTION", - "YMI+UX": "NITROWEEN_GIFT_UPSELL_TITLE", - "J88y6C": "NITROWEEN_MOBILE_GIFT_PLAN_SELECT_DESCRIPTION", - "W0CSx5": "NITROWEEN_MOBILE_GIFT_PURCHASE_DESCRIPTION", "HaVk0X": "NITRO_AFFINITY_UPSELL", "OS9KPu": "NITRO_BADGE_TEXT", "S5TykJ": "NITRO_CHURN_SURVEY_ANSWER_CHOICE_CANT_AFFORD", @@ -11757,8 +11523,6 @@ "B9eJyW": "NITRO_HOME_REWARDING_TENURE_UNLOCKED_AVATAR_DECO_ACTION", "3R9pPE": "NITRO_HOME_REWARDING_TENURE_UNLOCKED_TITLE", "LTaxu9": "NITRO_HOME_SHOW_UP_HOW_YOU_WANT", - "bXwK8d": "NITRO_HOME_SHY_PROJECT_SUBTITLE", - "S4AYvm": "NITRO_HOME_SHY_PROJECT_TITLE", "H4/NBN": "NITRO_HOME_SPECIAL_PRICING", "wo3D3T": "NITRO_HOME_SPECIAL_PRICING_DESCRIPTION", "4WgB/4": "NITRO_HOME_STREAM_UP_TO_4K", @@ -11827,11 +11591,7 @@ "pHj+z4": "NOTICE_DISPATCH_INSTALL_SCRIPT_PROGRESS_WITH_NAME", "1qxVe4": "NOTICE_EMBEDDED_APPLICATION_TEST_MODE", "2klD0Z": "NOTICE_ENABLE_PUBLIC_GUILD_UPSELL_MESSAGE", - "HcErZT": "NOTICE_H264_DISABLED_SETTINGS", - "51hI/g": "NOTICE_H264_DISABLED_SETTINGS_LINK_TEXT", "qoDex7": "NOTICE_HARDWARE_MUTE", - "B2hnhV": "NOTICE_MFA_SMS_BACKUP", - "50KYxi": "NOTICE_MFA_SMS_BACKUP_BUTTON", "+xn1o5": "NOTICE_NATIVE_APPS_2020_06", "dBFL/6": "NOTICE_NITRO_PRICE_CHANGED", "nCO9bI": "NOTICE_NO_INPUT_DETECTED", @@ -11951,6 +11711,7 @@ "RpQgm5": "NOTIFICATION_SETTINGS_PRESETS_UNREAD_SUBTITLE", "Tqd1Af": "NOTIFICATION_SETTINGS_PRESETS_UNREAD_TITLE", "ztO+l+": "NOTIFICATION_SETTINGS_USE_PRESET", + "LweOYy": "NOTIFICATION_SOUNDS", "VSgOVg": "NOTIFICATION_TITLE_DISCORD", "XoTWsI": "NOTIFICATION_TITLE_START_GAME", "hufwDu": "NOTIF_CENTER_ACTIVE_NOW", @@ -11969,49 +11730,6 @@ "GuUH7/": "NOTIF_CENTER_V2_SEND_MESSAGE", "vBq3iT": "NOTIF_CENTER_V2_SEND_REPLY", "zMRcWL": "NOTIF_CENTER_V2_UPDATE_AVATAR", - "nlpqxJ": "NOTIF_MIGRATION_BACKUP", - "izeB6V": "NOTIF_MIGRATION_CUSTOMIZE_SECTION1_SUBTITLE", - "f6pf36": "NOTIF_MIGRATION_CUSTOMIZE_SECTION1_TITLE", - "e+d/vn": "NOTIF_MIGRATION_CUSTOMIZE_SECTION2_SUBTITLE", - "tGGAdR": "NOTIF_MIGRATION_CUSTOMIZE_SECTION2_TITLE", - "zE9e/9": "NOTIF_MIGRATION_CUSTOMIZE_SUB_TITLE", - "56vYWZ": "NOTIF_MIGRATION_CUSTOMIZE_TAB", - "zBC2+b": "NOTIF_MIGRATION_CUSTOMIZE_TITLE", - "mCjLAR": "NOTIF_MIGRATION_ERROR", - "fgedbB": "NOTIF_MIGRATION_GUILD_TOOLTIP_ALITTLE", - "6dgvsf": "NOTIF_MIGRATION_GUILD_TOOLTIP_ALOT", - "3EQSoP": "NOTIF_MIGRATION_GUILD_TOOLTIP_BUSY", - "rdTrH7": "NOTIF_MIGRATION_GUILD_TOOLTIP_MUTED", - "sdFUj1": "NOTIF_MIGRATION_GUILD_TOOLTIP_NOT_MUTED", - "CaR/Et": "NOTIF_MIGRATION_GUILD_TOOLTIP_QUIET", - "R8eSY9": "NOTIF_MIGRATION_INTRO_AFTER", - "sLv7LF": "NOTIF_MIGRATION_INTRO_BEFORE", - "WFejRi": "NOTIF_MIGRATION_INTRO_CHANNEL_1", - "jqWm9Z": "NOTIF_MIGRATION_INTRO_CHANNEL_2", - "p9z9Iw": "NOTIF_MIGRATION_INTRO_CHANNEL_3", - "2bdWD/": "NOTIF_MIGRATION_INTRO_CHANNEL_4", - "Ci+Ouh": "NOTIF_MIGRATION_INTRO_CHANNEL_5", - "/7TEdh": "NOTIF_MIGRATION_INTRO_CHANNEL_6", - "Ime/t8": "NOTIF_MIGRATION_INTRO_CHANNEL_7", - "dKPfBe": "NOTIF_MIGRATION_INTRO_SUB_TITLE", - "JwwVrl": "NOTIF_MIGRATION_INTRO_TAB", - "eZb3iS": "NOTIF_MIGRATION_INTRO_TIP_AFTER1", - "M3KrJV": "NOTIF_MIGRATION_INTRO_TIP_AFTER2", - "WrPMOJ": "NOTIF_MIGRATION_INTRO_TIP_BEFORE1", - "pApL75": "NOTIF_MIGRATION_INTRO_TIP_BEFORE2", - "c0FhpS": "NOTIF_MIGRATION_INTRO_TITLE", - "Rm96Ty": "NOTIF_MIGRATION_SETTINGS_CONFIRM_ACTION", - "7zTJJQ": "NOTIF_MIGRATION_SETTINGS_CONFIRM_BODY", - "frbLrH": "NOTIF_MIGRATION_SETTINGS_SUBTITLE", - "z21l8M": "NOTIF_MIGRATION_SETTINGS_TITLE", - "jr/rn6": "NOTIF_MIGRATION_TIPS_SUB_TITLE", - "0l0rJj": "NOTIF_MIGRATION_TIPS_TAB", - "pS4WEr": "NOTIF_MIGRATION_TIPS_TAB1", - "C//fO+": "NOTIF_MIGRATION_TIPS_TAB1_TIP2", - "UVxi0U": "NOTIF_MIGRATION_TIPS_TAB2", - "5Il5fq": "NOTIF_MIGRATION_TIPS_TAB2_TIP1", - "+ROcro": "NOTIF_MIGRATION_TIPS_TAB2_TIP2", - "Wyk03p": "NOTIF_MIGRATION_TIPS_TITLE", "jHpxwo": "NOT_AVAILABLE", "l4qZrp": "NOT_INCLUDED", "L5eIZ2": "NOT_NOW", @@ -12034,6 +11752,7 @@ "SpxYoT": "NO_EMOJI_BODY", "IxxiKF": "NO_EMOJI_SEARCH_RESULTS", "lxsmBd": "NO_EMOJI_TITLE", + "5eYZiW": "NO_GAMES", "5u99Xb": "NO_GIF_FAVORITES_FLAVOR_FAVORITE_PLEASE", "o6CLL4": "NO_GIF_FAVORITES_FLAVOR_STILL_HERE", "MeP0SF": "NO_GIF_FAVORITES_GO_FAVORITE", @@ -12068,6 +11787,7 @@ "Xe+fJM": "NO_RESULTS_FOUND", "PpfzUE": "NO_SCREENSHARE_PERMISSION_DIALOG_BODY", "/x4knx": "NO_SCREENSHARE_PERMISSION_DIALOG_TITLE", + "J6sMqT": "NO_SEARCH_RESULTS_FOUND", "TTzyzW": "NO_SELECT_PHOTO_ACCESS", "IYKTTc": "NO_SEND_MESSAGES_PERMISSION_PLACEHOLDER", "ZhoSBI": "NO_SOUNDS", @@ -12172,18 +11892,6 @@ "06syeU": "NUX_POST_REG_JOIN_SERVER_TITLE", "Gf7U1T": "NUX_REDESIGN_NOTIFICATION_BODY", "3nx0b5": "NUX_REDESIGN_NOTIFICATION_TITLE", - "SURFMd": "NUX_SAMSUNG_GAME_PRESENCE_LINK_DESCRIPTION", - "J/ULNd": "NUX_SAMSUNG_GAME_PRESENCE_LINK_ENABLE", - "0XJ02e": "NUX_SAMSUNG_GAME_PRESENCE_LINK_TITLE", - "dbQxRw": "NUX_VALUE_PROPS_CAMERA_CARD_TITLE", - "3wC7eA": "NUX_VALUE_PROPS_CHAT_CARD_TITLE", - "GG2T6g": "NUX_VALUE_PROPS_HEADER_TITLE", - "FxpjsB": "NUX_VALUE_PROPS_NEXT_BUTTON", - "1BryeC": "NUX_VALUE_PROPS_SERVERS_2_CARD_TITLE", - "1K/IWy": "NUX_VALUE_PROPS_SERVERS_CARD_TITLE", - "MbhY+t": "NUX_VALUE_PROPS_SUBTITLE", - "qjXn0M": "NUX_VALUE_PROPS_VOICE_CARD_TITLE", - "S2fS/h": "NUX_VALUE_PROPS_WELCOME_CARD_TITLE", "eGjmy5": "N_DAYS", "1DXFFd": "OAUTH2_ADD_TO_GUILD", "t9Jm9o": "OAUTH2_ADD_TO_GUILD_DESCRIPTION", @@ -12224,7 +11932,6 @@ "BwwiSM": "OAUTH2_MISSED_FIELDS", "0cCDKP": "OAUTH2_OPEN_APP_CTA", "jFbDnJ": "OAUTH2_REQUESTS_ACCOUNT_ACCESS", - "7xlX6S": "OAUTH2_REQUESTS_PRIVATE_CHANNEL_INTEGRATION", "hQIQE+": "OAUTH2_REQUEST_INVALID_SCOPE", "RNeJI5": "OAUTH2_REQUEST_MISSING_PARAM", "1Hz+Sl": "OAUTH2_SCOPES_LABEL", @@ -12386,7 +12093,10 @@ "wuRE8M": "OPEN_LINK", "Fs9k3K": "OPEN_NAVIGATION", "SO93uu": "OPEN_ORIGIANL_IMAGE_BUTTON_A11Y_DESCRIPTION", + "7P/+qz": "OPEN_QUICK_SWITCHER", + "3/IlR0": "OPEN_SETTINGS", "cSgdvE": "OPEN_USER_PROFILE_A11Y_HINT", + "zdWNET": "OPTIONAL", "U19GM3": "OPTIONAL_APPLICATION_COMMAND_INDICATOR", "+1H47t": "OPTIONS", "pg0anB": "OPTIONS_MATCHING", @@ -12405,6 +12115,10 @@ "7zt9hQ": "OPT_IN_NUX_VOICE_TITLE", "HEuagM": "OR", "UmsfHL": "ORANGE", + "2+N6IR": "ORBS_EXCLUSIVES_PAGE", + "qQq91l": "ORBS_LEARN_MORE", + "fG3RIg": "ORBS_SHOP", + "qQR4tn": "ORBS_QUESTS", "bhrgkA": "ORIGINALLY_KNOWN_AS", "Wnhd3q": "OS_MIN_SCREENSHARE_DIALOG_BODY", "oblMYa": "OS_MIN_SCREENSHARE_DIALOG_TITLE", @@ -12450,10 +12164,8 @@ "JYzIWe": "OVERLAY_MENU_GET_INVITE", "G/Ez6p": "OVERLAY_MENU_OPEN_DISCORD", "zJvWqU": "OVERLAY_MENU_SWITCH_CHANNELS", - "tyAj1I": "OVERLAY_MOBILE_REQUIRED", "Wfoivk": "OVERLAY_MOBILE_TOGGLE_DESC", "9CSZJm": "OVERLAY_MOBILE_TOGGLE_LABEL", - "835B8B": "OVERLAY_MOBILE_UNAUTHED", "z9znpa": "OVERLAY_NEWS_GO_LIVE_BODY", "U76Ft2": "OVERLAY_NEWS_GO_LIVE_CTA", "ovWFnD": "OVERLAY_NOTIFICATIONS_BOTTOM_LEFT", @@ -12739,6 +12451,7 @@ "RMpwZu": "PIN_CHANNEL_TO_TOP", "rOQ5BX": "PIN_CONFIRM", "CvQ18w": "PIN_MESSAGE", + "Y5BI39": "PIN_MESSAGES", "3IRluI": "PIN_MESSAGE_BODY", "WG5dyo": "PIN_MESSAGE_BODY_MOBILE", "hMRngA": "PIN_MESSAGE_BODY_PRIVATE_CHANNEL", @@ -12933,7 +12646,6 @@ "5EmuVX": "POMELO_ACTION_LABEL", "F7T4db": "POMELO_ACTION_LABEL_OCF", "pdYZyg": "POMELO_ACTION_NEEDED", - "zT1hgi": "POMELO_ACTION_NEEDED_FORCE", "Rn/sLl": "POMELO_ADD_FRIEND_DESCRIPTION", "paDJBM": "POMELO_ADD_FRIEND_ERROR", "qRaqel": "POMELO_ADD_FRIEND_PLACEHOLDER", @@ -12982,25 +12694,12 @@ "YdyDM9": "POPOUT_REMOVE_FROM_TOP", "7Dwcnj": "POPOUT_RETURN", "ZVGHwP": "POPOUT_STAY_ON_TOP", + "YdkBCH": "POST_ACCOUNT_LINK_INVITE_CTA", + "DSZUK/": "POST_ACCOUNT_LINK_INVITE_BODY", + "0l2pEt": "POST_ACCOUNT_LINK_INVITE_TITLE", "oHVeHc": "POTENTIAL_SPAM", "BMw+7I": "POWERED_BY_NITRO", "Ipxkog": "PREMIUM", - "byekh7": "PREMIUM_2024_APRIL_NITRO_OFFER_BANNER_BODY_NON_SUB", - "vjCATj": "PREMIUM_2024_APRIL_NITRO_OFFER_BANNER_BODY_UPGRADE", - "nuo6BF": "PREMIUM_2024_APRIL_NITRO_OFFER_BANNER_HEADER", - "9juoTF": "PREMIUM_2024_APRIL_NITRO_OFFER_CLAIM_DECO_MODAL_BODY", - "Vzhz9f": "PREMIUM_2024_APRIL_NITRO_OFFER_HEADER", - "Yg8upJ": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_APP_ICONS_TILE_BODY", - "WhHmpE": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_APP_ICONS_TILE_HEADER", - "i+6bj7": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_BUTTON_CTA_NON_SUB", - "wUIAMO": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_BUTTON_CTA_NON_TIER_2_SUB", - "/PFsDn": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_COLOR_THEMES_TILE_BODY", - "fsiUtD": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_COLOR_THEMES_TILE_HEADER", - "0gojNq": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_CUSTOM_PROFILE_TILE_BODY", - "5R53Rt": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_CUSTOM_PROFILE_TILE_HEADER", - "qjfkT/": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_MODAL_TOP_PILL", - "UOmZZF": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_SUBHEADER", - "t2wV0N": "PREMIUM_2024_APRIL_NITRO_OFFER_PAYMENT_FLOW_BANNER_HEADER", "qSctqV": "PREMIUM_5TH_ANNIVERSARY_BODY", "tb/S5S": "PREMIUM_5TH_ANNIVERSARY_TITLE", "Q+BB2w": "PREMIUM_ACTIVATED", @@ -13381,7 +13080,6 @@ "lKDhhJ": "PREMIUM_MARKETING_PER_GUILD_PROFILES_PERK_TITLE", "aj1pfZ": "PREMIUM_MARKETING_PER_GUILD_PROFILE_THEMES_PERK_DESCRIPTION_CHECK_IT_OUT", "d2oYS8": "PREMIUM_MARKETING_PER_GUILD_PROFILE_THEMES_PERK_DESCRIPTION_TRY_IT_OUT", - "+Hmv2k": "PREMIUM_MARKETING_PLAN_COMPARISON_REFERRAL_PROGRAM", "hJG8ZN": "PREMIUM_MARKETING_STICKER_PERK_DESCRIPTION", "FXlU24": "PREMIUM_MARKETING_STICKER_PERK_LONG_DESCRIPTION", "tzdIwI": "PREMIUM_MARKETING_STICKER_PERK_TITLE", @@ -13421,12 +13119,6 @@ "/xvEMy": "PREMIUM_MARKETING_VARIANT_2_FEATURE_CLIENT_THEMES_TITLE", "A8O/Qw": "PREMIUM_MARKETING_VIDEO_BACKGROUND_PERK_DESCRIPTION", "NaGpTf": "PREMIUM_MARKETING_VIDEO_BACKGROUND_PERK_TITLE", - "2GPNry": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_DESCRIPTION_NON_SUB", - "MCvgWv": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_DESCRIPTION_SUB", - "1QvWwh": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_SUBTITLE_NON_SUB", - "QcJ6cW": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_SUBTITLE_SUB", - "5YcGTv": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_TITLE", - "+89rAP": "PREMIUM_MARKETING_WHATS_NEW_BOXES_REFERRAL_PROGRAM_DESCRIPTION", "i/NBFD": "PREMIUM_MARKETING_WHATS_NEW_CLIPS_CTA", "X9IeN3": "PREMIUM_MARKETING_WHATS_NEW_CLIPS_DESCRIPTION_NON_SUB", "Z6v86b": "PREMIUM_MARKETING_WHATS_NEW_CLIPS_DESCRIPTION_SUB", @@ -13446,18 +13138,10 @@ "y9TxXV": "PREMIUM_MARKETING_WHATS_NEW_NITRO_NEW_APP_STYLES", "wLXSZU": "PREMIUM_MARKETING_WHATS_NEW_NON_NITRO_CUSTOM_NOTIFICATION_DESCRIPTION", "d8o6lc": "PREMIUM_MARKETING_WHATS_NEW_NON_NITRO_NEW_APP_STYLES", - "XNKnvm": "PREMIUM_MARKETING_WHATS_NEW_PROFILE_EFFECTS_DESCRIPTION_NON_SUB", - "0mUM/O": "PREMIUM_MARKETING_WHATS_NEW_PROFILE_EFFECTS_DESCRIPTION_SUB", - "eVvkD5": "PREMIUM_MARKETING_WHATS_NEW_PROFILE_EFFECTS_SUBTITLE", - "c7OKaF": "PREMIUM_MARKETING_WHATS_NEW_PROFILE_EFFECTS_TITLE", "jRPQUH": "PREMIUM_MARKETING_WHATS_NEW_REFERALL_DESCRIPTION", "2JqTF6": "PREMIUM_MARKETING_WHATS_NEW_REFERRAL_PROGRAM_DESCRIPTION", "JY0grC": "PREMIUM_MARKETING_WHATS_NEW_REFERRAL_PROGRAM_SUBTITLE", "tPY4o9": "PREMIUM_MARKETING_WHATS_NEW_REFERRAL_PROGRAM_TITLE", - "fiLtJq": "PREMIUM_MARKETING_WHATS_NEW_REMIXING_DESCRIPTION_NON_SUB", - "gdA9FI": "PREMIUM_MARKETING_WHATS_NEW_REMIXING_DESCRIPTION_SUB", - "wmbOAh": "PREMIUM_MARKETING_WHATS_NEW_REMIXING_SUBTITLE", - "H+v6ed": "PREMIUM_MARKETING_WHATS_NEW_REMIXING_TITLE", "I9TYMg": "PREMIUM_MARKETING_WHATS_NEW_SERVER_PROFILES_TITLE", "HMSHeH": "PREMIUM_MARKETING_WHATS_NEW_SERVER_PRORFILES_SUBTITLE", "xMCnqh": "PREMIUM_MARKETING_WHATS_NEW_SO_NEW_BADGE", @@ -13485,32 +13169,6 @@ "HdFLQx": "PREMIUM_MOBILE_MARKETING_COMPARISON_TABLE_ACCESSIBILITY", "qVcfa0": "PREMIUM_MOBILE_TRIAL_FREE_TRIAL_BADGE", "+FgdjP": "PREMIUM_MOBILE_TRIAL_MARKETING_PAGE_BADGE", - "R2H/Eh": "PREMIUM_NITRO_DROP_2023_AVATAR_DECO_FEATURE_HEADER", - "bphR6V": "PREMIUM_NITRO_DROP_2023_AVATAR_DECO_FEATURE_SUBHEADER", - "xZqys2": "PREMIUM_NITRO_DROP_2023_BANNER_HEADER", - "YOriev": "PREMIUM_NITRO_DROP_2023_BANNER_NON_TIER_2_SUB_SUBHEADER", - "DLR4XU": "PREMIUM_NITRO_DROP_2023_BANNER_NON_TIER_2_SUB_SUBHEADER_2", - "X8mxJm": "PREMIUM_NITRO_DROP_2023_BANNER_TIER_2_SUB_SUBHEADER", - "8k2oih": "PREMIUM_NITRO_DROP_2023_BANNER_TIER_2_SUB_SUBHEADER_2", - "nqmeZ9": "PREMIUM_NITRO_DROP_2023_CLIENT_THEMES_FEATURE_HEADER", - "o9czzi": "PREMIUM_NITRO_DROP_2023_CLIENT_THEMES_FEATURE_SUBHEADER", - "TPdd8+": "PREMIUM_NITRO_DROP_2023_HEADER", - "npVU9h": "PREMIUM_NITRO_DROP_2023_NON_SUB_BUTTON_TEXT", - "m8DH1N": "PREMIUM_NITRO_DROP_2023_NON_TIER_2_SUB_BUTTON_TEXT", - "HdWndl": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_NON_SUB_NUDGE", - "eylqmo": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_NON_TIER_2_SUB_NUDGE", - "Q/thPy": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_PROMO", - "XFhWma": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_TIER_2_NUDGE", - "KYMYyS": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_WITH_TRIAL_NUDGE", - "TbNqAM": "PREMIUM_NITRO_DROP_2023_SOUNDBOARD_FEATURE_HEADER", - "R61aF5": "PREMIUM_NITRO_DROP_2023_SOUNDBOARD_FEATURE_SUBHEADER", - "6hKrRW": "PREMIUM_NITRO_DROP_2023_SUBHEADER", - "o3Zwvh": "PREMIUM_NITRO_DROP_2023_SUPER_REACTIONS_FEATURE_HEADER", - "H5iTda": "PREMIUM_NITRO_DROP_2023_SUPER_REACTIONS_FEATURE_SUBHEADER", - "G3zQ/R": "PREMIUM_NITRO_DROP_2023_SUPER_REACTIONS_FEATURE_SUBHEADER_2", - "WWa4Bh": "PREMIUM_NITRO_DROP_2023_TERMS", - "7H++ph": "PREMIUM_NITRO_DROP_2023_TIER_2_SUB_BUTTON_TEXT", - "Rx4LEj": "PREMIUM_NITRO_DROP_2023_WITH_TRIAL_BUTTON_TEXT", "Nn0Px8": "PREMIUM_NOT_CLAIMED", "7btfmI": "PREMIUM_NOT_CLAIMED_BODY", "UZLrY1": "PREMIUM_NOT_VERIFIED", @@ -13591,12 +13249,6 @@ "E0sNsc": "PREMIUM_PROFILE_CUSTOMIZATION_UPGRADE_BODY", "UBcuto": "PREMIUM_PROFILE_CUSTOMIZATION_UPSELL_BODY", "BbsMm4": "PREMIUM_PROFILE_CUSTOMIZATION_UPSELL_HEADER", - "zK1hph": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_SIZE_TOOLTIP_CONTENT", - "KAsfPX": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_SIZE_TOOLTIP_TITLE", - "ujItEl": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_TOOLTIP_CONTENT", - "UzVPrQ": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_TOOLTIP_CTA_PRIMARY_ROLE_SETTINGS", - "KkK/aM": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_TOOLTIP_CTA_SECONDARY", - "nxtaF7": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_TOOLTIP_TITLE", "mKo7K8": "PREMIUM_PROMO_DESCRIPTION_SEARCH_TIER_UPSELL", "se13Fh": "PREMIUM_PROMO_DESCRIPTION_SEARCH_UPSELL", "wOx3E+": "PREMIUM_PROMO_DESCRIPTION_SEARCH_UPSELL_NO_BOLD", @@ -13819,7 +13471,6 @@ "AozD3Q": "PREMIUM_TIER_2_DETAILS_SUBHEADER", "DbkNFj": "PREMIUM_TIER_2_FEATURE_BOOSTS", "vlHicE": "PREMIUM_TIER_2_FEATURE_MORE", - "ky8rxb": "PREMIUM_TIER_2_FEATURE_REMIXING", "myyAEr": "PREMIUM_TIER_2_FEATURE_STREAMING", "zTk8Ul": "PREMIUM_TIER_2_FEATURE_THEMES_AND_MORE", "Z2fbpL": "PREMIUM_TIER_2_GIFT_BLURB_MOBILE", @@ -13884,10 +13535,6 @@ "WO/Qe3": "PREMIUM_TRIAL_MARKETING_TRIAL_BODY_REMAINING_DAYS", "Y3YbJP": "PREMIUM_TRIAL_MARKETING_TRIAL_BODY_REMAINING_HOURS", "duuOaC": "PREMIUM_TRIAL_MARKETING_TRIAL_BODY_REMAINING_MINUTES", - "ZsgnLK": "PREMIUM_TRIAL_MARKETING_TRIAL_CTA_DAYS", - "Y0HCVd": "PREMIUM_TRIAL_MARKETING_TRIAL_CTA_MONTHS", - "8awlzB": "PREMIUM_TRIAL_MARKETING_TRIAL_CTA_WEEKS", - "ns1zkS": "PREMIUM_TRIAL_MARKETING_TRIAL_CTA_YEARS", "6Cdzoy": "PREMIUM_TRIAL_MARKETING_TRIAL_HEADING_DAYS", "x5MgxS": "PREMIUM_TRIAL_MARKETING_TRIAL_HEADING_MONTHS", "fRNBRX": "PREMIUM_TRIAL_MARKETING_TRIAL_HEADING_WEEKS", @@ -14059,7 +13706,6 @@ "qsMfsH": "PRIVACY_AND_SAFETY_FRIEND_REQUESTS_SOURCE_MUTUAL_GUILDS", "tp/UVC": "PRIVACY_AND_SAFETY_GUILD_TAB_TITLE", "wbYDfT": "PRIVACY_AND_SAFETY_SOCIAL_PERMISSIONS_DM_SETTING_GLOBAL_NOTE", - "4ckVu6": "PRIVACY_AND_SAFETY_SOCIAL_PERMISSIONS_DM_SETTING_SERVER_NOTE", "RAQUSN": "PRIVACY_AND_SAFETY_SOCIAL_PERMISSIONS_DM_SETTING_TITLE", "Sy3qan": "PRIVACY_AND_SAFETY_SOCIAL_PERMISSIONS_MESSAGE_REQUESTS_NOTE", "3o2ojh": "PRIVACY_AND_SAFETY_SOCIAL_PERMISSIONS_MESSAGE_REQUESTS_SETTING_TITLE", @@ -14109,7 +13755,6 @@ "+OYnFQ": "PRIVATE_CHANNEL_ACCESS_INFO_ROLES_OVERFLOW", "ES4CC6": "PRIVATE_CHANNEL_ACCESS_INFO_TITLE", "li1wKf": "PRIVATE_CHANNEL_ACCESS_INFO_TITLE_WITH_COLON", - "Pe9fcU": "PRIVATE_CHANNEL_ADD_APPS", "ErpIY3": "PRIVATE_CHANNEL_ADD_MEMBERS_MODAL_NO_RESULT", "gnsna/": "PRIVATE_CHANNEL_ADD_MEMBERS_MODAL_NO_ROLES", "iezLLn": "PRIVATE_CHANNEL_ADD_MEMBERS_MODAL_PLACEHOLDER", @@ -14120,20 +13765,10 @@ "TVZdKh": "PRIVATE_CHANNEL_ADD_MEMBERS_MODAL_SEARCH_PLACEHOLDER_MOBILE", "u46sxe": "PRIVATE_CHANNEL_ADD_MEMBERS_MODAL_SKIP", "rwFx85": "PRIVATE_CHANNEL_ADD_MEMBERS_MODAL_SUBTITLE", - "VoPuAy": "PRIVATE_CHANNEL_AVAILABLE_APPS", - "vZQD/6": "PRIVATE_CHANNEL_INSTALLED_APPS", "J8SaGy": "PRIVATE_CHANNEL_INTEGRATION_ADDED", "+6V2sd": "PRIVATE_CHANNEL_INTEGRATION_ADDED_DELETED_APPLICATION", "ojysqe": "PRIVATE_CHANNEL_INTEGRATION_ADDED_DELETED_APPLICATION_MOBILE", "8r+Z+I": "PRIVATE_CHANNEL_INTEGRATION_ADDED_MOBILE", - "85QGGf": "PRIVATE_CHANNEL_INTEGRATION_ADD_MODAL_ROW_INFO", - "2O07Ev": "PRIVATE_CHANNEL_INTEGRATION_MORE_APPS_INFO", - "6hcR9x": "PRIVATE_CHANNEL_INTEGRATION_MORE_APPS_INFO_LINKED", - "Tizg0h": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_BODY", - "+59dAX": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_CANNOT_READ_MESSAGE", - "lejOxr": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_COMMAND_SUMMARY", - "JppXEi": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_LEARN_MORE", - "ChPrUp": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_TITLE", "eGCDak": "PRIVATE_CHANNEL_INTEGRATION_REMOVED", "sAX6rs": "PRIVATE_CHANNEL_INTEGRATION_REMOVED_DELETED_APPLICATION", "x2CN/Z": "PRIVATE_CHANNEL_INTEGRATION_REMOVED_DELETED_APPLICATION_MOBILE", @@ -14147,8 +13782,6 @@ "u8CWLl": "PRIVATE_CHANNEL_MEMBERS_SECTION_HEADER", "kUjWgc": "PRIVATE_CHANNEL_NOTE", "yM/8JE": "PRIVATE_CHANNEL_ROLES_ADDED_TOAST_MSG", - "nbA5Ps": "PRIVATE_CHANNEL_TRY_APPS", - "7xavVl": "PRIVATE_CHANNEL_TRY_APPS_LINKED", "ZDtA0T": "PRIVATE_TEXT_CHANNEL_CREATION_PERMISSION_MISSING_HINT", "F1zyvU": "PRIVATE_THREAD", "iZAMty": "PRIVATE_VOICE_CHANNEL_CREATION_PERMISSION_MISSING_HINT", @@ -14161,13 +13794,9 @@ "5AFxuK": "PROFILE_CUSTOMIZATION_NITRO_ICON_TOOLTIP", "Zb06yP": "PROFILE_CUSTOMIZATION_PREVIEW", "NPEUUu": "PROFILE_CUSTOMIZATION_PRONOUNS_PLACEHOLDER", - "gUPW4a": "PROFILE_EFFECT_MODAL_APPLY", - "t5SVGU": "PROFILE_EFFECT_MODAL_HEADER", - "fmIfaD": "PROFILE_EFFECT_MODAL_SHOP_PREVIEW_HEADER", "Uv4OPR": "PROFILE_HEADING_COPY_ID_A11Y_HINT", "aFywn4": "PROFILE_IN_VOICE_CALL", "9C444m": "PROFILE_JOIN_VOICE_CHANNEL", - "fJNqJt": "PROFILE_LOOKING_GOOD_TOOLTIP_TEXT", "iOqmAc": "PROFILE_OPEN_VOICE_CHANNEL", "Cxm795": "PROFILE_THEMES_TOOLTIP_DESCRIPTION_PREMIUM", "V95BHK": "PROFILE_THEMES_TOOLTIP_TITLE", @@ -14206,10 +13835,6 @@ "oElqN5": "PS5", "QjAZAQ": "PS_LINK_SUCCESS_BODY", "e6SOl0": "PS_LINK_SUCCESS_TITLE", - "Q9g0Cs": "PS_LINK_UPSELL_CONTENT", - "LWC6fe": "PS_LINK_UPSELL_CONTENT_RECONNECT", - "FKmud4": "PS_LINK_UPSELL_HEADER", - "623c8V": "PS_LINK_UPSELL_HEADER_RECONNECT", "JA1Hew": "PS_PRECONNECT_BODY", "MNmoKH": "PS_PRECONNECT_BODY_WAITING", "LDTnRv": "PS_PRECONNECT_TITLE", @@ -14250,10 +13875,6 @@ "vxM4sF": "Q4_DROP_WHATS_NEW_SPECIAL_PRICING_CARD_SUBTITLE", "opgqDZ": "Q4_DROP_WHATS_NEW_SPECIAL_PRICING_CARD_SUBTITLE_V2", "0Mykgq": "Q4_DROP_WHATS_NEW_SPECIAL_PRICING_CARD_TITLE", - "TF7cPa": "Q4_DROP_WHATS_NEW_UNLIMITED_SUPER_REACTIONS_CARD_DESCRIPTION_NON_SUB", - "Cn/z63": "Q4_DROP_WHATS_NEW_UNLIMITED_SUPER_REACTIONS_CARD_DESCRIPTION_SUB", - "Hxujsr": "Q4_DROP_WHATS_NEW_UNLIMITED_SUPER_REACTIONS_CARD_SUBTITLE", - "hpgmO+": "Q4_DROP_WHATS_NEW_UNLIMITED_SUPER_REACTIONS_CARD_TITLE", "6S318H": "QR_CODE_FAIL", "QOQlWa": "QR_CODE_FAIL_DESCRIPTION", "Unm4vn": "QR_CODE_INVALID", @@ -14275,12 +13896,11 @@ "JALI2K": "QUESTS", "kUQLMJ": "QUESTS_ACCEPT", "l7E81v": "QUESTS_ACCEPT_QUEST", - "+MW4lN": "QUESTS_ACCEPT_TOOLTIP", + "IrNgN4": "QUESTS_ACTIVITY_HAS_QUEST", "0SzXmi": "QUESTS_ALL", - "6cSPNO": "QUESTS_ANY_GAME_NOT_DETECTED", + "giYD00": "QUESTS_ALL_QUESTS_HEADING", "R7mv+G": "QUESTS_AVAILABLE_SOON", "pX+fmn": "QUESTS_AVAILABLE_UNTIL_DATE", - "hzq8VE": "QUESTS_CHECK_FOR_ANY_GAME_LAUNCH_TOOLTIP", "jy9xiD": "QUESTS_CHECK_FOR_GAME_LAUNCH_TOOLTIP", "VN1Ajl": "QUESTS_CHECK_PROGRESS", "zyNYNB": "QUESTS_CLAIMED", @@ -14288,11 +13908,7 @@ "APddvF": "QUESTS_CLAIM_BY_DATE", "cfY4PE": "QUESTS_CLAIM_REWARD", "0IUT4Y": "QUESTS_CLAIM_REWARD_HOOK", - "2vKYEB": "QUESTS_CLAIM_THE_REWARD_HOOK", "GQ+4bk": "QUESTS_COLLAPSE_QUEST_BAR", - "Ag+a7L": "QUESTS_COLLECTIBLES_TEMPORARY_COLLECTION", - "7P3PEA": "QUESTS_COMPLETED", - "8XB865": "QUESTS_COMPLETE_TOOLTIP", "ij5E/5": "QUESTS_COMPLETION_COMPLETE", "gvCR4H": "QUESTS_COMPLETION_PROGRESS_ALMOST_COMPLETE", "BzFeTF": "QUESTS_COMPLETION_PROGRESS_COMPLETE", @@ -14305,12 +13921,10 @@ "u30/ut": "QUESTS_CONNECTED", "XF4wuA": "QUESTS_CONNECTED_CONSOLES", "W5lmKt": "QUESTS_CONNECTION_MODAL_ERROR_HEADER", - "qqgS7o": "QUESTS_CONNECTION_MODAL_ERROR_LEARN_MORE", "Cfye4v": "QUESTS_CONNECT_CONSOLE", "EJFSvD": "QUESTS_CONSOLE_CONNECTION_HELPER_STEPS_CONNECT_ACCOUNT", "csptqV": "QUESTS_CONSOLE_CONNECTION_HELPER_STEPS_CTA", "UPWlJu": "QUESTS_CONSOLE_CONNECTION_HELPER_STEPS_HEADING", - "9rQPyp": "QUESTS_CONSOLE_CONNECTION_HELPER_STEPS_LAUNCH_ANY_GAME", "+8JB6Y": "QUESTS_CONSOLE_CONNECTION_HELPER_STEPS_LAUNCH_GAME", "HhfrYS": "QUESTS_CONSOLE_CONNECTION_HELPER_STEPS_PLAYTIME", "iDiwby": "QUESTS_CONSOLE_EXPIRED_CREDENTIALS_PSN", @@ -14319,26 +13933,17 @@ "Ajlcd7": "QUESTS_CONSOLE_QUEST_TASK_WITH_LINK", "XAsWxQ": "QUESTS_DISCLOSURE_ACTIVITY", "mYt7hQ": "QUESTS_DISCLOSURE_AGE", - "yqc5QV": "QUESTS_DISCLOSURE_IN_HOUSE", - "Vv5ysH": "QUESTS_DISCLOSURE_IN_HOUSE_QUEST_BAR", - "/yqMgk": "QUESTS_DISCLOSURE_IN_HOUSE_QUEST_HOME", "GcsZKJ": "QUESTS_DISCLOSURE_LABEL", "tzq9Wa": "QUESTS_DISCLOSURE_LEARN_MORE", "xQSdPv": "QUESTS_DISCLOSURE_LOCATION", - "ZOJAeW": "QUESTS_DISCLOSURE_PUBLISHER_PROMOTING", "tOWwxN": "QUESTS_DISCLOSURE_PUBLISHER_PROMOTING_QUEST_HOME", "Piihy1": "QUESTS_DISCLOSURE_PUBLISHER_TARGETING", - "O0JX4Z": "QUESTS_DISMISSAL_SURVEY_CHOICE_DONT_PLAY_GAME", "ETU4Na": "QUESTS_DISMISSAL_SURVEY_CHOICE_INVALUABLE", "RFasgu": "QUESTS_DISMISSAL_SURVEY_CHOICE_OTHER", "uRIIpD": "QUESTS_DISMISSAL_SURVEY_CHOICE_TOO_LONG", "5dxvxs": "QUESTS_DISMISSAL_SURVEY_CHOICE_UNSURE_HOW", - "gnfiSF": "QUESTS_DISMISSAL_SURVEY_THANKS", "FIYcpC": "QUESTS_DISMISSAL_SURVEY_VIDEO_SUBTITLE", "ugbhDS": "QUESTS_DISMISSAL_SURVEY_VIDEO_TITLE", - "zsHThW": "QUESTS_EARN_REWARD", - "9nS4MS": "QUESTS_EMBED_INVALID_BODY", - "sA0YhR": "QUESTS_EMBED_INVALID_BODY_2", "CTn0yX": "QUESTS_EMBED_INVALID_BODY_3", "vnP31W": "QUESTS_EMBED_INVALID_HEADING", "14o6QY": "QUESTS_ENDED_ON_DATE", @@ -14347,32 +13952,21 @@ "8K9PE9": "QUESTS_EXPIRED_ON_DATE", "ge+AJp": "QUESTS_EXPIRED_QUEST_CARD_HEADING", "DT3auf": "QUESTS_EXPIRED_QUEST_CARD_SUBHEADING", - "BG/mqw": "QUESTS_EXPIRED_QUEST_CARD_SUBHEADING_EARN", "HnG2TE": "QUESTS_EXPIRES", - "RGG2Mz": "QUESTS_FIND_QUEST", "V6htN5": "QUESTS_FIND_QUEST_QUEST_HOME", "1u3YPC": "QUESTS_FIND_THIS_IN_DISCOVERY_QUEST_HOME", - "wm6viQ": "QUESTS_FOR_YOU", "STpNEC": "QUESTS_GAME_DETECTED", "28Ql27": "QUESTS_GAME_NOT_DETECTED", "lwQdjB": "QUESTS_GET_THIS_GAME", "NN79E9": "QUESTS_HIDE_THIS", - "IjISqk": "QUESTS_HOME_HERO_DESCRIPTION", "cA9Uli": "QUESTS_HOME_HERO_EYEBROW", - "MhG/VS": "QUESTS_HOME_HERO_TITLE", "svdwbA": "QUESTS_HOME_MODAL_CONNECT_CONSOLE", "cXnE5c": "QUESTS_HOME_MODAL_LINKED_ACCOUNTS", "a9OfTN": "QUESTS_HOME_MODAL_NEXT_STEP", "GURBQl": "QUESTS_HOME_MOVED_CALLOUT_BUTTON", - "5ctBX6": "QUESTS_HOME_MOVED_CALLOUT_DESCRIPTION", "IqmRZ9": "QUESTS_HOME_MOVED_CALLOUT_DESCRIPTION_V2", "z8YP2A": "QUESTS_HOME_MOVED_CALLOUT_TITLE", "lOVr0O": "QUESTS_HOME_REWARD_CLAIMED_DESCRIPTION", - "ZQ2za5": "QUESTS_INSTRUCTIONS_TO_EARN_REWARD", - "Tu36SU": "QUESTS_INSTRUCTIONS_TO_EARN_REWARD_TIERED", - "QoRDcs": "QUESTS_INSTRUCTIONS_TO_EARN_REWARD_TIERED_V2", - "OlWhjI": "QUESTS_INSTRUCTIONS_TO_EARN_REWARD_V2", - "j9iEPO": "QUESTS_INSTRUCTIONS_TO_WIN_REWARD", "OVMlG0": "QUESTS_INSTRUCTIONS_TO_WIN_REWARD_TIERED", "a/ia7F": "QUESTS_INSTRUCTIONS_TO_WIN_REWARD_TIERED_V2", "hkJ+Gs": "QUESTS_INSTRUCTIONS_TO_WIN_REWARD_V2", @@ -14380,17 +13974,13 @@ "KYP2pb": "QUESTS_INSTRUCTIONS_TO_WIN_REWARD_WITH_EXPIRING_COLLECTIBLE_REWARD_PREMIUM_EXTENSIBLE", "rxf+nx": "QUESTS_INVALID_QUEST", "pqVOay": "QUESTS_IN_HOUSE_REWARD_TOOLTIP", - "Y+lp80": "QUESTS_IN_HOUSE_TASK", - "UhuY7v": "QUESTS_IN_HOUSE_TASK_WITH_LINK", - "416bPZ": "QUESTS_IN_HOUSE_TITLE", "hsbwjv": "QUESTS_IN_PROGRESS_TOOLTIP", "BXFP30": "QUESTS_JOIN_ME", "xmotYh": "QUESTS_LANDING_PAGE_ERROR_HEADING", "NweJI8": "QUESTS_LANDING_PAGE_MOBILE_WEB_BODY", - "qVaoNg": "QUESTS_LANDING_PAGE_MOBILE_WEB_BODY_DESKTOP_AND_MOBILE", "gtZK09": "QUESTS_LANDING_PAGE_MOBILE_WEB_BODY_DESKTOP_AND_MOBILE_QUEST_HOME", + "hRIVy+": "QUESTS_LAUNCH", "gX0Qcx": "QUESTS_LAUNCHED_GAME", - "F9oOIb": "QUESTS_LEARN_MORE_LINK", "DYAleT": "QUESTS_LEARN_MORE_STACKED", "LLLLPD": "QUESTS_LEARN_MORE_V2", "Bz6SkH": "QUESTS_MEMBERS_LIST_AVAILBLE", @@ -14400,17 +13990,13 @@ "Lm8/mH": "QUESTS_MEMBERS_LIST_PROMOTED_BY", "nPThNb": "QUESTS_MICROHPONE_UNIT_BUTTON_CTA", "GXqvC1": "QUESTS_MICROPHONE_UNIT_BODY", - "zrLnnH": "QUESTS_MICROPHONE_UNIT_BODY_ANY_GAME", "beN4DG": "QUESTS_MICROPHONE_UNIT_FOOTER_HELP_ARTICLE_MULTI", - "at0ya6": "QUESTS_MICROPHONE_UNIT_FOOTER_HELP_ARTICLE_MULTI_V2", "HVS7nh": "QUESTS_MICROPHONE_UNIT_FOOTER_HELP_ARTICLE_SINGLE", - "l2taaS": "QUESTS_MICROPHONE_UNIT_FOOTER_HELP_ARTICLE_SINGLE_V2", "YstzGO": "QUESTS_MICROPHONE_UNIT_HEADER", "6pZPou": "QUESTS_MOBILE_EMBED_BODY", "yHzB4Y": "QUESTS_MOBILE_EMBED_BODY_QUEST_HOME", "3Z/Ejm": "QUESTS_MOBILE_EMBED_TITLE", "Ow5AQI": "QUESTS_MOBILE_EMBED_UNKNOWN_BODY", - "+bKyg/": "QUESTS_MOBILE_EMBED_UNKNOWN_TITLE", "7IjxCu": "QUESTS_MOBILE_EMBED_UNSUPPORTED_TITLE", "E2R8VX": "QUESTS_MOBILE_HOME_AWAITING_LAUNCH", "9Peldf": "QUESTS_MOBILE_HOME_AWAITING_LAUNCH_DESKTOP", @@ -14418,16 +14004,10 @@ "e3OlfB": "QUESTS_MOBILE_HOME_CLAIM_REWARD", "aFaRso": "QUESTS_MOBILE_HOME_CONTINUE_PLAYING", "lIFg6I": "QUESTS_MOBILE_HOME_GAME_CONNECTED", - "IRviFr": "QUESTS_MOBILE_HOME_LAUNCH_GAME", - "CTbW6V": "QUESTS_MOBILE_HOME_LAUNCH_GAME_DESKTOP", - "fUhYnc": "QUESTS_MOBILE_HOME_STREAM_GAME_DESKTOP", "JiosAn": "QUESTS_MOBILE_HOME_VIEW_REQUIREMENTS", "vTgCWx": "QUESTS_MOBILE_HOME_VIEW_REWARD", "U30tpC": "QUESTS_MOBILE_QUEST_BAR_OVERFLOW_MENU_LABEL", "SdlRnK": "QUESTS_NO_AVAILABLE", - "PfrqYX": "QUESTS_OTHER", - "XwFJ/T": "QUESTS_PLAY_GAME", - "EYy+QP": "QUESTS_PLAY_INSTRUCTIONS_TO_EARN_REWARD", "FZL5Q5": "QUESTS_PLAY_INSTRUCTIONS_TO_WIN_REWARD", "AwuMRS": "QUESTS_PLAY_INSTRUCTIONS_TO_WIN_REWARD_WITH_EXPIRING_COLLECTIBLE_REWARD", "Lc6EpJ": "QUESTS_PLAY_INSTRUCTIONS_TO_WIN_REWARD_WITH_EXPIRING_COLLECTIBLE_REWARD_PREMIUM_EXTENSIBLE", @@ -14438,14 +14018,14 @@ "o6FLcF": "QUESTS_PROMOTED", "VAbKhK": "QUESTS_PROMOTED_BY", "buEvBw": "QUESTS_PROMOTED_BY_BRAND", - "qLhlOt": "QUESTS_PROMOTED_BY_GUILD", - "b+RCtf": "QUESTS_PSN_ONLINE_ID", "74VQCG": "QUESTS_PSN_ONLINE_ID_V2", "l9uXL8": "QUESTS_REWARD_AVATAR_DECORATION_BODY", "tTlItm": "QUESTS_REWARD_AVATAR_DECORATION_BODY_WITH_EXPIRATION", "NpQ80c": "QUESTS_REWARD_AVATAR_DECORATION_BODY_WITH_EXPIRATION_EXTENDABLE", "gWlmFb": "QUESTS_REWARD_AVATAR_DECORATION_BODY_WITH_EXPIRATION_EXTENDED", "0/Yz+Y": "QUESTS_REWARD_AVATAR_DECORATION_HEADER", + "EMp8/M": "QUESTS_REWARD_CLAIMED", + "OD6Tvf": "QUESTS_REWARD_CLAIMED_LABEL", "YpswQo": "QUESTS_REWARD_CODE_CLAIMED_REWARD_TILE_SUBHEADER", "PJBpda": "QUESTS_REWARD_CODE_CONGRATS", "23SS+z": "QUESTS_REWARD_CODE_DONE", @@ -14464,18 +14044,20 @@ "EMrUHQ": "QUESTS_REWARD_CODE_SELECT_PLATFORM_PLACEHOLDER", "gNJHHp": "QUESTS_REWARD_CODE_TRY_AGAIN", "UUKbik": "QUESTS_REWARD_CODE_UNCLAIMED_REWARD_TILE_SUBHEADER", + "Hd3D8W": "QUESTS_REWARD_ERROR", + "Ij97SL": "QUESTS_REWARD_ERROR_DESCRIPTION", "v1u/zq": "QUESTS_REWARD_MODAL_FOOTER_IN_GAME_BODY", - "1KUSRw": "QUESTS_REWARD_SPONSORED_BY", + "qyKLdg": "QUESTS_REWARD_READY", "04MTGf": "QUESTS_REWARD_TILE_EXPIRED_QUEST", + "7Rdjms": "QUESTS_REWARD_UNLOCK_REWARDS", "qP5xYc": "QUESTS_REWARD_VERIFICATION_BODY", "vjying": "QUESTS_REWARD_VERIFICATION_ERROR", "c8eASM": "QUESTS_REWARD_VERIFICATION_TITLE", "bAGFz3": "QUESTS_SEE_CODE", + "yKJi+/": "QUESTS_SEE_DETAILS", "owFNB2": "QUESTS_SELECT_TO_START", - "en9KDv": "QUESTS_SHARE_LINK", "5Z6rzz": "QUESTS_SHARE_QUEST", "qiS+xj": "QUESTS_SHOW_CONNECTIONS", - "nqDGqW": "QUESTS_SPONSORED", "E80Bds": "QUESTS_START_QUEST", "umdNin": "QUESTS_START_VIDEO_QUEST", "5nMfBZ": "QUESTS_STREAM_SOURCE_SELECT_NOTICE_HEADING", @@ -14483,8 +14065,8 @@ "6zWtV8": "QUESTS_STREAM_TASK", "br3uIi": "QUESTS_THIS_PC", "7D8r4F": "QUESTS_TILE_BANNER_ENDS_DATE", - "37K1Ti": "QUESTS_TILE_BANNER_EXPIRES_ON_DATE", "EQa7os": "QUESTS_TITLE", + "k4z4er": "QUESTS_UNAVAILABLE", "BSXPZ+": "QUESTS_UNLOCK_REWARDS", "eIl+AK": "QUESTS_VIDEO_CONTROL_BTN_TOOLTIP_CHANGE_VOLUME", "r9s3Uv": "QUESTS_VIDEO_CONTROL_BTN_TOOLTIP_REWIND", @@ -14495,30 +14077,29 @@ "KCzjTi": "QUESTS_VIDEO_CONTROL_BTN_TOOLTIP_TOGGLE_TRANSCRIPT", "mxaHfx": "QUESTS_VIDEO_END_PANEL_LEARN_SUBTITLE", "iiTtpJ": "QUESTS_VIDEO_END_PANEL_LEARN_TITLE", - "veEQX0": "QUESTS_VIDEO_END_PANEL_REWARD_SUBTITLE", - "pxXqZd": "QUESTS_VIDEO_END_PANEL_REWARD_TITLE", + "xNXk0T": "QUESTS_VIDEO_INSTRUCTIONS_TO_GET_REWARD", + "LcS+D1": "QUESTS_VIDEO_INSTRUCTIONS_TO_GET_REWARD_GENERIC", "yMsQ7X": "QUESTS_VIDEO_INSTRUCTIONS_TO_WIN_REWARD", "g+InPC": "QUESTS_VIDEO_INSTRUCTIONS_TO_WIN_REWARD_GENERIC", "o+e9yh": "QUESTS_VIDEO_QUESTBAR_SUBTITLE", "U7Xrb+": "QUESTS_VIDEO_QUEST_PAUSE_MESSAGE", + "w6PeBF": "QUESTS_VIDEO_QUEST_PAUSE_MESSAGE_V2", "12IWP2": "QUESTS_VIDEO_REWARD_TOOLTIP", + "nzYZrt": "QUESTS_VIDEO_TIME_REMAINING", "YsCuyF": "QUESTS_VIDEO_WATCH_AGAIN", + "6fpk4L": "QUESTS_VIDEO_WATCH_CTA", "c59/Tp": "QUESTS_VIDEO_WATCH_RESUME_WITH_TIME_CTA", "GNsKiW": "QUESTS_VIDEO_WATCH_WITH_TIME_CTA", - "AowamK": "QUESTS_VIEW_COLLECTIBLE", "o8ZkKc": "QUESTS_VIEW_MORE_ACCOUNTS", + "Ws2Bl+": "QUESTS_VIEW_MORE_QUESTS", "th2+0j": "QUESTS_VIEW_QUEST", "9m9Mna": "QUESTS_WATCH_VIDEO_TASK", "MEhKlu": "QUESTS_XBOX_ID", "9KoPyB": "QUEST_ACCEPTED", "g8zcEa": "QUEST_AVAILABLE", - "4z+ESJ": "QUEST_BAR_MAC_WARNING_BODY", - "QbvIxE": "QUEST_BAR_MAC_WARNING_HEADER", "JPihZA": "QUEST_BAR_MAC_WARNING_HEADER_WINDOWS", - "AVC/hQ": "QUEST_BAR_SUBTITLE_PLAY_ANY_GAME_ON_CONNECTED_CONSOLE", "016F4t": "QUEST_BAR_SUBTITLE_PLAY_ANY_GAME_ON_CONNECTED_CONSOLE_PREMIUM_EXTENSIBLE", "NIimTt": "QUEST_BAR_SUBTITLE_PLAY_GAME", - "U5htd6": "QUEST_BAR_SUBTITLE_PLAY_GAME_EARN", "Ta44ut": "QUEST_BAR_SUBTITLE_PLAY_GAME_WITH_EXPIRING_COLLECTIBLE_REWARD", "fSYpaW": "QUEST_BAR_SUBTITLE_PLAY_GAME_WITH_EXPIRING_COLLECTIBLE_REWARD_PREMIUM_EXTENSIBLE", "mOrpXG": "QUEST_BAR_TITLE_START_PLAYING", @@ -14539,7 +14120,6 @@ "zNoqRe": "QUEST_REWARD_COMPLETED", "RrxtPU": "QUEST_REWARD_COMPLETED_CLAIMED", "l1jCM/": "QUEST_REWARD_COMPLETED_UNCLAIMED", - "TZT3Ou": "QUEST_REWARD_MULTIPLATFORM_WITH_EXPIRING_COLLECTIBLE_REWARD", "a5ADjf": "QUEST_REWARD_MULTIPLATFORM_WITH_EXPIRING_COLLECTIBLE_REWARD_V2", "34NW5T": "QUEST_REWARD_MULTIPLATFORM_WITH_EXPIRING_COLLECTIBLE_REWARD_V2_PREMIUM_EXTENSIBLE", "AGXkya": "QUEST_REWARD_PREMIUM_EXTENSIBLE", @@ -14601,8 +14181,6 @@ "svB7eY": "QUOTE", "krYXiu": "RAISED_HAND_LIST_MOVED_NUX_DESCRIPTION", "fBaWD6": "RAISED_HAND_LIST_MOVED_NUX_TITLE", - "HzLAbw": "RAPIDASH_ASK_TO_JOIN_CTA", - "k5d4Wq": "RAPIDASH_ASK_TO_JOIN_LABEL", "Whhv4w": "RATE_LIMITED", "YELVm2": "RATING_REQUEST_BODY_ANDROID", "dc2bbp": "RATING_REQUEST_TITLE", @@ -14676,28 +14254,12 @@ "MlmB4M": "REDIRECTED_CALLBACK_PENDING", "V43wuT": "REDIRECTED_CONFIRMATION_CALLBACK_SUCCESS", "YdkuxZ": "REDIRECTED_PAYMENT_METHOD_CONFIRMATION_CALLBACK_SUCCESS", - "eq39ak": "REFERRAL_INCENTIVE_COUNTDOWN_DAYS", - "MoKnzW": "REFERRAL_INCENTIVE_DISCOUNT_UNLOCKED", - "nysttW": "REFERRAL_INCENTIVE_FRIEND_PASSES_CONVERT_GET_INCENTIVE", - "O8mswO": "REFERRAL_INCENTIVE_FRIEND_PASSES_KEEP_GOING", - "nHuzUJ": "REFERRAL_INCENTIVE_FRIEND_PASSES_REDEEMED", - "iGlQKt": "REFERRAL_INCENTIVE_FRIEND_PASS_COUNTDOWN_HAS_BEGUN", - "r/h7S1": "REFERRAL_INCENTIVE_FRIEND_PASS_COUNTDOWN_HAS_BEGUN_V2", - "mxPPxQ": "REFERRAL_INCENTIVE_GET_DISCOUNT_OFF_YOUR_NEXT_MONTH", - "HGO89r": "REFERRAL_INCENTIVE_KEEP_SHARING_TO_EARN_ANOTHER_DISCOUNT", - "Kq6hc9": "REFERRAL_INCENTIVE_MORE_FRIEND_PASSES_ALMOST_HERE", - "SRJkUU": "REFERRAL_INCENTIVE_NITRO_FRIEND_PASSES_INCOMING", "SRIMcs": "REFERRAL_INCENTIVE_SELECT_3_FRIENDS_TO_SHARE_PASS", - "md2GU3": "REFERRAL_INCENTIVE_SHARE_NITRO_GET_DISCOUNT", - "7GMtc7": "REFERRAL_INCENTIVE_YOU_EARNED_DISCOUNT", - "/LRLDR": "REFERRAL_INCENTIVE_YOU_SHARED_X_PASSES", "wpSqAW": "REFERRAL_PROGRAM_CLOSE", "RO3T4B": "REFERRAL_PROGRAM_CONFIRMATION_ERROR_PAGE", "7VBEue": "REFERRAL_PROGRAM_CONFIRMATION_ERROR_PAGE_HEADER", "lQLlOb": "REFERRAL_PROGRAM_EMBED_BODY", "IiWKwg": "REFERRAL_PROGRAM_EMBED_HEADER", - "b2WNfv": "REFERRAL_PROGRAM_EMBED_RECIPIENT_INELIGIBLE_HEADER", - "riIbKK": "REFERRAL_PROGRAM_EMBED_RECIPIENT_INELIGIBLE_SUBHEADER", "H0+MxK": "REFERRAL_PROGRAM_EMBED_TIRAL_EXPIRED", "3PJw6c": "REFERRAL_PROGRAM_FRIEND_SELECTION_HIT_LIMIT", "iWtOfC": "REFERRAL_PROGRAM_FRIEND_SELECT_COMPLETE_HEADER", @@ -14710,19 +14272,9 @@ "mPmPri": "REFERRAL_PROGRAM_FRIEND_SELECT_RESENT_HEADER", "AGKQq6": "REFERRAL_PROGRAM_HOME_BADGE_SUBHEADER", "LwCwT9": "REFERRAL_PROGRAM_LEARN_MORE_ABOUT_SHARING", - "hg6PxV": "REFERRAL_PROGRAM_MOBILE_EMBED_BODY", - "ULY0XI": "REFERRAL_PROGRAM_MOBILE_EMBED_BODY_1", - "yD1/3e": "REFERRAL_PROGRAM_MOBILE_EMBED_HEADER_1", - "dpgQFk": "REFERRAL_PROGRAM_MOBILE_EMBED_HEADER_2", - "BCQSh1": "REFERRAL_PROGRAM_MOBILE_EMBED_SUBHEADER_1", - "ld+seI": "REFERRAL_PROGRAM_MOBILE_EMBED_SUBHEADER_DAYS_2", - "JZCHZJ": "REFERRAL_PROGRAM_MOBILE_EMBED_SUBHEADER_HOURS_2", - "eWSC5w": "REFERRAL_PROGRAM_NO_ELIGIBLE_FRIENDS_HEADER", - "iZSeXh": "REFERRAL_PROGRAM_NO_ELIGIBLE_FRIENDS_SUBHEADER", "nG95hA": "REFERRAL_PROGRAM_PAYMENT_MODAL_COPY", "93xPy3": "REFERRAL_PROGRAM_PLAN_COMPARISON_ROW", "M47CJX": "REFERRAL_PROGRAM_PROGRESS_BAR_HEADER_ALL_SHARED", - "UV4DRr": "REFERRAL_PROGRAM_PROGRESS_BAR_HEADER_COOL_DOWN", "FjrXCi": "REFERRAL_PROGRAM_PROGRESS_BAR_SUBHEADER", "mlES/D": "REFERRAL_PROGRAM_PROGRESS_BAR_SUBHEADER_ALL_SHARED", "3OYZMc": "REFERRAL_PROGRAM_PROGRESS_BAR_SUBHEADER_ALL_SHARED_NO_REFRESH", @@ -14750,80 +14302,12 @@ "NYkcCh": "REGION_BLOCKED_PAYMENTS_ONE_LINER", "pV8xeR": "REGISTER", "AVDyEj": "REGISTERED_GAMES", - "PGffT8": "REGISTER_LOGIN_PRIVACY_NOTICE", "nwGI1A": "REGISTER_PASSWORD_EXPERIMENT_HINT", "wC4TlR": "REGISTER_TITLE", "2rN4Xk": "REGISTER_USERNAME_HINT", + "rPREPG": "RELATED_SETTINGS", "bLgcyi": "REMAINING_PARTICIPANTS", - "Hu9dUE": "REMIXING_ADD_MENTION", - "3N7uL+": "REMIXING_ADD_STICKER", - "WpFYAs": "REMIXING_ADD_TEXT", - "ScPxn5": "REMIXING_ASPECT_RATIO_FOUR_THREE", - "RUzEiL": "REMIXING_ASPECT_RATIO_ORIGINAL", - "M+8nRc": "REMIXING_ASPECT_RATIO_SIXTEEN_NINE", - "MC7UpF": "REMIXING_ASPECT_RATIO_SQUARE", - "JJHmqu": "REMIXING_ASPECT_RATIO_VERTICAL", - "GUH3Dn": "REMIXING_BACKDROP_EDITOR_TITLE", - "MlJlDh": "REMIXING_CAROUSEL_SCROLL_PAGE", - "s+dFp+": "REMIXING_CROP", - "xb0sts": "REMIXING_DOWNLOAD_APP", - "/2M0F+": "REMIXING_DRAWING_COLOR_BABY_BLUE", - "75qkhV": "REMIXING_DRAWING_COLOR_BLACK", "Cn/LJ4": "REMIXING_DRAWING_COLOR_BRAND500", - "WNCXCR": "REMIXING_DRAWING_COLOR_BROWN", - "XbOcLy": "REMIXING_DRAWING_COLOR_DARK_BLUE", - "fb3pl1": "REMIXING_DRAWING_COLOR_DARK_GOLD", - "HhUh7C": "REMIXING_DRAWING_COLOR_DARK_GREEN", - "y2QVFE": "REMIXING_DRAWING_COLOR_DARK_ORANGE", - "IlZU8O": "REMIXING_DRAWING_COLOR_DARK_PURPLE", - "kKm/lL": "REMIXING_DRAWING_COLOR_DARK_RED", - "KJxdzn": "REMIXING_DRAWING_COLOR_DARK_TAN", - "XsMHg/": "REMIXING_DRAWING_COLOR_FADED_GREEN", - "NnwVuT": "REMIXING_DRAWING_COLOR_GREEN430", - "XNdCjR": "REMIXING_DRAWING_COLOR_GREENISH_YELLOW", - "mI18GJ": "REMIXING_DRAWING_COLOR_LIGHT_PINK", - "CVsCnC": "REMIXING_DRAWING_COLOR_LIGHT_PURPLE", - "xThUQE": "REMIXING_DRAWING_COLOR_LIGHT_YELLOW", - "ipKC2k": "REMIXING_DRAWING_COLOR_LILAC", - "kA8VFd": "REMIXING_DRAWING_COLOR_ORANGE345", - "AUhKMk": "REMIXING_DRAWING_COLOR_PINK_TAN", - "7O8rfR": "REMIXING_DRAWING_COLOR_RED500", - "mkNVgR": "REMIXING_DRAWING_COLOR_TAN", - "p16+Jy": "REMIXING_DRAWING_COLOR_WHITE", - "U9pJRX": "REMIXING_DRAWING_COLOR_YELLOW260", - "xOjxOX": "REMIXING_DRAWING_DONE", - "mNk38l": "REMIXING_EXIT_ALERT_BODY", - "jvq6Y4": "REMIXING_EXIT_ALERT_LEAVE_BUTTON", - "iieH6q": "REMIXING_EXIT_ALERT_STAY_BUTTON", - "OD9/lz": "REMIXING_EXIT_ALERT_TITLE", - "Ox9Acq": "REMIXING_FLIP", - "1Pskj9": "REMIXING_FREE_DRAW", - "2djXy/": "REMIXING_LANGUAGE_SUPPORT_WARNING", - "Tmbf3S": "REMIXING_MENTIONS_TOOLTIP", - "HxKEhw": "REMIXING_OPEN_ERROR", - "8GwCPR": "REMIXING_PERKS_CARD_DESCRIPTION", - "ZvulDs": "REMIXING_PERKS_CARD_TITLE", - "L5SL3h": "REMIXING_POST_CTA", - "mNmH85": "REMIXING_QUARTERSHEET_CTA_TRY_IT", - "VUWdQr": "REMIXING_QUARTERSHEET_DESCRIPTION", - "Un8xqo": "REMIXING_QUARTERSHEET_DESCRIPTION_GA", - "ht2Op4": "REMIXING_QUARTERSHEET_UNLOCK_WITH_NITRO", - "X+YFqS": "REMIXING_REDO", - "jXPD1o": "REMIXING_ROTATE", - "uXDG34": "REMIXING_TAG", - "Gp2rPh": "REMIXING_TITLE", - "Db2Z1l": "REMIXING_TOOLTIP_CTA_TRY_IT_OUT", - "qSQIv6": "REMIXING_TOOLTIP_DESCRIPTION", - "UZYn3g": "REMIXING_TOOLTIP_DESCRIPTION_MEME", - "phHyIY": "REMIXING_TOOLTIP_NITRO_EARLY_ACCESS", - "OB3OdB": "REMIXING_TOOLTIP_NOT_NOW", - "u0oRGO": "REMIXING_TOOLTIP_TITLE_MEME_IT", - "IMtCbn": "REMIXING_TOOLTIP_TITLE_REMIX", - "bQB2V0": "REMIXING_TWO_FINGER_HINT", - "DA7ECE": "REMIXING_UNDO", - "bPif92": "REMIXING_UNDO_ALL_ALERT", - "8DLZru": "REMIXING_UNDO_ALL_ALERT_BODY", - "TeBodx": "REMIXING_UNDO_ALL_ALERT_CANCEL_BUTTON", "N86XcP": "REMOVE", "ZbtGBm": "REMOVE_ALL_REACTIONS", "VpjOCo": "REMOVE_ALL_REACTIONS_CONFIRM_BODY", @@ -14876,6 +14360,7 @@ "E+6SSY": "REPLY_QUOTE_COMMAND", "XAkOo2": "REPLY_QUOTE_MESSAGE_BLOCKED", "mE3KJN": "REPLY_QUOTE_MESSAGE_DELETED", + "G7p6v/": "REPLY_QUOTE_MESSAGE_IGNORED", "1i+hMi": "REPLY_QUOTE_MESSAGE_NOT_LOADED", "6hGo0c": "REPLY_QUOTE_NO_TEXT_CONTENT", "JAKsM8": "REPLY_QUOTE_NO_TEXT_CONTENT_MOBILE", @@ -14960,6 +14445,7 @@ "yBZMsQ": "RESET", "9qSBvB": "RESET_FRIEND_NICKNAME", "aE02Rz": "RESET_NICKNAME", + "4iKQ/3": "RESET_VOICE_AND_VIDEO_SETTINGS", "3PBFN6": "RESET_NOTIFICATION_OVERRIDE", "OvBpRa": "RESET_NOTIFICATION_SETTINGS", "WAUOoK": "RESET_PASSWORD_SUCCESS_TITLE", @@ -14971,7 +14457,6 @@ "zpi5pg": "RESUME", "NzxWjb": "RESUME_SETUP", "5911Lb": "RETRY", - "IX7oWq": "RETURN_TO_CHANNEL", "86EAms": "RETURN_TO_LOGIN", "dcztdU": "REVEAL", "Bln6x1": "REVERSED", @@ -15037,16 +14522,27 @@ "E2iT8K": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_BE_VERIFIED", "Nj0a3j": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_ACCOUNT", "ZCNdD/": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_DOTA2", + "OGUX78": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_DOTA2_COUNT", "/w/EYk": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_FOLLOWERS", + "Zwey2Z": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_FOLLOWERS_COUNT", "JHEsYw": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_FOLLOWING", + "Ueeex/": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_FOLLOWING_COUNT", "zVJxqj": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_GAMES", "TLgZhv": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_KARMA", + "A4zKul": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_KARMA_COUNT", "tEFCYA": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_LIKES", + "uq2UuO": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_LIKES_COUNT", "oTFOe5": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_POSITIVE_FEEDBACK_PERCENTAGE", + "IpQ4E8": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_POSITIVE_FEEDBACK_PERCENTAGE_COUNT", "5I4mVS": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_POSTS", + "UK2/m/": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_POSTS_COUNT", "MCHnK+": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_TF2", + "Eq7h8E": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_TF2_COUNT", "+NFH7k": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_TWEETS", + "lrmh/U": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_TWEETS_COUNT", + "v5a2+Q": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_UNIQUE_POSITIVE_FEEDBACK", "RH3VAx": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_LEAST_UNIQUE_POSITIVE_FEEDBACK_COUNT", + "yYbR2r": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_MOST_UNIQUE_NEGATIVE_FEEDBACK", "sn3m7v": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_AT_MOST_UNIQUE_NEGATIVE_FEEDBACK_COUNT", "kCAN58": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_GOLD", "0JyE8I": "ROLE_EDIT_CONNECTIONS_CONTROLS_MUST_HAVE_PAYPAL_VERIFIED_BANK_ACCOUNT", @@ -15176,8 +14672,6 @@ "QAxIIt": "ROLE_PERMISSIONS_MANAGE_THREADS_AND_FORUMS_DESCRIPTION", "S31soU": "ROLE_PERMISSIONS_MANAGE_THREADS_AND_FORUMS_DESCRIPTION_CATEGORY", "XLi/jG": "ROLE_PERMISSIONS_MANAGE_THREADS_AND_FORUMS_DESCRIPTION_TEXT", - "AKdc4E": "ROLE_PERMISSIONS_MANAGE_THREADS_DESCRIPTION", - "YDIQ8A": "ROLE_PERMISSIONS_MANAGE_THREADS_DESCRIPTION_CATEGORY", "yvan0j": "ROLE_PERMISSIONS_MANAGE_THREADS_DESCRIPTION_TEXT", "LczYqC": "ROLE_PERMISSIONS_MANAGE_WEBHOOKS_DESCRIPTION", "K5+ZZ7": "ROLE_PERMISSIONS_MANAGE_WEBHOOKS_DESCRIPTION_CATEGORY", @@ -15227,15 +14721,12 @@ "46Ra1b": "ROLE_PERMISSIONS_SECTION_VOICE", "iqlsnD": "ROLE_PERMISSIONS_SECTION_VOICE_CHAT", "4Z9Fbb": "ROLE_PERMISSIONS_SECTION_VOICE_CHAT_DESCRIPTION", - "qry4Pd": "ROLE_PERMISSIONS_SEND_MESSAGES_DESCRIPTION", "WFwfSD": "ROLE_PERMISSIONS_SEND_MESSAGES_DESCRIPTION_ANNOUNCEMENT", "qLnFpc": "ROLE_PERMISSIONS_SEND_MESSAGES_DESCRIPTION_CATEGORY", "WQ6zpT": "ROLE_PERMISSIONS_SEND_MESSAGES_DESCRIPTION_TEXT", "C2ZPE3": "ROLE_PERMISSIONS_SEND_MESSAGES_IN_THREADS_AND_FORUM_POSTS_DESCRIPTION", "DlIVcN": "ROLE_PERMISSIONS_SEND_MESSAGES_IN_THREADS_AND_FORUM_POSTS_DESCRIPTION_CATEGORY", "XTnrPH": "ROLE_PERMISSIONS_SEND_MESSAGES_IN_THREADS_AND_FORUM_POSTS_DESCRIPTION_TEXT", - "6pyXvl": "ROLE_PERMISSIONS_SEND_MESSAGES_IN_THREADS_DESCRIPTION", - "VvrChO": "ROLE_PERMISSIONS_SEND_MESSAGES_IN_THREADS_DESCRIPTION_CATEGORY", "xHO6Me": "ROLE_PERMISSIONS_SEND_MESSAGES_IN_THREADS_DESCRIPTION_TEXT", "prvWKm": "ROLE_PERMISSIONS_SEND_MESSAGES_WITH_FORUMS_DESCRIPTION", "IjeLuu": "ROLE_PERMISSIONS_SEND_MESSAGES_WITH_FORUMS_DESCRIPTION_CATEGORY", @@ -15266,9 +14757,6 @@ "D+qW0J": "ROLE_PERMISSIONS_USE_APPLICATION_COMMANDS_DESCRIPTION_CATEGORY", "ReG3gG": "ROLE_PERMISSIONS_USE_APPLICATION_COMMANDS_DESCRIPTION_TEXT", "pJrJ35": "ROLE_PERMISSIONS_USE_APPLICATION_COMMANDS_GUILD_DESCRIPTION", - "8eeEZr": "ROLE_PERMISSIONS_USE_CLYDE_AI", - "d664F+": "ROLE_PERMISSIONS_USE_CLYDE_AI_CHANNEL_DESCRIPTION", - "Tx5TjC": "ROLE_PERMISSIONS_USE_CLYDE_AI_GUILD_DESCRIPTION", "BEqU5H": "ROLE_PERMISSIONS_USE_EMBEDDED_ACTIVITIES_DESCRIPTION", "maNzCO": "ROLE_PERMISSIONS_USE_EMBEDDED_ACTIVITIES_DESCRIPTION_CATEGORY", "qinvMU": "ROLE_PERMISSIONS_USE_EMBEDDED_ACTIVITIES_DESCRIPTION_CHANNEL", @@ -15343,6 +14831,7 @@ "Vu0Acc": "ROLE_ROW_DESCRIPTION", "Fgs8fD": "ROLE_ROW_VIEW_MEMBERS", "Mi9Kbe": "ROLE_SAMPLE_MESSAGE", + "9wVJRB": "ROLE_STYLE", "xFb68j": "ROLE_SUBSCRIPTION_EMOJI_POPOUT_PURCHASE_UNAVAILABLE_DESCRIPTION", "nN2DIo": "ROLE_SUBSCRIPTION_EMOJI_POPOUT_PURCHASE_UPSELL_BUTTON", "g8i/bf": "ROLE_SUBSCRIPTION_EMOJI_POPOUT_PURCHASE_UPSELL_DESCRIPTION", @@ -15385,12 +14874,6 @@ "qFsx5q": "SAFETY_ALERTS_SETTING_TITLE", "39O+8F": "SAFETY_ALERT_BLOCK_AND_REPORT_BUTTON", "5NhTvu": "SAFETY_ALERT_BLOCK_AND_REPORT_DESCRIPTION", - "1zzTSt": "SAFETY_CONSUMER_EDUCATION_BLOCK_CONTENT", - "61GrDO": "SAFETY_CONSUMER_EDUCATION_BLOCK_HEADER", - "xmrJWr": "SAFETY_CONSUMER_EDUCATION_MUTE_CONTENT", - "ajEMl9": "SAFETY_CONSUMER_EDUCATION_MUTE_HEADER", - "Lpp6PL": "SAFETY_CONSUMER_EDUCATION_REPORTING_CONTENT", - "4JBut5": "SAFETY_CONSUMER_EDUCATION_REPORTING_HEADER", "ncshoX": "SAFETY_HUB_ACCOUNT_STANDING_ALL_GOOD_DESCRIPTION", "pEdBD4": "SAFETY_HUB_ACCOUNT_STANDING_ALL_GOOD_DESCRIPTION_V2", "/Idfao": "SAFETY_HUB_ACCOUNT_STANDING_ALL_GOOD_SHORT", @@ -15522,7 +15005,6 @@ "eczHal": "SAVE_GUILD_FOLDERS_NAME_ERROR_DESCRIPTION", "S/xNKV": "SAVE_IMAGE", "PeXhgO": "SAVE_IMAGE_MENU_ITEM", - "fuwY7I": "SAVE_IMAGE_TO_DEVICE", "r4Zjzv": "SAVE_MEDIA_FAILURE_HELP_MOBILE", "cV3alD": "SAVE_MEDIA_FAILURE_MOBILE", "C1Otvp": "SAVE_MEDIA_SUCCESS_MOBILE", @@ -15575,8 +15057,6 @@ "mPRcyT": "SCOPE_SDK_SOCIAL_LAYER_3", "F7J4NE": "SCOPE_SDK_SOCIAL_LAYER_4", "2wxXX9": "SCOPE_SDK_SOCIAL_LAYER_5", - "wWIiGK": "SCOPE_UNSUPPORTED_ON_ANDROID", - "hqtfGn": "SCOPE_UNSUPPORTED_ON_ANDROID_DESCRIPTION", "XK5zdO": "SCOPE_VOICE", "sU+oPw": "SCOPE_WEBHOOK_INCOMING", "Re/64R": "SCOPE_WEBHOOK_INCOMING_CHANNEL_PLACEHOLDER", @@ -15649,6 +15129,7 @@ "78fJNN": "SEARCH_CLEAR", "LFTAUp": "SEARCH_CLEAR_ALL", "dwAvX1": "SEARCH_CLEAR_HISTORY", + "m1UwbP": "SEARCH_COMMANDS", "hGOODh": "SEARCH_COUNTRY", "fmtCi3": "SEARCH_DATE_PICKER_HINT", "Br0xJA": "SEARCH_DMS_STILL_INDEXING", @@ -15725,6 +15206,7 @@ "V6nAfF": "SEARCH_NO_RESULTS", "VrK/2R": "SEARCH_NO_RESULTS_ALT", "HTE8JP": "SEARCH_NUM_RESULTS_BLOCKED_NOT_SHOWN", + "OukXZj": "SEARCH_OLDEST", "a1BaUr": "SEARCH_OLDEST_SHORT", "epc9sr": "SEARCH_PICK_DATE", "Ov3VO7": "SEARCH_REMOVE_FROM_HISTORY_A11Y_LABEL", @@ -15976,10 +15458,8 @@ "Q60n1E": "SERVER_EMOJI", "rCPsbo": "SERVER_FOLDER_COLLAPSE_ALL", "thzRJA": "SERVER_FOLDER_MARK_AS_READ", - "vBTk2A": "SERVER_FOLDER_MUTE_ALL", "xV9hVh": "SERVER_FOLDER_PLACEHOLDER", "Dx7im5": "SERVER_FOLDER_SETTINGS", - "VFDdkU": "SERVER_FOLDER_UNMUTE_ALL", "VbpLyU": "SERVER_GUIDE", "cGmT/J": "SERVER_HIGHLIGHT_MANAGE_SETTINGS", "NRWtfC": "SERVER_HIGHLIGHT_UNSUBSCRIBE_BODY", @@ -15993,6 +15473,7 @@ "1y3CC2": "SERVER_NAME_REQUIRED", "me1lRk": "SERVER_NICKNAME", "sWekP9": "SERVER_OPTIONS", + "STMPJ2": "SERVER_ORDER", "iZmTaF": "SERVER_OVERVIEW", "154/bL": "SERVER_SETTINGS", "V7yE2I": "SERVER_SETTINGS_UPDATED", @@ -16036,6 +15517,7 @@ "6klMOk": "SETTINGS_GAMES_REPORT_INCORRECT_DETECTION_CONFIRMATION", "QmitzM": "SETTINGS_GAMES_TOGGLE_DETECTION", "1+O+Tu": "SETTINGS_GAMES_TOGGLE_OVERLAY", + "Fmjztz": "SETTINGS_GAMES_TURN_OFF", "4PJP5p": "SETTINGS_GAMES_VERIFIED_ICON", "+U02+i": "SETTINGS_GENERAL", "97VdNm": "SETTINGS_INVITE_TIP", @@ -16045,6 +15527,7 @@ "GuPYQB": "SETTINGS_PERMISSIONS_DELETE_TITLE", "9+nrUS": "SETTINGS_ROLES_DELETE_BODY", "YWISbQ": "SETTINGS_ROLES_DELETE_TITLE", + "KDdjou": "SETTINGS_STREAMING", "5oGejm": "SETTINGS_SYNC", "WE4l1e": "SETTINGS_TITLE_NEW_LAYOUT", "m0FidJ": "SETTINGS_TWO_FA", @@ -16056,9 +15539,6 @@ "IYPrRl": "SET_DEBUG_LOGGING_BODY", "QKJru/": "SET_INVITE_LINK_NEVER_EXPIRE", "3Uj+2p": "SET_STATUS", - "S0ajKG": "SET_STATUS_MODAL_CTA", - "YVM22u": "SET_STATUS_MODAL_SUBTITLE", - "DD4vJI": "SET_STATUS_MODAL_TITLE", "TAXOKw": "SET_VANITY_URL_ERROR_MESSAGE_INVALID_ACCESS", "lXtut1": "SET_VANITY_URL_ERROR_MESSAGE_INVALID_PERMISSIONS", "ZpuxVs": "SET_VANITY_URL_ERROR_MESSAGE_REQUIRED_FOR_PUBLISHED_GUILDS", @@ -16069,6 +15549,7 @@ "n0Ad1P": "SET_VOICE_CHANNEL_TOPIC_PLACEHOLDER", "t/d8ng": "SET_VOICE_CHANNEL_TOPIC_SHORT_CTA", "uVDhqZ": "SEVERAL_USERS_TYPING", + "Q8lUnE": "SEVERAL_USERS_TYPING_STRONG", "zxlx66": "SHAER_NITRO_CONFIRMATION_BUTTON_TEXT", "RDE0Sc": "SHARE", "Aw+09z": "SHARE_DEBUG_LOGS", @@ -16088,11 +15569,9 @@ "Mptau/": "SHARE_NITRO_EMBEDDED_MESSAGE_DISABLED_HEADER", "2vR8Pz": "SHARE_NITRO_EMBEDDED_MESSAGE_EXPIRED_BODY", "9SNdf4": "SHARE_NITRO_EMBEDDED_MESSAGE_EXPIRED_HEADER", - "1oPGmt": "SHARE_NITRO_EMBEDDED_MESSAGE_HEADER", "+Z4ey7": "SHARE_NITRO_MODAL_BODY_GENERAL", "58lPt9": "SHARE_NITRO_MODAL_BODY_SHARE_THEM_BY", "J/tYnm": "SHARE_NITRO_MODAL_CONFIRMATION_GENERAL", - "vVnRxZ": "SHARE_NITRO_MODAL_CONFIRMATION_GENERAL_LAST_REFERRAL", "c1wxcb": "SHARE_NITRO_MODAL_HEADER", "awsERJ": "SHARE_NITRO_RESEND_BUTTON_TEXT", "zzfBQu": "SHARE_NITRO_RESEND_TOOLTIP", @@ -16101,12 +15580,12 @@ "yCN5Qt": "SHARE_NITRO_RESEND_TRIAL_HEADER", "ziPEBp": "SHARE_NITRO_TOOLTIP", "0qLqcP": "SHARE_NITRO_TOOLTIP_DISABLED", - "SGbw2K": "SHARE_NITRO_VIEW_ON_DESKTOP", "leICvh": "SHARE_PUSH_NOTIFICATION_LOGS", "+KNdnt": "SHARE_SETTINGS_TITLE", "Ux8h5g": "SHARE_TITLE", "MR7/kg": "SHARE_TO", "fjBNo1": "SHARE_YOUR_SCREEN", + "OH6ADf": "SHARING", "eXan7B": "SHARING_SCREEN", "ZO3wfT": "SHEET_GRABBER_A11Y_HINT", "5Kt7uE": "SHEET_GRABBER_A11Y_LABEL", @@ -16114,6 +15593,8 @@ "idFMvH": "SHORTCUT_RECORDER_BUTTON_EDIT", "bmOri0": "SHORTCUT_RECORDER_BUTTON_RECORDING", "nWRdnl": "SHORTCUT_RECORDER_NO_BIND", + "XJuakA": "SHOW", + "CUICbO": "SHOW_ADVANCED_NOTIFICATION_SETTINGS", "whEs/l": "SHOW_ALL", "jcANeL": "SHOW_ALL_WITH_COUNT", "kkKapG": "SHOW_CHAT", @@ -16154,9 +15635,12 @@ "h7hdQh": "SMS_CONFIRMATION_TITLE", "jGVzY5": "SOCIAL", "LY35Zy": "SOCIAL_LAYER_APPLICATION_UNLINK_WARNING", + "apFNLU": "SOCIAL_LAYER_STOREFRONT_GAME_SHOP", "UYy1/h": "SOFORT_MANDATE_AGREEMENT", + "F8FvUy": "SOMETHING_WENT_WRONG", "XvNMNk": "SORT", "G8xyZn": "SORTING", + "LxVjvJ": "SORT_BY", "ABjMWI": "SOUNDBOARD", "/fzLLK": "SOUNDBOARD_CONTEXT_MENU_DOWNLOAD_SOUND", "ponZcG": "SOUNDBOARD_CONTEXT_MENU_EDIT_SOUND", @@ -16227,12 +15711,10 @@ "ZwRzIH": "SOUNDBOARD_SOUND_WHEEL_EDUCATION_MODAL_CONFIRM", "TJ0N99": "SOUNDBOARD_SOUND_WHEEL_EDUCATION_MODAL_EDIT_KEYBIND", "yJeV51": "SOUNDBOARD_SOUND_WHEEL_EDUCATION_MODAL_HEADER", - "jQIyyK": "SOUNDBOARD_TOOLTIP_BODY", - "0jmTwC": "SOUNDBOARD_TOOLTIP_TITLE", - "PZNQKE": "SOUNDBOARD_TOOLTIP_TITLE_NEW", "c1qVYh": "SOUNDBOARD_UPLOAD_SOUND_FOR_GUILD", "/BB09D": "SOUNDBOARD_VOLUME_TOOLTIP_BODY", "89R9tY": "SOUNDBOARD_VOLUME_TOOLTIP_HEADER", + "dDj3Ea": "SOUNDMOJI_COACHMARK_TITLE", "MZlgQM": "SOUNDPACK_ASMR_DESCRIPTION", "3SJZKD": "SOUNDPACK_ASMR_LABEL", "I39onu": "SOUNDPACK_BUBBLE_DESCRIPTION", @@ -16317,7 +15799,6 @@ "T+DNAA": "STAGE_CHANNEL_ACTIVITY_FEED_JOIN", "L9FN16": "STAGE_CHANNEL_AUDIENCE_COUNT", "obLqZ8": "STAGE_CHANNEL_AUDIENCE_MODAL_ACTION", - "5DRw+w": "STAGE_CHANNEL_AUDIENCE_MODAL_ALT_TEXT", "sBDfo6": "STAGE_CHANNEL_AUDIENCE_MODAL_BULLET_1", "x58YtH": "STAGE_CHANNEL_AUDIENCE_MODAL_BULLET_2", "XtVqla": "STAGE_CHANNEL_AUDIENCE_MODAL_BULLET_3", @@ -16378,10 +15859,6 @@ "L1pCBX": "STAGE_INVITE_SPEAKER_COUNT", "vyCHPF": "STAGE_IS_SPEAKING_HOOK", "bXChj+": "STAGE_IS_SPEAKING_ZERO_QUANTITY_HOOK", - "N3/OyV": "STAGE_MODERATOR_JOIN_MODAL_JOIN_AUDIENCE", - "Q8o/tb": "STAGE_MODERATOR_JOIN_MODAL_JOIN_SPEAKER", - "LQY4JX": "STAGE_MODERATOR_JOIN_MODAL_SUBTITLE", - "njetU0": "STAGE_MODERATOR_JOIN_MODAL_TITLE", "GMZqSi": "STAGE_MODERATOR_TOOLTIP", "zqxfrf": "STAGE_MUSIC_MUTE", "ScHlfl": "STAGE_MUSIC_UNMUTE", @@ -16392,7 +15869,6 @@ "sFzx0G": "STAGE_SPEAK_INVITE_BLOCKED_USERS", "1YDv7a": "STAGE_SPEAK_INVITE_DECLINE", "Ul1RJQ": "STAGE_SPEAK_INVITE_HEADER", - "ATpigW": "STAGE_SPEAK_INVITE_HEADER_BLOCKED_USERS", "Z+3bWy": "STAGE_SPEAK_INVITE_MODAL", "sqnsSP": "STAGE_SPEAK_INVITE_PUSH_NOTIFICATION", "xJjXxt": "STAGE_SPEAK_INVITE_SEND", @@ -16463,33 +15939,21 @@ "oF6+Ww": "START_VERIFICATION_BUTTON", "oCqlGG": "START_VIDEO_CALL", "focH1t": "START_VOICE_CALL", - "30yqZb": "STATUS_BRB", - "vkpn7+": "STATUS_CHILLING", + "er+FRD": "STATUS_A11Y_LABEL", "jaNpQH": "STATUS_DND", - "U9Vv16": "STATUS_DND_HELP", "day5A6": "STATUS_DND_HELP_FOCUS_MODE", - "UVSEhT": "STATUS_EATING", - "b6AscE": "STATUS_FOCUSING", - "lZslwM": "STATUS_GAMING", "qWbtVU": "STATUS_IDLE", "bg24HO": "STATUS_INVISIBLE", - "MqanVP": "STATUS_INVISIBLE_HELPER", - "l0q9/d": "STATUS_IN_TRANSIT", "74vS/x": "STATUS_LEAD_IN_JUST", "E13trI": "STATUS_MENU_LABEL", - "B+wavk": "STATUS_NONE", "Vv0abJ": "STATUS_OFFLINE", "WbGtnH": "STATUS_ONLINE", "9hghLD": "STATUS_ONLINE_MOBILE", "S90FuQ": "STATUS_POPOUT_CLEAR_STATUS", - "L/ZE8S": "STATUS_POPOUT_CUSTOM_TITLE", - "IN2LTm": "STATUS_POPOUT_EDIT_CUSTOM", - "UDg0qD": "STATUS_POPOUT_SET_CUSTOM", "XKYej5": "STATUS_STREAMING", "WkBM43": "STATUS_TAB_A11Y_ACTION", "UQMV/E": "STATUS_UNKNOWN", "BWD8fs": "STATUS_UNTIL", - "di6IF5": "STATUS_WATCHING", "tCQ3H8": "STEP_NUMBER", "fT+Yjp": "STICKER", "Xp+X2U": "STICKERS_ALWAYS_ANIMATE", @@ -16506,6 +15970,7 @@ "IGu8x3": "STICKERS_NEVER_ANIMATE", "05Z/0l": "STICKERS_YOU_MIGHT_LIKE", "wbfJFh": "STICKERS_YOU_MIGHT_LIKE_A11Y", + "GCEruV": "STICKER_A11Y_HINT", "rk6pOw": "STICKER_A11Y_LABEL", "tWYWJ+": "STICKER_ASSET_LOAD_ERROR", "rZpidU": "STICKER_BUTTON_LABEL", @@ -16755,7 +16220,6 @@ "1uAmCw": "SUGGESTED_FRIENDS_LIST_HEADER", "qm9dSj": "SUGGESTIONS", "9rJKF7": "SUGGEST_SLASH_COMMANDS", - "rIzKh7": "SUGGEST_STICKERS", "q21fUr": "SUMMARIES", "I3yTDn": "SUMMARIES_ACITONS_SHARE_CONTENT", "gvkcQl": "SUMMARIES_ACITONS_SHARE_FAILED", @@ -16870,13 +16334,11 @@ "5j2by3": "SUPPRESS_EMBED_TIP", "VL1KOk": "SUPPRESS_EMBED_TITLE", "RO/KYj": "SUPPRESS_NOTIFICATIONS_TOOLTIP", + "gLp+Wj": "SUSPENDED_USER_MESSAGE_COUNT", "L9yFko": "SUSPICIOUS_DOWNLOAD_WARNING_BODY", "j7Vi2i": "SUSPICIOUS_DOWNLOAD_WARNING_CANCEL", "/bHu89": "SUSPICIOUS_DOWNLOAD_WARNING_DOWNLOAD", "XtDo9Z": "SUSPICIOUS_DOWNLOAD_WARNING_TITLE", - "J2Ftvj": "SWIPE_TO_REPLY", - "xPmJly": "SWIPE_TO_REPLY_COACHMARK", - "Tp1FWJ": "SWIPE_TO_REPLY_HINT", "DSN+hw": "SWITCH_ACCOUNTS_ACTION_LOG_IN", "Wf421J": "SWITCH_ACCOUNTS_ACTION_SWITCH", "seV8yt": "SWITCH_ACCOUNTS_ACTIVE_ACCOUNT", @@ -16949,14 +16411,8 @@ "xH8qGO": "SYSTEM_MESSAGE_CHANNEL_FOLLOW_ADD_IOS", "wypJZ0": "SYSTEM_MESSAGE_CHANNEL_ICON_CHANGE", "OEdU6X": "SYSTEM_MESSAGE_CHANNEL_ICON_CHANGE_HOOK", - "fwn2M9": "SYSTEM_MESSAGE_CHANNEL_LINKED_TO_LOBBY", - "Y/+SvO": "SYSTEM_MESSAGE_CHANNEL_LINKED_TO_LOBBY_MOBILE", "XCPMEG": "SYSTEM_MESSAGE_CHANNEL_NAME_CHANGE", "oItgEw": "SYSTEM_MESSAGE_CHANNEL_NAME_CHANGE2", - "UoHq/T": "SYSTEM_MESSAGE_CONSUMABLE_HD_STREAMING_EMBED_BODY", - "AeU3uO": "SYSTEM_MESSAGE_CONSUMABLE_HD_STREAMING_EMBED_TITLE", - "N6rchA": "SYSTEM_MESSAGE_CONSUMABLE_HD_STREAMING_IMG_ALT", - "5bYXjv": "SYSTEM_MESSAGE_CONSUMABLE_HD_STREAMING_STARTED", "qa0e/n": "SYSTEM_MESSAGE_FORUM_POST_TITLE_CHANGE", "SOQ4hJ": "SYSTEM_MESSAGE_FORUM_POST_TITLE_CHANGE2", "zdBCIv": "SYSTEM_MESSAGE_GET_GAMING_STATS", @@ -17111,11 +16567,13 @@ "sPqvX5": "TEXT_PERMISSIONS", "9W3Guf": "THB_NAME", "Ksh3ik": "THEME", + "SMPT1k": "THEME_ASH", "b8Cei3": "THEME_DARK", "Jae48E": "THEME_DISABLED_FOR_CONTRAST_SYNC", "AUMSZP": "THEME_DISABLED_FOR_FORCED_COLORS", "K2sFfo": "THEME_LIGHT", "pQwSpQ": "THEME_MIDNIGHT", + "Do4ZJx": "THEME_ONYX", "B6GPzA": "THEME_PICKER_ACTIVITY_TITLE_1", "YAgqmE": "THEME_PICKER_ACTIVITY_TITLE_2", "mK5Zd+": "THEME_PICKER_MESSAGE_AUTHOR_1", @@ -17198,6 +16656,7 @@ "6Qn11G": "THREAD_HEADER_NOTICE_ARCHIVED", "smD5c5": "THREAD_HEADER_NOTICE_JOIN", "rEeodK": "THREAD_HEADER_NOTICE_LOCKED", + "YbkB3U": "THREAD_IN", "s2rpNf": "THREAD_INVITABLE_TOGGLE_LABEL", "9/n5vz": "THREAD_MEMBER_LIST_EMPTY_STATE_HEADER", "emw8UP": "THREAD_MEMBER_LIST_EMPTY_STATE_SUBTEXT", @@ -17220,19 +16679,10 @@ "LR1C0a": "TIERED_TENURE_BADGE_BRONZE", "fuwTPm": "TIERED_TENURE_BADGE_DIAMOND", "qNhNk4": "TIERED_TENURE_BADGE_EMERALD", - "Wu9WJg": "TIERED_TENURE_BADGE_FIRE", "VkhVKS": "TIERED_TENURE_BADGE_GOLD", "gzUfNS": "TIERED_TENURE_BADGE_PLATINUM", "wvX+eD": "TIERED_TENURE_BADGE_RUBY", "rI1/3H": "TIERED_TENURE_BADGE_SILVER", - "1vEPKJ": "TIERED_TNURE_BADGE_BRONZE_TOOLTIP", - "yUxtHG": "TIERED_TNURE_BADGE_DIAMOND_TOOLTIP", - "6FLaGe": "TIERED_TNURE_BADGE_EMERALD_TOOLTIP", - "2E+W8Z": "TIERED_TNURE_BADGE_FIRE_TOOLTIP", - "t5Yv90": "TIERED_TNURE_BADGE_GOLD_TOOLTIP", - "IppEDj": "TIERED_TNURE_BADGE_PLATINUM_TOOLTIP", - "qA7ah7": "TIERED_TNURE_BADGE_RUBY_TOOLTIP", - "1pri6t": "TIERED_TNURE_BADGE_SILVER_TOOLTIP", "GOmEb8": "TIME", "kEzA9E": "TIMEOUT_ERROR", "MlPTIi": "TIMEOUT_SUBMIT", @@ -17273,9 +16723,9 @@ "cqpdJW": "TOAST_IMAGE_SAVED", "R3o53R": "TOAST_MESSAGE_COPIED", "svRBmK": "TOAST_MESSAGE_ID_COPIED", - "wk1Ay3": "TOAST_REMIX_LANGUAGE_SUPPORT_WARNING", "FHVR/+": "TOAST_USERNAME_SAVED", "cEK+1g": "TOAST_VIDEO_SAVED", + "F4jZQs": "TODAY", "HK4JIu": "TOGGLE_CAMERA", "cIUqMm": "TOGGLE_DEAFEN", "UOACIY": "TOGGLE_DRAWER", @@ -17443,7 +16893,6 @@ "YjuMsf": "TWO_FA_WEBAUTHN_RENAME", "7asiR3": "TWO_FA_WEBAUTHN_RENAME_CREDENTIAL", "7yEgJY": "TWO_FA_WEBAUTHN_RENAME_FORM_NEW_KEY", - "Xb5JGo": "TWO_FA_WEBAUTHN_SHOULD_DO", "EeMRAt": "TWO_FA_WEBAUTHN_SWITCH_TOTP", "y7SXYX": "TWO_FA_WEBAUTHN_TITLE", "sKWmma": "TWO_FA_WEBAUTHN_VIEW_KEYS_TITLE", @@ -17536,7 +16985,6 @@ "vWkIII": "UNREADS_TUTORIAL_BODY", "vZPktJ": "UNREADS_TUTORIAL_HEADER", "9OB9hq": "UNREADS_VIEW_CHANNEL", - "abvB5N": "UNREAD_NOTIFICATION_SETTING_NOTICE", "o7FM1M": "UNREAD_NOTIFICATION_SETTING_NOTICE_ALL_MESSAGES", "i4xQ5o": "UNREAD_NOTIFICATION_SETTING_NOTICE_DESCRIPTION", "4MMKh2": "UNREAD_NOTIFICATION_SETTING_NOTICE_MENTION_ONLY", @@ -17586,7 +17034,6 @@ "Kf/MPH": "UPLOAD_AREA_PREMIUM_UPSELL_BODY_LINE_1_PREMIUM_TIER_1", "648rj0": "UPLOAD_AREA_PREMIUM_UPSELL_BODY_LINE_2", "AvXNH3": "UPLOAD_AREA_PREMIUM_UPSELL_BODY_LINE_2_INCREASE", - "htbuIR": "UPLOAD_AREA_PREMIUM_UPSELL_BODY_LINE_3", "ZcYwgR": "UPLOAD_AREA_PREMIUM_UPSELL_TIER_2", "5fMg2F": "UPLOAD_AREA_PREMIUM_UPSELL_TIER_2_V2", "c2XfpH": "UPLOAD_AREA_PREMIUM_UPSELL_WITH_SIZE_AND_ACTION", @@ -17614,7 +17061,6 @@ "fKBB8+": "UPLOAD_DEBUG_LOG_SUCCESS_HEADER", "DU0dy/": "UPLOAD_EMOJI", "bpycfA": "UPLOAD_EMOJI_INSTRUCTIONS", - "8Ql1Aw": "UPLOAD_ERROR_DESCRIPTION", "4rjikl": "UPLOAD_ERROR_RATE_LIMIT", "sp16MU": "UPLOAD_ERROR_RESIZE_GIF", "dq9aTi": "UPLOAD_ERROR_RETRY", @@ -17626,15 +17072,12 @@ "Xg6rYN": "UPLOAD_FILE_SUBTEXT", "MsUY/S": "UPLOAD_IMAGE", "DWUkB3": "UPLOAD_IMAGE_BODY", + "EbwFfR": "UPLOAD_LOGS", "My31tU": "UPLOAD_OPEN_FILE_FAILED", "i8HwxX": "UPLOAD_QUEUED", "dYP2Fc": "UPLOAD_TO", "RBBLhL": "UPLOAD_TO_NEW_POST", "gUx4eu": "UPLOAD_TO_NEW_THREAD", - "fuqnBC": "URF_LANDING_PAGE_REPORT_MESSAGE_BUTTON", - "F4jrRW": "URF_LANDING_PAGE_REPORT_USER_PROFILE_BUTTON", - "532l+q": "URF_LANDING_PAGE_SUBTITLE", - "Z11w18": "URF_LANDING_PAGE_TITLE", "MGWabA": "USAGE_STATISTICS_DISABLE_MODAL_BODY", "kYpG0u": "USAGE_STATISTICS_DISABLE_MODAL_CANCEL", "D3+rU4": "USAGE_STATISTICS_DISABLE_MODAL_CONFIRM", @@ -17642,6 +17085,7 @@ "kJGVtL": "USD_NAME", "KD6OJJ": "USER", "IEpCBQ": "USERNAME", + "wdY8Zz": "USERNAME_A11Y_LABEL", "ShEIEI": "USERNAME_AND_TAG", "GPfy3L": "USERNAME_REQUIRED", "GUVXCH": "USERNAME_SEARCH_BODY", @@ -17665,21 +17109,27 @@ "KV72oe": "USER_ACTIVITY_CLEAR_HISTORY_DISCLAIMER", "oSs8eg": "USER_ACTIVITY_CLEAR_LISTENING_HISTORY", "yX2hNy": "USER_ACTIVITY_CLEAR_WATCH_HISTORY", + "jaYS/h": "USER_ACTIVITY_CLOUD_PLAY_CTA", "OzCsIA": "USER_ACTIVITY_COMPETING_IN", "XWSHTb": "USER_ACTIVITY_CONNECT_PLATFORM", "04B8fB": "USER_ACTIVITY_CURRENTLY", "FMbL3s": "USER_ACTIVITY_DELETE_HISTORY_ERROR", "SQCo6D": "USER_ACTIVITY_HEADER_COMPETING", "5sYPnr": "USER_ACTIVITY_HEADER_LISTENING", + "ep6av7": "USER_ACTIVITY_HEADER_LISTENING_NOW", "Dzgz4u": "USER_ACTIVITY_HEADER_LIVE_ON_PLATFORM", "2TbM/G": "USER_ACTIVITY_HEADER_PLAYING", "iKo3yJ": "USER_ACTIVITY_HEADER_PLAYING_A_GAME", + "J4MQFX": "USER_ACTIVITY_HEADER_PLAYING_NOW", "A17aM8": "USER_ACTIVITY_HEADER_PLAYING_ON_PLATFORM", "ujoV/S": "USER_ACTIVITY_HEADER_STREAMING_TO_DM", "sddlGK": "USER_ACTIVITY_HEADER_STREAMING_TO_GUILD", "Ge29Zy": "USER_ACTIVITY_HEADER_WATCHING", + "xeqvTg": "USER_ACTIVITY_HEADER_WATCHING_NOW", + "ENbTKQ": "USER_ACTIVITY_HEADER_WATCHING_ON_PLATFORM", "VDODnv": "USER_ACTIVITY_INVITE_REQUEST_REQUESTED", "bl1Mz4": "USER_ACTIVITY_IN_A_CALL", + "GTfpaO": "USER_ACTIVITY_IN_VOICE", "bf6Ci7": "USER_ACTIVITY_JOINING", "ACyI83": "USER_ACTIVITY_JOIN_CALL", "kUEnxN": "USER_ACTIVITY_LISTENING", @@ -17692,7 +17142,10 @@ "hzg6Tk": "USER_ACTIVITY_MANAGE_SERVER_PRIVACY", "SqJBnN": "USER_ACTIVITY_NOT_DETECTED", "BMTj28": "USER_ACTIVITY_PLAYING", + "ZGax91": "USER_ACTIVITY_PLAY_ON_BATTLENET", "LEgD7t": "USER_ACTIVITY_PLAY_ON_PLATFORM", + "+KXAN0": "USER_ACTIVITY_PLAY_ON_RIOT", + "OlubC8": "USER_ACTIVITY_PLAY_ON_STEAM", "TdtyAq": "USER_ACTIVITY_RECENTLY_LISTENED_TO", "/+HOSR": "USER_ACTIVITY_RECENTLY_PLAYED", "KLzzAm": "USER_ACTIVITY_RECENTLY_WATCHED", @@ -17704,6 +17157,7 @@ "wgtd/b": "USER_ACTIVITY_STATUS_RECENTLY_PLAYED", "nCCdML": "USER_ACTIVITY_STATUS_RECENTLY_WATCHED", "Jpkr/q": "USER_ACTIVITY_STREAMING", + "HV97U/": "USER_ACTIVITY_STREAMING_NOW", "I/J7vI": "USER_ACTIVITY_TIMESTAMP_END", "JXDyAE": "USER_ACTIVITY_TIMESTAMP_END_SIMPLE", "M9Fexd": "USER_ACTIVITY_TIMESTAMP_START", @@ -17715,6 +17169,7 @@ "vQml+P": "USER_ACTIVITY_USER_PLAYING_FOR_MINUTES", "fIp/xJ": "USER_ACTIVITY_USER_PLAYING_FOR_SECONDS", "pD1L1u": "USER_ACTIVITY_VIEW_ALL_ACTIVITY", + "Hi4tob": "USER_ACTIVITY_VOICE_STATUS", "Lpv5i/": "USER_ACTIVITY_WATCH", "GpNXjC": "USER_ACTIVITY_WATCHING", "eyKDl5": "USER_ACTIVITY_WATCH_ALONG", @@ -17742,7 +17197,6 @@ "tiCXaH": "USER_DM_SPAM_FILTER_V2", "GdC+pn": "USER_DROPS_SETTINGS", "VkS7Yd": "USER_DROPS_SETTINGS_DROPS_OPTED_OUT", - "7Q2yX9": "USER_DROPS_SETTINGS_DROPS_OPTED_OUT_FORMATTED", "5htRLE": "USER_DROPS_SETTINGS_DROPS_OPTED_OUT_FORMATTED_V2", "TTzlcP": "USER_EXPLICIT_CONTENT_FILTER", "f+8JgS": "USER_EXPLICIT_CONTENT_FILTER_COACHMARK_ASSET_ALT", @@ -17785,35 +17239,55 @@ "1w6drw": "USER_POPOUT_PRONOUNS", "lwYRsE": "USER_POPOUT_WUMPUS_TOOLTIP", "jGoPJT": "USER_PROFILE_ABOUT_ME", + "PWeBgp": "USER_PROFILE_ACCOUNT_POPOUT_A11Y_LABEL", + "5fWB8U": "USER_PROFILE_ACCOUNT_POPOUT_BUTTON_A11Y_LABEL", "+zofAD": "USER_PROFILE_ACTION_MENU_A11Y_LABEL", "chq59f": "USER_PROFILE_ACTIVITY", "PlAQz1": "USER_PROFILE_ACTIVITY_ACTION_MENU_A11Y_LABEL", + "sjSitP": "USER_PROFILE_ACTIVITY_EMPTY_HEADING", + "AyMGXA": "USER_PROFILE_ACTIVITY_EMPTY_BODY_1", + "aAFW7V": "USER_PROFILE_ACTIVITY_EMPTY_BODY_2", + "h2g0cM": "USER_PROFILE_ACTIVITY_EMPTY_BODY_3", + "rrYh58": "USER_PROFILE_ACTIVITY_EMPTY_BODY_4", + "HX3K+F": "USER_PROFILE_ACTIVITY_EMPTY_BODY_5", + "/yW3aY": "USER_PROFILE_ACTIVITY_EMPTY_BODY_6", + "PmL/v0": "USER_PROFILE_ACTIVITY_EMPTY_BODY_7", + "IALa3h": "USER_PROFILE_ACTIVITY_EMPTY_BODY_8", + "HRcTFL": "USER_PROFILE_ACTIVITY_EMPTY_BODY_9", + "NuCqPt": "USER_PROFILE_ACTIVITY_EMPTY_BODY_10", + "M1tw+4": "USER_PROFILE_ACTIVITY_EMPTY_BODY_11", + "UBm1y2": "USER_PROFILE_ACTIVITY_EMPTY_BODY_12", + "Cu95PQ": "USER_PROFILE_ACTIVITY_EMPTY_BODY_13", + "R/wFuh": "USER_PROFILE_ACTIVITY_EMPTY_BODY_14", + "HQPAVT": "USER_PROFILE_ACTIVITY_EMPTY_BODY_15", + "YolGh4": "USER_PROFILE_ACTIVITY_EMPTY_BODY_16", "KmzwCY": "USER_PROFILE_ACTIVITY_LISTENING_TO", - "LQ32TR": "USER_PROFILE_ACTIVITY_REACT_COACHMARK_BODY", - "XDBiPX": "USER_PROFILE_ACTIVITY_REACT_COACHMARK_TITLE", "M0zgnT": "USER_PROFILE_ACTIVITY_RECENT_ACTIVITY", "7815ae": "USER_PROFILE_ADD_FRIEND", "icyMgc": "USER_PROFILE_ADD_ROLE", - "HEGlIN": "USER_PROFILE_ALL_REACT_COACHMARK_BODY", "rfSHng": "USER_PROFILE_AUDIO", - "65191r": "USER_PROFILE_AVATAR_REACT_COACHMARK_BODY", - "3FagAa": "USER_PROFILE_AVATAR_REACT_COACHMARK_TITLE", - "uBvD/1": "USER_PROFILE_BLOCKED_MODAL_BODY_CONFIRMATION", - "20WzZ0": "USER_PROFILE_BLOCKED_PANEL_BODY_CONFIRMATION", - "LXbngv": "USER_PROFILE_BLOCKED_PANEL_BODY_USERNAME", + "ZzAR2Y": "USER_PROFILE_BIO", "jpewdz": "USER_PROFILE_BLOCKED_SPEED_BUMP_ACTION_SHEET_BODY", + "nNOAcW": "USER_PROFILE_BLOCKED_SPEED_BUMP_ACTION_SHEET_BODY_V2", "TsoMyv": "USER_PROFILE_BLOCKED_SPEED_BUMP_ACTION_SHEET_BUTTON", "Kn2UDE": "USER_PROFILE_BLOCKED_SPEED_BUMP_ACTION_SHEET_NOTIFIED", "QxrDY1": "USER_PROFILE_BLOCKED_SPEED_BUMP_ACTION_SHEET_STILL_BLOCKED", "VNJ7UJ": "USER_PROFILE_BLOCKED_SPEED_BUMP_ACTION_SHEET_TITLE", + "J6STd9": "USER_PROFILE_CURRENT_ACTIVITY", "dQqmbk": "USER_PROFILE_DISCORD_MEMBER_SINCE", "9t7w53": "USER_PROFILE_DISCORD_MEMBER_SINCE_A11Y_LABEL", + "OEgx/4": "USER_PROFILE_EDIT_WISHLIST", "EIYbj6": "USER_PROFILE_ENTRY_POINTS_AMP_UP_YOUR_PROFILE", + "BhjXCp": "USER_PROFILE_ENTRY_POINTS_BROWSE_SHOP", + "6Xcq+Y": "USER_PROFILE_ENTRY_POINTS_DISMISS_OFFER", "x6rkDp": "USER_PROFILE_ENTRY_POINTS_GET_PREMIUM", "b2d0N0": "USER_PROFILE_ENTRY_POINTS_SHOP", + "Xa11Ep": "USER_PROFILE_ENTRY_POINTS_VIEW_PERK", "0Q61kF": "USER_PROFILE_ENTRY_POINTS_VIEW_PERKS", "AnlV9W": "USER_PROFILE_ENTRY_POINTS_VIEW_PREMIUM_PERKS", "LxVK/K": "USER_PROFILE_FAILURE_TO_OPEN_MESSAGE", + "GHLrQ/": "USER_PROFILE_FEATURED", + "tsSLZ9": "USER_PROFILE_FULL_PROFILE_A11Y_LABEL", "y6EnGD": "USER_PROFILE_GO_TO_DM", "GqXUt1": "USER_PROFILE_GO_TO_DMS", "FdLNDK": "USER_PROFILE_GUILD_MEMBER_SINCE_A11Y_LABEL", @@ -17824,24 +17298,43 @@ "Q1lNel": "USER_PROFILE_IN_A_STAGE", "hq/Qze": "USER_PROFILE_IN_GUILD_DETAILS", "3xHUJ+": "USER_PROFILE_IN_THIS_CALL", + "ozoE2A": "USER_PROFILE_JOIN_CALL", + "rALMNg": "USER_PROFILE_JOIN_STAGE", + "xhnv29": "USER_PROFILE_JOIN_VOICE", "p3Q9Y2": "USER_PROFILE_LOAD_ERROR", + "LXw470": "USER_PROFILE_MAIN", "a6XYD9": "USER_PROFILE_MEMBER_SINCE", "+EERMk": "USER_PROFILE_MENU_HELP", "zROXEV": "USER_PROFILE_MESSAGE", "3N/J2i": "USER_PROFILE_MODAL", "EApw/R": "USER_PROFILE_MOD_ACTIONS", + "f5KLNm": "USER_PROFILE_MUTUALS", "5s9jl+": "USER_PROFILE_MUTUAL_FRIENDS", "l2/aLi": "USER_PROFILE_MUTUAL_FRIENDS_AND_SERVERS", + "RnD2yZ": "USER_PROFILE_MUTUAL_FRIENDS_EMPTY_HEADING", + "madJdE": "USER_PROFILE_MUTUAL_FRIENDS_EMPTY_BODY_1", + "NYmfoP": "USER_PROFILE_MUTUAL_FRIENDS_EMPTY_BODY_2", + "R2PaCg": "USER_PROFILE_MUTUAL_FRIENDS_EMPTY_BODY_3", + "laSR8h": "USER_PROFILE_MUTUAL_FRIENDS_EMPTY_BODY_4", + "DnsJE8": "USER_PROFILE_MUTUAL_FRIENDS_EMPTY_BODY_5", "0mTJ3j": "USER_PROFILE_MUTUAL_FRIENDS_PLACEHOLDER", "eE3oep": "USER_PROFILE_MUTUAL_GUILDS", + "bFgqYJ": "USER_PROFILE_MUTUAL_GUILDS_EMPTY_HEADING", + "nFSbeE": "USER_PROFILE_MUTUAL_GUILDS_EMPTY_BODY_1", + "gTcxOz": "USER_PROFILE_MUTUAL_GUILDS_EMPTY_BODY_2", + "8T0wYj": "USER_PROFILE_MUTUAL_GUILDS_EMPTY_BODY_3", + "BIHl1g": "USER_PROFILE_MUTUAL_GUILDS_EMPTY_BODY_4", + "jhBm0+": "USER_PROFILE_MUTUAL_GUILDS_EMPTY_BODY_5", "4lTDZq": "USER_PROFILE_MUTUAL_GUILDS_PLACEHOLDER", "GTugLy": "USER_PROFILE_NOTIFICATION_BODY", "n9g3ay": "USER_PROFILE_NO_MUTUAL_FRIENDS", "jpY0X5": "USER_PROFILE_NO_MUTUAL_SERVERS", + "7hwn2A": "USER_PROFILE_OPEN_CALL", + "Acqcot": "USER_PROFILE_OPEN_STAGE", "g6pBAk": "USER_PROFILE_OPEN_STAGE_CHANNEL", + "BXxdl7": "USER_PROFILE_OPEN_VOICE", "L8CBnK": "USER_PROFILE_PENDING", - "yzj+du": "USER_PROFILE_PROFILES_REACT_COACHMARK_BODY", - "R/RaK3": "USER_PROFILE_PROFILES_REACT_COACHMARK_TITLE", + "fMm5q/": "USER_PROFILE_PENDING_REQUEST", "GI2A8C": "USER_PROFILE_PRONOUNS", "EUFEJt": "USER_PROFILE_REACTED_TO_ACTIVITY", "E6H15q": "USER_PROFILE_REACTED_TO_AVATAR", @@ -17851,8 +17344,7 @@ "bSe71F": "USER_PROFILE_REACT_TO_ACTIVITY_A11Y_LABEL", "fEUP/i": "USER_PROFILE_REACT_TO_AVATAR_A11Y_LABEL", "TKdBC8": "USER_PROFILE_REACT_TO_STATUS_A11Y_LABEL", - "mU+JXL": "USER_PROFILE_RECENT_ACTIVITY_EDUCATION_TOOLTIP_BODY", - "ZQJ62/": "USER_PROFILE_RECENT_ACTIVITY_EDUCATION_TOOLTIP_HEADER", + "jzgEoL": "USER_PROFILE_RECENT_ACTIVITY", "oR/8OI": "USER_PROFILE_RECENT_ACTIVITY_INFORMATION_TOOLTIP", "u3RVsH": "USER_PROFILE_REMOVE_ROLE", "WmvMCo": "USER_PROFILE_REPLIED_TO_ACTIVITY", @@ -17871,12 +17363,13 @@ "nhaI4b": "USER_PROFILE_SEND_REACTION", "5sVnB4": "USER_PROFILE_SETTINGS_SHOP_FOR_ALL_BANNER_HEADER", "x/MGHU": "USER_PROFILE_SETTINGS_SHOP_FOR_ALL_BANNER_SUBHEADER", - "MYYTWb": "USER_PROFILE_STATUS_REACT_COACHMARK_BODY", - "X/My/u": "USER_PROFILE_STATUS_REACT_COACHMARK_TITLE", "QEW8Mq": "USER_PROFILE_TOAST_VIEW", "mBZL1y": "USER_PROFILE_VIDEO", "YDiPq8": "USER_PROFILE_VIEW_FULL_BIO", "cyOg4I": "USER_PROFILE_VOLUME", + "7lZ31J": "USER_PROFILE_WISHLIST", + "BCi1gT": "USER_PROFILE_WISHLIST_SUGGESTED_GIFTS", + "y6PSA3": "USER_PROFILE_WISHLIST_VIEW_ALL", "4bk9Ak": "USER_RECENT_ACTIVITY_LEARN_MORE", "HEQggW": "USER_RECENT_ACTIVITY_ONLY_YOU_CAN_SEE", "kviQkj": "USER_RECENT_ACTIVITY_SHARE_MULTIPLE_PLACES", @@ -17915,7 +17408,6 @@ "8peUT0": "USER_SETTINGS_ACCOUNT_EDIT_EMAIL_A11Y_LABEL", "YDabSe": "USER_SETTINGS_ACCOUNT_EDIT_PHONE_A11Y_LABEL", "JECa91": "USER_SETTINGS_ACCOUNT_EDIT_USERNAME_A11Y_LABEL", - "vQuLOt": "USER_SETTINGS_ACCOUNT_EMAIL_DESCRIPTION_NO_LINK", "nqTD4d": "USER_SETTINGS_ACCOUNT_HIDE_EMAIL_A11Y_LABEL", "jllbv+": "USER_SETTINGS_ACCOUNT_HIDE_PHONE_A11Y_LABEL", "pKSjEj": "USER_SETTINGS_ACCOUNT_PASSWORD_AND_AUTHENTICATION", @@ -17945,18 +17437,29 @@ "NSTmdO": "USER_SETTINGS_ADD_BANNER_SPECS", "qxk9zo": "USER_SETTINGS_ADD_EMAIL_CLAIM", "evw0oz": "USER_SETTINGS_ADD_STATUS", + "mFgsfg": "USER_SETTINGS_AGE_CONFIRMATION_NOTICE", "xZ0Wot": "USER_SETTINGS_ANIMATED_AVATAR_UPSELL", "L3UPqR": "USER_SETTINGS_ANIMATED_AVATAR_UPSELL_DESCRIPTION", "eY1X1e": "USER_SETTINGS_APPEARANCE_CHANNEL_LIST_LAYOUT", "7iegX4": "USER_SETTINGS_APPEARANCE_CHANNEL_LIST_LAYOUT_COMPACT", "T7G4Y0": "USER_SETTINGS_APPEARANCE_CHANNEL_LIST_LAYOUT_COZY", "KOxrLW": "USER_SETTINGS_APPEARANCE_CHANNEL_LIST_LAYOUT_HYBRID", + "4cuYHx": "USER_SETTINGS_APPEARANCE_CHANNEL_LIST_LAYOUT_SPACIOUS", "OAOUoQ": "USER_SETTINGS_APPEARANCE_CHANNEL_LIST_PREVIEWS", "8K53DF": "USER_SETTINGS_APPEARANCE_CHANNEL_LIST_PREVIEWS_ALL", "R2Ok7F": "USER_SETTINGS_APPEARANCE_CHANNEL_LIST_PREVIEWS_NONE", "Gw11zg": "USER_SETTINGS_APPEARANCE_CHANNEL_LIST_PREVIEWS_UNREADS", + "0EzVst": "USER_SETTINGS_APPEARANCE_DEFAULT_THEMES_TITLE", + "PV3dGX": "USER_SETTINGS_APPEARANCE_DEFAULT_THEMES_DESCRIPTION", "OCOOiI": "USER_SETTINGS_APPEARANCE_GRADIENT_THEME_TITLE", "RPh2ou": "USER_SETTINGS_APPEARANCE_IN_APP_ICON_TITLE", + "p7eUrb": "USER_SETTINGS_APPEARANCE_MESSAGE_GROUP_SPACING_DESCRIPTION", + "u9N6Qh": "USER_SETTINGS_APPEARANCE_MESSAGE_SPACING_DESCRIPTION", + "2ed/sA": "USER_SETTINGS_APPEARANCE_MESSAGE_SPACING_TITLE", + "QntEEG": "USER_SETTINGS_APPEARANCE_MESSAGE_DISPLAY_DESCRIPTION", + "nKRoPv": "USER_SETTINGS_APPEARANCE_MESSAGE_DISPLAY_TITLE", + "1JNcPS": "USER_SETTINGS_APPEARANCE_MESSAGE_DISPLAY_COMPACT", + "Jqj4cZ": "USER_SETTINGS_APPEARANCE_MESSAGE_DISPLAY_DEFAULT", "oZxkEq": "USER_SETTINGS_APPEARANCE_PREVIEW_MESSAGE_1", "WGb/v7": "USER_SETTINGS_APPEARANCE_PREVIEW_MESSAGE_2_DARK", "62m4mz": "USER_SETTINGS_APPEARANCE_PREVIEW_MESSAGE_2_LIGHT", @@ -17965,6 +17468,10 @@ "hK9QW/": "USER_SETTINGS_APPEARANCE_PREVIEW_MESSAGE_5", "qYXrkX": "USER_SETTINGS_APPEARANCE_PREVIEW_THEMES_TITLE", "E+COuA": "USER_SETTINGS_APPEARANCE_PREVIEW_THEME_TITLE", + "0Yh+ZX": "USER_SETTINGS_APPEARANCE_SCALING_TITLE", + "QLZhYk": "USER_SETTINGS_APPEARANCE_SPACING_DESCRIPTION", + "C/5V0A": "USER_SETTINGS_APPEARANCE_SPACING_TITLE", + "ip0uSf": "USER_SETTINGS_APPEARANCE_ZOOM_DESCRIPTION", "OMkSUo": "USER_SETTINGS_APPEARANCE_ZOOM_TIP", "6EjbvA": "USER_SETTINGS_AUTOMATIC_GAIN_CONTROL", "zdzyFo": "USER_SETTINGS_AVAILABLE_CODES", @@ -17979,20 +17486,19 @@ "nnsFif": "USER_SETTINGS_BLOCKED_USERS_EMPTY", "1rzius": "USER_SETTINGS_BLOCKED_USERS_HEADER", "PR/xUz": "USER_SETTINGS_BLOCKED_USERS_UNBLOCKBUTTON", + "PFOUKW": "USER_SETTINGS_BLOCKED_USERS_V2", "23xR5w": "USER_SETTINGS_CACHES_CLEARED", "GgUIfl": "USER_SETTINGS_CACHES_WRITTEN", "4OynCD": "USER_SETTINGS_CHANGE_AVATAR", - "Tna/TZ": "USER_SETTINGS_CHANGE_AVATAR_DECORATION", - "0nEVoB": "USER_SETTINGS_CHANGE_PROFILE_EFFECT", "emkU7O": "USER_SETTINGS_CHOOSE_FROM_LIBRARY", "ZImm/x": "USER_SETTINGS_CHOOSE_GUILD_TITLE", - "h0hFx5": "USER_SETTINGS_CLOSE_BUTTON", "SUnWBB": "USER_SETTINGS_CONFIRM_LOGOUT", "aBZ/oQ": "USER_SETTINGS_CONTACT_DISCOVERY_TITLE", "R3Ro5D": "USER_SETTINGS_COPIED", "KXLX7l": "USER_SETTINGS_CUSTOMIZATION_UPGRADE_UPSELL", "mr4K7D": "USER_SETTINGS_CUSTOMIZATION_UPSELL", "hZkfwY": "USER_SETTINGS_CUSTOMIZE_PROFILE_EXAMPLE_BUTTON", + "FjN+et": "USER_SETTINGS_DEBUG_LOGGING_SETTINGS", "C8qfkr": "USER_SETTINGS_DELETE_AVATAR", "LoOB1F": "USER_SETTINGS_DISABLE_ADVANCED_VOICE_ACTIVITY", "gSV1nA": "USER_SETTINGS_DISABLE_NOISE_SUPPRESSION", @@ -18034,7 +17540,6 @@ "vNpUMz": "USER_SETTINGS_GAMES_SHORTCUTS_START_MENU", "cpYp0H": "USER_SETTINGS_GAMES_SHORTCUTS_START_MENU_NOTE", "7j5bMU": "USER_SETTINGS_GUILD_ROLE_SUBSCRIPTION_CANCEL_TITLE", - "k0R+4T": "USER_SETTINGS_HYPESQUAD", "UUpAD6": "USER_SETTINGS_KEYBINDS_ACTION", "hDhbb3": "USER_SETTINGS_KEYBINDS_CHAT_SECTION_TITLE", "Lz5KHI": "USER_SETTINGS_KEYBINDS_DEFAULT_KEYBINDS_TITLE", @@ -18070,6 +17575,7 @@ "mVuX+j": "USER_SETTINGS_MINIMIZE_TO_TRAY_BODY", "abLFes": "USER_SETTINGS_MINIMIZE_TO_TRAY_LABEL", "JAIM/m": "USER_SETTINGS_MY_ACCOUNT", + "x5CoXR": "USER_SETTINGS_NAMEPLATE", "TtE6v5": "USER_SETTINGS_NOISE_CANCELLATION", "najZCV": "USER_SETTINGS_NOISE_CANCELLATION_DESCRIPTION", "wkYAlz": "USER_SETTINGS_NOISE_CANCELLATION_DISABLED", @@ -18124,10 +17630,7 @@ "ZC0x75": "USER_SETTINGS_PRONOUNS_EDIT_A11Y_LABEL", "f8pw2S": "USER_SETTINGS_PRONOUNS_HINT", "twB3fz": "USER_SETTINGS_REMOVE_AVATAR", - "GReZ6D": "USER_SETTINGS_REMOVE_AVATAR_DECORATION", "tT9n7D": "USER_SETTINGS_REMOVE_BANNER", - "GsW4/o": "USER_SETTINGS_REMOVE_PER_GUILD_AVATAR_DECORATION", - "Ld+f5T": "USER_SETTINGS_REMOVE_PROFILE_EFFECT", "TDjKDm": "USER_SETTINGS_RESET_AVATAR", "jHlJNS": "USER_SETTINGS_RESET_BANNER", "L+GmoR": "USER_SETTINGS_RESET_PROFILE_THEME", @@ -18146,11 +17649,9 @@ "kbFsAD": "USER_SETTINGS_SOUNDBOARD_VOLUME", "FrC28a": "USER_SETTINGS_SOUNDBOARD_VOLUME_DESCRIPTION", "BPbGq7": "USER_SETTINGS_SOUNDBOARD_VOLUME_DESCRIPTION_WITH_LINK", - "w/vU5q": "USER_SETTINGS_STARTUP_BEHAVIOR", + "w9Hq8O": "USER_SETTINGS_SOUNDMOJI", "o2FSjB": "USER_SETTINGS_START_MINIMIZED_BODY", "n7Yjes": "USER_SETTINGS_START_MINIMIZED_LABEL", - "4rmZnx": "USER_SETTINGS_STREAMER_NOTICE_BODY", - "bxGbHL": "USER_SETTINGS_STREAMER_NOTICE_TITLE", "OBwCXF": "USER_SETTINGS_STREAM_PREVIEWS", "/gs+Pz": "USER_SETTINGS_SUBSCRIPTIONS_HEADER", "SpAQib": "USER_SETTINGS_TRY_IT_OUT", @@ -18167,24 +17668,20 @@ "DLKpps": "USER_SETTINGS_UPLOAD_AVATAR", "FkFLDN": "USER_SETTINGS_USED_BACKUP_CODES", "7vhiqk": "USER_SETTINGS_USER_PROFILE", - "GJ3Fcn": "USER_SETTINGS_USE_DEFAULT_PROFILE_EFFECT", "HVvn5T": "USER_SETTINGS_VOICE_ADD_MULTIPLE", "2nDAzN": "USER_SETTINGS_VOICE_CODEC_DESCRIPTION", "DSGmey": "USER_SETTINGS_VOICE_CODEC_TITLE", "4I0qzZ": "USER_SETTINGS_VOICE_EXPERIMENTAL_SOUNDSHARE_LABEL", - "Sln58X": "USER_SETTINGS_VOICE_HARDWARE_ENCODING", "I6OnJ3": "USER_SETTINGS_VOICE_MIC_TEST_BUTTON_ACTIVE", "c4qHt6": "USER_SETTINGS_VOICE_MIC_TEST_BUTTON_INACTIVE", "8hhsCU": "USER_SETTINGS_VOICE_MIC_TEST_DESCRIPTION", "gyljWE": "USER_SETTINGS_VOICE_MIC_TEST_TITLE", "bp3JOV": "USER_SETTINGS_VOICE_MIC_TEST_VOICE_CAPTION", "MA+OZh": "USER_SETTINGS_VOICE_MIC_TEST_VOICE_NO_INPUT_NOTICE", - "71Ve1y": "USER_SETTINGS_VOICE_OPEN_H264", "YkepGR": "USER_SETTINGS_VOICE_PRIVACY_NOTE", "/6sFWa": "USER_SETTINGS_VOICE_PRIVACY_NOTE_V2", "Me5lVK": "USER_SETTINGS_VOICE_PRIVACY_TITLE", "ie1mgY": "USER_SETTINGS_VOICE_SYSTEM_PICKER_LABEL", - "Tceiqx": "USER_SETTINGS_VOICE_VIDEO_CODEC_TITLE", "GmWk2E": "USER_SETTINGS_VOICE_VIDEO_HOOK_LABEL", "ZkDZov": "USER_SETTINGS_WINDOWS_SETTINGS", "Gzh6ZP": "USER_SETTINGS_WITH_BUILD_OVERRIDE", @@ -18222,8 +17719,6 @@ "AInv5m": "USE_THREADS_SIDEBAR_DESCRIPTION", "08zAV7": "USE_VAD", "mcwtcJ": "USE_VAD_DESCRIPTION", - "XOWfNn": "UU_FORCE_MIGRATION_EXISTING_FLOW_REMINDER_BODY_1", - "g/gkA4": "UU_FORCE_MIGRATION_EXISTING_FLOW_REMINDER_BODY_2", "NgL2GX": "UU_REGISTER_AGE_GATE_HEADER", "WeJZyy": "UU_REGISTER_DISPLAY_NAME_ERROR", "LYIh7j": "UU_REGISTER_DISPLAY_NAME_HEADER", @@ -18395,7 +17890,9 @@ "dBJVnZ": "VISIT_THE_SHOP_CTA", "mEwyko": "VND_NAME", "K3lovD": "VOICE", + "wtk08S": "VOICE_ACTIVITY_NOTIFICATIONS", "B1fFpf": "VOICE_AND_VIDEO", + "dsXapM": "VOICE_AND_VIDEO_SETTINGS", "MKWIHc": "VOICE_BACKGROUND_BLUE_SLUSH", "AttHyY": "VOICE_BACKGROUND_BLUE_WORLD", "GrfFce": "VOICE_BACKGROUND_DEBIL", @@ -18419,22 +17916,32 @@ "rMUL3+": "VOICE_CHANNELS_MATCHING", "ePyoY2": "VOICE_CHANNEL_ACTIVITY_STATUS_REDIRECT", "fDlr+F": "VOICE_CHANNEL_BAR_ACTIVE", + "aTORmE": "VOICE_CHANNEL_BLOCKED_AND_IGNORED_USER_JOIN_WARNING", + "LXFz18": "VOICE_CHANNEL_BLOCKED_AND_IGNORED_USER_JOIN_WARNING_DESCRIPTION", + "X/iIjg": "VOICE_CHANNEL_BLOCKED_AND_IGNORED_USER_JOIN_WARNING_V2", "+4O9nX": "VOICE_CHANNEL_BLOCKED_USER_AUDIBLE", + "tFvYm+": "VOICE_CHANNEL_BLOCKED_USER_JOIN_WARNING_DESCRIPTION", + "WgQ12s": "VOICE_CHANNEL_BLOCKED_USER_JOIN_WARNING_V2", + "J/ZBu9": "VOICE_CHANNEL_BLOCKED_USER_JOIN_WARNING", "zecN6A": "VOICE_CHANNEL_BLOCKED_USER_PRESENT_MODAL_HEADING", + "cpgfFk": "VOICE_CHANNEL_BLOCKED_USER_WARNING", "X6MrUZ": "VOICE_CHANNEL_BLOCKED_USER_WARNING_ALERT", "LGnmpf": "VOICE_CHANNEL_BLOCKED_USER_WARNING_ALERT_V2", "K8YIga": "VOICE_CHANNEL_BLOCKED_USER_WARNING_DESCRIPTION", "Trz9Jj": "VOICE_CHANNEL_BLOCKED_USER_WARNING_DONT_JOIN", + "rOXspL": "VOICE_CHANNEL_BLOCKED_USER_WARNING_DONT_JOIN_V2", "JLbzAI": "VOICE_CHANNEL_BLOCKED_USER_WARNING_JOINED", "kiODyN": "VOICE_CHANNEL_BLOCKED_USER_WARNING_JOIN_ANYWAY", "2qxuBK": "VOICE_CHANNEL_BLOCKED_USER_WARNING_JOIN_DESCRIPTION", "zPUmzZ": "VOICE_CHANNEL_BLOCKED_USER_WARNING_JOIN_MODAL", "Y56/oK": "VOICE_CHANNEL_BLOCKED_USER_WARNING_LEAVE", + "UKQ4Cn": "VOICE_CHANNEL_BLOCKED_USER_WARNING_LEAVE_DESCRIPTION", "1/gpFh": "VOICE_CHANNEL_BLOCKED_USER_WARNING_LEAVE_MODAL", "F/rzQH": "VOICE_CHANNEL_BLOCKED_USER_WARNING_LEAVE_V2", "w0YvUo": "VOICE_CHANNEL_BLOCKED_USER_WARNING_PRESENCE", "Z+/hfb": "VOICE_CHANNEL_BLOCKED_USER_WARNING_STAY", "bCcJST": "VOICE_CHANNEL_BLOCKED_USER_WARNING_STAY_V2", + "QnTzrp": "VOICE_CHANNEL_BLOCKED_USER_WARNING_V2", "7jN3FC": "VOICE_CHANNEL_BLOCKED_USER_WILL_BEAUDIBLE", "vA+uEs": "VOICE_CHANNEL_CHANGE_CONFIRMATION_BODY", "0LZN5F": "VOICE_CHANNEL_CHANGE_CONFIRMATION_HEADER", @@ -18442,26 +17949,21 @@ "NjmiOL": "VOICE_CHANNEL_DEAFENED", "d7PYNq": "VOICE_CHANNEL_DESC", "qOMFy+": "VOICE_CHANNEL_EFFECTS", - "D8Drx5": "VOICE_CHANNEL_EFFECTS_COOLDOWN", - "Nn8lP/": "VOICE_CHANNEL_EFFECTS_HOTBAR_TITLE", - "RLHsH7": "VOICE_CHANNEL_EFFECTS_MORE", "tjoj9E": "VOICE_CHANNEL_EFFECTS_NOTICE_BETA_TAG", "yNrzLB": "VOICE_CHANNEL_EFFECTS_NOTICE_DESCRIPTION_2", "o2rR0r": "VOICE_CHANNEL_EFFECTS_NOTICE_TITLE_2", - "S2RGUI": "VOICE_CHANNEL_EFFECTS_REDUCED_MOTION_TOOLTIP_BODY", - "VzO6Ot": "VOICE_CHANNEL_EFFECTS_REDUCED_MOTION_TOOLTIP_CANCEL", - "fgVzkI": "VOICE_CHANNEL_EFFECTS_REDUCED_MOTION_TOOLTIP_CONFIRM", - "6gGHnX": "VOICE_CHANNEL_EFFECTS_REDUCED_MOTION_TOOLTIP_TITLE", "HRSsUW": "VOICE_CHANNEL_EFFECTS_SPARKLE_TOOLTIP", - "ktEv/n": "VOICE_CHANNEL_EFFECTS_TOGGLE", - "oF6B0F": "VOICE_CHANNEL_EFFECTS_TOGGLE_TADA_ALT", - "GB2x0k": "VOICE_CHANNEL_EFFECTS_TOGGLE_TOOLTIP_DISABLED", - "CfapQY": "VOICE_CHANNEL_EFFECTS_TOGGLE_TOOLTIP_ENABLED", - "fe05NG": "VOICE_CHANNEL_EFFECTS_TOGGLE_UPSELL", "7aNIkW": "VOICE_CHANNEL_EFFECTS_UPSELL_BODY_2", "GJWF2O": "VOICE_CHANNEL_EFFECTS_UPSELL_CTA", "K49fZH": "VOICE_CHANNEL_EFFECTS_UPSELL_HEADER_2", "LxzNiu": "VOICE_CHANNEL_HIDE_NAMES", + "FB6emb": "VOICE_CHANNEL_IGNORED_USER_WARNING_ALERT_V2", + "wWueRW": "VOICE_CHANNEL_IGNORED_USER_WARNING_LEAVE_DESCRIPTION", + "xj3j47": "VOICE_CHANNEL_IGNORED_USER_WARNING", + "QsWbfY": "VOICE_CHANNEL_IGNORED_USER_WARNING_V2", + "Z21Rp9": "VOICE_CHANNEL_IGNORED_USER_JOIN_WARNING_DESCRIPTION", + "bwibp1": "VOICE_CHANNEL_IGNORED_USER_JOIN_WARNING_V2", + "8mtcq3": "VOICE_CHANNEL_IGNORED_USER_JOIN_WARNING", "9F+xJU": "VOICE_CHANNEL_LOCAL_MUTED", "aa0FYn": "VOICE_CHANNEL_LOCKED", "tjtv3P": "VOICE_CHANNEL_MUTED", @@ -18469,6 +17971,7 @@ "Mgpxiw": "VOICE_CHANNEL_SET_STATUS", "JYF2Oa": "VOICE_CHANNEL_SHOW_NAMES", "Fq5lwN": "VOICE_CHANNEL_STATUS", + "V2fdBj": "VOICE_CHANNEL_STATUS_A11Y_LABEL", "DUXxBh": "VOICE_CHANNEL_STATUS_MODAL_PREFILL_CHANNEL", "XqK2I2": "VOICE_CHANNEL_STATUS_MODAL_SET_STATUS", "NRBYju": "VOICE_CHANNEL_STATUS_MODAL_SUBTITLE", @@ -18483,6 +17986,9 @@ "VeBD1N": "VOICE_CONNECTED", "S69lJR": "VOICE_CONNECTION_ERROR_GENERIC", "zYzy2i": "VOICE_CONTROLS_SHEET_TOOLTIP_SWIPE_UP", + "WW5DAC": "VOICE_FILTER", + "hHCZJQ": "VOICE_FILTERS_SEARCH_PLACEHOLDER", + "ClGM/G": "VOICE_FILTERS_SETTINGS", "c8U6xd": "VOICE_MESSAGES_A11Y_LABEL", "OTsUp3": "VOICE_MESSAGES_A11Y_STATUS", "a+A3+f": "VOICE_MESSAGES_CANCEL", @@ -18490,6 +17996,7 @@ "sB81Bo": "VOICE_MESSAGES_LIMIT_CANCEL", "zPxm/X": "VOICE_MESSAGES_LIMIT_SEND", "3qvtks": "VOICE_MESSAGES_LOCK", + "LgCPMt": "VOICE_MESSAGES_PLAYBACK_RATE_LABEL", "64/7yo": "VOICE_MESSAGES_PLAYING_A11Y_STATUS", "H03AqF": "VOICE_MESSAGES_RECORDING_FAILED", "cyL7DJ": "VOICE_MESSAGES_SEND", @@ -18576,7 +18083,6 @@ "jp25Id": "WEBHOOKS", "xNhj0O": "WEBHOOK_CANCEL", "eHUWKg": "WEBHOOK_CREATE", - "YrsmBH": "WEBHOOK_CREATED_ON", "W+K1Fs": "WEBHOOK_DELETE", "rIWe+5": "WEBHOOK_DELETE_BODY", "QVFjHh": "WEBHOOK_DELETE_TITLE", @@ -18641,6 +18147,19 @@ "0/xHFO": "WINDOWS", "08KQ1P": "WINDOWS_32_BIT_DEPRECATED_WARNING", "8Je+dX": "WINDOWS_7_8_DEPRECATED_WARNING", + "SDUwM0": "WISHLIST_ADD_ITEM", + "Zr5tjn": "WISHLIST_BUNDLE", + "HFhcqh": "WISHLIST_DISCORD_SHOP_ITEM", + "HGnLLT": "WISHLIST_EMPTY_STATE_TITLE", + "/X1ny6": "WISHLIST_EMPTY_STATE_DESCRIPTION", + "pLPjsb": "WISHLIST_GIFT_THIS_ITEM", + "4yiU7x": "WISHLIST_IN_GAME_ITEM", + "L5Pt9L": "WISHLIST_OWNED", + "Ig6VDH": "WISHLIST_POPULAR_IN_SHOP", + "b2nFyA": "WISHLIST_PUBLIC_WISHLIST", + "jTW016": "WISHLIST_REMOVE_ITEM", + "ilhtIa": "WISHLIST_SEND_GIFT", + "5cWcZ6": "WISHLIST_VISIBILITY_SETTING", "A/AX+r": "WORKING", "NQMctU": "WRONG_USER_LOGOUT", "cqpybK": "WUMPUS", @@ -18649,15 +18168,11 @@ "mYFmDY": "XBOX_APP_REQUIRED_SUBHEADER", "dDtkl9": "XBOX_APP_STEP_ONE", "IWuXjC": "XBOX_APP_STEP_TWO", - "Oz5yJd": "XBOX_AUTHORIZATION_TITLE", "Y+UQDs": "XBOX_DETAILS_BODY", "1GjS/W": "XBOX_DETAILS_BODY_WAITING", "a3MfQT": "XBOX_DETAILS_TITLE", "EuwcxO": "XBOX_DETAILS_TITLE_WAITING", "Mz8oTq": "XBOX_LINK", - "GOBHEz": "XBOX_PIN_STEP1", - "o0Gcfv": "XBOX_PIN_STEP2", - "J/bl64": "XBOX_PIN_STEP3", "ynEs/Y": "XBOX_REMOTE_CONNECTED", "T0uYK9": "XBOX_REMOTE_CONNECTED_RAW", "sN1A3l": "XBOX_REMOTE_CONNECTING", @@ -18679,6 +18194,7 @@ "hvOfmC": "YOUR_EMAIL", "CAqwXt": "YOUR_FRIENDS", "2DfZIQ": "YOUR_HUB", + "pt6jhx": "YOUR_NAME", "tUo2Pm": "YOUR_PIN_EXPIRES", "kS1toz": "YOUR_PIN_IS_EXPIRED", "CaLQqD": "YOU_ARE_IN_CHANNEL", @@ -18696,7 +18212,6 @@ "wvVThC": "_LOGIN_STAGE", "W0/Duf": "_MFA_SMS_CONFIRM_REMOVE_BODY", "xhsJni": "_NUF_BODY_MOBILE", - "+ohEiB": "_OVERLAY_MOBILE_UNAUTHED", "JhDw5o": "_RETURN_TO_LOGIN", "Or4N9n": "_TWO_FA_LOGIN_FOOTER", "SaD/LY": "_TWO_FA_LOGIN_LABEL", @@ -18731,5 +18246,1197 @@ "6Et1LI": "uk", "MMYAI6": "vi", "MKOyIh": "zh-CN", - "QrErtr": "zh-TW" -} \ No newline at end of file + "QrErtr": "zh-TW", + "UPwh1I": "ACCESSIBILITY_SETTINGS_TAGS_LABEL", + "UQt6de": "ACCESSIBILITY_SETTINGS_TAGS_TITLE", + "24VUR9": "ACTIVE_ON_MOBILE", + "ahWaPW": "ACTIVE_THREADS_UPSELL_CONTENT", + "hLUL3s": "ACTIVE_THREADS_UPSELL_HEADER", + "0PyKSX": "ACTIVITY_FEED_NOW_PLAYING_WATCHING", + "n3feNG": "ACTIVITY_PANEL_GO_LIVE_TOOLTIP_NOT_IN_GUILD", + "fBXEoJ": "ACTIVITY_PANEL_GO_LIVE_TOOLTIP_NO_PERMISSION_IN_GUILD", + "f5xqhK": "ADMIN", + "05jDxl": "APPLICATION_CANCEL_SUBSCRIPTION_MODAL_NEVERMIND_CTA", + "irka9o": "APPLICATION_CANCEL_SUBSCRIPTION_MODAL_TITLE_V2", + "8XfbTb": "AUDIO", + "479+Pd": "AUTO_SUGGEST_STICKERS", + "r3uQUX": "AUTO_SUGGEST_STICKERS_DESCRIPTION", + "6tp+TO": "AVATAR", + "d6sv6o": "AVATAR_DECORATION_MODAL_APPLY", + "R3blbG": "AVATAR_DECORATION_SELECTION_SECTION_A11Y", + "g52y/r": "BILLING_SWITCH_PLAN_CONFIRM_TIER_2_NO_PAYMENT_TRIAL", + "OWqqE2": "BOGO_ANNOUNCEMENT_MODAL_REMIXING_CARD_BODY_FORMATTED", + "9h9otv": "BOGO_ANNOUNCEMENT_MODAL_REMIXING_CARD_HEADER", + "MtTjnf": "BOGO_CHANGE_LOG_REDEEM", + "50RxE+": "BOOST", + "BYj9a1": "BOT", + "nA/W+p": "BOT_PROFILE_REMOVE_PRIVATE_CHANNEL_INTEGRATION", + "0XHlSL": "BROWSE", + "Kmg64O": "BUG_REPORT_PRIORITY_VERY_LOW_DESCRIPTION", + "KGsyFy": "BUG_REPORT_PRIORITY_VERY_LOW_TITLE", + "ZPPOz4": "BUTTON", + "W6HwU6": "CALL_HIGH_FIVE_EXCLAMATION", + "DIJLzI": "CHANGE_DECORATION_MODAL_PREMIUM_STARTER_HEADER", + "UROtt/": "CHANGE_DECORATION_MODAL_PREVIEW_PURCHASE_PREMIUM", + "ucqOV6": "CHANGE_DECORATION_MODAL_PREVIEW_STARTER", + "zrBmQK": "CHANGE_DECORATION_MODAL_PREVIEW_STARTER_CHURNED", + "L5hyzz": "CHANGE_DECORATION_MODAL_PREVIEW_STARTER_PREMIUM", + "JEimX1": "CHANGE_DECORATION_MODAL_PURCHASE_HEADER", + "bGl9ty": "CHANGE_PFX_MODAL_PREVIEW_STARTER", + "ZVTtBi": "CHANGE_PFX_MODAL_PREVIEW_STARTER_CHURNED", + "PXzyvg": "CHANGE_PROFILE_EFFECT_MODAL_PREVIEW_PURCHASE_PREMIUM", + "18DFqk": "CHANNEL_SYNCING_ADDED_BY", + "/ZBO3Z": "CHANNEL_SYNCING_ADDED_BY_NO_LINK", + "v6plRI": "CHANNEL_SYNCING_ADDED_BY_UNKNOWN_USER", + "8Hfy44": "CHANNEL_SYNCING_CURRENTLY_SYNCING_WITH", + "AmrSuJ": "CHANNEL_SYNCING_STOP_SYNCING", + "JKCMYU": "CHANNEL_SYNCING_STOP_SYNCING_ALERT_BODY", + "XImiS9": "CHANNEL_SYNCING_STOP_SYNCING_ALERT_TITLE", + "WR3p/W": "CHANNEL_SYNCING_STOP_SYNCING_ERROR", + "43yFy8": "CHANNEL_SYNCING_STOP_SYNCING_ERROR_TITLE", + "UfpB2d": "CLAN_DISCOVERY_CARD_TAG_TOOLTIP", + "IZZohv": "CLAN_SETUP_PLAYSTYLE_CASUAL_TITLE", + "Zo1X5n": "CLAN_SETUP_PLAYSTYLE_COMPETITIVE_TITLE", + "cxUHv0": "CLAN_SETUP_PLAYSTYLE_SOCIAL_TITLE", + "xfySB6": "CLAN_SETUP_PLAYSTYLE_VERY_HARDCORE_TITLE", + "AUnyz/": "CLAN_USER_WAITLISTED", + "rwOhLP": "CLAN_USER_WAITLIST_CTA", + "OV9jYb": "CLAN_USER_WAITLIST_TOAST_SUCCESS", + "Aqd3ge": "CLIP", + "VRWPDm": "CLIPS_DELETE_CLIP", + "l9qpzm": "CLIPS_EXPORT_TO_FILE", + "HH4Tjj": "CLIPS_EXPORT_TO_SOUNDBOARD", + "KLhk6s": "CLIPS_NOTIFICATION_TITLE", + "Q0I8YZ": "CODE", + "Or1Ug7": "COLLECTIBLES_ARCADE_COACHTIP_DESCRIPTION", + "MBhTQO": "COLLECTIBLES_ARCADE_COACHTIP_TITLE", + "hORo2W": "COLLECTIBLES_AVATAR_DECORATION_PREVIEW_A11Y_LABEL", + "AjFeqQ": "COLLECTIBLES_BUNDLE_DECORATION", + "jM8/71": "COLLECTIBLES_BUNDLE_DESCRIPTION", + "R37vyu": "COLLECTIBLES_BUNDLE_DESCRIPTION_ALT", + "SKj9We": "COLLECTIBLES_BUNDLE_DESCRIPTION_PRFIX", + "hTwKEY": "COLLECTIBLES_BUNDLE_PROFILE_EFFECT", + "JgplD7": "COLLECTIBLES_DARK_FANTASY_COACHTIP_DESCRIPTION", + "lUIP4c": "COLLECTIBLES_DARK_FANTASY_COACHTIP_NEUTRAL_TEXT", + "tCzA8f": "COLLECTIBLES_DARK_FANTASY_COACHTIP_TITLE", + "Ifvd7F": "COLLECTIBLES_DETAILS_MODAL_BUNDLE_PURCHASE_DISCLAIMER", + "IA8col": "COLLECTIBLES_DETAILS_MODAL_PREMIUM_PURCHASE_DISCLAIMER", + "pxunjn": "COLLECTIBLES_DETAILS_MODAL_PROFILE_EFFECT_PREMIUM_PURCHASE_DISCLAIMER", + "Vrbnnu": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_BODY", + "fmqMEd": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_CTA_1", + "x8T+k9": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_CTA_2", + "Kup5Gf": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_HEADER_1", + "xz81oy": "COLLECTIBLES_EPHEMERAL_DECO_UPSELL_HEADER_2", + "YvcCKk": "COLLECTIBLES_FEELIN_RETRO_PIRATES_COACHTIP_DESCRIPTION", + "g/YzHN": "COLLECTIBLES_FEELIN_RETRO_PIRATES_COACHTIP_TITLE", + "bbQ4Hz": "COLLECTIBLES_GALAXY_COACHTIP_DESCRIPTION", + "t/ddtR": "COLLECTIBLES_GALAXY_COACHTIP_TITLE", + "qIeHBb": "COLLECTIBLES_LOFI_VIBES_COACHTIP_DESCRIPTION", + "QgBqwK": "COLLECTIBLES_LOFI_VIBES_COACHTIP_TITLE", + "nHOGt2": "COLLECTIBLES_MOBILE_SHOP_IAP_CONFIRMATION", + "MQkmBQ": "COLLECTIBLES_MOBILE_SHOP_IAP_DESCRIPTION_1", + "oa0TmU": "COLLECTIBLES_MOBILE_SHOP_IAP_DESCRIPTION_2", + "gxEIl3": "COLLECTIBLES_MOBILE_SHOP_IAP_DESCRIPTION_3", + "Lh3QfV": "COLLECTIBLES_MOBILE_SHOP_IAP_NEW_DESCRIPTION_2", + "RUtg4j": "COLLECTIBLES_MOBILE_SHOP_IAP_TITLE", + "HSX4HR": "COLLECTIBLES_PROFILE_EFFECT_PREVIEW_A11Y_LABEL", + "ofqyUg": "COLLECTIBLES_PURCHASE_DISCLAIMER_GIFT_PAYMENT", + "G3l0s4": "COLLECTIBLES_PURCHASE_DISCLAIMER_PAYMENT", + "zFXJX9": "COLLECTIBLES_PURCHASE_DISCLAIMER_PAYMENT_MOBILE", + "qAWS4G": "COLLECTIBLES_QUEUING_UP", + "Z4SDvB": "COLLECTIBLES_ROBERT_COACHTIP_DESCRIPTION", + "phhjIZ": "COLLECTIBLES_ROBERT_COACHTIP_TITLE", + "EDi1u3": "COLLECTIBLES_ROBERT_SETTINGS_BANNER_DESCRIPTION", + "pAJTKr": "COLLECTIBLES_ROBERT_SETTINGS_BANNER_TITLE", + "46KvZ8": "COLLECTIBLES_SFA_BANNER_DESCRIPTION", + "6MDGOa": "COLLECTIBLES_SFA_HERO_BANNER_SUBTITLE", + "9hafRs": "COLLECTIBLES_SFA_STARTER_BANNER_DESCRIPTION", + "r7ftiL": "COLLECTIBLES_SFA_TITLE", + "7TMPXi": "COLLECTIBLES_SHY_COACHTIP_DESCRIPTION", + "SKThFM": "COLLECTIBLES_SHY_COACHTIP_TITLE", + "kDb9hV": "COLLECTIBLES_SHY_FOR_A_LIMITED_TIME", + "ZDfl3Z": "COLLECTIBLES_STORM_MYSTERY_CARD_TITLE", + "sFMS6J": "COLLECTIBLES_TIDE_CAROUSEL_SLIDE_DESCRIPTION", + "KdNbQ9": "COLLECTIBLES_TIDE_COACHTIP_DESCRIPTION", + "xU2dMx": "COLLECTIBLES_TIDE_COACHTIP_TITLE", + "PgDVTl": "COLLECTIBLES_TIDE_SETTINGS_BANNER_DESCRIPTION", + "qFKNgE": "COLLECTIBLES_TIDE_SETTINGS_BANNER_TITLE", + "eemWoT": "COMMAND", + "lDqYJ0": "CONNECT_PLAYSTATION", + "bkvb+E": "CONNECT_XBOX", + "SaIjYG": "CONNECT_XBOX_SUCCESS_APP_BUTTON_ANDROID", + "Jvi61o": "CONNECT_XBOX_SUCCESS_APP_BUTTON_IOS", + "9gp9dU": "CONNECT_XBOX_SUCCESS_APP_TITLE", + "zQN4xU": "CONSOLE_DETECT_DEVICE_FOUND", + "zdizVF": "CONSOLE_DETECT_DEVICE_FOUND_DESCRIPTION", + "72jgfV": "CONSOLE_DETECT_NO_DEVICES_FOUND", + "wYbrS6": "CONSOLE_DETECT_NO_DEVICES_FOUND_DESCRIPTION", + "02gscF": "CONSOLE_LAN_DETECT_CTA", + "QywP7v": "CONSOLE_LAN_SEARCHING", + "egQIYJ": "CONSOLE_LAN_SEARCHING_DESCRIPTION", + "tZyXgy": "CONSUMABLE_HD_STREAMING_APPLYING_TO", + "yKw8Du": "CONSUMABLE_HD_STREAMING_BANNER_BUTTON_COPY", + "vNbVXP": "CONSUMABLE_HD_STREAMING_BANNER_COPY", + "JkWoqL": "CONSUMABLE_HD_STREAMING_BANNER_COPY_STREAMERS", + "r6xhB5": "CONSUMABLE_HD_STREAMING_BANNER_DISMISS_BUTTON_COPY", + "IjKvNS": "CONSUMABLE_HD_STREAMING_BANNER_SELF_COPY", + "Qwq08L": "CONSUMABLE_HD_STREAMING_LIST_ITEM", + "htEhYu": "CONSUMABLE_HD_STREAMING_LIST_ITEM_IMG_ALT", + "1wV4qt": "CONSUMABLE_HD_STREAMING_MENU_LEARN_MORE", + "bVbBTx": "CONSUMABLE_HD_STREAMING_MENU_TITLE", + "S9LAdf": "CONSUMABLE_HD_STREAMING_MODAL_BUY_BUTTON_COPY", + "sl6Tck": "CONSUMABLE_HD_STREAMING_MODAL_BUY_FREEBIE_COPY", + "Avt5Kf": "CONSUMABLE_HD_STREAMING_MODAL_CANCEL_BUTTON_COPY", + "xwRQWq": "CONSUMABLE_HD_STREAMING_MODAL_DESCR", + "sIA0OC": "CONSUMABLE_HD_STREAMING_MODAL_ERROR_MESSAGE", + "Ddigca": "CONSUMABLE_HD_STREAMING_MODAL_IMAGE_ALT", + "sxVfia": "CONSUMABLE_HD_STREAMING_MODAL_LINK", + "K04rOB": "CONSUMABLE_HD_STREAMING_MODAL_TITLE", + "AWkQTq": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_ALT", + "5Ey5Dy": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_DISCLOSURE", + "x/26dy": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_GOT_IT", + "gb37Kz": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_HEADER", + "aExjO+": "CONTENT_INVENTORY_MEMBERLIST_LEARN_MORE_PLAYED_NOTE", + "H2zH5W": "CUSTOM", + "xcVcFZ": "CUSTOM_HANGS_STATUS_COPY_CTA", + "k6lfDp": "CUSTOM_HANG_STATUS_PLACEHOLDER", + "d/HLji": "CUSTOM_STATUS_EDIT_CUSTOM_STATUS_PLACEHOLDER", + "ezAcP9": "CUSTOM_STATUS_SET_CUSTOM_STATUS_CTA", + "hsd65L": "DENY", + "lmq2GL": "DIRECT", + "QBGGK+": "DISCONNECT", + "7dMBj4": "DISCORD_U_COMING_SOON_TO_MOBILE", + "7R5eKv": "DISCOVERY_ENTRYPOINT_EMBED_CTA", + "34PBmH": "DISCOVERY_ENTRYPOINT_EMBED_DESCRIPTION", + "uPeLWs": "DISCOVERY_ENTRYPOINT_EMBED_ERROR_CTA", + "yHp/y0": "DISCOVERY_ENTRYPOINT_EMBED_ERROR_DESCRIPTION", + "ZDg1eP": "DISCOVERY_ENTRYPOINT_EMBED_ERROR_TITLE", + "KH2azq": "DISCOVERY_ENTRYPOINT_EMBED_LABEL", + "DOeucI": "DISCOVERY_ENTRYPOINT_EMBED_TITLE", + "SfO+xm": "DISCOVERY_FIND_GAMING_GUILD_CTA", + "kYjB7c": "DISCOVERY_FIND_GAMING_GUILD_HEADER", + "PwNiSJ": "DISCOVERY_FIND_GAMING_GUILD_SUBHEADER", + "x0rBe2": "DISCOVERY_SAMPLE_GUILDS_LABEL", + "dwPBWT": "EARN_AN_EXCLUSIVE_ITEM", + "rBTUVG": "EARN_AN_EXCLUSIVE_ITEM_EXCLAIMATION", + "DGJVuW": "EARN_AN_EXCLUSIVE_ITEM_EXCLAIMATION_PLURAL", + "YVZp8N": "EARN_AN_EXCLUSIVE_ITEM_PLURAL", + "mETI3F": "EARN_A_REWARD", + "LCpIZG": "EARN_A_REWARD_EXCLAIMATION", + "y8KW9G": "EARN_A_REWARD_EXCLAIMATION_PLURAL", + "S8RZU/": "EARN_A_REWARD_PLURAL", + "Qq+kXD": "EDIT_CHANNEL_SYNCING_TITLE", + "OU3/Po": "EDIT_PROFILE_CATEGORY_USER_PROFILE", + "Xt/LcD": "EMBEDDED_ACTIVITIES_ACTIVITIES_AVAILABLE_IN_TEXT", + "U9a92w": "EMBEDDED_ACTIVITIES_ACTIVITIES_OPEN_TO_EVERYONE_BANNER_A11Y_LABEL", + "wJNK8H": "EMBEDDED_ACTIVITIES_ALREADY_IN_ACTIVITY", + "FqHEaq": "EMBEDDED_ACTIVITIES_BOOSTING_BADGE_TOOLTIP", + "c1THWh": "EMBEDDED_ACTIVITIES_BOOST_SUBSCRIBE_CTA", + "pVr7Cu": "EMBEDDED_ACTIVITIES_CAREFUL", + "LeDe2e": "EMBEDDED_ACTIVITIES_CONCURRENT_ACTIVITIES_LIMITED_UPSELL_MODAL_BODY", + "o8Q/b2": "EMBEDDED_ACTIVITIES_CONCURRENT_ACTIVITIES_UNLIMITED_UPSELL_MODAL_BODY", + "spW7PJ": "EMBEDDED_ACTIVITIES_CONCURRENT_ACTIVITIES_UPSELL_MODAL_TITLE", + "Zdvmqd": "EMBEDDED_ACTIVITIES_CURRENTLY_TESTING_NITRO_ACTIVITIES", + "7qBEMd": "EMBEDDED_ACTIVITIES_END_ACTIVITY", + "ElsOBI": "EMBEDDED_ACTIVITIES_EXTERNAL_APP_CONFIRM_ANNOUNCEMENT_BIRD_A11Y_LABEL", + "Idm4cb": "EMBEDDED_ACTIVITIES_FREE_FOR_EVERYONE_BANNER_TEXT", + "Vs2EeY": "EMBEDDED_ACTIVITIES_FREE_PREVIEW_TOOLTIP", + "6eFGZR": "EMBEDDED_ACTIVITIES_GAME_NIGHT", + "1s1xdF": "EMBEDDED_ACTIVITIES_GAME_NIGHT_BODY", + "+4M1ZW": "EMBEDDED_ACTIVITIES_GAME_NIGHT_HEADING", + "VfI6Oy": "EMBEDDED_ACTIVITIES_LAST_HOST_LEAVING_MODAL", + "V1y2CA": "EMBEDDED_ACTIVITIES_MINI_SHELF_GAME_NIGHT_POSTER_ALT", + "bg1V8I": "EMBEDDED_ACTIVITIES_MINI_SHELF_TUNE_IN_POSTER_ALT", + "GK2DmM": "EMBEDDED_ACTIVITIES_MOBILE_NUX_BODY", + "fhm5x3": "EMBEDDED_ACTIVITIES_MOBILE_NUX_HEADING", + "z/DfBl": "EMBEDDED_ACTIVITIES_NITRO_END_WARNING", + "lJOmF8": "EMBEDDED_ACTIVITIES_NITRO_SUBSCRIBE_CTA", + "W4fGIV": "EMBEDDED_ACTIVITIES_NO_ELIGIBLE_HOST_MODAL", + "cce+HX": "EMBEDDED_ACTIVITIES_NO_ELIGIBLE_HOST_UPSELL_MODAL", + "EwoEOa": "EMBEDDED_ACTIVITIES_NVM", + "ugSbNf": "EMBEDDED_ACTIVITIES_POP_IN_WARNING", + "Tfj536": "EMBEDDED_ACTIVITIES_POP_OUT_WARNING", + "RRYNF3": "EMBEDDED_ACTIVITIES_PREMIUM_TIER_EXTRA_BOOSTS", + "16Lfrb": "EMBEDDED_ACTIVITIES_START_ACTIVITY_LABEL", + "5LMZtY": "EMBEDDED_ACTIVITIES_SUPPORTED_PLATFORMS_MOBILE", + "BQg4p6": "EMBEDDED_ACTIVITIES_TUNE_IN_PROMO_BANNER_ALT", + "d2wMvX": "EMBEDDED_ACTIVITIES_UNLOCK_ACTIVITIES", + "efSOLA": "EMBEDDED_ACTIVITIES_YEP", + "n9Tkzf": "EMBEDDED_ACTIVITY_NOTICE_BASH_OUT_DESCRIPTION", + "Z/r7IS": "EMOJI_PICKER_CREATE_EMOJI_TITLE", + "XCmLfG": "EMOJI_PICKER_CREATE_EMOJI_TITLE_DESCRIPTION", + "3vPQ3/": "ENABLE_LOCAL_NETWORK_ACCESS", + "ARF2xo": "ENABLE_LOCAL_NETWORK_ACCESS_DESCRIPTION", + "MLVL2M": "ENABLE_STREAMER_MODE_DESCRIPTION", + "LhmGOL": "EVENT", + "AxnPm1": "EXPERIMENTAL_ENCODERS", + "XNMs5h": "EXPRESSION_SUGGESTIONS_STICKER_DISABLE", + "5gglIs": "EXPRESSION_SUGGESTIONS_STICKER_NAME", + "8DjNnM": "EXPRESSION_SUGGESTIONS_STICKER_SHORT_NAV_PROMPT", + "C4ScLD": "FAMILY_CENTER_ACCEPTED_REQUESTS_EMPTY_DESCRIPTION", + "pu6/U0": "FAMILY_CENTER_ACCEPTED_REQUESTS_TITLE_PARENT", + "+tnO34": "FAMILY_CENTER_ACCEPTED_REQUESTS_TITLE_TEEN", + "Y3ZYtM": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_DATE", + "WRtySz": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_DAYS", + "J18GbG": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_HOURS", + "kX3wJg": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_MINUTES", + "Bqsamd": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_SECONDS", + "Ln9zMn": "FAMILY_CENTER_ACCEPTED_TIMESTAMP_YESTERDAY", + "snlFqR": "FAMILY_CENTER_ACCEPT_LINK_ACTIVITY_DISCLAIMER", + "pegSM5": "FAMILY_CENTER_ACCEPT_LINK_MODAL_ERROR", + "rlNJwZ": "FAMILY_CENTER_ACCEPT_LINK_MODAL_TITLE", + "wI/jo3": "FAMILY_CENTER_ACCEPT_REQUEST", + "jc1Ip7": "FAMILY_CENTER_ACCESSIBILITY_LABEL_ACCEPT_WITH_NAME", + "oUpA6X": "FAMILY_CENTER_ACCESSIBILITY_LABEL_CANCEL_WITH_NAME", + "4GtllP": "FAMILY_CENTER_ACCESSIBILITY_LABEL_DECLINE_WITH_NAME", + "T7DUoU": "FAMILY_CENTER_ACCESSIBILITY_LABEL_DISCONNECT_WITH_NAME", + "kIcKAj": "FAMILY_CENTER_ACTIVITY_ADD_FRIENDS_HEADER", + "TEvo+H": "FAMILY_CENTER_ACTIVITY_ADD_FRIENDS_SECTION_HEADER", + "HvsFJf": "FAMILY_CENTER_ACTIVITY_ADD_FRIENDS_TOOLTIP_PARENT", + "1/QpPy": "FAMILY_CENTER_ACTIVITY_ADD_FRIENDS_TOOLTIP_TEEN", + "EMCf6j": "FAMILY_CENTER_ACTIVITY_BANNER_DESCRIPTION_PARENT", + "MXjDSv": "FAMILY_CENTER_ACTIVITY_BANNER_DESCRIPTION_TEEN", + "goKE2b": "FAMILY_CENTER_ACTIVITY_BANNER_HEADER_PARENT", + "T7GyW+": "FAMILY_CENTER_ACTIVITY_BANNER_HEADER_TEEN", + "ffg6xd": "FAMILY_CENTER_ACTIVITY_BANNER_IMAGE_ALT", + "o4pfFA": "FAMILY_CENTER_ACTIVITY_DATA_CONFIRMATION_BANNER_ALT", + "eHQZuO": "FAMILY_CENTER_ACTIVITY_DATA_CONFIRMATION_BANNER_DESCRIPTION_PARENT", + "i4XFEH": "FAMILY_CENTER_ACTIVITY_DATA_CONFIRMATION_BANNER_DESCRIPTION_TEEN", + "XJabSN": "FAMILY_CENTER_ACTIVITY_DATA_CONFIRMATION_BANNER_HEADER", + "CcrbCw": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_HEADER", + "rcPInc": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_SECTION_HEADER", + "dcvNXx": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_TOOLTIP_PARENT", + "c0NgBX": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_TOOLTIP_PARENT_WITH_VC", + "823ugV": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_TOOLTIP_TEEN", + "DLVyFw": "FAMILY_CENTER_ACTIVITY_GUILD_INTERACTION_TOOLTIP_TEEN_WITH_VC", + "NulX9+": "FAMILY_CENTER_ACTIVITY_GUILD_JOIN_HEADER", + "7feG7T": "FAMILY_CENTER_ACTIVITY_GUILD_JOIN_SECTION_HEADER", + "Lmz9Vh": "FAMILY_CENTER_ACTIVITY_GUILD_JOIN_TOOLTIP_PARENT", + "MTFxYc": "FAMILY_CENTER_ACTIVITY_GUILD_JOIN_TOOLTIP_TEEN", + "5JmNgg": "FAMILY_CENTER_ACTIVITY_GUILD_ROW_MEMBER_COUNT", + "7dMmJY": "FAMILY_CENTER_ACTIVITY_MORE", + "n8n5Ba": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_PARENT_DAYS", + "2AtcIs": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_PARENT_TODAY", + "stOECr": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_PARENT_YESTERDAY", + "f1UJiC": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_TEEN_DAYS", + "g1ZX6m": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_TEEN_TODAY", + "s3qSVt": "FAMILY_CENTER_ACTIVITY_OVERVIEW_DESCRIPTION_TEEN_YESTERDAY", + "hIErU3": "FAMILY_CENTER_ACTIVITY_OVERVIEW_NO_ACTIVITY", + "Q/D/0Q": "FAMILY_CENTER_ACTIVITY_OVERVIEW_PREFACE_PARENT", + "7hqFl9": "FAMILY_CENTER_ACTIVITY_OVERVIEW_PREFACE_TEEN", + "bdBmqy": "FAMILY_CENTER_ACTIVITY_TAB", + "fwQgE/": "FAMILY_CENTER_ACTIVITY_USER_ADDED_TIMESTAMP_DAYS", + "JUHIYZ": "FAMILY_CENTER_ACTIVITY_USER_ADDED_TIMESTAMP_TODAY", + "GiswUW": "FAMILY_CENTER_ACTIVITY_USER_ADDED_TIMESTAMP_YESTERDAY", + "D7Sngz": "FAMILY_CENTER_ACTIVITY_USER_CALLED_HEADER", + "0GE4Ni": "FAMILY_CENTER_ACTIVITY_USER_CALLED_SECTION_HEADER", + "oCk8c4": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TIMESTAMP_DAYS", + "IHd5cZ": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TIMESTAMP_TODAY", + "wOsfxv": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TIMESTAMP_YESTERDAY", + "w7j/Lt": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TOOLTIP_PARENT", + "SCIaWK": "FAMILY_CENTER_ACTIVITY_USER_CALLED_TOOLTIP_TEEN", + "kvTgWP": "FAMILY_CENTER_ACTIVITY_USER_INTERACTION_HEADER", + "4T3zWT": "FAMILY_CENTER_ACTIVITY_USER_INTERACTION_SECTION_HEADER", + "cY19uR": "FAMILY_CENTER_ACTIVITY_USER_INTERACTION_TOOLTIP_PARENT", + "K5r+sN": "FAMILY_CENTER_ACTIVITY_USER_INTERACTION_TOOLTIP_TEEN", + "qvKjp8": "FAMILY_CENTER_ACTIVITY_USER_MESSAGED_TIMESTAMP_DAYS", + "fLBUx7": "FAMILY_CENTER_ACTIVITY_USER_MESSAGED_TIMESTAMP_TODAY", + "cHHgxI": "FAMILY_CENTER_ACTIVITY_USER_MESSAGED_TIMESTAMP_YESTERDAY", + "kFj4h1": "FAMILY_CENTER_AVATAR_ARIA", + "6gyAQZ": "FAMILY_CENTER_CANCEL_LINK_MODAL_ERROR", + "HynllX": "FAMILY_CENTER_CANCEL_LINK_MODAL_TITLE", + "mK40bk": "FAMILY_CENTER_CANCEL_REQUEST", + "czincX": "FAMILY_CENTER_CANCEL_REQUEST_BACK", + "1xBHHV": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_CONTENT_DESCRIPTION_PARENT", + "0QDVFN": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_CONTENT_DESCRIPTION_TEEN", + "82y87X": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_CONTENT_HEADER_PARENT", + "ASf7XN": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_CONTENT_HEADER_TEEN", + "2OqtJJ": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_HEADER_PARENT", + "TCzk/e": "FAMILY_CENTER_DATA_CONFIRMATION_EXCLUDED_HEADER_TEEN", + "DxFKkd": "FAMILY_CENTER_DATA_CONFIRMATION_FRIEND_ADD_DESCRIPTION", + "/zMYZX": "FAMILY_CENTER_DATA_CONFIRMATION_FRIEND_ADD_HEADER", + "WrY56N": "FAMILY_CENTER_DATA_CONFIRMATION_GUILD_PARTICIPATION_DESCRIPTION", + "44NEx6": "FAMILY_CENTER_DATA_CONFIRMATION_GUILD_PARTICIPATION_HEADER", + "YU7aaf": "FAMILY_CENTER_DATA_CONFIRMATION_INCLUDED_HEADER_PARENT", + "Sm8Gq5": "FAMILY_CENTER_DATA_CONFIRMATION_INCLUDED_HEADER_TEEN", + "KBgArX": "FAMILY_CENTER_DATA_CONFIRMATION_USERS_MESSAGED_DESCRIPTION", + "Z3G+8h": "FAMILY_CENTER_DATA_CONFIRMATION_USERS_MESSAGED_HEADER", + "LcM8BS": "FAMILY_CENTER_DECLINE_LINK_MODAL_DISCLAIMER_TEEN", + "tJAUyn": "FAMILY_CENTER_DECLINE_LINK_MODAL_ERROR", + "cXgKMD": "FAMILY_CENTER_DECLINE_LINK_MODAL_NOTICE_HEADER", + "teIRCR": "FAMILY_CENTER_DECLINE_LINK_MODAL_TITLE", + "dKxFcn": "FAMILY_CENTER_DECLINE_REQUEST", + "cSb7U0": "FAMILY_CENTER_DISABLE_FEATURE_MODAL_DISABLE_BUTTON_TEXT", + "VGB30H": "FAMILY_CENTER_DISABLE_FEATURE_MODAL_HEADER_TEXT", + "CrZZ+p": "FAMILY_CENTER_DISABLE_FEATURE_MODAL_SUBTITLE_TEXT", + "c5L+sl": "FAMILY_CENTER_DISCONNECT_BUTTON", + "/MYCee": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_DISCLAIMER_PARENT", + "VJaHUb": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_DISCLAIMER_TEEN", + "krIDdy": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_ERROR", + "EvMGLT": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_NOTICE_DESCRIPTION_PARENT", + "f1SUeW": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_NOTICE_DESCRIPTION_TEEN", + "VKblNt": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_NOTICE_HEADER", + "NMSTb/": "FAMILY_CENTER_DISCONNECT_LINK_MODAL_TITLE", + "Xt6oND": "FAMILY_CENTER_EMPTY_ACTIVITY_DAYS", + "VjIAQQ": "FAMILY_CENTER_EMPTY_ACTIVITY_TODAY", + "2a8xHY": "FAMILY_CENTER_EMPTY_ACTIVITY_YESTERDAY", + "GKzqWi": "FAMILY_CENTER_ERROR_CONNECTION_LIMIT_PARENT_DESCRIPTION", + "bS5x94": "FAMILY_CENTER_ERROR_CONNECTION_LIMIT_PARENT_HEADER", + "69F+eS": "FAMILY_CENTER_ERROR_CONNECTION_LIMIT_TEEN_DESCRIPTION", + "MzX4RP": "FAMILY_CENTER_ERROR_CONNECTION_LIMIT_TEEN_HEADER", + "Uss2dn": "FAMILY_CENTER_ERROR_GENERIC_DESCRIPTION", + "nGX8Co": "FAMILY_CENTER_ERROR_GENERIC_HEADER", + "Wu8BK2": "FAMILY_CENTER_ERROR_GENERIC_TOAST", + "xNEkdx": "FAMILY_CENTER_ERROR_REQUEST_PENDING_DESCRIPTION", + "Xyjnwn": "FAMILY_CENTER_ERROR_REQUEST_PENDING_DESCRIPTION_NO_EMAIL", + "tu0MRv": "FAMILY_CENTER_ERROR_REQUEST_PENDING_HEADER", + "On5iRI": "FAMILY_CENTER_ERROR_TEEN_TO_TEEN_LINK_DESCRIPTION", + "W9JLJh": "FAMILY_CENTER_ERROR_TEEN_TO_TEEN_LINK_HEADER", + "6JkHSg": "FAMILY_CENTER_FEATURE_CARDS_HEADER", + "bmhCnL": "FAMILY_CENTER_FEATURE_CARD_MESSAGES_DESCRIPTION_PARENT", + "5RZ8Tq": "FAMILY_CENTER_FEATURE_CARD_MESSAGES_DESCRIPTION_TEEN", + "001l3m": "FAMILY_CENTER_FEATURE_CARD_MESSAGES_HEADER", + "1xPTwE": "FAMILY_CENTER_FEATURE_CARD_PAIRING_DESCRIPTION_PARENT", + "Rm/6a0": "FAMILY_CENTER_FEATURE_CARD_PAIRING_DESCRIPTION_TEEN", + "hhOuMe": "FAMILY_CENTER_FEATURE_CARD_PAIRING_HEADER", + "68zfxD": "FAMILY_CENTER_FEATURE_CARD_SHARING_DESCRIPTION_PARENT", + "XKnFFq": "FAMILY_CENTER_FEATURE_CARD_SHARING_DESCRIPTION_TEEN", + "yipAeP": "FAMILY_CENTER_FEATURE_CARD_SHARING_HEADER", + "KOwsf/": "FAMILY_CENTER_HELP_LINE_CONTENT", + "7/tVhv": "FAMILY_CENTER_HELP_LINE_HEADER", + "krWQZK": "FAMILY_CENTER_LINK_ACTION_ACCEPT", + "e5iHmZ": "FAMILY_CENTER_LINK_ACTION_CANCEL", + "bBDeNI": "FAMILY_CENTER_LINK_ACTION_DECLINE", + "l20ZZp": "FAMILY_CENTER_LINK_ACTION_DISCONNECT", + "Q8XnAa": "FAMILY_CENTER_PENDING_REQUESTS_TITLE_PARENT", + "IkAgkG": "FAMILY_CENTER_PENDING_REQUESTS_TITLE_TEEN", + "MP3khg": "FAMILY_CENTER_PENDING_TIMESTAMP_DATE", + "pWig18": "FAMILY_CENTER_PENDING_TIMESTAMP_DAYS", + "ErkYCI": "FAMILY_CENTER_PENDING_TIMESTAMP_HOURS", + "InzMn3": "FAMILY_CENTER_PENDING_TIMESTAMP_MINUTES", + "CJdoee": "FAMILY_CENTER_PENDING_TIMESTAMP_SECONDS", + "GvfssA": "FAMILY_CENTER_PENDING_TIMESTAMP_YESTERDAY", + "wg2xwQ": "FAMILY_CENTER_QR_CODE_MODAL_BUTTON_HIDE", + "10dX6U": "FAMILY_CENTER_QR_CODE_MODAL_BUTTON_SHOW", + "LyyCsE": "FAMILY_CENTER_QR_CODE_MODAL_DESCRIPTION", + "AVTZaN": "FAMILY_CENTER_QR_CODE_MODAL_HEADER", + "iHYMAz": "FAMILY_CENTER_QR_CODE_MODAL_NOTICE", + "goDyoe": "FAMILY_CENTER_QR_CODE_MODAL_REMINDER", + "z4a9HP": "FAMILY_CENTER_QR_CODE_SCAN", + "RcTgiE": "FAMILY_CENTER_REQUESTS_LIMIT_INFO_PARENT", + "1/PzIj": "FAMILY_CENTER_REQUESTS_LIMIT_INFO_TEEN", + "1J/gZ4": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_DESCRIPTION_PARENT", + "JsAEDi": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_DESCRIPTION_PARENT_MOBILE", + "yMnoDl": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_DESCRIPTION_TEEN", + "pHEnV5": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_HEADER_PARENT", + "B0NPbp": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_HEADER_PARENT_MOBILE", + "zUCWEL": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_HEADER_TEEN", + "1M9So2": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_1_DESCRIPTION", + "7xxAni": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_1_HEADER", + "GzMFnb": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_2_DESCRIPTION", + "AXgx+a": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_2_HEADER", + "8rLBxD": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_3_DESCRIPTION", + "MZn1tG": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_PARENT_STEP_3_HEADER", + "r+PDmu": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_TEEN_ASSET_ALT", + "Ta9byS": "FAMILY_CENTER_REQUESTS_LINKING_BANNER_TEEN_BUTTON", + "gVWG+6": "FAMILY_CENTER_REQUESTS_TAB", + "ISg34l": "FAMILY_CENTER_REQUEST_LINK_BUTTON", + "GH11eI": "FAMILY_CENTER_REQUEST_LINK_MODAL_TITLE_PARENT", + "dVtWId": "FAMILY_CENTER_REQUEST_SUCCESS_DESCRIPTION", + "EpwfZl": "FAMILY_CENTER_REQUEST_SUCCESS_HEADER", + "irvJKR": "FAMILY_CENTER_SETTINGS_EMAIL_DIGEST_ENABLE_SWITCH", + "y34S46": "FAMILY_CENTER_SETTINGS_EMAIL_DIGEST_ENABLE_SWITCH_NOTE", + "cUIXFY": "FAMILY_CENTER_SETTINGS_ENABLE_CTA", + "xAVm7K": "FAMILY_CENTER_SETTINGS_ENABLE_PROMPT", + "zkEceS": "FAMILY_CENTER_SETTINGS_ENABLE_SWITCH", + "5MdB3j": "FAMILY_CENTER_SETTINGS_ENABLE_SWITCH_NOTE", + "USIXU7": "FAMILY_CENTER_SETTINGS_FORM_TITLE", + "gntCQT": "FAMILY_CENTER_SETTINGS_TITLE", + "Rkdixs": "FAMILY_CENTER_SIDEBAR_TITLE", + "vORl9Q": "FAMILY_CENTER_TEEN_SELECT_TITLE", + "6tsC8u": "FAMILY_CENTER_THROUGHLINE_CONTENT", + "RZqaJn": "FAMILY_CENTER_TITLE", + "JNLpDZ": "FAMILY_CENTER_TOOLTIP_MODAL_HEADER_PARENT", + "q3IRal": "FAMILY_CENTER_TOOLTIP_MODAL_HEADER_TEEN", + "JgEONF": "FILE", + "TVt5jc": "FIND", + "C6S5jQ": "FIND_CONSOLES", + "cRXfzH": "FOLDER", + "Xytv9C": "FORM_DESCRIPTION_PUSH_AFK_TIMEOUT", + "HEA/DU": "FORM_HELP_SLOWMODE", + "a+1pdO": "FORM_HELP_SLOWMODE_FORUM", + "OMmNCv": "FORM_HELP_SLOWMODE_THREAD", + "5Gjde9": "FORM_LABEL_MOBILE_NOTIFICATIONS_LABEL", + "TTvjd9": "FORM_LABEL_PUSH_AFK_TIMEOUT", + "zMsUsu": "FORUM_ADD_MEDIA_TO_ORIGINAL_POST_DESCRIPTION", + "hMWWMV": "FORUM_ADD_MEDIA_TO_ORIGINAL_POST_TITLE", + "oMIexV": "FORUM_CHANNEL_ONBOARDING_CHECKLIST_PERMISSION_DESCRIPTION", + "NjCtHz": "FORUM_CHANNEL_ONBOARDING_PERMISSION_MODEL_DESCRIPTION", + "kdZU6H": "FORUM_SETTING_SLOW_MODE_MESSAGE_TEXT", + "PYZlEr": "FORUM_TAG_FILTER_CLEAR", + "Yh05IS": "FORUM_TAG_FILTER_SUBMIT", + "6cUf3h": "GAME", + "wdpm4+": "GAME_PROFILE_FOLLOW_TOOLTIP", + "WHLC4B": "GAME_PROFILE_NONE", + "9c6NEX": "GAME_PROFILE_Q1_ACHIEVEMENTS", + "dYKMZb": "GAME_PROFILE_Q1_NEWS", + "g2eNLd": "GAME_PROFILE_Q1_WHEN_FRIENDS_PLAY", + "WkNZBZ": "GAME_PROFILE_Q2_FOLLOW_DEV", + "T4fRgn": "GAME_PROFILE_Q2_GAMES_FRIENDS_PLAY", + "8ZRk+O": "GAME_PROFILE_Q2_GAMES_I_PLAY_NOW", + "X8IaMI": "GAME_PROFILE_Q2_GAMES_I_WANT_TO_PLAY", + "Oa8FUC": "GAME_PROFILE_Q2_GENRES", + "sXBGoq": "GAME_PROFILE_QUESTION_BENEFITS", + "+HKaiL": "GAME_PROFILE_QUESTION_GAME_TYPES", + "QnieV0": "GAME_PROFILE_SURVEY_INTRO", + "z24eqT": "GAME_PROFILE_SURVEY_NOTIFY_ME", + "ItxxYd": "GAME_PROFILE_SURVEY_PROGRESS", + "x4JN+m": "GAME_PROFILE_SURVEY_SELECT_ALL", + "i3JNE2": "GAME_PROFILE_SURVEY_TY", + "3VsJyR": "GAME_PROFILE_SURVEY_TY_MORE", + "+HTQyi": "GAME_PROFILE_UNFOLLOW_GAME", + "oINSKA": "GAME_PROFILE_UNFOLLOW_TOOLTIP", + "TbKtaI": "GIFT", + "wDEPGW": "GLOBAL_DISCOVERY_APPS_CATEGORY_TITLE_END", + "B5tf+g": "GLOBAL_DISCOVERY_SERVERS_GUILDS_CATEGORY", + "Ae0MNQ": "GO", + "+36kn9": "GROUP", + "MOwYWD": "GROUP_DM_MULTIPLE_USER_SUMMARY", + "fhiMzZ": "GROUP_DM_SINGLE_USER_SUMMARY", + "tZon8K": "GROUP_DM_TWO_USER_SUMMARY", + "+SdbzD": "GUILD", + "HZosQr": "GUILD_ANTIRAID_SAFETY_JOIN_RAIDS_TITLE", + "y1ZrSw": "GUILD_ANTIRAID_SAFETY_MENTION_RAIDS_TITLE", + "D28L93": "GUILD_ANTIRAID_SAFETY_SETUP_CHANNEL_MANAGE_ACTION", + "7o1Lvp": "GUILD_ANTIRAID_SAFETY_SETUP_CHANNEL_SETUP_ACTION", + "4TJPA2": "GUILD_ANTIRAID_SAFETY_SETUP_ENABLE_TIP", + "L7iB87": "GUILD_ANTIRAID_SAFETY_SETUP_IN_AUTOMOD_ACTION", + "v6ErHG": "GUILD_ANTIRAID_SAFETY_SETUP_NO_EXPERIMENT_ACTION", + "CQ1Wk3": "GUILD_ANTIRAID_SETTING_CHANNEL_LABEL", + "HqZEYc": "GUILD_ANTIRAID_SETTING_CHANNEL_NONE", + "YT+Jol": "GUILD_ANTIRAID_SETTING_CHANNEL_NONE_LABEL", + "BBR1sh": "GUILD_ANTIRAID_SETTING_ENABLED", + "LYY1tT": "GUILD_ANTIRAID_SETTING_ENABLED_ALERTS", + "aJ+tpy": "GUILD_ANTIRAID_SETTING_PROTECTION_LABEL", + "ikljSO": "GUILD_ANTIRAID_UPSELL_ASSET_HEADER", + "QUUAeV": "GUILD_ANTIRAID_UPSELL_CONTENT", + "YJl/Hq": "GUILD_ANTIRAID_UPSELL_CTA", + "rwAUNh": "GUILD_ANTIRAID_UPSELL_DISMISSAL", + "GY/xJS": "GUILD_ANTIRAID_UPSELL_HEADER", + "6YriCC": "GUILD_HOME_ABOUT", + "/T0C9P": "GUILD_MENTION_RAID_LIMIT_UPSELL_ASSET_HEADER", + "jAO/LC": "GUILD_MENTION_RAID_LIMIT_UPSELL_CONTENT", + "Mtl9zP": "GUILD_MENTION_RAID_LIMIT_UPSELL_CTA", + "RdsKd6": "GUILD_MENTION_RAID_LIMIT_UPSELL_DISMISSAL", + "wUmMu2": "GUILD_MENTION_RAID_LIMIT_UPSELL_HEADER", + "k0COZY": "GUILD_ONBOARDING_DEFAULT_CHANNELS_MIN_CHANNELS", + "QAdRCy": "GUILD_ONBOARDING_HOME_GUILD_MEMBERS_RATIO", + "ey3uVZ": "GUILD_ONBOARDING_SETUP_REVIEW_NOT_ENOUGH_DEFAULT_CHANNELS", + "Yn1+xo": "GUILD_POPOUT_UNAVAILABLE_FLAVOR", + "+kdPH2": "GUILD_POPOUT_UNAVAILABLE_HEADER", + "K+WeR3": "GUILD_POPOUT_VIEW_SERVER_BUTTON", + "8+VX4z": "GUILD_PREMIUM", + "8aYImI": "GUILD_ROLE_SUBSCRIPTIONS_MANAGE_EMOJI_ROLES_MODAL_NEEDS_ONE_ROLE", + "R/9yQF": "GUILD_SETTINGS_ICON_RECOMMEND", + "s/entz": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_DESCRIPTION_1", + "Y9So0D": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_DESCRIPTION_2", + "wsJcws": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_DESCRIPTION_3", + "v/gQ4U": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_NAME_1", + "7mUf0d": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_NAME_2", + "vrGLjk": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_CHANNEL_NAME_3", + "Xvsukx": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_DESCRIPTION", + "5NJlXn": "GUILD_SETTINGS_PUBLIC_WELCOME_EXAMPLE_TITLE", + "RWdjP0": "GUILD_SETTINGS_PUBLIC_WELCOME_INTRO_BUTTON", + "a59UeI": "GUILD_SETTINGS_PUBLIC_WELCOME_INTRO_TEXT", + "4mGq0u": "GUILD_SETTINGS_SAFETY_UPDATES_HEADER", + "yHVqK2": "GUILD_SETTINGS_SAFETY_UPDATES_ITEM_1", + "bxESrc": "GUILD_SETTINGS_SAFETY_UPDATES_ITEM_2", + "YPJ8F9": "GUILD_SETTINGS_SAFETY_UPDATES_ITEM_3", + "8C2EfU": "GUILD_SETTINGS_SAFETY_UPDATES_ITEM_4", + "783jaG": "GUILD_SETTINGS_SAFETY_UPDATES_LINE_1", + "Ilf4Zl": "GUILD_SETTINGS_SAFETY_UPDATES_LINE_2", + "GFo2Gh": "HANG_STATUS_HELP", + "M4ddeY": "HARVEST_BACKEND_HUBSPOT", + "c0Ow6i": "HUB", + "YfeHRA": "HUB_EMAIL_CONNECTION_CONTENT_DESCRIPTION", + "pdXYeC": "HUB_EVENTS_FOOTER_BUTTON_TEXT", + "to3MHE": "HUB_EVENTS_FOOTER_DESCRIPTION", + "mnDjks": "HUB_EVENTS_FOOTER_TITLE", + "N+TB5v": "HUB_EVENTS_GO_TO_GUILD", + "6hktHA": "HUB_EVENTS_HEADER_DESCRIPTION", + "RhXVpX": "HUB_EVENTS_HEADER_TITLE", + "4BiO8c": "HUB_EVENTS_JOIN_GUILD", + "gTgUmR": "HUB_EVENTS_SHARE_CHANNEL_EVERYONE_VIEWABLE_WARNING", + "V8Oq8B": "HUB_EVENTS_SHARE_DESCRIPTION", + "8GW688": "HUB_EVENTS_SHARE_TITLE", + "CpG10a": "HYPESQUAD_DESCRIPTION_HOUSE_1", + "VNPE6m": "HYPESQUAD_DESCRIPTION_HOUSE_2", + "KNfiTa": "HYPESQUAD_DESCRIPTION_HOUSE_3", + "4JWDXt": "HYPESQUAD_ERROR_BODY", + "8A8ry9": "HYPESQUAD_ERROR_HEADING", + "iZowCU": "HYPESQUAD_HEADING", + "e7fL7J": "HYPESQUAD_HEADING_EXISTING_MEMBER", + "ORKdHa": "HYPESQUAD_HOUSE_1", + "aKf3dt": "HYPESQUAD_HOUSE_2", + "21LOa8": "HYPESQUAD_HOUSE_3", + "1GWQKp": "HYPESQUAD_JOIN", + "WH+dhp": "HYPESQUAD_LEAVE_ACTION", + "UUcECC": "HYPESQUAD_LEAVE_ERROR", + "ziWmcA": "HYPESQUAD_LEAVE_PROMPT", + "yG0XAD": "HYPESQUAD_MEMBERSHIP_HEADING", + "3kUvgp": "HYPESQUAD_NEWSLETTER_WARNING", + "ITh5++": "HYPESQUAD_PERKS_HEADING", + "qqp5Zc": "HYPESQUAD_PERK_DESCRIPTION_NEWSLETTER", + "3N3YOF": "HYPESQUAD_PERK_DESCRIPTION_PROFILE_BADGE", + "noChoN": "HYPESQUAD_PERK_DESCRIPTION_SQUAD_CHALLENGES", + "vURCfz": "HYPESQUAD_PERK_TITLE_NEWSLETTER", + "j4RYIw": "HYPESQUAD_PERK_TITLE_PROFILE_BADGE", + "Yu1bAp": "HYPESQUAD_PERK_TITLE_SQUAD_CHALLENGES", + "wWV9E/": "HYPESQUAD_QUESTION_0_PROMPT", + "o6ELqw": "HYPESQUAD_QUESTION_0_RESPONSE_A", + "VVcLQv": "HYPESQUAD_QUESTION_0_RESPONSE_B", + "v/5qvm": "HYPESQUAD_QUESTION_0_RESPONSE_C", + "dMYFq7": "HYPESQUAD_QUESTION_0_RESPONSE_D", + "FAs+YJ": "HYPESQUAD_QUESTION_10_PROMPT", + "jD0Bbf": "HYPESQUAD_QUESTION_10_RESPONSE_A", + "zFZP2V": "HYPESQUAD_QUESTION_10_RESPONSE_B", + "AQi4BF": "HYPESQUAD_QUESTION_10_RESPONSE_C", + "HNGDgo": "HYPESQUAD_QUESTION_10_RESPONSE_D", + "dY+C+S": "HYPESQUAD_QUESTION_11_PROMPT", + "8PHLGl": "HYPESQUAD_QUESTION_11_RESPONSE_A", + "PAWXCl": "HYPESQUAD_QUESTION_11_RESPONSE_B", + "pyRWsp": "HYPESQUAD_QUESTION_11_RESPONSE_C", + "SfbdaG": "HYPESQUAD_QUESTION_11_RESPONSE_D", + "1DiI68": "HYPESQUAD_QUESTION_12_PROMPT", + "VdyT73": "HYPESQUAD_QUESTION_12_RESPONSE_A", + "9tQrr1": "HYPESQUAD_QUESTION_12_RESPONSE_B", + "E11H4x": "HYPESQUAD_QUESTION_12_RESPONSE_C", + "TRNpXH": "HYPESQUAD_QUESTION_12_RESPONSE_D", + "r23dpx": "HYPESQUAD_QUESTION_13_PROMPT", + "gFpEVr": "HYPESQUAD_QUESTION_13_RESPONSE_A", + "oqF1le": "HYPESQUAD_QUESTION_13_RESPONSE_B", + "itk+ip": "HYPESQUAD_QUESTION_13_RESPONSE_C", + "WyvPF8": "HYPESQUAD_QUESTION_13_RESPONSE_D", + "/cxmL/": "HYPESQUAD_QUESTION_14_PROMPT", + "zaKm/a": "HYPESQUAD_QUESTION_14_RESPONSE_A", + "SES9Zg": "HYPESQUAD_QUESTION_14_RESPONSE_B", + "ebblm8": "HYPESQUAD_QUESTION_14_RESPONSE_C", + "csrWfP": "HYPESQUAD_QUESTION_14_RESPONSE_D", + "ujB5uC": "HYPESQUAD_QUESTION_1_PROMPT", + "R2dI+d": "HYPESQUAD_QUESTION_1_RESPONSE_A", + "s0EqhB": "HYPESQUAD_QUESTION_1_RESPONSE_B", + "ex6tvp": "HYPESQUAD_QUESTION_1_RESPONSE_C", + "lk2Bt5": "HYPESQUAD_QUESTION_1_RESPONSE_D", + "zYNt1A": "HYPESQUAD_QUESTION_2_PROMPT", + "NOC4TT": "HYPESQUAD_QUESTION_2_RESPONSE_A", + "FlDBfC": "HYPESQUAD_QUESTION_2_RESPONSE_B", + "MLzlRR": "HYPESQUAD_QUESTION_2_RESPONSE_C", + "1j46Zr": "HYPESQUAD_QUESTION_2_RESPONSE_D", + "CQkJcr": "HYPESQUAD_QUESTION_3_PROMPT", + "NyWJLy": "HYPESQUAD_QUESTION_3_RESPONSE_A", + "uF0u85": "HYPESQUAD_QUESTION_3_RESPONSE_B", + "BZuLSe": "HYPESQUAD_QUESTION_3_RESPONSE_C", + "27zWTt": "HYPESQUAD_QUESTION_3_RESPONSE_D", + "dPgrQn": "HYPESQUAD_QUESTION_4_PROMPT", + "Aq4y+g": "HYPESQUAD_QUESTION_4_RESPONSE_A", + "rr72eO": "HYPESQUAD_QUESTION_4_RESPONSE_B", + "2v7Vv9": "HYPESQUAD_QUESTION_4_RESPONSE_C", + "H5wx2U": "HYPESQUAD_QUESTION_4_RESPONSE_D", + "uS4tV2": "HYPESQUAD_QUESTION_5_PROMPT", + "tld7Ia": "HYPESQUAD_QUESTION_5_RESPONSE_A", + "OOfrPi": "HYPESQUAD_QUESTION_5_RESPONSE_B", + "QbtUjw": "HYPESQUAD_QUESTION_5_RESPONSE_C", + "88DsQh": "HYPESQUAD_QUESTION_5_RESPONSE_D", + "DMzlBv": "HYPESQUAD_QUESTION_6_PROMPT", + "wURefk": "HYPESQUAD_QUESTION_6_RESPONSE_A", + "6abY0a": "HYPESQUAD_QUESTION_6_RESPONSE_B", + "VttdKM": "HYPESQUAD_QUESTION_6_RESPONSE_C", + "N9tGcB": "HYPESQUAD_QUESTION_6_RESPONSE_D", + "4A4ezb": "HYPESQUAD_QUESTION_7_PROMPT", + "pK+hm2": "HYPESQUAD_QUESTION_7_RESPONSE_A", + "fpfjDX": "HYPESQUAD_QUESTION_7_RESPONSE_B", + "QDZPw/": "HYPESQUAD_QUESTION_7_RESPONSE_C", + "DJBGuY": "HYPESQUAD_QUESTION_7_RESPONSE_D", + "wshlHU": "HYPESQUAD_QUESTION_8_PROMPT", + "b5ar8Y": "HYPESQUAD_QUESTION_8_RESPONSE_A", + "SBEThn": "HYPESQUAD_QUESTION_8_RESPONSE_B", + "WsXEqZ": "HYPESQUAD_QUESTION_8_RESPONSE_C", + "1jEI+A": "HYPESQUAD_QUESTION_8_RESPONSE_D", + "pxkSfj": "HYPESQUAD_QUESTION_9_PROMPT", + "Y+ztvA": "HYPESQUAD_QUESTION_9_RESPONSE_A", + "PCjFjO": "HYPESQUAD_QUESTION_9_RESPONSE_B", + "jjodpJ": "HYPESQUAD_QUESTION_9_RESPONSE_C", + "5tHTjF": "HYPESQUAD_QUESTION_9_RESPONSE_D", + "hNL/nL": "HYPESQUAD_QUIZ_BODY_HOUSE_1", + "jVomuj": "HYPESQUAD_QUIZ_BODY_HOUSE_2", + "+kg5zh": "HYPESQUAD_QUIZ_BODY_HOUSE_3", + "5NfNYm": "HYPESQUAD_QUIZ_CANCEL", + "Wc/k5H": "HYPESQUAD_QUIZ_CLOSE", + "mW2CN8": "HYPESQUAD_QUIZ_COMPLETED_MODAL_TITLE", + "fMgJM0": "HYPESQUAD_QUIZ_ERROR_MODAL_TITLE", + "cgonQG": "HYPESQUAD_QUIZ_NEXT_QUESTION", + "4n8Pby": "HYPESQUAD_QUIZ_ONGOING_MODAL_TITLE", + "5BGOBA": "HYPESQUAD_QUIZ_RETRY", + "YeiLeI": "HYPESQUAD_QUIZ_SELECT_ANSWER", + "j5vHoz": "HYPESQUAD_QUIZ_SHOW_MY_HOUSE", + "HrcQAO": "HYPESQUAD_QUIZ_TITLE", + "Uq6KRt": "HYPESQUAD_READY_TO_REP", + "6FaVFO": "HYPESQUAD_SUBHEADING", + "LzBgrs": "HYPESQUAD_SWITCH_HOUSES_ACTION", + "zD3mqF": "HYPESQUAD_SWITCH_HOUSES_PROMPT", + "vZU8Kq": "HYPESQUAD_UNCLAIMED_ACCOUNT_NOTICE", + "T7TYEB": "HYPESQUAD_UNVERIFIED_EMAIL_NOTICE", + "KZoEI8": "HYPESQUAD_YOUR_HOUSE", + "afQrXj": "IMPORT", + "UJq0LC": "INFO", + "hTBi1z": "INPUT", + "P4RBtc": "INSTALL", + "5UKyUq": "INSTANT_INVITE_ACCEPT_STAGE", + "iNeO8H": "INVITE", + "VEtAtY": "INVITE_EMBED_FULL_GROUP", + "I52SNU": "INVITE_EMBED_GAME_INVITE", + "uWBvp/": "INVITE_EMBED_INVITE_TO_JOIN_GROUP", + "Y0TV5I": "INVITE_EMBED_IN_GROUP", + "EfJzLA": "INVITE_EMBED_LISTENING_INVITE", + "Z2irYI": "INVITE_EMBED_SEND_INVITE", + "DDzEVn": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_CONTENT", + "pMftkD": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_CONTENT_LOCKED", + "rOFcBt": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_CTA_PRIMARY_ROLE_SETTINGS", + "hBIHLc": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_CTA_SECONDARY", + "36wK83": "INVITE_SPLASH_GUILD_HEADER_TOOLTIP_TITLE", + "hd/uCi": "IN_APP_EDUCATION_CHANNEL_HEADER", + "3HA76Z": "IN_APP_EDUCATION_CHANNEL_SUBHEADER", + "rqVMdL": "IN_APP_EDUCATION_DM_HEADER", + "Yq9fnY": "IN_APP_EDUCATION_DM_SUBHEADER", + "zOKuz+": "IN_APP_EDUCATION_MORE_HELP_HEADER", + "b7APqC": "IN_APP_EDUCATION_MORE_HELP_SUBHEADER", + "0zk2sS": "IN_APP_EDUCATION_SERVER_HEADER", + "NgKsgR": "IN_APP_EDUCATION_SERVER_SUBHEADER", + "1UiKPl": "IOS_PROFILE_IN_VOICE_CALL", + "SJSaoT": "IOS_PROFILE_OPEN_VOICE_CHANNEL", + "5wbqhd": "KEYBOARD", + "O/7ALP": "LABEL", + "P3huQP": "LAUNCH_WELCOME_CHOOSE_A_THEME", + "7lEuXo": "LAUNCH_WELCOME_LANDING_SUBTITLE", + "prQDM5": "LAUNCH_WELCOME_LANDING_TITLE", + "lmz9aO": "LAUNCH_WELCOME_LEARN_MORE", + "vcisKb": "LEADERBOARD_GUILD_SETTINGS_MODAL_COMPETITION_SECTION_LABEL", + "R0X60o": "LEADERBOARD_GUILD_SETTINGS_MODAL_COMPETITION_SECTION_TITLE", + "WWBw57": "LEADERBOARD_MODAL_TITLE", + "HHDUd6": "LINK", + "/lFHJn": "LINK_YOUR_XBOX_ACCOUNT_1", + "1gfPiv": "LINK_YOUR_XBOX_ACCOUNT_2", + "HznH9x": "LIST", + "C+hUcx": "LOADING_LINE_11", + "G41kuy": "LOAD", + "5kvQM5": "LOCALIZED_PRICING_BANNER_BODY_EXISTING_CURRENCY", + "4cHbQz": "LOCALIZED_PRICING_BANNER_BODY_NEW_CURRENCY", + "BrYPGn": "LOCALIZED_PRICING_BANNER_BODY_NEW_CURRENCY_WITH_AMBIGUOUS_SYMBOL", + "xnD0NZ": "LOCALIZED_PRICING_BANNER_BODY_WITHOUT_PRICE", + "BuFSar": "LOCALIZED_PRICING_BANNER_HEADER", + "XufWPt": "LOCALIZED_PRICING_BANNER_LINK_ONLY", + "N1xw/Y": "LOCALIZED_PRICING_BANNER_NO_LOWERED_PRICE", + "o60rUP": "LOCALIZED_PRICING_BANNER_NO_LOWERED_PRICE_SINGLE_STRING", + "YDdBe4": "LOCALIZED_PRICING_BANNER_SUB_NOTIF", + "8rM+To": "LOCALIZED_PRICING_GENERALIZED_PAYMENT_METHODS_PROMO", + "M4FYRC": "LOCALIZED_PRICING_LEGACY_PRICING_BOOST_WARNING", + "MIY5dl": "LOCALIZED_PRICING_LEGACY_PRICING_WARNING", + "jwAcUD": "LOCALIZED_PRICING_LEGACY_PRICING_WARNING_NO_HELP_CENTER_LINK", + "jFY5lF": "LOCALIZED_PRICING_MOBILE_PRICE_CHANGE_NOTICE_HAS_SUB", + "58fjlZ": "LOCALIZED_PRICING_MOBILE_PRICE_CHANGE_NOTICE_HAS_SUB_AU", + "SKxUmb": "LOCALIZED_PRICING_MOBILE_PRICE_CHANGE_NOTICE_NO_SUB", + "olIY4h": "LOCALIZED_PRICING_MOBILE_PRICE_CHANGE_NOTICE_NO_SUB_AU", + "Tp5NkT": "LOCALIZED_PRICING_MORE_NEW_WAYS_TO_PAY", + "RJ4935": "LOCALIZED_PRICING_NOTICE", + "+5bXba": "LOCALIZED_PRICING_NOTICE_GENERALIZED_PAYMENT_METHODS_PROMO", + "0jblPl": "LOCALIZED_PRICING_NOTICE_NO_LOWERED_PRICE", + "QqRQPs": "LOCALIZED_PRICING_PAYMENT_METHODS_PROMO", + "hCpzie": "LOCALIZED_PRICING_PLN_LEGACY_PRICING_BOOST_WARNING", + "mTFLPD": "LOCALIZED_PRICING_PLN_LEGACY_PRICING_WARNING", + "0MAev8": "LOCALIZED_PRICING_PLN_LEGACY_PRICING_WARNING_NO_HELP_CENTER_LINK", + "9rb4Wz": "LOCALIZED_PRICING_TRY_LEGACY_PRICING_BOOST_WARNING", + "SQ4LyV": "LOCALIZED_PRICING_TRY_LEGACY_PRICING_WARNING", + "p2CqUj": "LOCALIZED_PRICING_TRY_LEGACY_PRICING_WARNING_NO_HELP_CENTER_LINK", + "gmgFZl": "LOCK", + "gbOKxn": "LOGGED_OUT_DISCOVERY_FIND_GAMING_GUILD_CTA", + "a2lbLr": "LOGGED_OUT_DISCOVERY_FIND_GAMING_GUILD_HEADER", + "/B+X5Q": "LOGGED_OUT_DISCOVERY_FIND_GAMING_GUILD_SUBHEADER", + "PrDDkp": "LOGGED_OUT_DISCOVERY_MOBILE_CTA", + "0J3Hrm": "MANAGE", + "xJGYzW": "MARK", + "ujGN9Q": "MEDIA_VIEWER_REACTION_LABEL", + "l5PP/2": "MEMBER_LIST_CONTENT_FEED_TIMESTAMP_ACTIVE", + "TDi/ct": "MEMBER_VERIFICATION_LEAVE_APPLICATION_COMPLETE_LATER", + "DeDPr4": "MEMBER_VERIFICATION_LEAVE_APPLICATION_DESC", + "lhVad+": "MEMBER_VERIFICATION_LEAVE_APPLICATION_TITLE", + "Ip58Kh": "MEMBER_VERIFICATION_PENDING_APPLICATION_MODAL_LEAVE", + "HY+QM0": "MESSAGE", + "pQioM5": "MFA_SMS_ENABLE_SHOULD_DO", + "GOnSXu": "MOBILE", + "hDrTPm": "MODE", + "wGpywa": "MOVE", + "CgmyUH": "NAME", + "5OjF/T": "NICK", + "TWxqHq": "NITROWEEN_DESKTOP_BILLING_SETTINGS_SUBTITLE", + "IelGKw": "NITROWEEN_DESKTOP_GIFT_CONFIRMATION_TITLE_MONTH", + "gausuY": "NITROWEEN_DESKTOP_GIFT_CONFIRMATION_TITLE_YEAR", + "DPwt6B": "NITROWEEN_DESKTOP_GIFT_PLAN_SELECT_DESCRIPTION", + "5vzYv/": "NITROWEEN_DESKTOP_GIFT_PURCHASE_DESCRIPTION", + "rX/m/d": "NITROWEEN_DESKTOP_GIFT_PURCHASE_PLACEHOLDER", + "BIBwbh": "NITROWEEN_GIFT_UPSELL_DESCRIPTION", + "YMI+UX": "NITROWEEN_GIFT_UPSELL_TITLE", + "J88y6C": "NITROWEEN_MOBILE_GIFT_PLAN_SELECT_DESCRIPTION", + "W0CSx5": "NITROWEEN_MOBILE_GIFT_PURCHASE_DESCRIPTION", + "TY4x0K": "NITRO", + "bXwK8d": "NITRO_HOME_SHY_PROJECT_SUBTITLE", + "S4AYvm": "NITRO_HOME_SHY_PROJECT_TITLE", + "HcErZT": "NOTICE_H264_DISABLED_SETTINGS", + "51hI/g": "NOTICE_H264_DISABLED_SETTINGS_LINK_TEXT", + "B2hnhV": "NOTICE_MFA_SMS_BACKUP", + "50KYxi": "NOTICE_MFA_SMS_BACKUP_BUTTON", + "ZnrORv": "NOTIFICATION", + "nlpqxJ": "NOTIF_MIGRATION_BACKUP", + "izeB6V": "NOTIF_MIGRATION_CUSTOMIZE_SECTION1_SUBTITLE", + "f6pf36": "NOTIF_MIGRATION_CUSTOMIZE_SECTION1_TITLE", + "e+d/vn": "NOTIF_MIGRATION_CUSTOMIZE_SECTION2_SUBTITLE", + "tGGAdR": "NOTIF_MIGRATION_CUSTOMIZE_SECTION2_TITLE", + "zE9e/9": "NOTIF_MIGRATION_CUSTOMIZE_SUB_TITLE", + "56vYWZ": "NOTIF_MIGRATION_CUSTOMIZE_TAB", + "zBC2+b": "NOTIF_MIGRATION_CUSTOMIZE_TITLE", + "mCjLAR": "NOTIF_MIGRATION_ERROR", + "fgedbB": "NOTIF_MIGRATION_GUILD_TOOLTIP_ALITTLE", + "6dgvsf": "NOTIF_MIGRATION_GUILD_TOOLTIP_ALOT", + "3EQSoP": "NOTIF_MIGRATION_GUILD_TOOLTIP_BUSY", + "rdTrH7": "NOTIF_MIGRATION_GUILD_TOOLTIP_MUTED", + "sdFUj1": "NOTIF_MIGRATION_GUILD_TOOLTIP_NOT_MUTED", + "CaR/Et": "NOTIF_MIGRATION_GUILD_TOOLTIP_QUIET", + "R8eSY9": "NOTIF_MIGRATION_INTRO_AFTER", + "sLv7LF": "NOTIF_MIGRATION_INTRO_BEFORE", + "WFejRi": "NOTIF_MIGRATION_INTRO_CHANNEL_1", + "jqWm9Z": "NOTIF_MIGRATION_INTRO_CHANNEL_2", + "p9z9Iw": "NOTIF_MIGRATION_INTRO_CHANNEL_3", + "2bdWD/": "NOTIF_MIGRATION_INTRO_CHANNEL_4", + "Ci+Ouh": "NOTIF_MIGRATION_INTRO_CHANNEL_5", + "/7TEdh": "NOTIF_MIGRATION_INTRO_CHANNEL_6", + "Ime/t8": "NOTIF_MIGRATION_INTRO_CHANNEL_7", + "dKPfBe": "NOTIF_MIGRATION_INTRO_SUB_TITLE", + "JwwVrl": "NOTIF_MIGRATION_INTRO_TAB", + "eZb3iS": "NOTIF_MIGRATION_INTRO_TIP_AFTER1", + "M3KrJV": "NOTIF_MIGRATION_INTRO_TIP_AFTER2", + "WrPMOJ": "NOTIF_MIGRATION_INTRO_TIP_BEFORE1", + "pApL75": "NOTIF_MIGRATION_INTRO_TIP_BEFORE2", + "c0FhpS": "NOTIF_MIGRATION_INTRO_TITLE", + "Rm96Ty": "NOTIF_MIGRATION_SETTINGS_CONFIRM_ACTION", + "7zTJJQ": "NOTIF_MIGRATION_SETTINGS_CONFIRM_BODY", + "frbLrH": "NOTIF_MIGRATION_SETTINGS_SUBTITLE", + "z21l8M": "NOTIF_MIGRATION_SETTINGS_TITLE", + "jr/rn6": "NOTIF_MIGRATION_TIPS_SUB_TITLE", + "0l0rJj": "NOTIF_MIGRATION_TIPS_TAB", + "pS4WEr": "NOTIF_MIGRATION_TIPS_TAB1", + "C//fO+": "NOTIF_MIGRATION_TIPS_TAB1_TIP2", + "UVxi0U": "NOTIF_MIGRATION_TIPS_TAB2", + "5Il5fq": "NOTIF_MIGRATION_TIPS_TAB2_TIP1", + "+ROcro": "NOTIF_MIGRATION_TIPS_TAB2_TIP2", + "Wyk03p": "NOTIF_MIGRATION_TIPS_TITLE", + "2iHA3E": "NSFW", + "SURFMd": "NUX_SAMSUNG_GAME_PRESENCE_LINK_DESCRIPTION", + "J/ULNd": "NUX_SAMSUNG_GAME_PRESENCE_LINK_ENABLE", + "0XJ02e": "NUX_SAMSUNG_GAME_PRESENCE_LINK_TITLE", + "dbQxRw": "NUX_VALUE_PROPS_CAMERA_CARD_TITLE", + "3wC7eA": "NUX_VALUE_PROPS_CHAT_CARD_TITLE", + "GG2T6g": "NUX_VALUE_PROPS_HEADER_TITLE", + "FxpjsB": "NUX_VALUE_PROPS_NEXT_BUTTON", + "1BryeC": "NUX_VALUE_PROPS_SERVERS_2_CARD_TITLE", + "1K/IWy": "NUX_VALUE_PROPS_SERVERS_CARD_TITLE", + "MbhY+t": "NUX_VALUE_PROPS_SUBTITLE", + "qjXn0M": "NUX_VALUE_PROPS_VOICE_CARD_TITLE", + "S2fS/h": "NUX_VALUE_PROPS_WELCOME_CARD_TITLE", + "7xlX6S": "OAUTH2_REQUESTS_PRIVATE_CHANNEL_INTEGRATION", + "tyAj1I": "OVERLAY_MOBILE_REQUIRED", + "835B8B": "OVERLAY_MOBILE_UNAUTHED", + "zT1hgi": "POMELO_ACTION_NEEDED_FORCE", + "byekh7": "PREMIUM_2024_APRIL_NITRO_OFFER_BANNER_BODY_NON_SUB", + "vjCATj": "PREMIUM_2024_APRIL_NITRO_OFFER_BANNER_BODY_UPGRADE", + "nuo6BF": "PREMIUM_2024_APRIL_NITRO_OFFER_BANNER_HEADER", + "9juoTF": "PREMIUM_2024_APRIL_NITRO_OFFER_CLAIM_DECO_MODAL_BODY", + "Vzhz9f": "PREMIUM_2024_APRIL_NITRO_OFFER_HEADER", + "Yg8upJ": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_APP_ICONS_TILE_BODY", + "WhHmpE": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_APP_ICONS_TILE_HEADER", + "i+6bj7": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_BUTTON_CTA_NON_SUB", + "wUIAMO": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_BUTTON_CTA_NON_TIER_2_SUB", + "/PFsDn": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_COLOR_THEMES_TILE_BODY", + "fsiUtD": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_COLOR_THEMES_TILE_HEADER", + "0gojNq": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_CUSTOM_PROFILE_TILE_BODY", + "5R53Rt": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_CUSTOM_PROFILE_TILE_HEADER", + "qjfkT/": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_MODAL_TOP_PILL", + "UOmZZF": "PREMIUM_2024_APRIL_NITRO_OFFER_MODAL_SUBHEADER", + "t2wV0N": "PREMIUM_2024_APRIL_NITRO_OFFER_PAYMENT_FLOW_BANNER_HEADER", + "+Hmv2k": "PREMIUM_MARKETING_PLAN_COMPARISON_REFERRAL_PROGRAM", + "2GPNry": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_DESCRIPTION_NON_SUB", + "MCvgWv": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_DESCRIPTION_SUB", + "1QvWwh": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_SUBTITLE_NON_SUB", + "QcJ6cW": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_SUBTITLE_SUB", + "5YcGTv": "PREMIUM_MARKETING_WHATS_NEW_AVATAR_DECO_TITLE", + "+89rAP": "PREMIUM_MARKETING_WHATS_NEW_BOXES_REFERRAL_PROGRAM_DESCRIPTION", + "XNKnvm": "PREMIUM_MARKETING_WHATS_NEW_PROFILE_EFFECTS_DESCRIPTION_NON_SUB", + "0mUM/O": "PREMIUM_MARKETING_WHATS_NEW_PROFILE_EFFECTS_DESCRIPTION_SUB", + "eVvkD5": "PREMIUM_MARKETING_WHATS_NEW_PROFILE_EFFECTS_SUBTITLE", + "c7OKaF": "PREMIUM_MARKETING_WHATS_NEW_PROFILE_EFFECTS_TITLE", + "fiLtJq": "PREMIUM_MARKETING_WHATS_NEW_REMIXING_DESCRIPTION_NON_SUB", + "gdA9FI": "PREMIUM_MARKETING_WHATS_NEW_REMIXING_DESCRIPTION_SUB", + "wmbOAh": "PREMIUM_MARKETING_WHATS_NEW_REMIXING_SUBTITLE", + "H+v6ed": "PREMIUM_MARKETING_WHATS_NEW_REMIXING_TITLE", + "R2H/Eh": "PREMIUM_NITRO_DROP_2023_AVATAR_DECO_FEATURE_HEADER", + "bphR6V": "PREMIUM_NITRO_DROP_2023_AVATAR_DECO_FEATURE_SUBHEADER", + "xZqys2": "PREMIUM_NITRO_DROP_2023_BANNER_HEADER", + "YOriev": "PREMIUM_NITRO_DROP_2023_BANNER_NON_TIER_2_SUB_SUBHEADER", + "DLR4XU": "PREMIUM_NITRO_DROP_2023_BANNER_NON_TIER_2_SUB_SUBHEADER_2", + "X8mxJm": "PREMIUM_NITRO_DROP_2023_BANNER_TIER_2_SUB_SUBHEADER", + "8k2oih": "PREMIUM_NITRO_DROP_2023_BANNER_TIER_2_SUB_SUBHEADER_2", + "nqmeZ9": "PREMIUM_NITRO_DROP_2023_CLIENT_THEMES_FEATURE_HEADER", + "o9czzi": "PREMIUM_NITRO_DROP_2023_CLIENT_THEMES_FEATURE_SUBHEADER", + "TPdd8+": "PREMIUM_NITRO_DROP_2023_HEADER", + "npVU9h": "PREMIUM_NITRO_DROP_2023_NON_SUB_BUTTON_TEXT", + "m8DH1N": "PREMIUM_NITRO_DROP_2023_NON_TIER_2_SUB_BUTTON_TEXT", + "HdWndl": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_NON_SUB_NUDGE", + "eylqmo": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_NON_TIER_2_SUB_NUDGE", + "Q/thPy": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_PROMO", + "XFhWma": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_TIER_2_NUDGE", + "KYMYyS": "PREMIUM_NITRO_DROP_2023_SHARE_NITRO_WITH_TRIAL_NUDGE", + "TbNqAM": "PREMIUM_NITRO_DROP_2023_SOUNDBOARD_FEATURE_HEADER", + "R61aF5": "PREMIUM_NITRO_DROP_2023_SOUNDBOARD_FEATURE_SUBHEADER", + "6hKrRW": "PREMIUM_NITRO_DROP_2023_SUBHEADER", + "o3Zwvh": "PREMIUM_NITRO_DROP_2023_SUPER_REACTIONS_FEATURE_HEADER", + "H5iTda": "PREMIUM_NITRO_DROP_2023_SUPER_REACTIONS_FEATURE_SUBHEADER", + "G3zQ/R": "PREMIUM_NITRO_DROP_2023_SUPER_REACTIONS_FEATURE_SUBHEADER_2", + "WWa4Bh": "PREMIUM_NITRO_DROP_2023_TERMS", + "7H++ph": "PREMIUM_NITRO_DROP_2023_TIER_2_SUB_BUTTON_TEXT", + "Rx4LEj": "PREMIUM_NITRO_DROP_2023_WITH_TRIAL_BUTTON_TEXT", + "zK1hph": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_SIZE_TOOLTIP_CONTENT", + "KAsfPX": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_SIZE_TOOLTIP_TITLE", + "ujItEl": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_TOOLTIP_CONTENT", + "UzVPrQ": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_TOOLTIP_CTA_PRIMARY_ROLE_SETTINGS", + "KkK/aM": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_TOOLTIP_CTA_SECONDARY", + "nxtaF7": "PREMIUM_PROGRESS_BAR_GUILD_HEADER_TOOLTIP_TITLE", + "ky8rxb": "PREMIUM_TIER_2_FEATURE_REMIXING", + "ZsgnLK": "PREMIUM_TRIAL_MARKETING_TRIAL_CTA_DAYS", + "Y0HCVd": "PREMIUM_TRIAL_MARKETING_TRIAL_CTA_MONTHS", + "8awlzB": "PREMIUM_TRIAL_MARKETING_TRIAL_CTA_WEEKS", + "ns1zkS": "PREMIUM_TRIAL_MARKETING_TRIAL_CTA_YEARS", + "4ckVu6": "PRIVACY_AND_SAFETY_SOCIAL_PERMISSIONS_DM_SETTING_SERVER_NOTE", + "Pe9fcU": "PRIVATE_CHANNEL_ADD_APPS", + "VoPuAy": "PRIVATE_CHANNEL_AVAILABLE_APPS", + "vZQD/6": "PRIVATE_CHANNEL_INSTALLED_APPS", + "85QGGf": "PRIVATE_CHANNEL_INTEGRATION_ADD_MODAL_ROW_INFO", + "2O07Ev": "PRIVATE_CHANNEL_INTEGRATION_MORE_APPS_INFO", + "6hcR9x": "PRIVATE_CHANNEL_INTEGRATION_MORE_APPS_INFO_LINKED", + "Tizg0h": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_BODY", + "+59dAX": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_CANNOT_READ_MESSAGE", + "lejOxr": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_COMMAND_SUMMARY", + "JppXEi": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_LEARN_MORE", + "ChPrUp": "PRIVATE_CHANNEL_INTEGRATION_OAUTH_SHEET_TITLE", + "nbA5Ps": "PRIVATE_CHANNEL_TRY_APPS", + "7xavVl": "PRIVATE_CHANNEL_TRY_APPS_LINKED", + "gUPW4a": "PROFILE_EFFECT_MODAL_APPLY", + "t5SVGU": "PROFILE_EFFECT_MODAL_HEADER", + "fmIfaD": "PROFILE_EFFECT_MODAL_SHOP_PREVIEW_HEADER", + "fJNqJt": "PROFILE_LOOKING_GOOD_TOOLTIP_TEXT", + "Q9g0Cs": "PS_LINK_UPSELL_CONTENT", + "LWC6fe": "PS_LINK_UPSELL_CONTENT_RECONNECT", + "FKmud4": "PS_LINK_UPSELL_HEADER", + "623c8V": "PS_LINK_UPSELL_HEADER_RECONNECT", + "TF7cPa": "Q4_DROP_WHATS_NEW_UNLIMITED_SUPER_REACTIONS_CARD_DESCRIPTION_NON_SUB", + "Cn/z63": "Q4_DROP_WHATS_NEW_UNLIMITED_SUPER_REACTIONS_CARD_DESCRIPTION_SUB", + "Hxujsr": "Q4_DROP_WHATS_NEW_UNLIMITED_SUPER_REACTIONS_CARD_SUBTITLE", + "hpgmO+": "Q4_DROP_WHATS_NEW_UNLIMITED_SUPER_REACTIONS_CARD_TITLE", + "+MW4lN": "QUESTS_ACCEPT_TOOLTIP", + "6cSPNO": "QUESTS_ANY_GAME_NOT_DETECTED", + "hzq8VE": "QUESTS_CHECK_FOR_ANY_GAME_LAUNCH_TOOLTIP", + "2vKYEB": "QUESTS_CLAIM_THE_REWARD_HOOK", + "Ag+a7L": "QUESTS_COLLECTIBLES_TEMPORARY_COLLECTION", + "7P3PEA": "QUESTS_COMPLETED", + "8XB865": "QUESTS_COMPLETE_TOOLTIP", + "qqgS7o": "QUESTS_CONNECTION_MODAL_ERROR_LEARN_MORE", + "9rQPyp": "QUESTS_CONSOLE_CONNECTION_HELPER_STEPS_LAUNCH_ANY_GAME", + "yqc5QV": "QUESTS_DISCLOSURE_IN_HOUSE", + "Vv5ysH": "QUESTS_DISCLOSURE_IN_HOUSE_QUEST_BAR", + "/yqMgk": "QUESTS_DISCLOSURE_IN_HOUSE_QUEST_HOME", + "ZOJAeW": "QUESTS_DISCLOSURE_PUBLISHER_PROMOTING", + "O0JX4Z": "QUESTS_DISMISSAL_SURVEY_CHOICE_DONT_PLAY_GAME", + "gnfiSF": "QUESTS_DISMISSAL_SURVEY_THANKS", + "zsHThW": "QUESTS_EARN_REWARD", + "9nS4MS": "QUESTS_EMBED_INVALID_BODY", + "sA0YhR": "QUESTS_EMBED_INVALID_BODY_2", + "BG/mqw": "QUESTS_EXPIRED_QUEST_CARD_SUBHEADING_EARN", + "RGG2Mz": "QUESTS_FIND_QUEST", + "wm6viQ": "QUESTS_FOR_YOU", + "IjISqk": "QUESTS_HOME_HERO_DESCRIPTION", + "MhG/VS": "QUESTS_HOME_HERO_TITLE", + "5ctBX6": "QUESTS_HOME_MOVED_CALLOUT_DESCRIPTION", + "ZQ2za5": "QUESTS_INSTRUCTIONS_TO_EARN_REWARD", + "Tu36SU": "QUESTS_INSTRUCTIONS_TO_EARN_REWARD_TIERED", + "QoRDcs": "QUESTS_INSTRUCTIONS_TO_EARN_REWARD_TIERED_V2", + "OlWhjI": "QUESTS_INSTRUCTIONS_TO_EARN_REWARD_V2", + "j9iEPO": "QUESTS_INSTRUCTIONS_TO_WIN_REWARD", + "Y+lp80": "QUESTS_IN_HOUSE_TASK", + "UhuY7v": "QUESTS_IN_HOUSE_TASK_WITH_LINK", + "416bPZ": "QUESTS_IN_HOUSE_TITLE", + "qVaoNg": "QUESTS_LANDING_PAGE_MOBILE_WEB_BODY_DESKTOP_AND_MOBILE", + "F9oOIb": "QUESTS_LEARN_MORE_LINK", + "zrLnnH": "QUESTS_MICROPHONE_UNIT_BODY_ANY_GAME", + "at0ya6": "QUESTS_MICROPHONE_UNIT_FOOTER_HELP_ARTICLE_MULTI_V2", + "l2taaS": "QUESTS_MICROPHONE_UNIT_FOOTER_HELP_ARTICLE_SINGLE_V2", + "+bKyg/": "QUESTS_MOBILE_EMBED_UNKNOWN_TITLE", + "IRviFr": "QUESTS_MOBILE_HOME_LAUNCH_GAME", + "CTbW6V": "QUESTS_MOBILE_HOME_LAUNCH_GAME_DESKTOP", + "fUhYnc": "QUESTS_MOBILE_HOME_STREAM_GAME_DESKTOP", + "PfrqYX": "QUESTS_OTHER", + "XwFJ/T": "QUESTS_PLAY_GAME", + "EYy+QP": "QUESTS_PLAY_INSTRUCTIONS_TO_EARN_REWARD", + "qLhlOt": "QUESTS_PROMOTED_BY_GUILD", + "b+RCtf": "QUESTS_PSN_ONLINE_ID", + "1KUSRw": "QUESTS_REWARD_SPONSORED_BY", + "en9KDv": "QUESTS_SHARE_LINK", + "nqDGqW": "QUESTS_SPONSORED", + "37K1Ti": "QUESTS_TILE_BANNER_EXPIRES_ON_DATE", + "veEQX0": "QUESTS_VIDEO_END_PANEL_REWARD_SUBTITLE", + "pxXqZd": "QUESTS_VIDEO_END_PANEL_REWARD_TITLE", + "AowamK": "QUESTS_VIEW_COLLECTIBLE", + "4z+ESJ": "QUEST_BAR_MAC_WARNING_BODY", + "QbvIxE": "QUEST_BAR_MAC_WARNING_HEADER", + "AVC/hQ": "QUEST_BAR_SUBTITLE_PLAY_ANY_GAME_ON_CONNECTED_CONSOLE", + "U5htd6": "QUEST_BAR_SUBTITLE_PLAY_GAME_EARN", + "TZT3Ou": "QUEST_REWARD_MULTIPLATFORM_WITH_EXPIRING_COLLECTIBLE_REWARD", + "HzLAbw": "RAPIDASH_ASK_TO_JOIN_CTA", + "k5d4Wq": "RAPIDASH_ASK_TO_JOIN_LABEL", + "eq39ak": "REFERRAL_INCENTIVE_COUNTDOWN_DAYS", + "MoKnzW": "REFERRAL_INCENTIVE_DISCOUNT_UNLOCKED", + "nysttW": "REFERRAL_INCENTIVE_FRIEND_PASSES_CONVERT_GET_INCENTIVE", + "O8mswO": "REFERRAL_INCENTIVE_FRIEND_PASSES_KEEP_GOING", + "nHuzUJ": "REFERRAL_INCENTIVE_FRIEND_PASSES_REDEEMED", + "iGlQKt": "REFERRAL_INCENTIVE_FRIEND_PASS_COUNTDOWN_HAS_BEGUN", + "r/h7S1": "REFERRAL_INCENTIVE_FRIEND_PASS_COUNTDOWN_HAS_BEGUN_V2", + "mxPPxQ": "REFERRAL_INCENTIVE_GET_DISCOUNT_OFF_YOUR_NEXT_MONTH", + "HGO89r": "REFERRAL_INCENTIVE_KEEP_SHARING_TO_EARN_ANOTHER_DISCOUNT", + "Kq6hc9": "REFERRAL_INCENTIVE_MORE_FRIEND_PASSES_ALMOST_HERE", + "SRJkUU": "REFERRAL_INCENTIVE_NITRO_FRIEND_PASSES_INCOMING", + "md2GU3": "REFERRAL_INCENTIVE_SHARE_NITRO_GET_DISCOUNT", + "7GMtc7": "REFERRAL_INCENTIVE_YOU_EARNED_DISCOUNT", + "/LRLDR": "REFERRAL_INCENTIVE_YOU_SHARED_X_PASSES", + "b2WNfv": "REFERRAL_PROGRAM_EMBED_RECIPIENT_INELIGIBLE_HEADER", + "riIbKK": "REFERRAL_PROGRAM_EMBED_RECIPIENT_INELIGIBLE_SUBHEADER", + "hg6PxV": "REFERRAL_PROGRAM_MOBILE_EMBED_BODY", + "ULY0XI": "REFERRAL_PROGRAM_MOBILE_EMBED_BODY_1", + "yD1/3e": "REFERRAL_PROGRAM_MOBILE_EMBED_HEADER_1", + "dpgQFk": "REFERRAL_PROGRAM_MOBILE_EMBED_HEADER_2", + "BCQSh1": "REFERRAL_PROGRAM_MOBILE_EMBED_SUBHEADER_1", + "ld+seI": "REFERRAL_PROGRAM_MOBILE_EMBED_SUBHEADER_DAYS_2", + "JZCHZJ": "REFERRAL_PROGRAM_MOBILE_EMBED_SUBHEADER_HOURS_2", + "eWSC5w": "REFERRAL_PROGRAM_NO_ELIGIBLE_FRIENDS_HEADER", + "iZSeXh": "REFERRAL_PROGRAM_NO_ELIGIBLE_FRIENDS_SUBHEADER", + "UV4DRr": "REFERRAL_PROGRAM_PROGRESS_BAR_HEADER_COOL_DOWN", + "PGffT8": "REGISTER_LOGIN_PRIVACY_NOTICE", + "Hu9dUE": "REMIXING_ADD_MENTION", + "3N7uL+": "REMIXING_ADD_STICKER", + "WpFYAs": "REMIXING_ADD_TEXT", + "ScPxn5": "REMIXING_ASPECT_RATIO_FOUR_THREE", + "RUzEiL": "REMIXING_ASPECT_RATIO_ORIGINAL", + "M+8nRc": "REMIXING_ASPECT_RATIO_SIXTEEN_NINE", + "MC7UpF": "REMIXING_ASPECT_RATIO_SQUARE", + "JJHmqu": "REMIXING_ASPECT_RATIO_VERTICAL", + "GUH3Dn": "REMIXING_BACKDROP_EDITOR_TITLE", + "MlJlDh": "REMIXING_CAROUSEL_SCROLL_PAGE", + "s+dFp+": "REMIXING_CROP", + "xb0sts": "REMIXING_DOWNLOAD_APP", + "/2M0F+": "REMIXING_DRAWING_COLOR_BABY_BLUE", + "75qkhV": "REMIXING_DRAWING_COLOR_BLACK", + "WNCXCR": "REMIXING_DRAWING_COLOR_BROWN", + "XbOcLy": "REMIXING_DRAWING_COLOR_DARK_BLUE", + "fb3pl1": "REMIXING_DRAWING_COLOR_DARK_GOLD", + "HhUh7C": "REMIXING_DRAWING_COLOR_DARK_GREEN", + "y2QVFE": "REMIXING_DRAWING_COLOR_DARK_ORANGE", + "IlZU8O": "REMIXING_DRAWING_COLOR_DARK_PURPLE", + "kKm/lL": "REMIXING_DRAWING_COLOR_DARK_RED", + "KJxdzn": "REMIXING_DRAWING_COLOR_DARK_TAN", + "XsMHg/": "REMIXING_DRAWING_COLOR_FADED_GREEN", + "NnwVuT": "REMIXING_DRAWING_COLOR_GREEN430", + "XNdCjR": "REMIXING_DRAWING_COLOR_GREENISH_YELLOW", + "mI18GJ": "REMIXING_DRAWING_COLOR_LIGHT_PINK", + "CVsCnC": "REMIXING_DRAWING_COLOR_LIGHT_PURPLE", + "xThUQE": "REMIXING_DRAWING_COLOR_LIGHT_YELLOW", + "ipKC2k": "REMIXING_DRAWING_COLOR_LILAC", + "kA8VFd": "REMIXING_DRAWING_COLOR_ORANGE345", + "AUhKMk": "REMIXING_DRAWING_COLOR_PINK_TAN", + "7O8rfR": "REMIXING_DRAWING_COLOR_RED500", + "mkNVgR": "REMIXING_DRAWING_COLOR_TAN", + "p16+Jy": "REMIXING_DRAWING_COLOR_WHITE", + "U9pJRX": "REMIXING_DRAWING_COLOR_YELLOW260", + "xOjxOX": "REMIXING_DRAWING_DONE", + "mNk38l": "REMIXING_EXIT_ALERT_BODY", + "jvq6Y4": "REMIXING_EXIT_ALERT_LEAVE_BUTTON", + "iieH6q": "REMIXING_EXIT_ALERT_STAY_BUTTON", + "OD9/lz": "REMIXING_EXIT_ALERT_TITLE", + "Ox9Acq": "REMIXING_FLIP", + "1Pskj9": "REMIXING_FREE_DRAW", + "2djXy/": "REMIXING_LANGUAGE_SUPPORT_WARNING", + "Tmbf3S": "REMIXING_MENTIONS_TOOLTIP", + "HxKEhw": "REMIXING_OPEN_ERROR", + "8GwCPR": "REMIXING_PERKS_CARD_DESCRIPTION", + "ZvulDs": "REMIXING_PERKS_CARD_TITLE", + "L5SL3h": "REMIXING_POST_CTA", + "mNmH85": "REMIXING_QUARTERSHEET_CTA_TRY_IT", + "VUWdQr": "REMIXING_QUARTERSHEET_DESCRIPTION", + "Un8xqo": "REMIXING_QUARTERSHEET_DESCRIPTION_GA", + "ht2Op4": "REMIXING_QUARTERSHEET_UNLOCK_WITH_NITRO", + "X+YFqS": "REMIXING_REDO", + "jXPD1o": "REMIXING_ROTATE", + "uXDG34": "REMIXING_TAG", + "Gp2rPh": "REMIXING_TITLE", + "Db2Z1l": "REMIXING_TOOLTIP_CTA_TRY_IT_OUT", + "qSQIv6": "REMIXING_TOOLTIP_DESCRIPTION", + "UZYn3g": "REMIXING_TOOLTIP_DESCRIPTION_MEME", + "phHyIY": "REMIXING_TOOLTIP_NITRO_EARLY_ACCESS", + "OB3OdB": "REMIXING_TOOLTIP_NOT_NOW", + "u0oRGO": "REMIXING_TOOLTIP_TITLE_MEME_IT", + "IMtCbn": "REMIXING_TOOLTIP_TITLE_REMIX", + "bQB2V0": "REMIXING_TWO_FINGER_HINT", + "DA7ECE": "REMIXING_UNDO", + "bPif92": "REMIXING_UNDO_ALL_ALERT", + "8DLZru": "REMIXING_UNDO_ALL_ALERT_BODY", + "TeBodx": "REMIXING_UNDO_ALL_ALERT_CANCEL_BUTTON", + "IX7oWq": "RETURN_TO_CHANNEL", + "AKdc4E": "ROLE_PERMISSIONS_MANAGE_THREADS_DESCRIPTION", + "YDIQ8A": "ROLE_PERMISSIONS_MANAGE_THREADS_DESCRIPTION_CATEGORY", + "qry4Pd": "ROLE_PERMISSIONS_SEND_MESSAGES_DESCRIPTION", + "6pyXvl": "ROLE_PERMISSIONS_SEND_MESSAGES_IN_THREADS_DESCRIPTION", + "VvrChO": "ROLE_PERMISSIONS_SEND_MESSAGES_IN_THREADS_DESCRIPTION_CATEGORY", + "8eeEZr": "ROLE_PERMISSIONS_USE_CLYDE_AI", + "d664F+": "ROLE_PERMISSIONS_USE_CLYDE_AI_CHANNEL_DESCRIPTION", + "Tx5TjC": "ROLE_PERMISSIONS_USE_CLYDE_AI_GUILD_DESCRIPTION", + "1zzTSt": "SAFETY_CONSUMER_EDUCATION_BLOCK_CONTENT", + "61GrDO": "SAFETY_CONSUMER_EDUCATION_BLOCK_HEADER", + "xmrJWr": "SAFETY_CONSUMER_EDUCATION_MUTE_CONTENT", + "ajEMl9": "SAFETY_CONSUMER_EDUCATION_MUTE_HEADER", + "Lpp6PL": "SAFETY_CONSUMER_EDUCATION_REPORTING_CONTENT", + "4JBut5": "SAFETY_CONSUMER_EDUCATION_REPORTING_HEADER", + "fuwY7I": "SAVE_IMAGE_TO_DEVICE", + "wWIiGK": "SCOPE_UNSUPPORTED_ON_ANDROID", + "hqtfGn": "SCOPE_UNSUPPORTED_ON_ANDROID_DESCRIPTION", + "vBTk2A": "SERVER_FOLDER_MUTE_ALL", + "VFDdkU": "SERVER_FOLDER_UNMUTE_ALL", + "S0ajKG": "SET_STATUS_MODAL_CTA", + "YVM22u": "SET_STATUS_MODAL_SUBTITLE", + "DD4vJI": "SET_STATUS_MODAL_TITLE", + "1oPGmt": "SHARE_NITRO_EMBEDDED_MESSAGE_HEADER", + "vVnRxZ": "SHARE_NITRO_MODAL_CONFIRMATION_GENERAL_LAST_REFERRAL", + "SGbw2K": "SHARE_NITRO_VIEW_ON_DESKTOP", + "jQIyyK": "SOUNDBOARD_TOOLTIP_BODY", + "0jmTwC": "SOUNDBOARD_TOOLTIP_TITLE", + "PZNQKE": "SOUNDBOARD_TOOLTIP_TITLE_NEW", + "5DRw+w": "STAGE_CHANNEL_AUDIENCE_MODAL_ALT_TEXT", + "N3/OyV": "STAGE_MODERATOR_JOIN_MODAL_JOIN_AUDIENCE", + "Q8o/tb": "STAGE_MODERATOR_JOIN_MODAL_JOIN_SPEAKER", + "LQY4JX": "STAGE_MODERATOR_JOIN_MODAL_SUBTITLE", + "njetU0": "STAGE_MODERATOR_JOIN_MODAL_TITLE", + "ATpigW": "STAGE_SPEAK_INVITE_HEADER_BLOCKED_USERS", + "30yqZb": "STATUS_BRB", + "vkpn7+": "STATUS_CHILLING", + "U9Vv16": "STATUS_DND_HELP", + "UVSEhT": "STATUS_EATING", + "b6AscE": "STATUS_FOCUSING", + "lZslwM": "STATUS_GAMING", + "MqanVP": "STATUS_INVISIBLE_HELPER", + "l0q9/d": "STATUS_IN_TRANSIT", + "B+wavk": "STATUS_NONE", + "L/ZE8S": "STATUS_POPOUT_CUSTOM_TITLE", + "IN2LTm": "STATUS_POPOUT_EDIT_CUSTOM", + "UDg0qD": "STATUS_POPOUT_SET_CUSTOM", + "di6IF5": "STATUS_WATCHING", + "rIzKh7": "SUGGEST_STICKERS", + "J2Ftvj": "SWIPE_TO_REPLY", + "xPmJly": "SWIPE_TO_REPLY_COACHMARK", + "Tp1FWJ": "SWIPE_TO_REPLY_HINT", + "fwn2M9": "SYSTEM_MESSAGE_CHANNEL_LINKED_TO_LOBBY", + "Y/+SvO": "SYSTEM_MESSAGE_CHANNEL_LINKED_TO_LOBBY_MOBILE", + "UoHq/T": "SYSTEM_MESSAGE_CONSUMABLE_HD_STREAMING_EMBED_BODY", + "AeU3uO": "SYSTEM_MESSAGE_CONSUMABLE_HD_STREAMING_EMBED_TITLE", + "N6rchA": "SYSTEM_MESSAGE_CONSUMABLE_HD_STREAMING_IMG_ALT", + "5bYXjv": "SYSTEM_MESSAGE_CONSUMABLE_HD_STREAMING_STARTED", + "Wu9WJg": "TIERED_TENURE_BADGE_FIRE", + "1vEPKJ": "TIERED_TNURE_BADGE_BRONZE_TOOLTIP", + "yUxtHG": "TIERED_TNURE_BADGE_DIAMOND_TOOLTIP", + "6FLaGe": "TIERED_TNURE_BADGE_EMERALD_TOOLTIP", + "2E+W8Z": "TIERED_TNURE_BADGE_FIRE_TOOLTIP", + "t5Yv90": "TIERED_TNURE_BADGE_GOLD_TOOLTIP", + "IppEDj": "TIERED_TNURE_BADGE_PLATINUM_TOOLTIP", + "qA7ah7": "TIERED_TNURE_BADGE_RUBY_TOOLTIP", + "1pri6t": "TIERED_TNURE_BADGE_SILVER_TOOLTIP", + "wk1Ay3": "TOAST_REMIX_LANGUAGE_SUPPORT_WARNING", + "Xb5JGo": "TWO_FA_WEBAUTHN_SHOULD_DO", + "abvB5N": "UNREAD_NOTIFICATION_SETTING_NOTICE", + "htbuIR": "UPLOAD_AREA_PREMIUM_UPSELL_BODY_LINE_3", + "8Ql1Aw": "UPLOAD_ERROR_DESCRIPTION", + "fuqnBC": "URF_LANDING_PAGE_REPORT_MESSAGE_BUTTON", + "F4jrRW": "URF_LANDING_PAGE_REPORT_USER_PROFILE_BUTTON", + "532l+q": "URF_LANDING_PAGE_SUBTITLE", + "Z11w18": "URF_LANDING_PAGE_TITLE", + "7Q2yX9": "USER_DROPS_SETTINGS_DROPS_OPTED_OUT_FORMATTED", + "LQ32TR": "USER_PROFILE_ACTIVITY_REACT_COACHMARK_BODY", + "XDBiPX": "USER_PROFILE_ACTIVITY_REACT_COACHMARK_TITLE", + "HEGlIN": "USER_PROFILE_ALL_REACT_COACHMARK_BODY", + "65191r": "USER_PROFILE_AVATAR_REACT_COACHMARK_BODY", + "3FagAa": "USER_PROFILE_AVATAR_REACT_COACHMARK_TITLE", + "uBvD/1": "USER_PROFILE_BLOCKED_MODAL_BODY_CONFIRMATION", + "20WzZ0": "USER_PROFILE_BLOCKED_PANEL_BODY_CONFIRMATION", + "LXbngv": "USER_PROFILE_BLOCKED_PANEL_BODY_USERNAME", + "yzj+du": "USER_PROFILE_PROFILES_REACT_COACHMARK_BODY", + "R/RaK3": "USER_PROFILE_PROFILES_REACT_COACHMARK_TITLE", + "mU+JXL": "USER_PROFILE_RECENT_ACTIVITY_EDUCATION_TOOLTIP_BODY", + "ZQJ62/": "USER_PROFILE_RECENT_ACTIVITY_EDUCATION_TOOLTIP_HEADER", + "MYYTWb": "USER_PROFILE_STATUS_REACT_COACHMARK_BODY", + "X/My/u": "USER_PROFILE_STATUS_REACT_COACHMARK_TITLE", + "vQuLOt": "USER_SETTINGS_ACCOUNT_EMAIL_DESCRIPTION_NO_LINK", + "Tna/TZ": "USER_SETTINGS_CHANGE_AVATAR_DECORATION", + "0nEVoB": "USER_SETTINGS_CHANGE_PROFILE_EFFECT", + "h0hFx5": "USER_SETTINGS_CLOSE_BUTTON", + "k0R+4T": "USER_SETTINGS_HYPESQUAD", + "GReZ6D": "USER_SETTINGS_REMOVE_AVATAR_DECORATION", + "GsW4/o": "USER_SETTINGS_REMOVE_PER_GUILD_AVATAR_DECORATION", + "Ld+f5T": "USER_SETTINGS_REMOVE_PROFILE_EFFECT", + "w/vU5q": "USER_SETTINGS_STARTUP_BEHAVIOR", + "4rmZnx": "USER_SETTINGS_STREAMER_NOTICE_BODY", + "bxGbHL": "USER_SETTINGS_STREAMER_NOTICE_TITLE", + "GJ3Fcn": "USER_SETTINGS_USE_DEFAULT_PROFILE_EFFECT", + "Sln58X": "USER_SETTINGS_VOICE_HARDWARE_ENCODING", + "71Ve1y": "USER_SETTINGS_VOICE_OPEN_H264", + "Tceiqx": "USER_SETTINGS_VOICE_VIDEO_CODEC_TITLE", + "XOWfNn": "UU_FORCE_MIGRATION_EXISTING_FLOW_REMINDER_BODY_1", + "g/gkA4": "UU_FORCE_MIGRATION_EXISTING_FLOW_REMINDER_BODY_2", + "D8Drx5": "VOICE_CHANNEL_EFFECTS_COOLDOWN", + "Nn8lP/": "VOICE_CHANNEL_EFFECTS_HOTBAR_TITLE", + "RLHsH7": "VOICE_CHANNEL_EFFECTS_MORE", + "S2RGUI": "VOICE_CHANNEL_EFFECTS_REDUCED_MOTION_TOOLTIP_BODY", + "VzO6Ot": "VOICE_CHANNEL_EFFECTS_REDUCED_MOTION_TOOLTIP_CANCEL", + "fgVzkI": "VOICE_CHANNEL_EFFECTS_REDUCED_MOTION_TOOLTIP_CONFIRM", + "6gGHnX": "VOICE_CHANNEL_EFFECTS_REDUCED_MOTION_TOOLTIP_TITLE", + "ktEv/n": "VOICE_CHANNEL_EFFECTS_TOGGLE", + "oF6B0F": "VOICE_CHANNEL_EFFECTS_TOGGLE_TADA_ALT", + "GB2x0k": "VOICE_CHANNEL_EFFECTS_TOGGLE_TOOLTIP_DISABLED", + "CfapQY": "VOICE_CHANNEL_EFFECTS_TOGGLE_TOOLTIP_ENABLED", + "fe05NG": "VOICE_CHANNEL_EFFECTS_TOGGLE_UPSELL", + "YrsmBH": "WEBHOOK_CREATED_ON", + "Oz5yJd": "XBOX_AUTHORIZATION_TITLE", + "GOBHEz": "XBOX_PIN_STEP1", + "o0Gcfv": "XBOX_PIN_STEP2", + "J/bl64": "XBOX_PIN_STEP3", + "+ohEiB": "_OVERLAY_MOBILE_UNAUTHED", + "fCpOHj": "AI_FIX_GRAMMAR", + "mxQpUY": "AI_FIX_GRAMMAR_SUCCESS", + "6epDlR": "AI_TRANSLATE_BUTTON", + "JC9BXn": "AI_TRANSLATE_REVERT", + "FtVUqm": "AI_TRANSLATE_SUCCESS", + "xi+55/": "DESKTOP_DOWNLOAD_TITLE", + "FD9mUy": "DESKTOP_DOWNLOAD_TITLE_LINUX", + "hmGBzx": "DESKTOP_DOWNLOAD_TITLE_MAC", + "GY/qwb": "DESKTOP_DOWNLOAD_TITLE_WINDOWS" +} diff --git a/package.json b/package.json index 236522283..1894fec91 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "equicord", "private": "true", - "version": "1.14.2.0", + "version": "1.14.3.0", "description": "The other cutest Discord client mod", "homepage": "https://github.com/Equicord/Equicord#readme", "bugs": { diff --git a/packages/discord-types/src/common/Channel.d.ts b/packages/discord-types/src/common/Channel.d.ts index 6ae5ba895..21f2dc10e 100644 --- a/packages/discord-types/src/common/Channel.d.ts +++ b/packages/discord-types/src/common/Channel.d.ts @@ -14,15 +14,15 @@ export interface PermissionOverwrite { export interface AvatarDecorationData { asset: string; expires_at: string | null; - sku_id: string; + skuId: string; } /** Clan identity information. */ export interface ClanData { badge: string; - identity_enabled: boolean; - identity_guild_id: string; tag: string; + identityEnabled: boolean; + identityGuildId: string; } /** Display name style configuration. */ @@ -38,7 +38,8 @@ export interface CollectibleItem { expires_at: string | null; label: string; palette: string; - sku_id: string; + type: number; + skuId: string; } /** User collectibles configuration. */ diff --git a/packages/discord-types/src/common/User.d.ts b/packages/discord-types/src/common/User.d.ts index 0905b8bf2..f3007f120 100644 --- a/packages/discord-types/src/common/User.d.ts +++ b/packages/discord-types/src/common/User.d.ts @@ -39,7 +39,7 @@ export class User extends DiscordRecord { get avatarDecoration(): AvatarDecorationData | null; get createdAt(): Date; get isProvisional(): boolean; - get nameplate(): { asset: string; sku_id: string; } | null; + get nameplate(): { asset: string; skuId: string; } | null; get premiumGroupRole(): { id: string; name: string; color: number; } | null; get tag(): string; diff --git a/packages/discord-types/src/common/messages/Embed.d.ts b/packages/discord-types/src/common/messages/Embed.d.ts index 1c06756f4..9142d417c 100644 --- a/packages/discord-types/src/common/messages/Embed.d.ts +++ b/packages/discord-types/src/common/messages/Embed.d.ts @@ -23,10 +23,10 @@ export interface EmbedMedia { height: number; width: number; url: string; - proxyURL: string; + proxyURL?: string; placeholder: string; placeholderVersion: number; - description: string; + description?: string; srcIsAnimated: boolean; flags: number; contentType: string; diff --git a/packages/discord-types/src/components.d.ts b/packages/discord-types/src/components.d.ts index 32c7be0a0..8d0aa0ed4 100644 --- a/packages/discord-types/src/components.d.ts +++ b/packages/discord-types/src/components.d.ts @@ -411,6 +411,24 @@ export type MaskedLink = ComponentType>; +interface ScrollToOptions { + animate?: boolean; + callback?: (() => unknown); +} + +/** Full type can be found at {@link https://github.com/fedeericodl/discord-client-types/blob/main/src/discord_common/js/packages/design/components/Scroller/utils/core/getAnimatedScrollHelpers.ts} */ +export interface ScrollerBaseRef { + scrollTo: (props: { to: number; } & ScrollToOptions) => void; + scrollPageUp: (props?: ScrollToOptions) => void; + scrollPageDown: (props?: ScrollToOptions) => void; + scrollToTop: (props?: ScrollToOptions) => void; + scrollToBottom: (props?: ScrollToOptions) => void; + isScrolledToTop: () => boolean; + isScrolledToBottom: () => boolean; + getDistanceFromTop: () => number; + getDistanceFromBottom: () => number; +} + export interface ScrollerBaseProps { className?: string; style?: CSSProperties; @@ -418,6 +436,7 @@ export interface ScrollerBaseProps { paddingFix?: boolean; onClose?(): void; onScroll?(): void; + ref?: Ref; } export type ScrollerThin = ComponentType React.ReactNode; wrapSection?: (section: number, children: React.ReactNode) => React.ReactNode; - sectionHeight: number; - rowHeight: number; - footerHeight?: number; + sectionHeight: number | ((section: number) => number); + rowHeight: number | ((section: number, row: number) => number); + footerHeight?: number | ((section: number) => number); sidebarHeight?: number; chunkSize?: number; diff --git a/packages/discord-types/src/stores/PendingReplyStore.d.ts b/packages/discord-types/src/stores/PendingReplyStore.d.ts new file mode 100644 index 000000000..1819277cb --- /dev/null +++ b/packages/discord-types/src/stores/PendingReplyStore.d.ts @@ -0,0 +1,26 @@ +import { Channel, FluxStore, Message } from ".."; + +/** Full pending reply state object */ +interface PendingReply { + /** The channel in which the pending reply was created */ + channel: Channel; + /** The message that you're replying to */ + message: Message; + /** Whether to ping the person you're replying to */ + shouldMention: boolean; + /** Whether to show the ping \@ON/\@OFF toggle. Disabled by default for self-replies. */ + showMentionToggle: boolean; +} + +/** Shallow state object which is persisted between restarts. Based on {@link PendingReply}. */ +interface PendingReplyState { + channelId: string; + messageId: string; + shouldMention: boolean; + showMentionToggle: boolean; +} + +export class PendingReplyStore extends FluxStore { + getState(): Record; + getPendingReply(channelId: string): PendingReply | undefined; +} diff --git a/packages/discord-types/src/stores/index.d.ts b/packages/discord-types/src/stores/index.d.ts index 019efb38e..5c4b2472a 100644 --- a/packages/discord-types/src/stores/index.d.ts +++ b/packages/discord-types/src/stores/index.d.ts @@ -25,6 +25,7 @@ export * from "./MediaEngineStore"; export * from "./MessageStore"; export * from "./NotificationSettingsStore"; export * from "./OverridePremiumTypeStore"; +export * from "./PendingReplyStore"; export * from "./PermissionStore"; export * from "./PopoutWindowStore"; export * from "./PresenceStore"; diff --git a/packages/discord-types/src/utils.d.ts b/packages/discord-types/src/utils.d.ts index bf20e3625..df0621606 100644 --- a/packages/discord-types/src/utils.d.ts +++ b/packages/discord-types/src/utils.d.ts @@ -25,14 +25,29 @@ export type Parser = Record< | "parse" | "parseTopic" | "parseEmbedTitle" + | "parseEmbedTitleWithoutLinks" | "parseInlineReply" | "parseGuildVerificationFormRule" | "parseGuildEventDescription" | "parseAutoModerationSystemMessage" | "parseForumPostGuidelines" - | "parseForumPostMostRecentMessage", + | "parseVoiceChannelStatus", (content: string, inline?: boolean, state?: Record) => ReactNode[] -> & Record<"defaultRules" | "guildEventRules", Record>>; +> & Record< + | "parseToAST" + | "parseTopicToAST" + | "parseEmbedTitleToAST" + | "parseEmbedTitleWithoutLinksToAST" + | "parseInlineReplyToAST" + | "parseAutoModerationSystemMessageToAST", + (content: string, inline?: boolean, state?: Record) => any[] +> & Record<"defaultRules" | "guildEventRules" | "notifCenterV2MessagePreviewRules" | "lockscreenWidgetMessageRules", Record>> & { + reactParserFor(rules: Record): (content: string, inline?: boolean, state?: Record) => ReactNode[]; + astParserFor(rules: Record): (content: string, inline?: boolean, state?: Record) => any[]; + createReactRules(options: Record): Record; + defaultReactRuleOptions: Record; + combineAndInjectMentionRule(rules: Record, mentionRule: Record): Record; +}; export interface Alerts { show(alert: { @@ -48,16 +63,39 @@ export interface Alerts { onConfirmSecondary?(): void; onCloseCallback?(): void; }): void; + confirm(alert: { + title: any; + body: React.ReactNode; + className?: string; + confirmColor?: string; + cancelText?: string; + confirmText?: string; + secondaryConfirmText?: string; + onCancel?(): void; + onConfirmSecondary?(): void; + onCloseCallback?(): void; + }): Promise; /** This is a noop, it does nothing. */ close(): void; } export interface SnowflakeUtils { fromTimestamp(timestamp: number): string; + fromTimestampWithSequence(timestamp: number, sequence: number): string; extractTimestamp(snowflake: string): number; age(snowflake: string): number; atPreviousMillisecond(snowflake: string): string; + atNextMillisecond(snowflake: string): string; compare(snowflake1?: string, snowflake2?: string): number; + isProbablyAValidSnowflake(snowflake: string): boolean; + castChannelIdAsMessageId(channelId: string): string; + castMessageIdAsChannelId(messageId: string): string; + castGuildIdAsEveryoneGuildRoleId(guildId: string): string; + cast(snowflake: string): string; + keys(obj: Record): string[]; + forEach(obj: Record, callback: (value: any, key: string) => void): void; + forEachKey(obj: Record, callback: (key: string) => void): void; + entries(obj: Record): [string, any][]; } interface RestRequestData { @@ -249,45 +287,55 @@ export interface UsernameUtils { useName(user: User): string; getUserTag(user: User, options?: UserNameUtilsTagOptions): string; useUserTag(user: User, options?: UserNameUtilsTagOptions): string; - - + isNameConcealed(user: User): boolean; + getUserIsStaff(user: User): boolean; useDirectMessageRecipient: any; humanizeStatus: any; } -// TODO: fix type export class DisplayProfile { userId: string; + guildId?: string; banner?: string; bio?: string; pronouns?: string; accentColor?: number; themeColors?: number[]; + profileEffect?: any; popoutAnimationParticleType?: any; - profileEffectId?: string; + fetchStartedAt?: Date | null; + fetchEndedAt?: Date | null; _userProfile?: any; _guildMemberProfile?: any; - canUsePremiumProfileCustomization: boolean; - canEditThemes: boolean; - premiumGuildSince: Date | null; - premiumSince: Date | null; - premiumType?: PremiumType; - primaryColor?: number; + get premiumSince(): Date | null; + get premiumGuildSince(): Date | null; + get premiumType(): PremiumType | undefined; + get private(): boolean; + get widgets(): any[] | undefined; + get gameWidgets(): any[] | undefined; + get primaryColor(): number | undefined; + get canUsePremiumProfileCustomization(): boolean; + get canEditThemes(): boolean; + get application(): any; + get isLoaded(): boolean; + + hasThemeColors(): boolean; + hasPremiumCustomization(): boolean; + isUsingGuildMemberBanner(): boolean; + isUsingGuildMemberBio(): boolean; + isUsingGuildMemberPronouns(): boolean; + getBannerURL(options: { canAnimate: boolean; size: number; }): string; + getPreviewBanner(banner: string | null, canAnimate: boolean, size?: number): string | null; + getPreviewBio(bio: string | undefined): string | undefined; + getPreviewThemeColors(themeColors: number[] | undefined): number[] | undefined; getBadges(): Array<{ id: string; description: string; icon: string; link?: string; }>; - getBannerURL(options: { canAnimate: boolean; size: number; }): string; getLegacyUsername(): string | null; - hasFullProfile(): boolean; - hasPremiumCustomization(): boolean; - hasThemeColors(): boolean; - isUsingGuildMemberBanner(): boolean; - isUsingGuildMemberBio(): boolean; - isUsingGuildMemberPronouns(): boolean; } export interface DisplayProfileUtils { @@ -317,3 +365,51 @@ export interface CommandOptions { max_value?: number; autocomplete?: boolean; } + +export interface URLUtils { + URL_REGEX: RegExp; + makeUrl(url: string): URL | null; + isDiscordUrl(url: string): boolean; + isDiscordCdnUrl(url: string): boolean; + isDiscordAssetUrl(url: string, proxyUrl?: string, originalUrl?: string): boolean; + isDiscordDirectAssetUrl(url: string): boolean; + isDiscordProxiedAssetUrl(url: string, proxyUrl?: string, originalUrl?: string): boolean; + isDiscordHostname(hostname: string): boolean; + isDiscordLocalhost(hostname: string): boolean; + isDiscordProtocol(url: string): boolean; + isDiscordUri(url: string): boolean; + isDiscordUrlOrUri(url: string): boolean; + isAllowedGifProviderUrl(url: string): boolean; + isAppRoute(url: string): boolean; + isOriginalContentTypeDifferent(url: string, proxyUrl: string): boolean; + toURLSafe(url: string): URL | null; + safeDecodeURIComponent(component: string): string; + safeParseWithQuery(url: string): URL | null; + format(url: URL): string; + formatPathWithQuery(path: string, query: Record): string; + formatSearch(query: Record): string; +} + +export interface Humanize { + filesize(bytes: number, base?: number, decimals?: number, decimalSep?: string, thousandsSep?: string, suffix?: string): string; + intword(number: number, units?: string[], base?: number, decimals?: number, decimalSep?: string, thousandsSep?: string): string; + relativeTime(timestamp?: number): string; + naturalDay(timestamp?: number, format?: string): string; + ordinal(value: number): string; + numberFormat(number: number, decimals?: number, decimalSep?: string, thousandsSep?: string): string; + truncatechars(str: string, maxLength: number): string; + truncatewords(str: string, maxWords: number): string; + pad(str: string, length: number, padChar?: string, direction?: "left" | "right"): string; + date(format: string, timestamp?: Date | number): string; + time(): number; + linebreaks(str: string): string; + nl2br(str: string): string; +} + +export interface EmojiUtils { + getEmojiColors(emoji: any): number[] | null; + getURL(emoji: any): string; + filterUnsupportedEmojis(emojis: any[]): any[]; + triggerFullscreenAnimation(emoji: any, node: HTMLElement): void; + applyPlatformToThemedEmojiColorPalette(colors: any): any; +} diff --git a/src/VencordNative.ts b/src/VencordNative.ts index 7835e84c2..d13ce4dd7 100644 --- a/src/VencordNative.ts +++ b/src/VencordNative.ts @@ -102,7 +102,6 @@ export default { setUpdateState: (available: boolean) => ipcRenderer.send(IpcEvents.SET_TRAY_UPDATE_STATE, available), onCheckUpdates: (cb: () => void) => { ipcRenderer.on(IpcEvents.TRAY_CHECK_UPDATES, cb); }, onRepair: (cb: () => void) => { ipcRenderer.on(IpcEvents.TRAY_REPAIR, cb); }, - onAbout: (cb: () => void) => { ipcRenderer.on(IpcEvents.TRAY_ABOUT, cb); }, }, pluginHelpers: PluginHelpers diff --git a/src/debug/runReporter.ts b/src/debug/runReporter.ts index 679c40bc3..339edbbee 100644 --- a/src/debug/runReporter.ts +++ b/src/debug/runReporter.ts @@ -39,7 +39,7 @@ async function runReporter() { await loadLazyChunksDone; - if (IS_REPORTER && IS_WEB && !IS_VESKTOP) { + if (IS_REPORTER && IS_WEB && !IS_VESKTOP && !IS_EQUIBOP) { console.log("[REPORTER_META]", { buildNumber: getBuildNumber(), buildHash: window.GLOBAL_ENV.SENTRY_TAGS.buildId diff --git a/src/equicordplugins/_api/userArea.ts b/src/equicordplugins/_api/userArea.ts index 181edfd79..9ed35d0c8 100644 --- a/src/equicordplugins/_api/userArea.ts +++ b/src/equicordplugins/_api/userArea.ts @@ -19,7 +19,7 @@ export default definePlugin({ patches: [ { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", + find: ".WIDGETS_RTC_UPSELL_COACHMARK),", replacement: [ { match: /(?<=className:(\i)\.\i,style:\i,)children:\[/, @@ -27,7 +27,7 @@ export default definePlugin({ }, // fix discord weird shrink with extra buttons { - match: /(?<=\{ref:\i,)style:(\i)(?=,onMouseEnter:\i,onMouseDown:\i,onClick)/, + match: /(?<=\{ref:\i,)style:(\i)/, replace: "style:{...$1,minWidth:0}" } ] diff --git a/src/equicordplugins/betterUserArea/index.ts b/src/equicordplugins/betterUserArea/index.ts index fdde42738..0d48d04f3 100644 --- a/src/equicordplugins/betterUserArea/index.ts +++ b/src/equicordplugins/betterUserArea/index.ts @@ -54,76 +54,77 @@ export default definePlugin({ settings, patches: [ { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", - replacement: { - match: /,nameplate:\i,selectedGuildId:(\i),avatarDecoration/, - replace: ",nameplate:null,selectedGuildId:$1,avatarDecoration" - }, - predicate: () => settings.store.removeNameplate - }, - { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", + find: ".NITRO_PRIVACY_PERK_BETA_COACHMARK));", replacement: [ { - match: /(?<=#{intl::MUTE}\),)className:\i\.\i,/, - replace: "" + match: /,nameplate:\i,selectedGuildId:(\i),avatarDecoration/, + replace: ",nameplate:null,selectedGuildId:$1,avatarDecoration", + predicate: () => settings.store.removeNameplate }, { - match: /(?<=#{intl::DEAFEN}\),)className:\i\.\i,/, - replace: "" + match: /hoverText:(\i),forceHover:\i,children:/g, + replace: "hoverText:$1,forceHover:!0,children:", + predicate: () => settings.store.alwaysShowUsername }, { - match: /,\(0,\i\.jsxs?\)\(\i\.\i,\{.{0,600}#{intl::ACCOUNT_INPUT_OPTIONS}\)\}\)(?=\])/, - replace: "" + match: /avatarDecoration:(.{0,70}),size:/, + replace: "avatarDecoration:void 0,size:", + predicate: () => settings.store.removeAvatarDecoration }, { - match: /,\(0,\i\.jsxs?\)\(\i\.\i,\{.{0,650}#{intl::ACCOUNT_OUTPUT_OPTIONS}\)\}\)(?=\])/, - replace: "" + match: /displayNameStyles:(\i),/, + replace: "displayNameStyles:void 0,", + predicate: () => settings.store.removeUsernameStyles } ], - predicate: () => settings.store.removeAudioMenus }, { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", - replacement: { - match: /hoverText:(\i),forceHover:\i,children:/g, - replace: "hoverText:$1,forceHover:!0,children:" - }, - predicate: () => settings.store.alwaysShowUsername - }, - { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", + find: '"MicrophoneButton"', replacement: [ { match: /:\{tooltipText:\i\};/, - replace: ":{tooltipText:void 0};" + replace: ":{tooltipText:void 0};", + predicate: () => settings.store.removeButtonTooltips }, + { + match: /(?<=#{intl::MUTE}\),)className:\i\.\i,/, + replace: "", + predicate: () => settings.store.removeAudioMenus + }, + { + match: /,\(0,\i\.jsxs?\)\(\i\.\i,\{.{0,600}#{intl::ACCOUNT_INPUT_OPTIONS}\)\}\)(?=\])/, + replace: "", + predicate: () => settings.store.removeAudioMenus + }, + ], + }, + { + find: "#{intl::f+DDY/::raw},{outputDeviceName", + replacement: [ { match: /(?<=role:"switch",)tooltipText:\i\}/, - replace: "tooltipText:void 0}" + replace: "tooltipText:void 0}", + predicate: () => settings.store.removeButtonTooltips }, { - match: /tooltipText:\i,tooltipPositionKey/, - replace: "tooltipText:void 0,tooltipPositionKey" + match: /(?<=#{intl::DEAFEN}\),)className:\i\.\i,/, + replace: "", + predicate: () => settings.store.removeAudioMenus + }, + { + match: /,\(0,\i\.jsxs?\)\(\i\.\i,\{.{0,650}#{intl::ACCOUNT_OUTPUT_OPTIONS}\)\}\)(?=\])/, + replace: "", + predicate: () => settings.store.removeAudioMenus } ], + }, + { + find: "#{intl::USER_SETTINGS_WITH_BUILD_OVERRIDE}", + replacement: { + match: /tooltipText:\i,tooltipPositionKey/, + replace: "tooltipText:void 0,tooltipPositionKey" + }, predicate: () => settings.store.removeButtonTooltips }, - { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", - replacement: { - match: /avatarDecoration:(.{0,70}),size:/, - replace: "avatarDecoration:void 0,size:" - }, - predicate: () => settings.store.removeAvatarDecoration - }, - { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", - replacement: { - match: /displayNameStyles:(\i),/, - replace: "displayNameStyles:void 0," - }, - predicate: () => settings.store.removeUsernameStyles - } ], }); diff --git a/src/equicordplugins/dragify/index.tsx b/src/equicordplugins/dragify/index.tsx index 47b6a5469..183f67d1e 100644 --- a/src/equicordplugins/dragify/index.tsx +++ b/src/equicordplugins/dragify/index.tsx @@ -223,7 +223,7 @@ export default definePlugin({ }, // Member list items (server member list) { - find: "MemberListItem", + find: ".MEMBER_USER})]", replacement: { match: /(?<=useRawTargetDimensions.{0,250})onContextMenu:\i,(?=onMouseEnter:)/, replace: "$&draggable:!0,onDragStart:e=>$self.onUserDragStart(e,{id:arguments[0].user?.id}),\"data-dragify-user\":!0,\"data-user-id\":arguments[0].user?.id," @@ -233,7 +233,7 @@ export default definePlugin({ { find: ']="BADGES"', replacement: { - match: /(?<=textDecorationColor:.{0,300})(?=onClick:\i,onContextMenu:\i,)/, + match: /(?="data-username-has-gradient")/, replace: "draggable:!0,onDragStart:e=>$self.onUserDragStart(e,arguments[0].author),\"data-dragify-user\":!0,\"data-user-id\":arguments[0].author.id," } }, diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx index 5459e8edb..59cce166f 100644 --- a/src/equicordplugins/equicordHelper/index.tsx +++ b/src/equicordplugins/equicordHelper/index.tsx @@ -97,15 +97,21 @@ const settings = definePluginSettings({ accountStandingButton: { type: OptionType.BOOLEAN, description: "Show an account standing button in the header bar", - default: false, restartNeeded: true, - } + default: false, + }, + restoreFileDownloadButton: { + type: OptionType.BOOLEAN, + description: "Adds back the Download button at the top right corner of files", + restartNeeded: true, + default: false + }, }); export default definePlugin({ name: "EquicordHelper", description: "Used to provide support, fix discord caused crashes, and other misc features.", - authors: [Devs.thororen, EquicordDevs.nyx, EquicordDevs.Naibuu, EquicordDevs.keircn, EquicordDevs.SerStars, EquicordDevs.mart], + authors: [Devs.thororen, EquicordDevs.nyx, EquicordDevs.Naibuu, EquicordDevs.keircn, EquicordDevs.SerStars, EquicordDevs.mart, EquicordDevs.omaw], required: true, settings, headerBarButton: { @@ -164,6 +170,7 @@ export default definePlugin({ replace: "true||$&" }, }, + // Show your own activity buttons because discord removes them for who knows why { find: ".USER_PROFILE_ACTIVITY_BUTTONS),", predicate: () => settings.store.showYourOwnActivityButtons && !isPluginEnabled(customRPC.name), @@ -200,6 +207,15 @@ export default definePlugin({ replace: "1" } }, + // Restore File Download Button + { + predicate: () => settings.store.restoreFileDownloadButton, + find: '"VISUAL_PLACEHOLDER":', + replacement: { + match: /(\.downloadUrl,showDownload:)\i/, + replace: "$1!0" + } + }, ], renderMessageAccessory(props) { return ( diff --git a/src/equicordplugins/favouriteAnything/components.tsx b/src/equicordplugins/favouriteAnything/components.tsx new file mode 100644 index 000000000..ac38c411e --- /dev/null +++ b/src/equicordplugins/favouriteAnything/components.tsx @@ -0,0 +1,294 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { BaseText } from "@components/BaseText"; +import { Button } from "@components/Button"; +import { LazyComponentWrapper } from "@utils/lazyReact"; +import { Channel, Message, MessageAttachment, ScrollerBaseRef } from "@vencord/discord-types"; +import { ChannelType } from "@vencord/discord-types/enums"; +import { findByCodeLazy, findByPropsLazy, findComponentByCode, findComponentByCodeLazy, findCssClassesLazy, proxyLazyWebpack } from "@webpack"; +import { ChannelStore, ExpressionPickerStore, ListScrollerThin, lodash, PermissionsBits, PermissionStore, React, useCallback, useEffect, useMemo, useRef, useState, useStateFromStores } from "@webpack/common"; +import { ReactNode } from "react"; + +import { AttachmentContext, EmbedContext, EmbedMosaicContext } from "."; +import { SignedUrlsStore } from "./stores"; +import { AttachmentItem, AttachmentsComponentProps, CustomItemFormat, FavoriteButtonProps, FavouriteItemFormat, FilePickerItemProps, FilePickerProps, ManaSearchBarProps, MessageComponentClass } from "./types"; +import { cl, defs, hasPermission, ImageUtils, sendAttachment, useFavourites, useListScroller, useResizeObserver } from "./utils"; + +const ManaSearchBar = findComponentByCodeLazy("#{intl::SEARCH}),ref"); +const FavoriteButton = findComponentByCodeLazy("#{intl::GIF_TOOLTIP_ADD_TO_FAVORITES}"); +const SendIcon = findComponentByCodeLazy("M6.6 10.02 14 11.4a.6.6"); + +const DmChannel: Channel & { new(base?: Partial): Channel; } = findByPropsLazy("fromServer", "sortRecipients"); +const MessageClass: Message & { new(base?: Partial): Message; } = findByCodeLazy(";mentionChannels;mentionGames;"); + +const Classes = findCssClassesLazy("gifFavoriteButton", "ctaButtonContainer"); + +export const AttachmentPreview = proxyLazyWebpack(() => { + // findComponentByCodeLazy doesn't work properly with component classes, this must be kept within the lazy scope + const MessageComponent = findComponentByCode("this.renderAttachments") as LazyComponentWrapper; + + class MessageAttachmentsComponent extends MessageComponent { + render(): ReactNode { + return this.renderAttachments(this.props.message); + } + } + + const channel = Object.freeze(new DmChannel({ id: "0", type: ChannelType.GUILD_TEXT })); + + return function AttachmentPreview({ attachment }: AttachmentsComponentProps) { + const message = useMemo( + () => new MessageClass({ attachments: [attachment], channel_id: channel.id }), + [attachment] + ); + + return ( + + ); + }; +}); + +export function FilePicker({ onSelectItem }: FilePickerProps) { + const listRef = useRef(null); + + const { channelId, query } = ExpressionPickerStore.useExpressionPickerStore(store => ({ + channelId: store.activeChannelId as string, + query: store.searchQuery + })); + + const channel = useStateFromStores([ChannelStore], () => ChannelStore.getChannel(channelId), [channelId]); + + const favs = useFavourites(CustomItemFormat.ATTACHMENT, query); + const count = useMemo(() => (favs ? Object.keys(favs).length : 0), [favs]); + + const [rowHeights, handleResize] = useListScroller(); + + const handleSubmit = useCallback((url: string) => onSelectItem({ url }), []); + + const renderRow = (row: number) => { + const item = favs?.[row]; + if (!item) return null; + + return ( + + ); + }; + + useEffect(() => void listRef.current?.scrollToTop(), [query]); + + return ( +
+
+ ExpressionPickerStore.setSearchQuery(query)} + onClear={() => ExpressionPickerStore.setSearchQuery("")} + /> +
+ {count > 0 ? ( +
+ (favs?.[row] && rowHeights.get(favs[row].url)) ?? 100} + renderSection={() => null} + renderRow={({ row }) => renderRow(row)} + /> +
+ ) : ( +
+ {query.trim() ? : } +
+ )} +
+ ); +} + +function EmptyList() { + return No files match your search.; +} + +const demoAttachment: MessageAttachment = { + id: "1", + filename: "file", + content_type: "application/octet-stream", + size: 123 * 1024, + spoiler: false, + url: "", + proxy_url: "" +}; + +function Demo() { + return ( + <> +
+ + +
+ + Click the star to favourite a file. +
+ Favourite files will show up here! +
+ + ); +} + +export function FilePickerItem({ url, file, channel, onResize, onSubmit, reducePadding }: FilePickerItemProps) { + const [isFetching, setIsFetching] = useState(false); + + const ref = useRef(null); + useResizeObserver(ref, ({ height }) => onResize(url, height), [onResize, url]); + + const attachment = useStateFromStores( + [SignedUrlsStore], + () => ({ ...file, url: SignedUrlsStore.get(file.url), proxy_url: SignedUrlsStore.get(file.proxy_url) }), + [file], + lodash.isEqual + ) as MessageAttachment; + + const { canAttachFiles, canSendMessages } = useStateFromStores( + [PermissionStore], + () => ({ + canAttachFiles: hasPermission(PermissionsBits.ATTACH_FILES, channel), + canSendMessages: hasPermission(PermissionsBits.SEND_MESSAGES, channel) + }), + [channel] + ); + + const handleClick = useMemo(() => { + switch (true) { + case canAttachFiles: + return async () => { + setIsFetching(true); + await sendAttachment(attachment, channel!); + ExpressionPickerStore.closeExpressionPicker(); + setIsFetching(false); + }; + case canSendMessages: + return () => onSubmit(url); + default: + return null; + } + }, [attachment, canAttachFiles, canSendMessages, channel, url]); + + return ( +
+ + {handleClick && ( + + )} +
+ ); +} + +export function EmbedAccessory() { + const embed = React.useContext(EmbedContext); + const mosaicIndex = React.useContext(EmbedMosaicContext); + + const props: FavoriteButtonProps | null = useMemo(() => { + if (!embed || embed.type === "gifv") return null; + + const { video, image, images, thumbnail } = embed; + + if (video) { + // This field is missing on videos by third party providers (TikTok, YouTube ...) + const isProxiedVideo = !!video.proxyURL; + + // External videos don't have a video.proxyURL property that could be used for the preview - use the static thumbnail instead + const src = video.proxyURL ?? thumbnail?.proxyURL ?? video.url; + const format = isProxiedVideo ? FavouriteItemFormat.VIDEO : FavouriteItemFormat.IMAGE; + + // External videos' content.url usually doesn't point to a valid resource that could be embedded + const url = !isProxiedVideo ? embed.url! : video.url; + + return { ...video, format, src, url }; + } + + const img = (mosaicIndex != null && images?.[mosaicIndex]) || image; + if (!img) return null; + + const src = img.proxyURL ?? img.url; + + // Do not render the custom embed accessory if the original image already has a gif accessory + const isAnimated = ImageUtils.isAnimated({ ...img, original: img.url, src, animated: false }); + if (isAnimated) return null; + + return { ...img, format: FavouriteItemFormat.IMAGE, src }; + }, [embed, mosaicIndex]); + + return ( + props && ( +
+ +
+ ) + ); +} + +const visualMediaFormats: Partial> = Object.freeze({ + IMAGE: FavouriteItemFormat.IMAGE, + VIDEO: FavouriteItemFormat.VIDEO, + CLIP: FavouriteItemFormat.VIDEO +}); + +export function AttachmentAccessory() { + const attachment = React.useContext(AttachmentContext); + + const props: FavoriteButtonProps | null = useMemo(() => { + if (!attachment?.downloadUrl) return null; + const { originalItem, type, downloadUrl, width = 600, height = 400, srcIsAnimated } = attachment; + + // Do not render the custom accessory if the original attachment component already has a gif accessory + const isAnimated = ImageUtils.isAnimated({ + original: originalItem.url, + src: originalItem.proxy_url, + animated: false, + srcIsAnimated + }); + if (isAnimated) return null; + + if (type in visualMediaFormats) { + return { format: visualMediaFormats[type]!, src: originalItem.proxy_url, url: downloadUrl, width, height }; + } + + // Non visual attachments have to be encoded to store metadata in the src property. + // Note that this isn't a valid url yet, the full url (with a fallback image for vanilla client compat) + // is generated via `getThumbnailUrl` once the user clicks the favourite button + const src = defs.encode(CustomItemFormat.ATTACHMENT, originalItem)?.toString(); + if (!src) return null; + + return { format: FavouriteItemFormat.NONE, src, url: downloadUrl, width, height }; + }, [attachment]); + + return props && ; +} diff --git a/src/equicordplugins/favouriteAnything/index.tsx b/src/equicordplugins/favouriteAnything/index.tsx index 8780f309e..9797c9b42 100644 --- a/src/equicordplugins/favouriteAnything/index.tsx +++ b/src/equicordplugins/favouriteAnything/index.tsx @@ -5,133 +5,159 @@ */ import { Devs, EquicordDevs } from "@utils/constants"; +import { getIntlMessage } from "@utils/discord"; import definePlugin from "@utils/types"; import { Embed } from "@vencord/discord-types"; -import { findComponentByCodeLazy, findCssClassesLazy, proxyLazyWebpack } from "@webpack"; +import { proxyLazyWebpack } from "@webpack"; import { React } from "@webpack/common"; -import { Component, ReactNode } from "react"; +import { ComponentType, ReactNode } from "react"; -enum Format { - NONE = 0, - IMAGE = 1, - VIDEO = 2 -} +import { AttachmentAccessory, EmbedAccessory, FilePicker } from "./components"; +import { SignedUrlsStore } from "./stores"; +import managedStyle from "./style.css?managed"; +import { AttachmentItem, EmbedComponent, ExpressionPickerTabProps, ExpressionPickerView, FavouriteItem, FavouriteItemFormat } from "./types"; +import { getThumbnailUrl } from "./utils"; -interface FavoriteButtonProps { - width: number; - height: number; - // Media URL - src: string; - // Provider source URL - url: string; - format: Format; - className?: string; -} - -interface AccessoryProps - extends Pick { - proxyUrl?: string; - video?: boolean; -} - -interface EmbedComponent extends Component<{ embed: Embed; }> { - __render: () => ReactNode; -} - -const FavoriteButton = findComponentByCodeLazy("#{intl::GIF_TOOLTIP_ADD_TO_FAVORITES}"); -const Classes = findCssClassesLazy("gifFavoriteButton", "ctaButtonContainer"); -const EmbedContext = proxyLazyWebpack(() => React.createContext(null)); +export const EmbedContext = proxyLazyWebpack(() => React.createContext(null)); +export const EmbedMosaicContext = proxyLazyWebpack(() => React.createContext(null)); +export const AttachmentContext = proxyLazyWebpack(() => React.createContext(null)); export default definePlugin({ name: "FavouriteAnything", - description: "Favourite any image", + description: "Favourite any image, video, or file attachment", authors: [Devs.nin0dev, EquicordDevs.davri], + managedStyle, patches: [ + // EMBEDS { - find: "static isAnimated", + find: "#{intl::SUPPRESS_ALL_EMBEDS}", replacement: [ - // .isAnimated is checked in almost every media overlay event listener, so it's easier to patch the source. { - match: /static isAnimated\((\i)\)\{/, - replace: - "static isAnimated($1,override){if(!override)return true;" + // Wrap the embed component's render method in a custom context to avoid having to drill props + match: "render()", + replace: "$&{return $self.renderEmbed.call(this)}__render()" }, - // Always render the custom accessory if the prop wasn't provided. This mostly affects video attachments. - // Url and proxyUrl are additionally set to the same value, since the original url property only stores the thumbnail. { - match: /(?<=this\.props\.renderAccessory\(\):)null/, - replace: - "$self.Accessory({...this.props,url:this.props.proxyUrl,video:true})" - }, - // Always return static thumbnails for non gif media to prevent graphical glitches (side effect of the first patch). - { - match: /getSrc\(\i\)\{.*?let \i=/, - replace: "$&!this.constructor.isAnimated(this.props,true)||" - }, - // Hide the default "GIF" tag accessory that is visible when discord is unfocused. - { - match: "return this.props.shouldRenderAccessory?", - replace: "$&!this.constructor.isAnimated(this.props,true)||" + // Specify the index for individual items in embed.images + match: /\.images\.map\((\i)=>(this.renderImage\(\{[^}]{50,100}\}\))\)/, + replace: ".images.map(($1,index)=>$self.renderEmbedMosaicItem($2,index))" } ] }, - // Wrap the embed component with a custom context provider to avoid having to drill props. { - find: "#{intl::SUPPRESS_ALL_EMBEDS}", + // Override the default renderAdjacentContent prop value for all types of embed components (renderImageComponent, renderVideoComponent...) + find: "#{intl::MEDIA_MOSAIC_ALT_TEXT_POPOUT_TITLE}", replacement: { - match: "render()", - replace: "$&{return $self.renderEmbed.call(this)}__render()" + match: /renderAdjacentContent:(\i)/g, + replace: "$&=$self.renderEmbedAccessory" } }, - // Replace the default gif accessory with a custom one that skips fileType checks. Mostly affects image attachments. + // ATTACHMENTS { - find: "renderComponentAccessories", + find: '["VIDEO","CLIP","AUDIO"]', + replacement: [ + { + // Wrap the attachment component in a custom context to avoid having to drill props + match: /(?<=children:)(\i)=>(\i\(\1\))\}\):(\i\(\))/, + replace: "$1=>$self.renderAttachment($2,arguments[0])}):$self.renderAttachment($3,arguments[0])" + }, + { + // Always add our custom accessory to the attachment's adjacent content + match: "=[];", + replace: "=[$self.renderAttachmentAccessory()];" + } + ] + }, + // EXPRESSION PICKER + { + find: "#{intl::EXPRESSION_PICKER_CATEGORIES_A11Y_LABEL}", + replacement: [ + { + // Replace the "GIFs" tab with two custom tabs + match: /\(0,\i\.jsx\)\((\i),[^}]{20,40}?"aria-selected":(\i)[^}]{50,100}?#{intl::EXPRESSION_PICKER_GIF}\)\}\)/, + replace: "$self.renderTabs($1,$2)" + }, + { + // Insert the custom file picker into the expression picker's body + match: /\{onSelectGIF:(\i),[^}]{20,40}\}\):null,(?=(\i)===)/, + replace: "$&$self.renderFilePicker($2,$1)," + } + ] + }, + { + // Hide favourite files from the GIFs/Media tab + find: '.sortBy("order").reverse().value()', replacement: { - match: /\i=>\(\)=>\{.{200,300}?null\}/, - replace: "props=>()=>$self.Accessory({...props,video:false})" + match: '.sortBy("order").reverse()', + replace: "$&.filter($self.filterGifs)" } }, - // Add a proxyUrl prop alongside the src prop, which is used for video thumbnails. + // FAVOURITE BUTTON { - find: /disableArrowKeySeek:\i\}\)\}/, + find: "#{intl::GIF_TOOLTIP_REMOVE_FROM_FAVORITES}", replacement: { - match: /src:\i(?=,\.\.\.\i)/, - replace: "$&,proxyUrl:this.props.src" + // Intercept the onClick callback to replace the placeholder thumbnail with a valid CDN link + match: /\(0,(\i\.\i)\)\((\{[^}].{40,60}?\})\)/, + replace: "$self.interceptAddToFavourites($2).then($1)" } } ], - renderEmbed(this: EmbedComponent) { + renderTabs(Tab: ComponentType, activeView: ExpressionPickerView) { return ( - - {this.__render()} - + <> + + Media + + + {getIntlMessage("FILES")} + + ); }, - Accessory(props: AccessoryProps) { - const embed = React.useContext(EmbedContext); - const content = embed?.image ?? embed?.video; + renderFilePicker(activeView: ExpressionPickerView, onSelectGIF: (item: { url: string; }) => void) { + return activeView === ExpressionPickerView.FILES ? : null; + }, + renderAttachment(children: ReactNode, props: { item: AttachmentItem; }) { + return {children}; + }, + renderEmbed(this: EmbedComponent) { + return {this.__render()}; + }, + renderEmbedMosaicItem(children: ReactNode, index: number) { + return {children}; + }, + renderAttachmentAccessory: () => , + renderEmbedAccessory: () => , + filterGifs: (item: FavouriteItem) => item.format !== FavouriteItemFormat.NONE, + interceptAddToFavourites: async (item: FavouriteItem & { url: string; }) => { + if (item.format !== FavouriteItemFormat.NONE) return item; - const { url, proxyUrl, width, height, video } = - embed && content - ? { - ...content, - url: (embed.type === "gifv" && embed.url) || content.url, - proxyUrl: content.proxyURL, - video: !!embed.video - } - : props; + SignedUrlsStore.addSigned(item.url); - if (!width || !height || !url) return null; + if (URL.canParse(item.src)) { + SignedUrlsStore.addSigned(item.src); + return item; + } - return ( - - ); + const thumbnail = await getThumbnailUrl(item.src, item.width, item.height); + if (!thumbnail) return item; + + thumbnail.search = ""; + thumbnail.hash = item.src; + return { ...item, src: `${thumbnail}` }; } }); diff --git a/src/equicordplugins/favouriteAnything/native.ts b/src/equicordplugins/favouriteAnything/native.ts new file mode 100644 index 000000000..63bf6c715 --- /dev/null +++ b/src/equicordplugins/favouriteAnything/native.ts @@ -0,0 +1,31 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { MessageAttachment } from "@vencord/discord-types"; + +const allowedHosts = new Set([ + "cdn.discordapp.com", + "images-ext-1.discordapp.net", + "images-ext-2.discordapp.net", + "media.discordapp.net" +]); + +// Discord has very strict CORS rules for which types of assets can be fetched from where (CDN/Media proxy), +// and most binary file types are prohibited by both. This function serves as a simple bypass. +export async function fetchAttachment(_: unknown, attachment: MessageAttachment) { + const { content_type, filename } = attachment; + const url = URL.parse(attachment.url); + if (!url || !allowedHosts.has(url.hostname)) throw new Error("Invalid URL"); + + const res = await fetch(url, { headers: { Accept: "*/*" } }); + if (!res.ok) throw new Error("Server error"); + + const blob = await res.blob(); + const type = blob.type || content_type || "application/octet-stream"; + const data = await blob.arrayBuffer(); + + return { type, data, filename }; +} diff --git a/src/equicordplugins/favouriteAnything/polyfills.ts b/src/equicordplugins/favouriteAnything/polyfills.ts new file mode 100644 index 000000000..fc6950a20 --- /dev/null +++ b/src/equicordplugins/favouriteAnything/polyfills.ts @@ -0,0 +1,176 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/* + * This file contains modified code from: + * https://github.com/tc39/proposal-arraybuffer-base64 + * * Copyright (c) 2017 ECMA TC39 and contributors + * * + * * 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. + */ + +// TODO: Remove once discord stops being insane and updates electron + +interface Uint8ArrayExtended extends Uint8Array { + toBase64(options?: { alphabet?: "base64" | "base64url"; omitPadding?: boolean; }): string; +} + +interface Uint8ArrayConstructorExtended extends Uint8ArrayConstructor { + fromBase64( + base64: string, + options?: { + alphabet?: "base64" | "base64url"; + lastChunkHandling?: "loose" | "strict" | "stop-before-partial"; + } + ): Uint8ArrayExtended; +} + +function supportsToBase64(array: Uint8Array): array is Uint8ArrayExtended { + return "toBase64" in array && typeof array.toBase64 === "function"; +} + +function supportsFromBase64(ctor: Uint8ArrayConstructor): ctor is Uint8ArrayConstructorExtended { + return "fromBase64" in ctor && typeof ctor.fromBase64 === "function"; +} + +const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; +const map = new Map(chars.split("").map((c, i) => [c, i])); + +export function uint8ArrayToBase64(arr: Uint8Array): string { + if (supportsToBase64(arr)) { + return arr.toBase64({ alphabet: "base64url", omitPadding: true }); + } + + if ("detached" in arr.buffer && arr.buffer.detached) { + throw new TypeError("toBase64 called on array backed by detached buffer"); + } + + let result = ""; + + let i = 0; + for (; i + 2 < arr.length; i += 3) { + const triplet = (arr[i] << 16) + (arr[i + 1] << 8) + arr[i + 2]; + result += + chars[(triplet >> 18) & 63] + + chars[(triplet >> 12) & 63] + + chars[(triplet >> 6) & 63] + + chars[triplet & 63]; + } + if (i + 2 === arr.length) { + const triplet = (arr[i] << 16) + (arr[i + 1] << 8); + result += chars[(triplet >> 18) & 63] + chars[(triplet >> 12) & 63] + chars[(triplet >> 6) & 63]; + } else if (i + 1 === arr.length) { + const triplet = arr[i] << 16; + result += chars[(triplet >> 18) & 63] + chars[(triplet >> 12) & 63]; + } + + return result; +} + +function decodeBase64Chunk(chunk: string): number[] { + const actualChunkLength = chunk.length; + if (actualChunkLength < 4) { + chunk += actualChunkLength === 2 ? "AA" : "A"; + } + + const c1 = chunk[0]; + const c2 = chunk[1]; + const c3 = chunk[2]; + const c4 = chunk[3]; + + const triplet = (map.get(c1)! << 18) + (map.get(c2)! << 12) + (map.get(c3)! << 6) + map.get(c4)!; + + const chunkBytes = [(triplet >> 16) & 255, (triplet >> 8) & 255, triplet & 255]; + + if (actualChunkLength === 2) { + return [chunkBytes[0]]; + } else if (actualChunkLength === 3) { + return [chunkBytes[0], chunkBytes[1]]; + } + return chunkBytes; +} + +const asciiWhitespaceRegex = /[\u0009\u000A\u000C\u000D\u0020]/; +function skipAsciiWhitespace(string: string, index: number): number { + for (; index < string.length; ++index) { + if (!asciiWhitespaceRegex.test(string[index])) { + break; + } + } + return index; +} + +export function base64ToUint8Array(string: string): Uint8Array { + if (supportsFromBase64(Uint8Array)) { + return Uint8Array.fromBase64(string, { alphabet: "base64url" }); + } + + const bytes: number[] = []; + let chunk = ""; + + let index = 0; + while (true) { + index = skipAsciiWhitespace(string, index); + if (index === string.length) { + if (chunk.length > 0) { + if (chunk.length === 1) { + throw new SyntaxError("malformed padding: exactly one additional character"); + } + bytes.push(...decodeBase64Chunk(chunk)); + } + break; + } + const char = string[index]; + ++index; + if (char === "=") { + if (chunk.length < 2) { + throw new SyntaxError("padding is too early"); + } + index = skipAsciiWhitespace(string, index); + if (chunk.length === 2) { + if (index === string.length) { + throw new SyntaxError("malformed padding - only one ="); + } + if (string[index] === "=") { + ++index; + index = skipAsciiWhitespace(string, index); + } + } + if (index < string.length) { + throw new SyntaxError("unexpected character after padding"); + } + bytes.push(...decodeBase64Chunk(chunk)); + break; + } + if (!chars.includes(char)) { + throw new SyntaxError(`unexpected character ${JSON.stringify(char)}`); + } + + chunk += char; + if (chunk.length === 4) { + bytes.push(...decodeBase64Chunk(chunk)); + chunk = ""; + } + } + + return new Uint8Array(bytes); +} diff --git a/src/equicordplugins/favouriteAnything/stores.ts b/src/equicordplugins/favouriteAnything/stores.ts new file mode 100644 index 000000000..53b59f45a --- /dev/null +++ b/src/equicordplugins/favouriteAnything/stores.ts @@ -0,0 +1,98 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { proxyLazyWebpack } from "@webpack"; +import { Constants, Flux, FluxDispatcher, RestAPI } from "@webpack/common"; + +import { RefreshedUrlsResponse } from "./types"; +import { BatchedRequestQueue, isAllowedHost } from "./utils"; + +/** Used for storing and automatically refreshing signed CDN/Media proxy urls ({@link https://docs.discord.food/reference#signed-attachment-urls}). */ +export const SignedUrlsStore = proxyLazyWebpack(() => { + interface Store { + get(url: string): string | null; + addSigned(url: string): void; + } + + class SignedUrlsStore extends Flux.Store implements Store { + private static readonly _expirationThreshold = 60 * 60 * 1000; + + private _urls = new Map(); + private _queue = new BatchedRequestQueue(batch => this._handleBatch(batch), { + maxCount: 50, + timeout: 50 + }); + + __getLocalVars() { + return { urls: this._urls, queue: this._queue }; + } + + public get(url: string): string | null { + const key = URL.parse(url); + if (!this._isValid(key)) return null; + + const value = this._urls.get(`${this._clean(key)}`) ?? null; + + const parsed = URL.parse(value!); + if (!parsed || this._willExpire(parsed)) this._refresh(key); + + return value; + } + + public addSigned(url: string): void { + const parsed = URL.parse(url); + if (!this._isValid(parsed)) return; + + if (this._willExpire(parsed)) this._refresh(parsed); + else this._update([[`${this._clean(parsed)}`, url]]); + } + + private _refresh(url: URL): void { + this._queue.add(`${this._clean(url)}`); + } + + private _clean(url: URL): URL { + const clean = new URL(url); + clean.search = ""; + clean.hash = ""; + return clean; + } + + private _isValid(url: URL | null): url is URL { + return !!(url && isAllowedHost(url.hostname)); + } + + private _willExpire(url: URL): boolean { + const expiryTimestamp = parseInt(url.searchParams.get("ex")!, 16) * 1000; + return isNaN(expiryTimestamp) || expiryTimestamp - SignedUrlsStore._expirationThreshold < Date.now(); + } + + private _update(urls: [string, string][]): void { + let hasChanged: boolean = false; + + for (const [url, value] of urls) { + if (!value || url === value || this._urls.get(url) === value) continue; + + this._urls.set(url, value); + hasChanged = true; + } + + if (hasChanged) this.emitChange(); + } + + private async _handleBatch(batch: string[]): Promise { + await RestAPI.post({ + url: Constants.Endpoints.ATTACHMENTS_REFRESH_URLS, + body: { attachment_urls: batch }, + retries: 3 + }).then(({ body }: { body: RefreshedUrlsResponse; }) => + this._update(body.refreshed_urls.map(({ original, refreshed }) => [original, refreshed!])) + ); + } + } + + return new SignedUrlsStore(FluxDispatcher) as Store; +}); diff --git a/src/equicordplugins/favouriteAnything/style.css b/src/equicordplugins/favouriteAnything/style.css new file mode 100644 index 000000000..a0acd6019 --- /dev/null +++ b/src/equicordplugins/favouriteAnything/style.css @@ -0,0 +1,112 @@ +.vc-favouriteAnything-attachment-container { + padding: 12px; + display: flex; + gap: 12px; + + &.vc-favouriteAnything-reduced-padding { + padding-bottom: 0; + } + + > :first-child { + margin: 0; + flex: 1; + min-width: 0; + + > [class*="nonVisualMediaItem"] { + width: 100%; + + [class*="mosaicItem"] { + min-width: 0; + max-width: unset; + width: 100%; + } + + [class*="spoilerContent"] { + min-width: 0; + flex: 1; + } + } + } + + > button { + width: 15%; + min-width: 54px; + } +} + +.vc-favouriteAnything-container { + background: var(--background-base-lower); + display: flex; + flex-direction: column; + overflow: hidden; + position: relative; + width: 100%; +} + +.vc-favouriteAnything-container-header { + background: var(--background-surface-high); + border-bottom: 1px solid var(--border-subtle); + padding: var(--custom-gif-picker-gutter-size); + z-index: 1; +} + +.vc-favouriteAnything-container-body { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + flex: 1; + overflow: hidden; + + &.vc-favouriteAnything-container-info { + justify-content: center; + align-items: center; + gap: 1.5rem; + } +} + +.vc-favouriteAnything-image-accessory { + inset-inline-start: 6px; + inset-inline-end: unset; + position: absolute; + top: 6px; + z-index: 3; + cursor: pointer; + + :has(> &) { + position: relative; + } + + :is(.imageWrapper:is(:hover, :focus-within) ~ &, :hover, :focus-within) > [class*="gifFavoriteButton"] { + opacity: 1; + transform: translateY(0); + } +} + +.vc-favouriteAnything-attachment-accessory { + cursor: pointer; + + &:hover { + background: var(--interactive-background-hover); + } +} + +.vc-favouriteAnything-info-text { + text-align: center; + line-height: 1.6; + font-size: 1.1rem; +} + +.vc-favouriteAnything-demo { + width: 70%; + justify-self: center; + position: relative; + + .vc-favouriteAnything-demo-favourite-button { + position: absolute; + inset-inline-end: 4px; + top: 4px; + border-radius: 4px; + box-shadow: 0 0 0 4px var(--yellow-300); + } +} diff --git a/src/equicordplugins/favouriteAnything/types.ts b/src/equicordplugins/favouriteAnything/types.ts new file mode 100644 index 000000000..583ac409c --- /dev/null +++ b/src/equicordplugins/favouriteAnything/types.ts @@ -0,0 +1,140 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Channel, Embed, EmbedJSON, Message, MessageAttachment, TextInput } from "@vencord/discord-types"; +import { Component, ComponentClass, ComponentProps, ComponentPropsWithRef, Key, PropsWithChildren, ReactNode, RefObject } from "react"; +import { JsonValue, PartialDeep } from "type-fest"; + +export enum ExpressionPickerView { + EMOJI = "emoji", + GIF = "gif", + STICKER = "sticker", + SOUNDBOARD = "soundboard", + FILES = "files" +} + +export interface ExpressionPickerTabProps extends PropsWithChildren { + id?: string; + "aria-controls"?: string; + "aria-selected"?: boolean; + isActive?: boolean; + viewType: ExpressionPickerView; +} + +export interface FavoriteButtonProps extends Omit { + url: string; + gifSrc?: string; + className?: string; +} + +// Partial type, renderAttachments only uses a few props +interface MessageComponentProps { + message: Message; + channel: Channel; + gifAutoPlay?: boolean; + canDeleteAttachments?: boolean; + shouldHideMediaOptions?: boolean; + inlineAttachmentMedia?: boolean; +} + +export interface MessageComponentClass extends Omit, "new"> { + new(props: MessageComponentProps): Component & { + renderAttachments(message: Partial): ReactNode; + }; +} + +export interface ManaSearchBarProps extends Pick< + ComponentPropsWithRef, + "autoFocus" | "placeholder" | "onKeyDown" | "disabled" | "onChange" | "onBlur" | "onFocus" | "autoComplete" | "ref" +> { + query?: string; + onClear?: () => void; + inputProps?: ComponentProps; +} + +export interface FilePickerProps { + onSelectItem: (item: { url: string; }) => void; +} + +export interface FilePickerItemProps { + url: string; + file: MessageAttachment; + channel: Channel | null; + reducePadding?: boolean; + onResize: (key: Key, height: number) => void; + onSubmit: (url: string) => void; +} + +export interface AttachmentsComponentProps { + attachment: MessageAttachment; +} + +export interface EmbedComponent extends Component<{ embed: Embed; }> { + __render: () => ReactNode; +} + +export interface AttachmentItem { + contentType: string; + type: "IMAGE" | "VIDEO" | "CLIP" | "AUDIO" | "VISUAL_PLACEHOLDER" | "PLAINTEXT_PREVIEW" | "OTHER" | "INVALID"; + width?: number; + height?: number; + downloadUrl: string; + spoiler: boolean; + srcIsAnimated: boolean; + uniqueId: string; + originalItem: MessageAttachment; +} + +export enum FavouriteItemFormat { + NONE = 0, + IMAGE = 1, + VIDEO = 2 +} + +export interface FavouriteItem { + format: FavouriteItemFormat; + src: string; + width: number; + height: number; + order: number; +} + +export enum CustomItemFormat { + ATTACHMENT = 0 +} + +export interface CustomItemDef { + encode: (data: A) => B | null; + decode: (data: PartialDeep) => NoInfer | null; + stringify: (data: A) => string; +} + +export type ItemsDef = T & { + [K in keyof T]: T[K] extends CustomItemDef ? CustomItemDef : never; +}; + +export interface RefreshedUrlsResponse { + refreshed_urls: [ + { + original: string; + refreshed: string | null; + } + ]; +} + +export interface UnfurledEmbedsResponse { + embeds: EmbedJSON[]; +} + +export type ResizeObserverHook = ( + ref: RefObject, + callback: (size: { width: number; height: number; }) => void, + deps?: unknown[] +) => void; + +export interface ImageUtils { + isAnimated(image: { src: string; original?: string; animated: boolean; srcIsAnimated?: boolean; }): boolean; +} diff --git a/src/equicordplugins/favouriteAnything/utils.ts b/src/equicordplugins/favouriteAnything/utils.ts new file mode 100644 index 000000000..b90ea9653 --- /dev/null +++ b/src/equicordplugins/favouriteAnything/utils.ts @@ -0,0 +1,312 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { classNameFactory } from "@utils/css"; +import { sendMessage } from "@utils/discord"; +import { proxyLazy } from "@utils/lazy"; +import { Queue } from "@utils/Queue"; +import { useForceUpdater } from "@utils/react"; +import { PluginNative } from "@utils/types"; +import { Channel, MessageAttachment } from "@vencord/discord-types"; +import { findByCodeLazy, findByPropsLazy } from "@webpack"; +import { Constants, DraftType, FluxDispatcher, MessageActions, PendingReplyStore, PermissionStore, RestAPI, Toasts, UploadAttachmentStore, UploadHandler, UploadManager, useCallback, useEffect, useRef, UserSettingsActionCreators, UserSettingsProtoStore, useStateFromStores } from "@webpack/common"; +import { deflateSync, inflateSync } from "fflate"; +import { Key } from "react"; +import { JsonValue } from "type-fest"; + +import { base64ToUint8Array, uint8ArrayToBase64 } from "./polyfills"; +import { CustomItemDef, CustomItemFormat, FavouriteItem, FavouriteItemFormat, ImageUtils as ImageUtils_, ItemsDef, ResizeObserverHook, UnfurledEmbedsResponse } from "./types"; + +const Native = VencordNative.pluginHelpers.FavouriteAnything as PluginNative; + +export const cl = classNameFactory("vc-favouriteAnything-"); + +export const useResizeObserver: ResizeObserverHook = findByCodeLazy("borderBoxSize", "blockSize", "inlineSize"); +export const ImageUtils: ImageUtils_ = findByPropsLazy("isAnimated", "getFormatQuality"); + +const defineItem = (item: CustomItemDef) => item; +function defineItems>(def: ItemsDef) { + type Type = T[F] extends CustomItemDef ? A : never; + + return { + encode: (format: F, data: Type) => { + try { + const obj = [format, def[format].encode(data)]; + + const buf = deflateSync(new TextEncoder().encode(JSON.stringify(obj))); + return uint8ArrayToBase64(buf); + } catch { + return null; + } + }, + decode: (raw: string) => { + try { + if (!raw) return null; + + const buf = inflateSync(base64ToUint8Array(raw)); + const parsed: unknown[] | null = JSON.parse(new TextDecoder().decode(buf)); + if (!Array.isArray(parsed)) return null; + + const [format, data] = parsed as [keyof typeof def, JsonValue]; + if (!(format in def)) return null; + + return { format, data: def[format].decode(data) } as { + [F in CustomItemFormat]: { format: F; data: Type; }; + }[CustomItemFormat]; + } catch { + return null; + } + }, + stringify: (format: F, item: Type) => def[format].stringify(item) + }; +} + +// Encode/Decode definitions for custom favourite items. +// The encode callback must return a json compatible object, preferably as compact as possible. +// Decode must recreate the original object based on the encoded value. +// Stringify returns a simple string representation used for thumbnail text and expression picker search. +export const defs = defineItems({ + [CustomItemFormat.ATTACHMENT]: defineItem({ + encode: ({ id, filename, size, url, content_type = "" }: MessageAttachment) => [ + id, + filename, + size, + new URL(url).pathname, + content_type + ], + decode: ([id, filename, size, path, content_type]) => ({ + id: id ?? "0", + filename: filename ?? "UNKNOWN", + size: +size! || 0, + url: `${new URL(path!, `https://${window.GLOBAL_ENV.CDN_HOST}`)}`, + proxy_url: `${new URL(path!, `https://${window.GLOBAL_ENV.MEDIA_PROXY_ENDPOINT}`)}`, + content_type: content_type ?? "application/octet-stream", + spoiler: filename?.startsWith("SPOILER_") ?? false + }), + stringify: ({ filename }) => filename + }) + // This could be expanded in the future with other item types (e.g. voice messages) +}); + +// TODO: make thumbnails prettier +const fallbackThumbnail = new URL("https://images-ext-1.discordapp.net/external/pGTJg3YdSHpyGTltH4vZUKEyQoNzf5mtqbSJs7I4ebc/https/equicord.org/assets/plugins/favoriteAnything/invalid.png"); + +export async function getThumbnailUrl(data: string, width: number, height: number): Promise { + try { + const decoded = defs.decode(data); + if (!decoded || !width || !height) return null; + + const text = defs.stringify(decoded.format, decoded.data); + const url = new URL(`https://placehold.jp/42/444/fff/${width}x${height}.png`); + url.searchParams.append("text", text); + + return await RestAPI.post({ + url: Constants.Endpoints.UNFURL_EMBED_URLS, + body: { urls: [url] }, + retries: 3 + }).then(({ body }: { body: UnfurledEmbedsResponse; }) => { + const [{ thumbnail } = {}] = body.embeds; + return thumbnail?.proxy_url ? new URL(thumbnail.proxy_url) : fallbackThumbnail; + }); + } catch { + return fallbackThumbnail; + } +} + +export const isAllowedHost = proxyLazy(() => { + // GLOBAL_ENV is not initialized immediately + const allowedHosts = new Set([ + window.GLOBAL_ENV.CDN_HOST, + ...[window.GLOBAL_ENV.IMAGE_PROXY_ENDPOINTS, window.GLOBAL_ENV.MEDIA_PROXY_ENDPOINT] + .flatMap(endpoint => endpoint.split(",")) + .map(endpoint => URL.parse(`https://${endpoint}`)?.hostname) + .filter(Boolean) + ]); + return (value: string) => allowedHosts.has(value); +}); + +async function fetchAttachment(attachment: MessageAttachment): Promise { + if (!IS_WEB) + return Native.fetchAttachment(attachment).then( + ({ data, filename, type }) => new File([data], filename, { type }) + ); + + const { content_type, filename } = attachment; + const url = URL.parse(attachment.url); + if (!url || !isAllowedHost(url.hostname)) throw new Error("Invalid URL"); + + const res = await fetch(url, { headers: { Accept: "*/*" } }); + if (!res.ok) throw new Error("Server error"); + + const blob = await res.blob(); + const type = blob.type || content_type || "application/octet-stream"; + const data = await blob.arrayBuffer(); + + return new File([data], filename, { type }); +} + +export async function sendAttachment(attachment: MessageAttachment, channel: Channel) { + const file = await fetchAttachment(attachment) + .catch(() => + Toasts.show({ + message: `Couldn't fetch ${attachment.filename}`, + id: Toasts.genId(), + type: Toasts.Type.FAILURE + }) + ); + if (!file) return; + + // Using promptToUpload instead of addFiles directly since it has file size checks with error popups + await UploadHandler.promptToUpload([file], channel, DraftType.ChannelMessage).catch(() => + Toasts.show({ + message: `Couldn't upload ${attachment.filename}`, + id: Toasts.genId(), + type: Toasts.Type.FAILURE + }) + ); + + const uploads = [...UploadAttachmentStore.getUploads(channel.id, DraftType.ChannelMessage)]; + const uploadIdx = uploads.findIndex(({ item }) => item.file === file); + if (uploadIdx === -1) return; + + const reply = PendingReplyStore.getPendingReply(channel.id); + const [upload] = uploads.splice(uploadIdx); + UploadManager.setUploads({ uploads, channelId: channel.id, draftType: DraftType.ChannelMessage }); + FluxDispatcher.dispatch({ type: "DELETE_PENDING_REPLY", channelId: channel.id }); + + void sendMessage(channel.id, {}, false, { + ...MessageActions.getSendMessageOptionsForReply(reply), + attachmentsToUpload: [upload] + }); +} + +export function hasPermission(permission: bigint, channel: Channel | null): boolean { + return !!channel && (PermissionStore.can(permission, channel) || channel.isPrivate()); +} + +const diacriticsRegex = /[\u0300-\u036f]/g; +function normalize(str: string) { + return str.normalize("NFD").replace(diacriticsRegex, "").normalize("NFKC").toLowerCase().trim(); +} + +// Stolen from favGifSearch +function fuzzySearch(searchQuery: string, searchString: string) { + let searchIndex = 0; + let score = 0; + + for (let i = 0; i < searchString.length; i++) { + if (searchString[i] === searchQuery[searchIndex]) { + score++; + searchIndex++; + } else { + score--; + } + + if (searchIndex === searchQuery.length) { + return score; + } + } + + return null; +} + +function filterItems(items: Record | null, itemFormat: CustomItemFormat, query?: string) { + if (!items) return null; + + const validItems = Object.entries(items) + .filter(([, { format }]) => format === FavouriteItemFormat.NONE) + .map(([url, { src, ...rest }]) => ({ + ...rest, + ...defs.decode(URL.parse(src)?.hash.replace("#", "") ?? "")!, + url + })) + .filter(({ format, data }) => data && format === itemFormat); + + if (!query) return validItems.sort((a, b) => b.order - a.order); + + return validItems + .map(item => ({ + item, + score: fuzzySearch(query, normalize(defs.stringify(item.format, item.data))) + })) + .filter(({ score }) => score !== null) + .sort((a, b) => b.score! - a.score!) + .map(({ item }) => item); +} + +export function useFavourites(itemFormat: CustomItemFormat, searchQuery?: string) { + useEffect(() => void UserSettingsActionCreators.FrecencyUserSettingsActionCreators.loadIfNecessary(), []); + + const { state } = useStateFromStores( + [UserSettingsProtoStore], + () => { + const query = searchQuery && normalize(searchQuery); + const items: Record | null = + UserSettingsProtoStore.frecencyWithoutFetchingLatest.favoriteGifs?.gifs; + + return { query, state: filterItems(items, itemFormat, query) }; + }, + [searchQuery], + // Do not rerender components using this hook unless the query has changed or the items were loaded for the first time + // This matches the behavior of the gif picker, where unfavouriting an item doesn't immediately hide it + (prev, next) => !!prev.state === !!next.state && prev.query === next.query + ); + + return state; +} + +// Helper hook for the ListScroller component, similar utility is used in the forum channel list view +// for keeping track of the individual row heights +export function useListScroller() { + const rowHeights = useRef(new Map()); + const update = useForceUpdater(); + + const handleResize = useCallback((key: Key, height: number) => { + if (height === rowHeights.current.get(key)) return; + + rowHeights.current.set(key, height); + update(); + }, []); + + return [rowHeights.current, handleResize] as const; +} + +// Wrapper class for Queue which allows batching multiple requests into one. +// A request is fired immediately if at least `maxCount` items are in this queue, +// or if enough time (`timeout`) has passed since the last item was added. +// Subsequent requests are fired in sequence. +export class BatchedRequestQueue { + private items: T[] = []; + private timer: NodeJS.Timeout | null = null; + private readonly queue: Queue = new Queue(); + + constructor( + private readonly cb: (items: T[]) => Promise, + private readonly options: { maxCount: number; timeout?: number; } + ) { } + + public add(item: T) { + if (this.items.indexOf(item) !== -1) return; + this.items.push(item); + + if (this.items.length >= this.options.maxCount) { + this.flush(); + } else { + if (this.timer) clearTimeout(this.timer); + this.timer = setTimeout(() => this.flush(), this.options.timeout); + } + } + + private flush() { + if (this.timer) clearTimeout(this.timer); + this.timer = null; + + if (this.items.length === 0) return; + + const batch = this.items.splice(0, 50); + this.queue.push(() => this.cb(batch).catch(() => this.items.push(...batch))); + } +} diff --git a/src/equicordplugins/ghosted/index.tsx b/src/equicordplugins/ghosted/index.tsx index 954c9b624..845a34f6b 100644 --- a/src/equicordplugins/ghosted/index.tsx +++ b/src/equicordplugins/ghosted/index.tsx @@ -100,7 +100,7 @@ function BooIndicator() { return ( <> - {settings.store.showIndicator && getGhostedChannels().length && ( + {settings.store.showIndicator && getGhostedChannels().length > 0 && (
{({ onMouseEnter, onMouseLeave }) => ( diff --git a/src/equicordplugins/ghosted/styles.css b/src/equicordplugins/ghosted/styles.css index fb373f8fa..bb5d05bbf 100644 --- a/src/equicordplugins/ghosted/styles.css +++ b/src/equicordplugins/ghosted/styles.css @@ -10,7 +10,8 @@ background-color: var(--background-primary); height: 30px; width: 48px; - margin-left: 8px; + margin-left: auto; + margin-right: auto; color: var(--text-default); fill: var(--text-default); } @@ -153,4 +154,4 @@ .vc-boo-modal-text { color: var(--text-muted); -} \ No newline at end of file +} diff --git a/src/equicordplugins/gifCollections/index.tsx b/src/equicordplugins/gifCollections/index.tsx index cf9592141..fad3c214e 100644 --- a/src/equicordplugins/gifCollections/index.tsx +++ b/src/equicordplugins/gifCollections/index.tsx @@ -22,7 +22,7 @@ import { Alerts, Button, ContextMenuApi, FluxDispatcher, Menu, React, showToast, import { addToCollection, cache_collections, createCollection, DATA_COLLECTION_NAME, deleteCollection, fixPrefix, getCollections, getGifById, getItemCollectionNameFromId, moveGifToCollection, refreshCacheCollection, removeFromCollection, renameCollection, updateGif } from "./utils/collectionManager"; import { getFormat } from "./utils/getFormat"; import { getGif } from "./utils/getGif"; -import { refreshGifUrl } from "./utils/refreshUrl"; +import { batchRefreshAttachmentUrls, isCdnUrlExpired } from "./utils/refreshUrl"; import { downloadCollections, uploadGifCollections } from "./utils/settingsUtils"; import { uuidv4 } from "./utils/uuidv4"; @@ -385,11 +385,44 @@ export default definePlugin({ width: g.width, height: g.height })).reverse(); + + const expiredGifs = collection.gifs.filter(g => g.src && g.url && (isCdnUrlExpired(g.src) || isCdnUrlExpired(g.url))); + if (expiredGifs.length > 0) { + const allUrls = [...new Set( + expiredGifs.flatMap(g => [g.src, g.url].filter((u): u is string => !!u && isCdnUrlExpired(u))) + )]; + const refreshInBatches = async () => { + const fullMap: Record = {}; + for (let i = 0; i < allUrls.length; i += 50) { + const batch = allUrls.slice(i, i + 50); + const result = await batchRefreshAttachmentUrls(batch); + Object.assign(fullMap, result); + } + return fullMap; + }; + refreshInBatches().then(async refreshMap => { + if (!Object.keys(refreshMap).length) return; + let anyUpdated = false; + for (const gif of expiredGifs) { + const newSrc = refreshMap[gif.src] ?? gif.src; + const newUrl = refreshMap[gif.url] ?? gif.url; + if (newSrc !== gif.src || newUrl !== gif.url) { + await updateGif(gif.id, { ...gif, src: newSrc, url: newUrl }); + anyUpdated = true; + } + } + if (!anyUpdated) return; + const { query } = instance.props; + FluxDispatcher.dispatch({ type: "GIF_PICKER_QUERY", query: `${query} ` }); + await new Promise(r => setTimeout(r, 2500)); + FluxDispatcher.dispatch({ type: "GIF_PICKER_QUERY", query }); + }); + } } } }, hidePrefix(name) { - return name.split(":".length > 1) ? name.replace(/.+?:/, "") : name; + return name.includes(":") ? name.replace(/.+?:/, "") : name; }, insertCollections(instance) { const shouldRemoveAll = settings.store.onlyShowCollections; @@ -547,40 +580,6 @@ const RemoveItemContextMenu = ({ type, nameOrId, instance }) => ( }} /> - { - const gifInfo = getGifById(nameOrId); - if (!gifInfo) return; - - if (!gifInfo.channelId || !gifInfo.messageId || !gifInfo.attachmentId) { - showToast("Cannot refresh: GIF missing metadata (re-add to collection)", Toasts.Type.FAILURE); - return; - } - - showToast("Refreshing URL...", Toasts.Type.MESSAGE); - const refreshedGif = await refreshGifUrl(gifInfo); - - if (refreshedGif) { - await updateGif(nameOrId, refreshedGif); - const collectionName = getItemCollectionNameFromId(nameOrId); - FluxDispatcher.dispatch({ - type: "GIF_PICKER_QUERY", - query: `${collectionName} ` - }); - FluxDispatcher.dispatch({ - type: "GIF_PICKER_QUERY", - query: `${collectionName}` - }); - showToast("URL refreshed successfully", Toasts.Type.SUCCESS); - } else { - showToast("Failed to refresh URL", Toasts.Type.FAILURE); - } - }} - /> - { +export function isCdnUrlExpired(url: string): boolean { try { - const response = await RestAPI.get({ - url: `/channels/${channelId}/messages`, - query: { - limit: 1, - around: messageId - } + const ex = new URL(url).searchParams.get("ex"); + if (!ex) return false; + return parseInt(ex, 16) * 1000 < Date.now(); + } catch { + return false; + } +} + +export async function batchRefreshAttachmentUrls(urls: string[]): Promise> { + try { + const response = await RestAPI.post({ + url: "/attachments/refresh-urls", + body: { attachment_urls: urls } }); - - if (response.ok && response.body.length > 0) { - return response.body.find((m: any) => m.id === messageId); + if (!response.ok) return {}; + const map: Record = {}; + for (const { original, refreshed } of response.body.refreshed_urls) { + map[original] = refreshed; } - } catch (error) { - console.error("Failed to fetch message for GIF refresh:", error); + return map; + } catch { + return {}; } - return null; -} - -export async function refreshGifUrl(gif: Gif): Promise { - if (!gif.channelId || !gif.messageId || !gif.attachmentId) { - return null; - } - - const message = await fetchMessageFromAPI(gif.channelId, gif.messageId); - if (!message) { - return null; - } - - const attachment = message.attachments?.find((a: any) => a.id === gif.attachmentId); - if (!attachment) { - return null; - } - - return { - ...gif, - src: attachment.proxy_url, - url: attachment.url - }; } diff --git a/src/equicordplugins/hideMessages/index.tsx b/src/equicordplugins/hideMessages/index.tsx new file mode 100644 index 000000000..ca5feb6bd --- /dev/null +++ b/src/equicordplugins/hideMessages/index.tsx @@ -0,0 +1,70 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; +import { definePluginSettings } from "@api/Settings"; +import { EquicordDevs } from "@utils/constants"; +import definePlugin, { IconComponent, OptionType } from "@utils/types"; +import { Message } from "@vencord/discord-types"; +import { findExportedComponentLazy } from "@webpack"; +import { ChannelStore, FluxDispatcher, Menu } from "@webpack/common"; + +const EyeIconLazy = findExportedComponentLazy("EyeIcon"); +const EyeIcon: IconComponent = props => ; + +const hideMessage = (messageId: string, channelId: string) => { + FluxDispatcher.dispatch({ + type: "MESSAGE_DELETE", + id: messageId, + channelId, + mlDeleted: true, + }); +}; + +const messageCtxPatch: NavContextMenuPatchCallback = (children, { message }: { message: Message; }) => { + const group = findGroupChildrenByChildId("copy-text", children); + if (!group) return; + + group.splice(group.findIndex(c => c?.props?.id === "copy-text") + 1, 0, ( + hideMessage(message.id, message.channel_id)} + /> + )); +}; + +const settings = definePluginSettings({ + hidePopoverButton: { + type: OptionType.BOOLEAN, + description: "Hide the hide button in the message popover.", + default: false + } +}); + +export default definePlugin({ + name: "HideMessages", + description: "A plugin to temporarily hide messages until you restart.", + authors: [EquicordDevs.yash], + contextMenus: { + "message": messageCtxPatch + }, + settings, + messagePopoverButton: { + icon: EyeIcon, + render(message: Message) { + if (settings.store.hidePopoverButton) return null; + return { + label: "Hide", + icon: EyeIcon, + message, + channel: ChannelStore.getChannel(message.channel_id), + onClick: () => hideMessage(message.id, message.channel_id) + }; + } + } +}); diff --git a/src/equicordplugins/ignoreCalls/index.tsx b/src/equicordplugins/ignoreCalls/index.tsx index b9e287be3..1df54d557 100644 --- a/src/equicordplugins/ignoreCalls/index.tsx +++ b/src/equicordplugins/ignoreCalls/index.tsx @@ -17,6 +17,20 @@ import { Channel } from "@vencord/discord-types"; import { findComponentByCodeLazy } from "@webpack"; import { FluxDispatcher, Menu, React, Tooltip, UserStore } from "@webpack/common"; +interface CallUpdate { + ringing: string[]; + ongoingRings: Record; + messageId: string; + region: string; +} + +const args: CallUpdate = { + ringing: [], + ongoingRings: {}, + messageId: "", + region: "", +}; + const ignoredChannelIds = new Set(); const cl = classNameFactory("vc-ignore-calls-"); const Deafen = findComponentByCodeLazy("0-1.02-.1H3.05a9"); @@ -74,12 +88,6 @@ const settings = definePluginSettings({ }, }); -const args = { - ringing: [], - messageId: "", - region: "", -}; - export default definePlugin({ name: "IgnoreCalls", description: "Allows you to ignore calls from specific users or dm groups.", @@ -99,8 +107,9 @@ export default definePlugin({ "gdm-context": ContextMenuPatch, }, flux: { - async CALL_UPDATE({ ringing, messageId, region }) { - args.ringing = ringing; + async CALL_UPDATE({ ringing, ongoingRings, messageId, region }) { + args.ringing = ringing || []; + args.ongoingRings = ongoingRings || {}; args.messageId = messageId; args.region = region; } @@ -113,6 +122,7 @@ export default definePlugin({ type: "CALL_UPDATE", channelId: channel.id, ringing: args.ringing.filter((id: string) => id !== currentUserId), + ongoingRings: args.ongoingRings, messageId: args.messageId, region: args.region }); @@ -133,6 +143,7 @@ export default definePlugin({ type: "CALL_UPDATE", channelId: channel.id, ringing: args.ringing.filter((id: string) => id !== currentUserId), + ongoingRings: args.ongoingRings, messageId: args.messageId, region: args.region }); diff --git a/src/equicordplugins/limitMiddleClickPaste/index.ts b/src/equicordplugins/limitMiddleClickPaste/index.ts deleted file mode 100644 index 632eae2fe..000000000 --- a/src/equicordplugins/limitMiddleClickPaste/index.ts +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Vencord, a Discord client mod - * Copyright (c) 2025 Vendicated and contributors - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -import { definePluginSettings } from "@api/Settings"; -import { EquicordDevs } from "@utils/index"; -import definePlugin, { OptionType } from "@utils/types"; - -const MIDDLE_CLICK = 1; - -let lastMiddleClickUp = 0; - -const settings = definePluginSettings({ - scope: { - type: OptionType.SELECT, - description: "Situations in which to prevent middle click from pasting.", - options: [ - { - label: "Always Prevent Middle Click Pasting", - value: "always", - default: true - }, - { - label: "Only Prevent When Text Area Not Focused", - value: "focus" - }, - ] - }, - threshold: { - type: OptionType.NUMBER, - description: "Milliseconds until pasting is enabled again after a middle click.", - default: 100, - onChange(newValue) { if (newValue < 1) { settings.store.threshold = 1; } }, - }, - preventLinkOpen: { - type: OptionType.BOOLEAN, - description: "Prevent middle-click on links from opening new tabs while preserving autoscroll.", - default: false, - onChange(newValue) { - if (newValue) { - document.addEventListener("auxclick", handleAuxClick, true); - } else { - document.removeEventListener("auxclick", handleAuxClick, true); - } - }, - }, -}); - -function shouldBlockLink(e: MouseEvent): boolean { - if (e.button !== MIDDLE_CLICK) return false; - - const target = e.target as HTMLElement | null; - if (!target?.closest) return false; - - const a = target.closest("a[href]") as HTMLAnchorElement | null; - if (!a) return false; - - const href = a.getAttribute("href"); - return !!href && href !== "#"; -} - -function handleAuxClick(e: MouseEvent) { - if (!shouldBlockLink(e)) return; - e.preventDefault(); - e.stopPropagation(); -} - -export default definePlugin({ - name: "LimitMiddleClickPaste", - description: "Prevent middle click pasting either always or just when a text area is not focused.", - authors: [EquicordDevs.Etorix, EquicordDevs.korzi], - settings, - - isPastingDisabled(isInput: boolean) { - const pasteBlocked = Date.now() - lastMiddleClickUp < Math.max(settings.store.threshold, 1); - const { scope } = settings.store; - - if (!pasteBlocked) return false; - if (scope === "always") return true; - if (scope === "focus" && !isInput) return true; - - return false; - }, - - onMouseUp: (e: MouseEvent) => { - if (e.button === MIDDLE_CLICK) lastMiddleClickUp = Date.now(); - }, - - start() { - document.addEventListener("mouseup", this.onMouseUp); - if (settings.store.preventLinkOpen) { - document.addEventListener("auxclick", handleAuxClick, true); - } - }, - - stop() { - document.removeEventListener("mouseup", this.onMouseUp); - document.removeEventListener("auxclick", handleAuxClick, true); - }, - - patches: [ - { - // Detects paste events triggered by the "browser" outside of input fields. - find: "document.addEventListener(\"paste\",", - replacement: { - match: /(?<=paste",(\i)=>{)/, - replace: "if($1.target.tagName===\"BUTTON\"||$self.isPastingDisabled(false)){$1.preventDefault?.();$1.stopPropagation?.();return;};" - } - }, - { - // Detects paste events triggered inside of Discord's text input. - find: ",origin:\"clipboard\"});", - replacement: { - match: /(?<=handlePaste=(\i)=>{)(?=let)/, - replace: "if($self.isPastingDisabled(true)){$1.preventDefault?.();$1.stopPropagation?.();return;}" - } - }, - { - // Detects paste events triggered inside of Discord's search box. - find: "props.handlePastedText&&", - replacement: { - match: /(?<=clipboardData\);)/, - replace: "if($self.isPastingDisabled(true)){arguments[1].preventDefault?.();arguments[1].stopPropagation?.();return;};" - } - }, - ], -}); diff --git a/src/equicordplugins/messagePeek/index.tsx b/src/equicordplugins/messagePeek/index.tsx index 9e28bca9c..8d07c8492 100644 --- a/src/equicordplugins/messagePeek/index.tsx +++ b/src/equicordplugins/messagePeek/index.tsx @@ -8,16 +8,17 @@ import "./style.css"; import { DecoratorProps } from "@api/MemberListDecorators"; import { isPluginEnabled } from "@api/PluginManager"; +import { definePluginSettings } from "@api/Settings"; import betterActivities from "@equicordplugins/betterActivities"; import showMeYourName from "@plugins/showMeYourName"; import { Devs, EquicordDevs } from "@utils/constants"; import { classNameFactory } from "@utils/css"; import { classes } from "@utils/misc"; -import definePlugin from "@utils/types"; +import definePlugin, { OptionType } from "@utils/types"; import { Activity, ApplicationStream, Channel, Message, OnlineStatus, User } from "@vencord/discord-types"; import { MessageFlags } from "@vencord/discord-types/enums"; import { findByCodeLazy, findByPropsLazy, findComponentByCodeLazy, findCssClassesLazy, findExportedComponentLazy } from "@webpack"; -import { ChannelStore, ExperimentStore, MessageStore, Parser, RelationshipStore, SnowflakeUtils, UserStore, useStateFromStores } from "@webpack/common"; +import { ChannelStore, ExperimentStore, MessageStore, Parser, RelationshipStore, SnowflakeUtils, UserGuildSettingsStore, UserStore, useStateFromStores } from "@webpack/common"; const cl = classNameFactory("vc-message-peek-"); @@ -30,6 +31,14 @@ const ActivityText: React.ComponentType = findComponentByCode const ONE_HOUR_MS = 60 * 60 * 1000; +const settings = definePluginSettings({ + hideMuted: { + type: OptionType.BOOLEAN, + description: "Hide message previews and timestamps for muted DMs and group chats.", + default: false + } +}); + type AttachmentType = "image" | "gif" | "video" | "file"; type IconType = AttachmentType | "voice" | "sticker"; @@ -150,7 +159,7 @@ function MessagePreviewContent({ channel, user }: { channel: Channel; user: User return <>Official Discord Message; } - const smynName = isPluginEnabled(showMeYourName.name) ? showMeYourName.getMemberListProfilesReactionsVoiceNameText({ user: user ?? lastMessage?.author, type: "membersList" }) : null; + const smynName = isPluginEnabled(showMeYourName.name) ? showMeYourName.getTypingMemberListProfilesReactionsVoiceNameText({ user: user ?? lastMessage?.author, type: "membersList" }) : null; if (!lastMessage) { if (channel.isMultiUserDM()) return <>{channel.recipients.length + 1} Members; @@ -215,7 +224,7 @@ function Timestamp({ channel }: { channel: Channel; }) { if (!lastMessage) return null; const timestamp = SnowflakeUtils.extractTimestamp(lastMessage.id); - const className = ExperimentStore.getUserExperimentBucket("2021-09_favorites_server") >= 1 ? cl("timestamp-favorites") : cl("timestamp"); + const className = ExperimentStore.getUserExperimentBucket("2026-01-favorites-server") >= 1 ? cl("timestamp-favorites") : cl("timestamp"); return {formatRelativeTime(timestamp)}; } @@ -231,6 +240,7 @@ export default definePlugin({ name: "MessagePeek", description: "Shows the last message preview and timestamp in the Direct Messages list.", authors: [Devs.prism, EquicordDevs.justjxke], + settings, patches: [ { find: "PrivateChannel.renderAvatar", @@ -252,11 +262,28 @@ export default definePlugin({ renderMemberListDecorator({ channel }: DecoratorProps) { if (!channel) return null; + if (settings.store.hideMuted && UserGuildSettingsStore.isChannelMuted(null!, channel.id)) return null; return ; }, getSubText(props: PrivateChannelProps) { const { channel, user, activities, status, applicationStream, voiceChannel } = props; + + if (settings.store.hideMuted && UserGuildSettingsStore.isChannelMuted(null!, channel.id)) { + const hasActivity = hasRelevantActivity({ activities, status, applicationStream, voiceChannel }); + if (hasActivity) { + return ( + + ); + } + return null; + } + const lastMessage = MessageStore.getLastMessage(channel.id) as Message | undefined; const hasActivity = hasRelevantActivity({ activities, status, applicationStream, voiceChannel }); const showActivity = shouldShowActivity(lastMessage, hasActivity); diff --git a/src/equicordplugins/middleClickTweaks/index.ts b/src/equicordplugins/middleClickTweaks/index.ts new file mode 100644 index 000000000..da10a5d21 --- /dev/null +++ b/src/equicordplugins/middleClickTweaks/index.ts @@ -0,0 +1,150 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { definePluginSettings, SettingsStore } from "@api/Settings"; +import { EquicordDevs } from "@utils/index"; +import definePlugin, { OptionType } from "@utils/types"; + +const MIDDLE_CLICK = 1; +let lastMiddleClickUp = 0; + +function updateListeners(refresh: boolean = true) { + document.removeEventListener("mouseup", handleMouseUp, true); + document.removeEventListener("auxclick", handleAuxClick, true); + + if (refresh) { + document.addEventListener("mouseup", handleMouseUp, true); + document.addEventListener("auxclick", handleAuxClick, true); + } +} + +function handleAuxClick(event: MouseEvent) { + if (event.button !== MIDDLE_CLICK) return false; + + const { openScope } = settings.store; + + const target = event.target as HTMLElement | null; + const anchor = target?.closest("a[href]") as HTMLAnchorElement | null; + const media = target?.closest("a[href][data-role='img'], a[href][data-role='video']") as HTMLAnchorElement | null; + const role = anchor?.dataset.role ?? ""; + + const isMedia = !!media; + const isLink = !isMedia && !!anchor?.href && anchor.getAttribute("href") !== "#" && !["img", "video", "button"].includes(role); + + if (isLink && ["links", "both"].includes(openScope)) { + event.preventDefault(); + event.stopPropagation(); + } else if (isMedia && ["media", "both"].includes(openScope)) { + event.preventDefault(); + event.stopPropagation(); + } +} + +function handleMouseUp(event: MouseEvent) { + if (event.button === MIDDLE_CLICK) lastMiddleClickUp = Date.now(); +} + +const settings = definePluginSettings({ + openScope: { + type: OptionType.SELECT, + description: "Prevent middle clicking on these content types from opening them.", + options: [ + { label: "Links", value: "links" }, + { label: "Media", value: "media" }, + { label: "Links & Media", value: "both" }, + { label: "None", value: "none", default: true }, + ], + onChange(newValue) { updateListeners(newValue !== "none"); } + }, + pasteScope: { + type: OptionType.SELECT, + description: "Prevent middle click from pasting during these situations.", + options: [ + { label: "Always Prevent Middle Click Pasting", value: "always", default: true }, + { label: "Only Prevent When Text Area Not Focused", value: "focus" }, + ] + }, + pasteThreshold: { + type: OptionType.NUMBER, + description: "Milliseconds until pasting is enabled again after a middle click.", + default: 100, + onChange(newValue) { if (newValue < 1) { settings.store.pasteThreshold = 1; } } + } +}); + +function migrate() { + const { plugins } = SettingsStore.plain; + const oldPlugin = plugins?.LimitMiddleClickPaste; + + if (!oldPlugin) return; + + const newPlugin = plugins.MiddleClickTweaks ??= { enabled: false }; + const { scope, threshold, preventLinkOpen } = oldPlugin; + + if (scope) newPlugin.pasteScope = scope; + if (threshold) newPlugin.pasteThreshold = threshold; + if (preventLinkOpen) newPlugin.openScope = "both"; + if (oldPlugin.enabled) newPlugin.enabled = true; + + delete plugins.LimitMiddleClickPaste; + SettingsStore.markAsChanged(); +} + +migrate(); + +export default definePlugin({ + name: "MiddleClickTweaks", + description: "Various middle click tweaks, such as with pasting and link opening.", + authors: [EquicordDevs.Etorix, EquicordDevs.korzi], + settings, + + tags: ["LimitMiddleClickPaste"], + + isPastingDisabled(isInput: boolean) { + const pasteBlocked = Date.now() - lastMiddleClickUp < Math.max(settings.store.pasteThreshold, 1); + const { pasteScope } = settings.store; + + if (!pasteBlocked) return false; + if (pasteScope === "always") return true; + if (pasteScope === "focus" && !isInput) return true; + + return false; + }, + + start() { + migrate(); + updateListeners(); + }, + + stop() { updateListeners(false); }, + + patches: [ + { + // Detects paste events triggered by the "browser" outside of input fields. + find: "document.addEventListener(\"paste\",", + replacement: { + match: /(?<=paste",(\i)=>{)/, + replace: "if($1.target.tagName===\"BUTTON\"||$self.isPastingDisabled(false)){$1.preventDefault?.();$1.stopPropagation?.();return;};" + } + }, + { + // Detects paste events triggered inside of Discord's text input. + find: ",origin:\"clipboard\"});", + replacement: { + match: /(?<=handlePaste=(\i)=>{)(?=let)/, + replace: "if($self.isPastingDisabled(true)){$1.preventDefault?.();$1.stopPropagation?.();return;}" + } + }, + { + // Detects paste events triggered inside of Discord's search box. + find: "props.handlePastedText&&", + replacement: { + match: /(?<=clipboardData\);)/, + replace: "if($self.isPastingDisabled(true)){arguments[1].preventDefault?.();arguments[1].stopPropagation?.();return;};" + } + }, + ], +}); diff --git a/src/equicordplugins/musicControls/index.tsx b/src/equicordplugins/musicControls/index.tsx index 50d8c623a..0054b321b 100644 --- a/src/equicordplugins/musicControls/index.tsx +++ b/src/equicordplugins/musicControls/index.tsx @@ -52,10 +52,10 @@ export default definePlugin({ patches: [ { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", + find: ".WIDGETS_RTC_UPSELL_COACHMARK),", replacement: { // react.jsx)(AccountPanel, { ..., showTaglessAccountPanel: blah }) - match: /(?<=\i\.jsxs?\)\()(\i),{(?=[^}]*?userTag:\i,hidePrivateData:)/, + match: /(?<=\i\.jsxs?\)\()(\i),{(?=[^}]*?userTag:\i,occluded:)/, // react.jsx(WrapperComponent, { VencordOriginal: AccountPanel, ... replace: "$self.PanelWrapper,{VencordOriginal:$1," }, diff --git a/src/equicordplugins/noPushToTalk/index.ts b/src/equicordplugins/noPushToTalk/index.ts new file mode 100644 index 000000000..ff5ee8682 --- /dev/null +++ b/src/equicordplugins/noPushToTalk/index.ts @@ -0,0 +1,33 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { EquicordDevs } from "@utils/constants"; +import definePlugin from "@utils/types"; + +export default definePlugin({ + name: "NoPushToTalk", + description: "Bypasses the push-to-talk requirement for voice activity in channels that enforce it.", + authors: [EquicordDevs.omaw], + patches: [ + { + find: "PermissionVADStore", + replacement: [ + { + match: /\|\|\i\.\i\.can\(\i\.\i\.USE_VAD,\i\)\|\|/, + replace: "||true||" + }, + { + match: /shouldShowWarning\(\)\{return!\i\}/, + replace: "shouldShowWarning(){return false}" + }, + { + match: /canUseVoiceActivity\(\)\{return \i\}/, + replace: "canUseVoiceActivity(){return true}" + }, + ] + } + ], +}); diff --git a/src/equicordplugins/platformSpoofer/index.tsx b/src/equicordplugins/platformSpoofer/index.tsx index a4ba90b5a..d6366bbf8 100644 --- a/src/equicordplugins/platformSpoofer/index.tsx +++ b/src/equicordplugins/platformSpoofer/index.tsx @@ -41,6 +41,10 @@ const settings = definePluginSettings({ label: "Playstation", value: "playstation", }, + { + label: "VR", + value: "vr", + }, ] } }); @@ -48,7 +52,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "PlatformSpoofer", description: "Spoof what platform or device you're on", - authors: [EquicordDevs.Drag], + authors: [EquicordDevs.Drag, EquicordDevs.neoarz], settingsAboutComponent: () => ( We can't guarantee this plugin won't get you warned or banned. @@ -95,6 +99,8 @@ export default definePlugin({ return { browser: "Discord Embedded", vcIcon: 2 }; case "playstation": return { browser: "Discord Embedded", vcIcon: 3 }; + case "vr": + return { browser: "Discord VR", vcIcon: 4 }; default: return null; } diff --git a/src/equicordplugins/profileSets/components/presetList.tsx b/src/equicordplugins/profileSets/components/presetList.tsx index 2beb5bc9e..61bf18ce6 100644 --- a/src/equicordplugins/profileSets/components/presetList.tsx +++ b/src/equicordplugins/profileSets/components/presetList.tsx @@ -4,7 +4,9 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { isNonNullish } from "@utils/guards"; import { classes } from "@utils/misc"; +import { ProfilePreset } from "@vencord/discord-types"; import { ContextMenuApi, Menu, React, TextInput } from "@webpack/common"; import { cl } from ".."; @@ -37,6 +39,7 @@ export function PresetList({ currentPage, onPageChange }: PresetListProps) { + type EditableProfile = Omit; const [renaming, setRenaming] = React.useState(-1); const [renameText, setRenameText] = React.useState(""); const isGuildProfile = section === "server"; @@ -149,11 +152,11 @@ export function PresetList({ label="Update" action={async () => { const profile = await getCurrentProfile(guildId, { isGuildProfile }); - Object.entries(profile).forEach(([key, value]) => { - if (value !== null && value !== undefined) { - updatePresetField(actualIndex, key as any, value, section, guildId); - } - }); + await Promise.all( + (Object.entries(profile) as [keyof EditableProfile, EditableProfile[keyof EditableProfile]][]) + .filter(([, value]) => isNonNullish(value)) + .map(([key, value]) => updatePresetField(actualIndex, key, value, section, guildId)) + ); onUpdate(); }} /> diff --git a/src/equicordplugins/profileSets/components/presetManager.tsx b/src/equicordplugins/profileSets/components/presetManager.tsx index b50090720..74f2c5bc8 100644 --- a/src/equicordplugins/profileSets/components/presetManager.tsx +++ b/src/equicordplugins/profileSets/components/presetManager.tsx @@ -137,7 +137,7 @@ export function PresetManager({ section, guildId }: PresetManagerProps) { }); }; - const avatarSize = settings.store.avatarSize || 40; + const { avatarSize } = settings.store; const hasPresets = presets.length > 0; const shouldShowPagination = filteredPresets.length > PRESETS_PER_PAGE; diff --git a/src/equicordplugins/profileSets/index.tsx b/src/equicordplugins/profileSets/index.tsx index dccb74a8c..a2db97aa4 100644 --- a/src/equicordplugins/profileSets/index.tsx +++ b/src/equicordplugins/profileSets/index.tsx @@ -18,9 +18,11 @@ import { loadPresets, PresetSection } from "./utils/storage"; export const cl = classNameFactory("vc-profile-presets-"); export const settings = definePluginSettings({ avatarSize: { - type: OptionType.NUMBER, + type: OptionType.SLIDER, description: "Avatar size in preset list.", - default: 40, + markers: [56, 64, 72, 80, 88, 96], + default: 56, + stickToMarkers: true }, }); @@ -40,8 +42,8 @@ export default definePlugin({ { find: "USER_SETTINGS_GUILD_PROFILE)", replacement: { - match: /onChange:\i\}\)(?=.{0,25}profilePreviewTitle:)/, - replace: '$&,$self.renderPresetSection("server")' + match: /guildId:(\i\.id),onChange:(\i)\}\)(?=.{0,25}profilePreviewTitle:)/, + replace: 'guildId:$1,onChange:$2}),$self.renderPresetSection("server",$1)' } } ], diff --git a/src/equicordplugins/profileSets/utils/actions.ts b/src/equicordplugins/profileSets/utils/actions.ts index eef4b916d..a43aa3e24 100644 --- a/src/equicordplugins/profileSets/utils/actions.ts +++ b/src/equicordplugins/profileSets/utils/actions.ts @@ -4,24 +4,64 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { isNonNullish } from "@utils/guards"; import { ProfilePreset } from "@vencord/discord-types"; +import { findStoreLazy } from "@webpack"; +import { showToast, Toasts } from "@webpack/common"; import { getCurrentProfile } from "./profile"; -import { addPreset, movePresetInArray, PresetSection, presets, removePreset, replaceAllPresets, savePresetsData, updatePreset, type ProfilePresetEx } from "./storage"; +import { addPreset, movePresetInArray, presets, PresetSection, type ProfilePresetEx, removePreset, replaceAllPresets, savePresetsData, updatePreset } from "./storage"; + +const UserProfileSettingsStore = findStoreLazy("UserProfileSettingsStore"); + +function isImageInput(value: unknown): value is string | { imageUri: string; } { + if (typeof value === "string") return value.length > 0; + return typeof value === "object" && isNonNullish(value) && "imageUri" in value && typeof (value as { imageUri: unknown }).imageUri === "string"; +} + +function getFreshPendingAvatar(section: PresetSection, guildId?: string): string | null { + const pending = (section === "server" && guildId + ? UserProfileSettingsStore.getPendingChanges?.(guildId) + : UserProfileSettingsStore.getPendingChanges?.()) ?? {}; + const pendingObj = pending as Record; + + const candidates = [ + pendingObj.selectedAvatarRaw, + pendingObj.presetAvatarRaw, + pendingObj.pendingAvatar, + pendingObj.avatar, + pendingObj.selectedAvatarProcessed, + pendingObj.presetAvatarProcessed + ]; + const selected = candidates.find(isImageInput); + if (!selected) return null; + return typeof selected === "string" ? selected : selected.imageUri; +} export async function savePreset(name: string, section: PresetSection, guildId?: string) { const profile = await getCurrentProfile(guildId, { isGuildProfile: section === "server" }); + const freshPendingAvatar = getFreshPendingAvatar(section, guildId); + const effectiveAvatar = freshPendingAvatar ?? profile.avatarDataUrl ?? null; + const newPreset: ProfilePresetEx = { name, timestamp: Date.now(), ...profile, + avatarDataUrl: effectiveAvatar, }; addPreset(newPreset); await savePresetsData(section); } -export async function updatePresetField(index: number, field: keyof Omit, value: any, section: PresetSection, guildId?: string) { +export async function updatePresetField>( + index: number, + field: K, + value: Omit[K], + section: PresetSection, + guildId?: string +) { if (index < 0 || index >= presets.length) return; + void guildId; const updatedPreset = { ...presets[index], @@ -55,17 +95,14 @@ export async function renamePreset(index: number, newName: string, section: Pres } export function exportPresets(section: PresetSection) { - try { - const dataStr = JSON.stringify(presets, null, 2); - const dataBlob = new Blob([dataStr], { type: "application/json" }); - const url = URL.createObjectURL(dataBlob); - const link = document.createElement("a"); - link.href = url; - link.download = `profile-presets-${section}-${Date.now()}.json`; - link.click(); - URL.revokeObjectURL(url); - } catch { - } + const dataStr = JSON.stringify(presets, null, 2); + const dataBlob = new Blob([dataStr], { type: "application/json" }); + const url = URL.createObjectURL(dataBlob); + const link = document.createElement("a"); + link.href = url; + link.download = `profile-presets-${section}-${Date.now()}.json`; + link.click(); + URL.revokeObjectURL(url); } export type ImportDecision = "override" | "merge" | "cancel"; @@ -108,6 +145,7 @@ export async function importPresets( await savePresetsData(section); forceUpdate(); } catch { + showToast("Failed to import presets. The file might be invalid.", Toasts.Type.FAILURE); } }; input.click(); diff --git a/src/equicordplugins/profileSets/utils/profile.ts b/src/equicordplugins/profileSets/utils/profile.ts index 2408623eb..148081443 100644 --- a/src/equicordplugins/profileSets/utils/profile.ts +++ b/src/equicordplugins/profileSets/utils/profile.ts @@ -7,12 +7,16 @@ import { getUserSettingLazy } from "@api/UserSettings"; import { CustomStatus, DisplayNameStyles, Nameplate, ProfileEffect, ProfilePreset } from "@vencord/discord-types"; import { findStoreLazy } from "@webpack"; -import { FluxDispatcher, GuildMemberStore,IconUtils, UserProfileStore, UserStore } from "@webpack/common"; +import { FluxDispatcher, GuildMemberStore, IconUtils, UserProfileStore, UserStore } from "@webpack/common"; const UserProfileSettingsStore = findStoreLazy("UserProfileSettingsStore"); const CustomStatusSettings = getUserSettingLazy("status", "customStatus")!; type PendingChanges = Record & { + selectedAvatarRaw?: ImageInput; + presetAvatarRaw?: ImageInput; + selectedAvatarProcessed?: ImageInput; + presetAvatarProcessed?: ImageInput; pendingAvatar?: ImageInput; avatar?: ImageInput; pendingBanner?: ImageInput; @@ -30,34 +34,22 @@ type PendingChanges = Record & { pendingPrimaryGuildId?: string | null; }; -type UserExtras = { - collectibles?: { - nameplate?: Nameplate; - }; - displayNameStyles?: DisplayNameStyles; - avatarDecorationData?: { - asset: string; - skuId: string; - } | null; - primaryGuild?: { - identityGuildId?: string | null; - } | null; -}; - -type ProfileCollectible = { - skuId: string; - title?: string; - description?: string; - accessibilityLabel?: string; - reducedMotionSrc?: string; - thumbnailPreviewSrc?: string; - effects?: ProfileEffect["effects"]; - animationType?: number; - staticFrameSrc?: string; - type?: number; -}; - type ImageInput = string | { imageUri: string; } | null | undefined; +type DisplayNameStylesLike = DisplayNameStyles & { + fontId?: number; + effectId?: number; +}; + +type CurrentProfileOptions = { + isGuildProfile?: boolean; +}; + +type LoadPresetOptions = { + skipGlobalName?: boolean; + skipBio?: boolean; + skipPronouns?: boolean; + isGuildProfile?: boolean; +}; function dispatch(type: string, payload: Record) { FluxDispatcher.dispatch({ type, ...payload }); @@ -70,7 +62,23 @@ function isNonEmptyString(value: unknown): value is string { function hasImageInput(value: ImageInput): boolean { if (!value) return false; if (typeof value === "string") return value.length > 0; - return typeof value === "object" && "imageUri" in value && isNonEmptyString(value.imageUri); + return typeof value === "object" && isNonEmptyString(value?.imageUri); +} + +function normalizeDisplayNameStyles(value: DisplayNameStylesLike | null | undefined): DisplayNameStylesLike | null { + if (!value) return null; + const fontId = value.fontId ?? value.font_id; + const effectId = value.effectId ?? value.effect_id; + if (typeof fontId !== "number" || typeof effectId !== "number") return null; + const colors = Array.isArray(value.colors) ? [...value.colors] : []; + + return { + fontId, + effectId, + font_id: fontId, + effect_id: effectId, + colors + }; } export async function imageUrlToBase64(url: string): Promise { @@ -91,7 +99,7 @@ export async function imageUrlToBase64(url: string): Promise { async function processImage(imageData: ImageInput, userId: string, type: "avatar" | "banner", guildId?: string, useGuildPath?: boolean): Promise { if (!imageData) return null; - if (typeof imageData === "object" && "imageUri" in imageData && isNonEmptyString(imageData.imageUri)) { + if (typeof imageData === "object" && isNonEmptyString(imageData?.imageUri)) { return imageData.imageUri; } @@ -117,17 +125,6 @@ async function processImage(imageData: ImageInput, userId: string, type: "avatar return null; } -type CurrentProfileOptions = { - isGuildProfile?: boolean; -}; - -type LoadPresetOptions = { - skipGlobalName?: boolean; - skipBio?: boolean; - skipPronouns?: boolean; - isGuildProfile?: boolean; -}; - export async function getCurrentProfile(guildId?: string, options: CurrentProfileOptions = {}): Promise> { const currentUser = UserStore.getCurrentUser(); const baseProfile = UserProfileStore.getUserProfile(currentUser.id); @@ -135,19 +132,17 @@ export async function getCurrentProfile(guildId?: string, options: CurrentProfil const effectiveGuildId = isGuildProfile ? guildId : undefined; const guildProfile = effectiveGuildId ? UserProfileStore.getGuildMemberProfile(currentUser.id, effectiveGuildId) : null; const userProfile = guildProfile ?? baseProfile; - const userAny = currentUser as UserExtras; + const userAny = currentUser; const guildMember = effectiveGuildId ? GuildMemberStore.getMember(effectiveGuildId, currentUser.id) : null; - const pendingChangesDefault = (UserProfileSettingsStore.getPendingChanges() ?? {}) as PendingChanges; - const pendingChangesForGuild = (effectiveGuildId - ? (UserProfileSettingsStore.getPendingChanges(effectiveGuildId) ?? {}) - : {}) as PendingChanges; + const pendingChangesDefault: PendingChanges = UserProfileSettingsStore.getPendingChanges() ?? {}; + const pendingChangesForGuild: PendingChanges = UserProfileSettingsStore.getPendingChanges(effectiveGuildId) ?? {}; const pendingChanges: PendingChanges = isGuildProfile && Object.keys(pendingChangesForGuild).length > 0 ? pendingChangesForGuild : pendingChangesDefault; const customStatusSetting = CustomStatusSettings.getSetting(); - const customStatus: CustomStatus | null = isGuildProfile + const customStatus = isGuildProfile ? null : { text: customStatusSetting?.text ?? "", @@ -180,7 +175,7 @@ export async function getCurrentProfile(guildId?: string, options: CurrentProfil type: effectToUse.type || 1 }; } else if (effectToUse.skuId) { - const collectibles = (userProfile as { collectibles?: ProfileCollectible[]; } | null)?.collectibles; + const collectibles = userProfile?.collectibles; const collectible = collectibles?.find(c => c?.skuId === effectToUse.skuId); if (collectible) { profileEffect = { @@ -208,12 +203,11 @@ export async function getCurrentProfile(guildId?: string, options: CurrentProfil type: nameplateToUse.type || 2 } : null; - const displayNameStylesToUse = pendingChanges.pendingDisplayNameStyles ?? userAny.displayNameStyles; - const displayNameStyles = displayNameStylesToUse ? { - font_id: displayNameStylesToUse.font_id ?? 0, - effect_id: displayNameStylesToUse.effect_id ?? 0, - colors: Array.isArray(displayNameStylesToUse.colors) ? displayNameStylesToUse.colors : [] - } : null; + const savedDisplayNameStyles = isGuildProfile + ? (guildMember?.displayNameStyles ?? userAny.displayNameStyles) + : userAny.displayNameStyles; + const displayNameStylesToUse = pendingChanges.pendingDisplayNameStyles ?? savedDisplayNameStyles; + const displayNameStyles = normalizeDisplayNameStyles(displayNameStylesToUse); const pendingAvatar = pendingChanges.pendingAvatar ?? pendingChanges.avatar; const avatarToUse: ImageInput = hasImageInput(pendingAvatar) @@ -245,7 +239,7 @@ export async function getCurrentProfile(guildId?: string, options: CurrentProfil globalName: isGuildProfile ? (pendingChanges.pendingNickname ?? guildMember?.nick ?? null) : (pendingChanges.pendingGlobalName ?? currentUser.globalName ?? null), - pronouns: pendingChanges.pendingPronouns ?? userProfile?.pronouns ?? null, + pronouns: isGuildProfile ? null : (pendingChanges.pendingPronouns ?? userProfile?.pronouns ?? null), avatarDecoration, profileEffect, nameplate, @@ -263,98 +257,156 @@ function jsonEq(a: unknown, b: unknown): boolean { } function customStatusEq(a: CustomStatus | null | undefined, b: CustomStatus | null | undefined): boolean { - if (a == null && b == null) return true; - if (a == null || b == null) return false; + if (a == null || b == null) return a == null && b == null; return a.text === b.text && String(a.emojiId ?? "") === String(b.emojiId ?? "") && a.emojiName === b.emojiName && String(a.expiresAtMs ?? "0") === String(b.expiresAtMs ?? "0"); } +function resolvePendingAvatar(pendingChanges: PendingChanges | null): ImageInput { + if (!pendingChanges) return null; + + const candidates: ImageInput[] = [ + pendingChanges.selectedAvatarRaw, + pendingChanges.presetAvatarRaw, + pendingChanges.pendingAvatar, + pendingChanges.avatar, + pendingChanges.selectedAvatarProcessed, + pendingChanges.presetAvatarProcessed + ]; + return candidates.find(hasImageInput) ?? null; +} + +function normalizeImageValue(value: unknown): string | null { + if (typeof value === "string") return value; + if (value && typeof value === "object" && "imageUri" in value) { + const { imageUri } = value as { imageUri: unknown; }; + return typeof imageUri === "string" ? imageUri : null; + } + return null; +} + +function collectibleEqBySku(a: { skuId?: string | number | null; } | null | undefined, b: { skuId?: string | number | null; } | null | undefined): boolean { + if (a == null || b == null) return a == null && b == null; + return String(a.skuId ?? "") === String(b.skuId ?? ""); +} + +function avatarDecorationEq(a: { skuId?: string | number | null; asset?: string | null; } | null | undefined, b: { skuId?: string | number | null; asset?: string | null; } | null | undefined): boolean { + if (a == null || b == null) return a == null && b == null; + return String(a.skuId ?? "") === String(b.skuId ?? "") && String(a.asset ?? "") === String(b.asset ?? ""); +} + +function nameplateEq(a: { skuId?: string | number | null; asset?: string | null; } | null | undefined, b: { skuId?: string | number | null; asset?: string | null; } | null | undefined): boolean { + if (a == null || b == null) return a == null && b == null; + return String(a.skuId ?? "") === String(b.skuId ?? "") && String(a.asset ?? "") === String(b.asset ?? ""); +} + export async function loadPresetAsPending(preset: ProfilePreset, guildId?: string, options: LoadPresetOptions = {}) { try { const isGuild = options.isGuildProfile ?? Boolean(guildId); if (isGuild && !guildId) return; + const currentUser = UserStore.getCurrentUser(); + const baseProfile = UserProfileStore.getUserProfile(currentUser.id); + const guildProfile = isGuild && guildId ? UserProfileStore.getGuildMemberProfile(currentUser.id, guildId) : null; + const equippedProfile = guildProfile ?? baseProfile; const current = await getCurrentProfile(guildId, { isGuildProfile: isGuild }); - const profilePrefix = "USER_SETTINGS_ACCOUNT"; - const dispatchProfile = (type: string, payload: Record) => { - dispatch(type, isGuild ? { ...payload, guildId } : payload); + const pendingChanges = (isGuild && guildId + ? UserProfileSettingsStore.getPendingChanges(guildId) + : UserProfileSettingsStore.getPendingChanges()); + const equippedAvatarDecoration = currentUser.avatarDecorationData ?? null; + const equippedProfileEffect = equippedProfile?.profileEffect ?? null; + const equippedNameplate = currentUser.collectibles?.nameplate ?? null; + const pendingAvatarDecoration = pendingChanges?.pendingAvatarDecoration ?? null; + const pendingProfileEffect = pendingChanges?.pendingProfileEffect ?? null; + const pendingNameplate = pendingChanges?.pendingNameplate ?? null; + const setPending = (field: string, payload: Record) => { + const cleanPayload = Object.fromEntries(Object.entries(payload).filter(([, v]) => v !== undefined)); + if (!Object.keys(cleanPayload).length) return; + dispatch(`USER_PROFILE_SETTINGS_SET_PENDING_${field}`, isGuild ? { ...cleanPayload, guildId } : cleanPayload); }; - const setPending = (type: string, payload: Record) => dispatchProfile(type, payload); if ("avatarDataUrl" in preset) { const avatarValue = preset.avatarDataUrl; - if (isGuild || avatarValue !== current.avatarDataUrl) { - setPending(`${profilePrefix}_SET_PENDING_AVATAR`, { avatar: avatarValue }); + const presetAvatar = normalizeImageValue(avatarValue); + const currentAvatar = normalizeImageValue(current.avatarDataUrl); + const pendingAvatar = normalizeImageValue(resolvePendingAvatar(pendingChanges)); + if (isGuild || (presetAvatar !== currentAvatar && presetAvatar !== pendingAvatar)) { + const avatarPayload = + typeof avatarValue === "string" && avatarValue.startsWith("data:") + ? { + assetOrigin: "NEW_ASSET", + imageUri: avatarValue, + description: `profilesets-${preset.name ?? "preset"}` + } + : avatarValue; + setPending("AVATAR", { avatar: avatarPayload }); } } if ("bannerDataUrl" in preset && preset.bannerDataUrl !== current.bannerDataUrl) { - setPending(`${profilePrefix}_SET_PENDING_BANNER`, { banner: preset.bannerDataUrl }); + setPending("BANNER", { banner: preset.bannerDataUrl }); } - if (!options.skipBio && "bio" in preset && preset.bio !== current.bio) { + if (!options.skipBio && preset?.bio !== current?.bio) { const bioValue = preset.bio === null ? "" : preset.bio; - setPending(`${profilePrefix}_SET_PENDING_BIO`, { bio: bioValue }); + setPending("BIO", { bio: bioValue }); } - if (!options.skipPronouns && "pronouns" in preset && preset.pronouns !== current.pronouns) { + if (!isGuild && !options.skipPronouns && preset?.pronouns !== current?.pronouns) { const pronounsValue = preset.pronouns === null ? "" : preset.pronouns; - setPending(`${profilePrefix}_SET_PENDING_PRONOUNS`, { pronouns: pronounsValue }); + setPending("PRONOUNS", { pronouns: pronounsValue }); } - if (!options.skipGlobalName && preset.globalName !== undefined && preset.globalName !== current.globalName) { + if (!options.skipGlobalName && preset?.globalName !== current?.globalName) { if (isGuild) { - setPending("USER_SETTINGS_ACCOUNT_SET_PENDING_NICKNAME", { nickname: preset.globalName }); + setPending("NICKNAME", { nickname: preset.globalName }); } else { - setPending("USER_SETTINGS_ACCOUNT_SET_PENDING_GLOBAL_NAME", { globalName: preset.globalName }); + setPending("GLOBAL_NAME", { globalName: preset.globalName }); } } - if (preset.avatarDecoration !== undefined && !jsonEq(preset.avatarDecoration, current.avatarDecoration)) { - dispatchProfile(`${profilePrefix}_SET_PENDING_COLLECTIBLES_ITEM`, { + if (preset.avatarDecoration && ![pendingAvatarDecoration, equippedAvatarDecoration, current.avatarDecoration].some(d => avatarDecorationEq(preset.avatarDecoration, d))) { + setPending("COLLECTIBLES_ITEM", { item: { type: 0, value: preset.avatarDecoration } }); } - if (preset.profileEffect !== undefined && !jsonEq(preset.profileEffect, current.profileEffect)) { - dispatchProfile(`${profilePrefix}_SET_PENDING_COLLECTIBLES_ITEM`, { + if (preset.profileEffect && ![pendingProfileEffect, equippedProfileEffect, current.profileEffect].some(d => collectibleEqBySku(preset.profileEffect, d))) { + setPending("COLLECTIBLES_ITEM", { item: { type: 1, value: preset.profileEffect } }); } - if (preset.nameplate !== undefined && !jsonEq(preset.nameplate, current.nameplate)) { - dispatchProfile(`${profilePrefix}_SET_PENDING_COLLECTIBLES_ITEM`, { + if (preset.nameplate && ![pendingNameplate, equippedNameplate, current.nameplate].some(d => nameplateEq(preset.nameplate, d))) { + setPending("COLLECTIBLES_ITEM", { item: { type: 2, value: preset.nameplate } }); } - if (preset.displayNameStyles !== undefined && !jsonEq(preset.displayNameStyles, current.displayNameStyles)) { - setPending(`${profilePrefix}_SET_PENDING_DISPLAY_NAME_STYLES`, { displayNameStyles: preset.displayNameStyles }); + if (preset.displayNameStyles) { + const presetDisplayNameStyles = normalizeDisplayNameStyles(preset.displayNameStyles); + if (!jsonEq(presetDisplayNameStyles, current.displayNameStyles)) { + setPending("DISPLAY_NAME_STYLES", { displayNameStyles: presetDisplayNameStyles }); + } } - if (preset.themeColors !== undefined && !jsonEq(preset.themeColors, current.themeColors)) { - setPending(`${profilePrefix}_SET_PENDING_THEME_COLORS`, { themeColors: preset.themeColors }); + if (preset.themeColors && !jsonEq(preset.themeColors, current.themeColors)) { + setPending("THEME_COLORS", { themeColors: preset.themeColors }); } - if (preset.primaryGuildId !== undefined && !isGuild && preset.primaryGuildId !== current.primaryGuildId) { + if (preset.primaryGuildId && !isGuild && preset.primaryGuildId !== current.primaryGuildId) { dispatch("USER_SETTINGS_SET_PENDING_PRIMARY_GUILD_ID", { primaryGuildId: preset.primaryGuildId }); } - if (preset.customStatus !== undefined && !isGuild && !customStatusEq(preset.customStatus, current.customStatus)) { - const customStatusValue = preset.customStatus ?? { - text: "", - expiresAtMs: "0", - emojiId: "0", - emojiName: "" - }; + if (preset.customStatus && !isGuild && !customStatusEq(preset.customStatus, current.customStatus)) { CustomStatusSettings.updateSetting({ - text: customStatusValue.text || "", - expiresAtMs: customStatusValue.expiresAtMs || "0", - emojiId: customStatusValue.emojiId || "0", - emojiName: customStatusValue.emojiName || "" + text: preset.customStatus?.text ?? "", + expiresAtMs: preset.customStatus?.expiresAtMs ?? "0", + emojiId: preset.customStatus?.emojiId ?? "0", + emojiName: preset.customStatus?.emojiName ?? "" }); } } catch (err) { diff --git a/src/equicordplugins/questify/index.tsx b/src/equicordplugins/questify/index.tsx index c850b285c..8c9d1ee14 100644 --- a/src/equicordplugins/questify/index.tsx +++ b/src/equicordplugins/questify/index.tsx @@ -1007,6 +1007,8 @@ function getQuestAcceptedButtonText(quest: Quest, prepositional: boolean = false } function getQuestPanelPercentComplete({ quest, percentCompleteText }: { quest: Quest; percentCompleteText?: string; }): { percentComplete: number; } | { percentComplete: number; percentCompleteText: string; } | null { + if (!quest) { return null; } + const task = getQuestTask(quest); if (!task) { return null; } @@ -1294,8 +1296,8 @@ export default definePlugin({ // Fixes the progress tracking for auto-completing Quests. find: ",{progressTextAnimation:", replacement: { - match: /(?<=children:\i}=)(\i)/, - replace: "Object.assign({},$1,$1.quest?$self.getQuestPanelPercentComplete($1):{})" + match: /(let{percentComplete:.{0,115}?children:\i}=)(\i)/, + replace: "const questifyProgress=$self.getQuestPanelPercentComplete({...$2,quest:$2.children?.props?.quest});$1Object.assign({},$2,questifyProgress??{})" } }, { @@ -1603,17 +1605,9 @@ export default definePlugin({ } ] }, - { - // Sets intervals to progress Video Quests in the background. - find: "CAPTCHA_FAILED:", - replacement: { - match: /(?<=SUCCESS:)(\i\({)/, - replace: "!$self.processQuestForAutoComplete(arguments[0])&&$1" - } - }, { // Adds support for dev://experiment/2025-12-quest-cta-refactor-rollout - find: '"sm",preClickCallback:', + find: '"primary",preClickCallback:', replacement: [ { match: /(?=let{quest:)/, @@ -1624,11 +1618,19 @@ export default definePlugin({ replace: "!$self.processQuestForAutoComplete(arguments[0].quest)&&($1)" }, { - match: /(?<=,text:)(?=\i)/, - replace: "questifyText??" + match: /(?<=,text:)(\i),icon:\i/, + replace: "questifyText??$1" } ] }, + { + // Sets intervals to progress Video Quests in the background. + find: "CAPTCHA_FAILED:", + replacement: { + match: /(?<=SUCCESS:)(\i\({)/, + replace: "!$self.processQuestForAutoComplete(arguments[0])&&$1" + } + }, { // Sets intervals to progress Play Game Quests in the background. // Triggers if a Quest has already been started but was interrupted, such as by a reload. diff --git a/src/equicordplugins/quoter/index.tsx b/src/equicordplugins/quoter/index.tsx index f8389de73..95825e3c1 100644 --- a/src/equicordplugins/quoter/index.tsx +++ b/src/equicordplugins/quoter/index.tsx @@ -12,11 +12,11 @@ import { getCurrentChannel } from "@utils/discord"; import { ModalCloseButton, ModalContent, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; import definePlugin, { OptionType } from "@utils/types"; import { Message } from "@vencord/discord-types"; -import { Button, Menu, TextInput, UploadHandler, useEffect, useState } from "@webpack/common"; +import { Button, IconUtils, Menu, TextInput, UploadHandler, useEffect, useState } from "@webpack/common"; import { QuoteIcon } from "./components/QuoteIcon"; import { QuoteFont } from "./types"; -import { createQuoteImage, ensureFontLoaded, generateFileNamePreview, getFileExtension, getMimeType, resetFontLoading, sizeUpgrade } from "./utils"; +import { createQuoteImage, ensureFontLoaded, generateFileNamePreview, getFileExtension, getMimeType, resetFontLoading } from "./utils"; const settings = definePluginSettings({ quoteFont: { @@ -105,7 +105,7 @@ function QuoteModal({ message, ...props }: ModalProps & { message: Message; }) { const generateImage = async () => { const image = await createQuoteImage({ - avatarUrl: sizeUpgrade(message.author.getAvatarURL()), + avatarUrl: IconUtils.getUserAvatarURL(message.author, true, 512), quote: message.content, grayScale: gray, author: message.author, diff --git a/src/equicordplugins/quoter/utils.tsx b/src/equicordplugins/quoter/utils.tsx index faf83dd6f..8ff9ae5bf 100644 --- a/src/equicordplugins/quoter/utils.tsx +++ b/src/equicordplugins/quoter/utils.tsx @@ -5,15 +5,20 @@ */ import { User } from "@vencord/discord-types"; -import { UserStore } from "@webpack/common"; +import { IconUtils, UserStore } from "@webpack/common"; import { applyPalette, GIFEncoder, quantize } from "gifenc"; import { CANVAS_CONFIG, CanvasConfig, FONT_SIZES, FontSizeCalculation, QuoteFont, QuoteImageOptions, SPACING } from "./types"; -export function sizeUpgrade(url: string): string { - const u = new URL(url); - u.searchParams.set("size", "512"); - return u.toString(); +const CUSTOM_EMOJI_REGEX = //g; +const CUSTOM_EMOJI_PLACEHOLDER = "\uFFFC"; +const CUSTOM_EMOJI_SIZE_MULTIPLIER = 1.15; +const CUSTOM_EMOJI_BASELINE_OFFSET = 0.85; + +interface CustomEmojiToken { + id: string; + name: string; + animated: boolean; } export function canvasToBlob(canvas: HTMLCanvasElement): Promise { @@ -32,7 +37,7 @@ export async function fetchImageAsBlob(url: string): Promise { } export function fixUpQuote(quote: string): string { - let result = quote.replace(//g, ""); + let result = quote; const mentionMatches = result.match(/<@!?\d+>/g); if (mentionMatches) { mentionMatches.forEach(match => { @@ -46,7 +51,8 @@ export function fixUpQuote(quote: string): string { export function generateFileNamePreview(message: string): string { const words = message.split(" "); - return words.length > 6 ? words.slice(0, 6).join(" ") : words.join(" "); + const preview = words.length > 6 ? words.slice(0, 6).join(" ") : words.join(" "); + return preview.slice(0, 10); } export function getFileExtension(saveAsGif: boolean): string { @@ -140,6 +146,89 @@ function drawGradientOverlay(ctx: CanvasRenderingContext2D, config: CanvasConfig ctx.fillRect(config.height - SPACING.gradientWidth, 0, SPACING.gradientWidth, config.height); } +function extractCustomEmojis(text: string): { text: string; emojis: CustomEmojiToken[]; } { + const emojis: CustomEmojiToken[] = []; + const cleanText = text.replace(CUSTOM_EMOJI_REGEX, (match, name: string, id: string) => { + emojis.push({ + id, + name, + animated: match.startsWith(" { + const image = new Image(); + const blobUrl = URL.createObjectURL(blob); + + try { + await new Promise((resolve, reject) => { + image.onload = () => resolve(); + image.onerror = () => reject(new Error("Failed to load image")); + image.src = blobUrl; + }); + return image; + } finally { + URL.revokeObjectURL(blobUrl); + } +} + +async function loadCustomEmojiImage(emoji: CustomEmojiToken): Promise { + const animatedVariants = emoji.animated ? [true, false] : [false]; + for (const animated of animatedVariants) { + try { + const blob = await fetchImageAsBlob(IconUtils.getEmojiURL({ + id: emoji.id, + animated, + size: 96 + })); + return await loadImageFromBlob(blob); + } catch { + continue; + } + } + + return null; +} + +async function loadCustomEmojiImages(emojis: CustomEmojiToken[]): Promise> { + if (!emojis.length) return new Map(); + + const unique = new Map(); + emojis.forEach(emoji => { + const key = `${emoji.id}:${emoji.animated ? "a" : "s"}`; + if (!unique.has(key)) unique.set(key, emoji); + }); + + const entries = await Promise.all( + Array.from(unique.entries()).map(async ([key, emoji]) => [key, await loadCustomEmojiImage(emoji)] as const) + ); + + return entries.reduce((acc, [key, image]) => { + if (image) acc.set(key, image); + return acc; + }, new Map()); +} + +function measureTextWithCustomEmojis(ctx: CanvasRenderingContext2D, text: string, fontSize: number): number { + const emojiSize = fontSize * CUSTOM_EMOJI_SIZE_MULTIPLIER; + let width = 0; + let start = 0; + + for (let i = 0; i < text.length; i++) { + if (text[i] !== CUSTOM_EMOJI_PLACEHOLDER) continue; + width += ctx.measureText(text.slice(start, i)).width; + width += emojiSize; + start = i + 1; + } + + width += ctx.measureText(text.slice(start)).width; + return width; +} + function calculateTextLines( ctx: CanvasRenderingContext2D, text: string, @@ -153,12 +242,31 @@ function calculateTextLines( let currentLine: string[] = []; words.forEach(word => { - const testLine = [...currentLine, word].join(" "); - if (ctx.measureText(testLine).width > maxWidth && currentLine.length) { - lines.push(currentLine.join(" ")); - currentLine = [word]; + if (measureTextWithCustomEmojis(ctx, word, fontSize) > maxWidth) { + if (currentLine.length) { + lines.push(currentLine.join(" ")); + currentLine = []; + } + + let chunk = ""; + for (const char of word) { + const testChunk = chunk + char; + if (measureTextWithCustomEmojis(ctx, testChunk, fontSize) > maxWidth) { + if (chunk) lines.push(chunk); + chunk = char; + } else { + chunk = testChunk; + } + } + if (chunk) lines.push(chunk); } else { - currentLine.push(word); + const testLine = [...currentLine, word].join(" "); + if (measureTextWithCustomEmojis(ctx, testLine, fontSize) > maxWidth && currentLine.length) { + lines.push(currentLine.join(" ")); + currentLine = [word]; + } else { + currentLine.push(word); + } } }); @@ -204,17 +312,52 @@ function drawQuoteText( ctx: CanvasRenderingContext2D, calculation: FontSizeCalculation, font: QuoteFont, - config: CanvasConfig + config: CanvasConfig, + emojis: CustomEmojiToken[], + emojiImages: Map ): number { ctx.fillStyle = "#fff"; ctx.font = `300 ${calculation.fontSize}px '${font}', sans-serif`; + const emojiSize = calculation.fontSize * CUSTOM_EMOJI_SIZE_MULTIPLIER; let quoteY = (config.height - calculation.totalHeight) / 2; + let emojiIndex = 0; calculation.lines.forEach(line => { - const xOffset = (config.quoteAreaWidth - ctx.measureText(line).width) / 2; + const xOffset = (config.quoteAreaWidth - measureTextWithCustomEmojis(ctx, line, calculation.fontSize)) / 2; + let x = config.quoteAreaX + xOffset; + let segmentStart = 0; quoteY += calculation.lineHeight; - ctx.fillText(line, config.quoteAreaX + xOffset, quoteY); + + for (let i = 0; i < line.length; i++) { + if (line[i] !== CUSTOM_EMOJI_PLACEHOLDER) continue; + + const segment = line.slice(segmentStart, i); + if (segment) { + ctx.fillText(segment, x, quoteY); + x += ctx.measureText(segment).width; + } + + const emoji = emojis[emojiIndex++]; + if (emoji) { + const key = `${emoji.id}:${emoji.animated ? "a" : "s"}`; + const image = emojiImages.get(key); + if (image) { + const y = quoteY - emojiSize * CUSTOM_EMOJI_BASELINE_OFFSET; + ctx.drawImage(image, x, y, emojiSize, emojiSize); + } else { + ctx.fillText("□", x, quoteY); + } + } + + x += emojiSize; + segmentStart = i + 1; + } + + const tail = line.slice(segmentStart); + if (tail) { + ctx.fillText(tail, x, quoteY); + } }); return quoteY; @@ -263,6 +406,8 @@ export async function createQuoteImage(options: QuoteImageOptions): Promise { diff --git a/src/equicordplugins/statusPresets/index.tsx b/src/equicordplugins/statusPresets/index.tsx index 113b4052b..4904bd273 100644 --- a/src/equicordplugins/statusPresets/index.tsx +++ b/src/equicordplugins/statusPresets/index.tsx @@ -150,7 +150,7 @@ export default definePlugin({ managedStyle, patches: [ { - find: '"CustomStatusModalWithPreview"', + find: '="custom-status-input";', replacement: { match: /(?<=(\i)\?\.state\?\?.*?)\{text:\i\.\i\.\i\(\i\.\i#{intl::SAVE}\)/, replace: "$self.renderRememberButton($1),$&" diff --git a/src/equicordplugins/themeLibrary/index.tsx b/src/equicordplugins/themeLibrary/index.tsx index befdadca0..c634bb119 100644 --- a/src/equicordplugins/themeLibrary/index.tsx +++ b/src/equicordplugins/themeLibrary/index.tsx @@ -26,7 +26,7 @@ export default definePlugin({ start() { SettingsPlugin.customEntries.push({ - key: "theme_library", + key: "equicord_theme_library", title: "Theme Library", Component: require("./components/ThemeTab").default, Icon: ColorPaletteIcon diff --git a/src/equicordplugins/themeLibrary/utils/auth.tsx b/src/equicordplugins/themeLibrary/utils/auth.tsx index 9cc05ab20..9aba2d576 100644 --- a/src/equicordplugins/themeLibrary/utils/auth.tsx +++ b/src/equicordplugins/themeLibrary/utils/auth.tsx @@ -21,7 +21,7 @@ export async function authorizeUser(triggerModal: boolean = true) { responseType="code" redirectUri="https://themes.equicord.org/api/user/auth" permissions={0n} - clientId="1257819493422465235" + clientId="1464006702125940736" cancelCompletesFlow={false} callback={async ({ location }: any) => { if (!location) return logger.error("No redirect location returned"); diff --git a/src/equicordplugins/toneIndicators/index.tsx b/src/equicordplugins/toneIndicators/index.tsx index 655020748..6dc0ba1a0 100644 --- a/src/equicordplugins/toneIndicators/index.tsx +++ b/src/equicordplugins/toneIndicators/index.tsx @@ -24,11 +24,6 @@ const settings = definePluginSettings({ description: "Custom tone indicators (format: jk=Joking; srs=Serious)", default: "", }, - maxIndicators: { - type: OptionType.NUMBER, - description: "Maximum number of tone indicators to show per message", - default: 5, - }, }); function getCustomIndicators(): Record { @@ -91,15 +86,17 @@ function buildIndicatorRegex(): RegExp { function splitTextWithIndicators(text: string): ReactNode[] { const nodes: ReactNode[] = []; let lastIndex = 0; - let count = 0; const regex = buildIndicatorRegex(); const prefix = settings.store.prefix || "/"; let match: RegExpExecArray | null; - while ((match = regex.exec(text)) && count < settings.store.maxIndicators) { + while ((match = regex.exec(text))) { const indicator = match[1]; const desc = getIndicator(indicator); + const fullMatch = match[0]; + const leadingWhitespace = fullMatch.match(/^(\s*)/)?.[1] ?? ""; + const matchStart = match.index; const matchEnd = regex.lastIndex; @@ -108,6 +105,7 @@ function splitTextWithIndicators(text: string): ReactNode[] { } if (desc) { + if (leadingWhitespace) nodes.push(leadingWhitespace); nodes.push( , ); - count++; } lastIndex = matchEnd; diff --git a/src/equicordplugins/triviaAI/index.tsx b/src/equicordplugins/triviaAI/index.tsx new file mode 100644 index 000000000..f4c860347 --- /dev/null +++ b/src/equicordplugins/triviaAI/index.tsx @@ -0,0 +1,66 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; +import { EquicordDevs } from "@utils/constants"; +import definePlugin, { IconComponent } from "@utils/types"; +import { Message } from "@vencord/discord-types"; +import { findExportedComponentLazy } from "@webpack"; +import { ChannelStore, Menu } from "@webpack/common"; + +import { settings } from "./settings"; +import { getResponse, handleResponse, parseMessageContent } from "./utils"; + +const RobotIconLazy = findExportedComponentLazy("RobotIcon"); +const RobotIcon: IconComponent = props => ; + +const messageCtxPatch: NavContextMenuPatchCallback = (children, { message }: { message: Message; }) => { + const payload = parseMessageContent(message); + if (!payload) return; + + const group = findGroupChildrenByChildId("copy-text", children); + if (!group) return; + + group.splice(group.findIndex(c => c?.props?.id === "copy-text") + 1, 0, ( + { + const ans = await getResponse(payload); + handleResponse(message, ans); + }} + /> + )); +}; + +export default definePlugin({ + name: "TriviaAI", + description: "A plugin that helps you answer trivia questions using AI.", + authors: [EquicordDevs.yash], + settings, + contextMenus: { + "message": messageCtxPatch + }, + messagePopoverButton: { + icon: RobotIcon, + render(message: Message) { + const payload = parseMessageContent(message); + if (!payload) return null; + + return { + label: "Answer With AI", + icon: RobotIcon, + message, + channel: ChannelStore.getChannel(message.channel_id), + onClick: async () => { + const ans = await getResponse(payload); + handleResponse(message, ans); + } + }; + } + } +}); diff --git a/src/equicordplugins/triviaAI/settings.ts b/src/equicordplugins/triviaAI/settings.ts new file mode 100644 index 000000000..b4a97e823 --- /dev/null +++ b/src/equicordplugins/triviaAI/settings.ts @@ -0,0 +1,53 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { definePluginSettings } from "@api/Settings"; +import { OptionType } from "@utils/types"; + +export const settings = definePluginSettings({ + apiKey: { + type: OptionType.STRING, + description: "API Key.", + default: "", + placeholder: "Enter API Key here for your AI endpoint.", + componentProps: { + type: "password" + } + }, + model: { + type: OptionType.STRING, + description: "AI Model to use.", + default: "google/gemini-3-flash-preview", + placeholder: "e.g. google/gemini-3-flash-preview, inception/mercury, openai/gpt-5.2-chat, etc." + }, + systemPrompt: { + type: OptionType.STRING, + description: "System Prompt for the AI.", + default: "You are a helpful assistant who answers questions for the user in a concise and short way while using the least amount of words and punctuation.", + placeholder: "Enter system prompt." + }, + maxTokens: { + type: OptionType.NUMBER, + description: "Maximum number of tokens in the response.", + default: 500 + }, + endpoint: { + type: OptionType.STRING, + description: "OpenAI Compatible AI Endpoint.", + default: "https://openrouter.ai/api/v1/chat/completions", + placeholder: "Enter your OpenAI compatible AI endpoint here." + }, + autoRespond: { + type: OptionType.BOOLEAN, + description: "Automatically respond to messages on receiving a response.", + default: false + }, + supportImages: { + type: OptionType.BOOLEAN, + description: "Pass images to the AI for context (if any). This is not supported by all models.", + default: true + } +}); diff --git a/src/equicordplugins/triviaAI/utils.ts b/src/equicordplugins/triviaAI/utils.ts new file mode 100644 index 000000000..501a14ffb --- /dev/null +++ b/src/equicordplugins/triviaAI/utils.ts @@ -0,0 +1,188 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { insertTextIntoChatInputBox, sendMessage } from "@utils/discord"; +import { Logger } from "@utils/Logger"; +import { Message } from "@vencord/discord-types"; +import { showToast, Toasts } from "@webpack/common"; + +import { settings } from "./settings"; + +const logger = new Logger("TriviaAI"); + +type TextPart = { + type: "text"; + text: string; +}; + +type ImagePart = { + type: "image_url"; + image_url: { + url: string; + detail?: "auto" | "high" | "low"; + }; +}; + +export type ContentPayload = string | (TextPart | ImagePart)[]; + +export function parseMessageContent(message: Message): ContentPayload | null { + const textParts: string[] = []; + + if (message.content && message.content.trim().length > 0) { + textParts.push(message.content); + } + + message.embeds.forEach(embed => { + const embedBuffer: string[] = []; + + const parts = [ + embed.provider?.name ? `> ${embed.provider.name}` : null, + embed.author?.name ? `**${embed.author.name}**` : null, + embed.rawTitle ? `## ${embed.rawTitle}` : null, + embed.rawDescription ?? null, + ...(embed.fields?.map(f => (f.rawName && f.rawValue) ? `**${f.rawName}**: ${f.rawValue}` : null) ?? []), + embed.footer?.text ? `_${embed.footer.text}_` : null, + ]; + + parts.forEach(p => { + if (p) embedBuffer.push(p); + }); + + if (embedBuffer.length > 0) textParts.push(embedBuffer.join("\n")); + }); + + const combinedText = textParts.join("\n\n"); + + if (!settings.store.supportImages) { + return combinedText || null; + } + + const imageUrls = new Set(); + + message.attachments + .filter(att => att.content_type?.startsWith("image/")) + .forEach(att => imageUrls.add(att.url)); + + message.embeds.forEach(embed => { + const potentialUrls = [ + embed.image?.url, + embed.thumbnail?.url, + ...(embed.images?.map(img => img.url) ?? []) + ]; + + potentialUrls.forEach(url => { + if (url) imageUrls.add(url); + }); + }); + + if (imageUrls.size === 0) { + return combinedText || null; + } + + const payload: (TextPart | ImagePart)[] = []; + + if (combinedText.length > 0) { + payload.push({ + type: "text", + text: combinedText + }); + } + + imageUrls.forEach(url => { + payload.push({ + type: "image_url", + image_url: { url } + }); + }); + + return payload; +} + +export async function handleResponse(message: Message, response: string): Promise { + if (settings.store.autoRespond) { + sendMessage( + message.channel_id, + { content: response }, + true, + { messageReference: { channel_id: message.channel_id, message_id: message.id } } + ); + return response; + } else { + insertTextIntoChatInputBox(response); + return response; + } +} + +export async function getResponse(payload: ContentPayload): Promise { + if (!settings.store.apiKey) { + showToast("TriviaAI: API Key is not set.", Toasts.Type.FAILURE); + return ""; + } + + if (!settings.store.endpoint) { + showToast("TriviaAI: Endpoint is not set.", Toasts.Type.FAILURE); + return ""; + } + + if (!settings.store.model) { + showToast("TriviaAI: Model is not set.", Toasts.Type.FAILURE); + return ""; + } + + try { + const req = await fetch(settings.store.endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${settings.store.apiKey}` + }, + body: JSON.stringify({ + model: settings.store.model, + messages: [ + { + role: "system", + content: settings.store.systemPrompt + }, + { + role: "user", + content: payload + } + ], + max_tokens: settings.store.maxTokens, + }) + }); + + if (!req.ok) { + const errorBody = await req.text(); + const errorMessage = `API request failed with status ${req.status}: ${errorBody}`; + logger.error(errorMessage); + showToast(errorMessage, Toasts.Type.FAILURE); + return ""; + } + + const data = await req.json(); + + if (data.error) { + const errorMessage = data.error.message ?? "An unknown error occurred"; + logger.error(`API Error: ${errorMessage}`); + showToast(errorMessage, Toasts.Type.FAILURE); + return ""; + } + + const response = data.choices[0].message.content; + + if (!response?.trim()) { + logger.warn("no response from AI model"); + return ""; + } + + return response; + } catch (e) { + logger.error("Error getting response from AI model", e); + showToast("Error getting response from AI model", Toasts.Type.FAILURE); + return ""; + } +} diff --git a/src/equicordplugins/voiceButtons/index.tsx b/src/equicordplugins/voiceButtons/index.tsx index 91360e72f..a8b18c885 100644 --- a/src/equicordplugins/voiceButtons/index.tsx +++ b/src/equicordplugins/voiceButtons/index.tsx @@ -31,8 +31,12 @@ export default definePlugin({ ], renderButtons(user: User) { if (!user) return null; + const positionClass = settings.store.buttonPosition === "right" + ? "voice-user-buttons-right" + : "voice-user-buttons-left"; + return ( - + {settings.store.showChatButton && } {settings.store.showMuteButton && } {settings.store.showDeafenButton && } diff --git a/src/equicordplugins/voiceButtons/settings.ts b/src/equicordplugins/voiceButtons/settings.ts index fb0d4a435..e12cfe7cb 100644 --- a/src/equicordplugins/voiceButtons/settings.ts +++ b/src/equicordplugins/voiceButtons/settings.ts @@ -30,46 +30,47 @@ export const settings = definePluginSettings({ type: OptionType.BOOLEAN, default: true, description: "Toggles their soundboard upon clicking deafen button.", - restartNeeded: false, }, disableVideo: { type: OptionType.BOOLEAN, default: true, description: "Toggles their video upon clicking deafen button.", - restartNeeded: false, }, useServer: { type: OptionType.BOOLEAN, description: "Use server mute/deafen instead of local when you have permission.", default: false, - restartNeeded: false, }, serverSelf: { type: OptionType.BOOLEAN, description: "Deafen / Mute yourself on the server when using mute/deafen.", default: false, - restartNeeded: false, }, showButtonsSelf: { type: OptionType.SELECT, - default: "display", description: "Whether you want to display buttons for your own user. Same functionality as other button(s) except it'll open DMs panel and mute/deafen for yourself upon clicking button(s).", restartNeeded: true, options: [ - { label: "Display", value: "display" }, + { label: "Display", value: "display", default: true }, { label: "Hide", value: "hide" }, { label: "Disable", value: "disable" }, ], }, whichNameToShow: { type: OptionType.SELECT, - default: "both", description: "Choose whether to show nickname or username in tooltip.", - restartNeeded: false, options: [ + { label: "Both", value: "both", default: true }, { label: "Global Name", value: "global" }, - { label: "Default Username", value: "username" }, - { label: "Both", value: "both" }, + { label: "Username", value: "username" }, + ], + }, + buttonPosition: { + type: OptionType.SELECT, + description: "Choose where to place voice buttons in the voice user row.", + options: [ + { label: "Left", value: "left", default: true }, + { label: "Right", value: "right" }, ], } }, { diff --git a/src/equicordplugins/voiceButtons/styles.css b/src/equicordplugins/voiceButtons/styles.css index f6edc1113..56e1da52e 100644 --- a/src/equicordplugins/voiceButtons/styles.css +++ b/src/equicordplugins/voiceButtons/styles.css @@ -2,10 +2,19 @@ flex: none !important; } +.voice-user-buttons-left { + order: -1; +} + +.voice-user-buttons-right { + order: 1; + margin-left: 4px; +} + .voice-user-button-container { padding-right: 4px; } div[class*='list'][class*='collapsed'] .voice-user-buttons { display: none; -} \ No newline at end of file +} diff --git a/src/equicordplugins/voiceChatUtils/index.tsx b/src/equicordplugins/voiceChatUtils/index.tsx index dd66f1260..64baf1ba5 100644 --- a/src/equicordplugins/voiceChatUtils/index.tsx +++ b/src/equicordplugins/voiceChatUtils/index.tsx @@ -7,6 +7,7 @@ import { NavContextMenuPatchCallback } from "@api/ContextMenu"; import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; +import { insertTextIntoChatInputBox } from "@utils/discord"; import definePlugin, { makeRange, OptionType } from "@utils/types"; import type { Channel } from "@vencord/discord-types"; import { GuildChannelStore, Menu, React, RestAPI, UserStore, VoiceStateStore } from "@webpack/common"; @@ -48,6 +49,17 @@ function sendPatch(channel: Channel, body: Record, bypass = false) }); } +function mentionVoiceUsers(channel: Channel) { + const currentUserId = UserStore.getCurrentUser()?.id; + const mentions = Object.values(VoiceStateStore.getVoiceStatesForChannel(channel.id)) + .map(state => state.userId) + .filter((userId, index, arr) => userId && userId !== currentUserId && arr.indexOf(userId) === index) + .map(userId => `<@${userId}>`); + + if (mentions.length === 0) return; + insertTextIntoChatInputBox(`${mentions.join(" ")} `); +} + interface VoiceChannelContextProps { channel: Channel; } @@ -69,6 +81,13 @@ const VoiceChannelContext: NavContextMenuPatchCallback = (children, { channel }: key="voice-tools" id="voice-tools" > + mentionVoiceUsers(channel)} + /> + i.length > 0); - if (list.join(" ").length < 1) return true; - return list.includes(friendId); + const ignoreList = settings.store.ignoredFriends.split(",").join(" ").split(" ").filter(i => i.length > 0); + if (ignoreList.includes(friendId)) return false; + const allowList = settings.store.allowedFriends.split(",").join(" ").split(" ").filter(i => i.length > 0); + if (allowList.join(" ").length < 1) return true; + return allowList.includes(friendId); } // Blatantly stolen from VcNarrator plugin diff --git a/src/equicordplugins/waitForSlot/index.tsx b/src/equicordplugins/waitForSlot/index.tsx index f9a345249..fbcfd636e 100644 --- a/src/equicordplugins/waitForSlot/index.tsx +++ b/src/equicordplugins/waitForSlot/index.tsx @@ -12,7 +12,7 @@ import { Devs, EquicordDevs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; import type { Channel } from "@vencord/discord-types"; import { ChannelType } from "@vencord/discord-types/enums"; -import { ChannelActions, ChannelStore, Menu, VoiceStateStore } from "@webpack/common"; +import { ChannelActions, ChannelStore, Menu, PermissionsBits, PermissionStore, VoiceStateStore } from "@webpack/common"; let waitingChannelId: string | null = null; @@ -33,6 +33,7 @@ const settings = definePluginSettings({ const ChannelContext: NavContextMenuPatchCallback = (children, { channel }) => { if (channel?.type !== ChannelType.GUILD_VOICE || !channel.userLimit) return; + if (PermissionStore.can(PermissionsBits.MOVE_MEMBERS, channel)) return; if (Object.keys(VoiceStateStore.getVoiceStatesForChannel(channel.id)).length < channel.userLimit) return; const isWaiting = waitingChannelId === channel.id; @@ -48,6 +49,7 @@ const ChannelContext: NavContextMenuPatchCallback = (children, { channel }) => { function promptVoiceChannel(channel: Channel | null | undefined): boolean { if (!channel || channel.type !== ChannelType.GUILD_VOICE || !channel.userLimit) return false; + if (PermissionStore.can(PermissionsBits.MOVE_MEMBERS, channel)) return false; if (Object.keys(VoiceStateStore.getVoiceStatesForChannel(channel.id)).length < channel.userLimit) return false; if (waitingChannelId === channel.id) return true; diff --git a/src/main/ipcMain.ts b/src/main/ipcMain.ts index 8c6489680..5b5411479 100644 --- a/src/main/ipcMain.ts +++ b/src/main/ipcMain.ts @@ -22,7 +22,7 @@ import "./settings"; import { debounce } from "@shared/debounce"; import { IpcEvents } from "@shared/IpcEvents"; -import { BrowserWindow, ipcMain, nativeTheme, shell, systemPreferences } from "electron"; +import { app, BrowserWindow, dialog, ipcMain, nativeTheme, shell, systemPreferences } from "electron"; import monacoHtml from "file://monacoWin.html?minify&base64"; import { FSWatcher, mkdirSync, readFileSync, watch, writeFileSync } from "fs"; import { open, readdir, readFile, unlink } from "fs/promises"; @@ -139,16 +139,17 @@ ipcMain.on(IpcEvents.GET_MONACO_THEME, e => { e.returnValue = nativeTheme.shouldUseDarkColors ? "vs-dark" : "vs-light"; }); +let monacoWin: BrowserWindow | null = null; + ipcMain.handle(IpcEvents.OPEN_MONACO_EDITOR, async () => { - const title = "Equicord QuickCSS Editor"; - const existingWindow = BrowserWindow.getAllWindows().find(w => w.title === title); - if (existingWindow && !existingWindow.isDestroyed()) { - existingWindow.focus(); + if (monacoWin && !monacoWin.isDestroyed()) { + monacoWin.show(); + monacoWin.focus(); return; } - const win = new BrowserWindow({ - title, + monacoWin = new BrowserWindow({ + title: "Equicord QuickCSS Editor", autoHideMenuBar: true, darkTheme: true, webPreferences: { @@ -159,9 +160,28 @@ ipcMain.handle(IpcEvents.OPEN_MONACO_EDITOR, async () => { } }); - makeLinksOpenExternally(win); + monacoWin.once("closed", () => { monacoWin = null; }); - await win.loadURL(`data:text/html;base64,${monacoHtml}`); + makeLinksOpenExternally(monacoWin); + + await monacoWin.loadURL(`data:text/html;base64,${monacoHtml}`); +}); + +app.on("before-quit", async event => { + if (monacoWin && !monacoWin.isDestroyed() && !monacoWin.isVisible()) { + const result = await dialog.showMessageBox({ + type: "question", + buttons: ["Cancel", "Close Anyway"], + defaultId: 0, + title: "QuickCSS Editor Open", + message: "QuickCSS editor is still open in the background.", + detail: "Do you want to close Discord anyway? This will also close the QuickCSS editor." + }); + + if (result.response === 1) { + app.exit(); + } + } }); ipcMain.handle(IpcEvents.GET_RENDERER_CSS, () => readFile(RENDERER_CSS_PATH, "utf-8")); diff --git a/src/plugins/_api/badges/index.tsx b/src/plugins/_api/badges/index.tsx index 41955d33e..6125e7667 100644 --- a/src/plugins/_api/badges/index.tsx +++ b/src/plugins/_api/badges/index.tsx @@ -91,7 +91,7 @@ async function loadBadges(url: string, noCache = false) { async function loadAllBadges(noCache = false) { const vencordBadges = await loadBadges("https://badges.vencord.dev/badges.json", noCache); - const equicordBadges = await loadBadges("https://equicord.org/badges.json", noCache); + const equicordBadges = await loadBadges("https://badge.equicord.org/badges.json", noCache); DonorBadges = vencordBadges; EquicordDonorBadges = equicordBadges; diff --git a/src/plugins/_api/nicknameIcons.ts b/src/plugins/_api/nicknameIcons.ts index 48cc4b70d..47c7b8905 100644 --- a/src/plugins/_api/nicknameIcons.ts +++ b/src/plugins/_api/nicknameIcons.ts @@ -15,7 +15,7 @@ export default definePlugin({ { find: "#{intl::USER_PROFILE_PRONOUNS}", replacement: { - match: /(?<=isVerifiedBot\(\)}\).{0,60})children:(\i)/, + match: /(?<=shouldUnderlineOnHover:null.{0,150})children:(\i)/, replace: "children:[...Vencord.Api.NicknameIcons._renderIcons({userId:arguments[0].user?.id}),$1]" } } diff --git a/src/plugins/accountPanelServerProfile/index.tsx b/src/plugins/accountPanelServerProfile/index.tsx index 8d90ff5eb..2fc49e85c 100644 --- a/src/plugins/accountPanelServerProfile/index.tsx +++ b/src/plugins/accountPanelServerProfile/index.tsx @@ -75,7 +75,7 @@ export default definePlugin({ patches: [ { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", + find: ".WIDGETS_RTC_UPSELL_COACHMARK)", group: true, replacement: [ { @@ -87,7 +87,7 @@ export default definePlugin({ replace: "$&$self.onPopoutClose();" }, { - match: /(?:#{intl::5fWB8U::raw}|#{intl::SET_STATUS})\)(?<=ref:(\i),style:.+?)/, + match: /ref:(\i),style:\i(?=.{0,250}#{intl::USER_PROFILE_ACCOUNT_POPOUT_BUTTON_A11Y_LABEL})/, replace: "$&,onContextMenu:($self.grabRef($1),$self.openAccountPanelContextMenu)" } ] diff --git a/src/plugins/betterFolders/index.tsx b/src/plugins/betterFolders/index.tsx index 8b6f72e39..fa07d51a5 100644 --- a/src/plugins/betterFolders/index.tsx +++ b/src/plugins/betterFolders/index.tsx @@ -21,10 +21,10 @@ import "./style.css"; import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; import { getIntlMessage } from "@utils/discord"; -import { Logger } from "@utils/Logger"; import definePlugin, { OptionType } from "@utils/types"; -import { findByPropsLazy, findStoreLazy } from "@webpack"; -import { FluxDispatcher } from "@webpack/common"; +import type { GuildFolder } from "@vencord/discord-types"; +import { findByPropsLazy, findComponentByCodeLazy, findStoreLazy } from "@webpack"; +import { ChannelStore, FluxDispatcher, ReadStateStore } from "@webpack/common"; import { ReactNode } from "react"; import FolderSideBar from "./FolderSideBar"; @@ -35,15 +35,42 @@ enum FolderIconDisplay { MoreThanOneFolderExpanded } +type GuildTreeNode = { + id: string | number; + type?: string; + parentId?: string | number | null; + name?: string; + children?: GuildTreeNode[]; + isBetterFoldersNested?: boolean; + [key: string]: unknown; +}; + +type FolderRenderProps = { + isBetterFolders?: boolean; + folderNode?: GuildTreeNode; +}; + +type FolderDragItem = { + type?: string; + nodeId: string | number; +}; + +type FolderMentionProps = { + mentionCount?: number; + folderNode?: GuildTreeNode; +}; + export const ExpandedGuildFolderStore = findStoreLazy("ExpandedGuildFolderStore"); export const SortedGuildStore = findStoreLazy("SortedGuildStore"); const FolderUtils = findByPropsLazy("move", "toggleGuildFolderExpand"); +const FolderItem = findComponentByCodeLazy("FolderItem", "onExpandCollapse", "folderButtonSize"); +const MAX_TREE_FILTER_DEPTH = 1000; let lastGuildId = null as string | null; let dispatchingFoldersClose = false; function getGuildFolder(id: string) { - return SortedGuildStore.getGuildFolders().find(folder => folder.guildIds.includes(id)); + return SortedGuildStore.getGuildFolders().find((folder: GuildFolder) => folder.guildIds.includes(id)); } function closeFolders() { @@ -52,22 +79,31 @@ function closeFolders() { } // Nuckyz: Unsure if this should be a general utility or not -function filterTreeWithTargetNode(children: any, predicate: (node: any) => boolean) { +function filterTreeWithTargetNode(children: any, predicate: (node: any) => boolean, visited = new WeakSet(), depth = 0) { if (children == null) { return false; } + if (depth > MAX_TREE_FILTER_DEPTH) { + return false; + } + + if (typeof children === "object") { + if (visited.has(children)) return false; + visited.add(children); + } + if (!Array.isArray(children)) { if (predicate(children)) { return true; } - return filterTreeWithTargetNode(children.props?.children, predicate); + return filterTreeWithTargetNode(children.props?.children, predicate, visited, depth + 1); } let childIsTargetChild = false; for (let i = 0; i < children.length; i++) { - const shouldKeep = filterTreeWithTargetNode(children[i], predicate); + const shouldKeep = filterTreeWithTargetNode(children[i], predicate, visited, depth + 1); if (shouldKeep) { childIsTargetChild = true; continue; @@ -79,6 +115,75 @@ function filterTreeWithTargetNode(children: any, predicate: (node: any) => boole return childIsTargetChild; } +function getNestedFolderMap(): Record { + return settings.store.nestedFolders ?? {}; +} + +function saveNestedFolderMap(map: Record) { + settings.store.nestedFolders = map; +} + +export function getParentFolderId(childId: string | number): string | undefined { + return getNestedFolderMap()[childId.toString()]; +} + +export function getChildFolderIds(parentId: string | number): string[] { + const map = getNestedFolderMap(); + return Object.entries(map) + .filter(([, pid]) => pid === String(parentId)) + .map(([cid]) => cid); +} + +function getDescendantFolderIds(parentId: string | number): string[] { + const descendants: string[] = []; + const queue = [...getChildFolderIds(parentId)]; + + while (queue.length) { + const current = queue.shift(); + if (!current) continue; + descendants.push(current); + queue.push(...getChildFolderIds(current)); + } + + return descendants; +} + +function nestFolder(childId: string, parentId: string) { + if (childId === parentId) return; + if (hasParentInChain(parentId, childId)) return; + + const map = { ...getNestedFolderMap() }; + + delete map[childId]; + + map[childId] = parentId; + saveNestedFolderMap(map); +} + +function unnestFolder(childId: string) { + const map = { ...getNestedFolderMap() }; + if (map[childId] == null) return; + delete map[childId]; + saveNestedFolderMap(map); +} + +function hasParentInChain(childId: string, parentId: string): boolean { + const seen = new Set(); + let current = getParentFolderId(childId); + + while (current != null && !seen.has(current)) { + if (current === parentId) return true; + seen.add(current); + current = getParentFolderId(current); + } + + return false; +} + +function areNestedRelated(firstId: string, secondId: string): boolean { + return hasParentInChain(firstId, secondId) || hasParentInChain(secondId, firstId); +} + export const settings = definePluginSettings({ sidebar: { type: OptionType.BOOLEAN, @@ -132,8 +237,10 @@ export const settings = definePluginSettings({ { label: "When more than one folder is expanded", value: FolderIconDisplay.MoreThanOneFolderExpanded } ], restartNeeded: true - } -}); + }, +}).withPrivateSettings<{ + nestedFolders: Record; +}>(); const IS_BETTER_FOLDERS_VAR = "typeof isBetterFolders!=='undefined'?isBetterFolders:arguments[0]?.isBetterFolders"; const BETTER_FOLDERS_EXPANDED_IDS_VAR = "typeof betterFoldersExpandedIds!=='undefined'?betterFoldersExpandedIds:arguments[0]?.betterFoldersExpandedIds"; @@ -146,6 +253,9 @@ export default definePlugin({ isModified: true, settings, + start() { + settings.store.nestedFolders ??= {}; + }, patches: [ { @@ -190,6 +300,14 @@ export default definePlugin({ } ] }, + { + find: '("guildsnav")', + predicate: () => !settings.store.sidebar, + replacement: { + match: /switch\((\i)\.type\){case \i\.\i\.FOLDER:.{0,800}?case \i\.\i\.GUILD:.{0,800}?default:return null}/, + replace: "return $self.wrapGuildNodeComponent($1,()=>{$&},false,void 0);" + } + }, { // This is the parent folder component find: ".toggleGuildFolderExpand(", @@ -248,6 +366,23 @@ export default definePlugin({ } ] }, + { + find: ".FOLDER_ITEM_ANIMATION_DURATION),", + replacement: [ + { + match: /mentionCount:(\i),isMentionLowImportance:(\i)/, + replace: "mentionCount:$self.getFolderMentionCountWithNested(arguments[0]),isMentionLowImportance:$self.getFolderIsMentionLowImportanceWithNested(arguments[0],$2)" + }, + { + match: /(\{id:\i,name:\i,children:\i\})=(\i),/, + replace: "$1=$self.getFolderNodeForRender($2)," + }, + { + match: /(?<=gap:"xs",className:)(\i\.\i)/, + replace: "$self.getFolderGuildsListClassName(arguments[0],$1)" + } + ] + }, { find: "APPLICATION_LIBRARY,render:", predicate: () => settings.store.sidebar, @@ -263,7 +398,7 @@ export default definePlugin({ replace: (m, conditions, props) => `${m},${conditions}$self.FolderSideBar(${props})` }, { - // Add grid styles to fix aligment with other visual refresh elements + // Add grid styles to fix alignment with other visual refresh elements match: /(?<=className:)\i\.\i(?=,"data-fullscreen")/, replace: `"${GRID_STYLE_NAME} "+$&` } @@ -277,6 +412,35 @@ export default definePlugin({ match: /(?<=onClick:\(\)=>{)(?=.{0,300}"discodo")/, replace: "$self.closeFolders();" } + }, + { + find: "[GuildDropTarget]", + all: true, + replacement: [ + { + match: /(\i)=!(\i)&&null==(\i)\.parentId/, + replace: "$1=$self.shouldShowCombineTarget($2,$3)" + }, + { + match: /canDrop:\i=>\i\.nodeId.{0,100}==\i\.parentId\)/, + replace: "canDrop:e=>$self.canDropOnFolder(e,arguments[1],arguments[3])" + }, + { + match: /drop\(\i\)\{(?=.{0,25}!==\i\.\i\.FOLDER)/, + replace: "$&if($self.handleFolderDrop(arguments[0],arguments[1],arguments[2],arguments[3]))return;" + }, + { + match: /\[\i\.\i\.GUILD\](?=.{0,250}#{intl::DND_DROP_COMBINE})/, + replace: "[...$self.getFolderAcceptTypes(arguments[0]?.targetNode)]" + } + ] + }, + { + find: ".hasFetchedRequestToJoinGuilds)", + replacement: { + match: /return \i\.type!==\i\.\i\.GUILD/, + replace: "return $self.renderFolderChild(arguments[0],arguments[1],arguments[2])" + } } ], @@ -308,10 +472,14 @@ export default definePlugin({ FluxDispatcher.wait(() => { const expandedFolders = ExpandedGuildFolderStore.getExpandedFolders(); + const expandedId = data.folderId?.toString(); if (expandedFolders.size > 1) { - for (const id of expandedFolders) if (id !== data.folderId) + for (const id of expandedFolders) { + const folderId = id?.toString(); + if (folderId === expandedId || areNestedRelated(folderId, expandedId)) continue; FolderUtils.toggleGuildFolderExpand(id); + } } dispatchingFoldersClose = false; @@ -326,12 +494,219 @@ export default definePlugin({ FolderSideBar, closeFolders, + getGuildMentionCount(guildId: string): number { + const mentionChannelIds = ReadStateStore.getMentionChannelIds() ?? []; + let count = 0; + + for (const channelId of mentionChannelIds) { + const channel = ChannelStore.getChannel(channelId); + if (channel?.guild_id !== guildId) continue; + count += ReadStateStore.getMentionCount(channelId); + } + + return count; + }, + getFolderMentionMetaWithNested(props: FolderMentionProps | undefined): { mentionCount: number, hasNestedMention: boolean; } { + const folderNode = props?.folderNode; + const baseMentionCount = props?.mentionCount ?? 0; + if (folderNode?.id == null) { + return { + mentionCount: baseMentionCount, + hasNestedMention: false + }; + } + + const descendantIds = getDescendantFolderIds(folderNode.id); + if (descendantIds.length === 0) { + return { + mentionCount: baseMentionCount, + hasNestedMention: false + }; + } + + const tree = SortedGuildStore.getGuildsTree(); + if (typeof tree?.getNode !== "function") { + return { + mentionCount: baseMentionCount, + hasNestedMention: false + }; + } + + const nestedGuildIds = new Set(); + for (const childFolderId of descendantIds) { + const stack = [...(tree.getNode(childFolderId)?.children ?? [])]; + while (stack.length) { + const node = stack.pop(); + if (!node) continue; + if (node.type === "guild") { + nestedGuildIds.add(node.id?.toString()); + continue; + } + if (node.type === "folder" && Array.isArray(node.children)) { + stack.push(...node.children); + } + } + } + + if (nestedGuildIds.size === 0) { + return { + mentionCount: baseMentionCount, + hasNestedMention: false + }; + } + + let nestedMentionCount = 0; + for (const guildId of nestedGuildIds) nestedMentionCount += this.getGuildMentionCount(guildId); + return { + mentionCount: baseMentionCount + nestedMentionCount, + hasNestedMention: nestedMentionCount > 0 + }; + }, + getFolderMentionCountWithNested(props: FolderMentionProps | undefined): number { + return this.getFolderMentionMetaWithNested(props).mentionCount; + }, + getFolderIsMentionLowImportanceWithNested(props: FolderMentionProps | undefined, originalFlag: boolean): boolean { + return this.getFolderMentionMetaWithNested(props).hasNestedMention ? false : originalFlag; + }, + augmentFolderChildren(folderNode: GuildTreeNode, originalChildren: GuildTreeNode[]): GuildTreeNode[] { + const childIds = getChildFolderIds(folderNode.id); + if (childIds.length === 0) return originalChildren; + + try { + const tree = SortedGuildStore.getGuildsTree(); + if (typeof tree?.getNode !== "function") { + return originalChildren; + } + const existingIds = new Set(originalChildren.map(child => child?.id?.toString())); + const childFolderNodes: GuildTreeNode[] = []; + + for (const id of childIds) { + if (existingIds.has(id?.toString())) continue; + const node = tree.getNode(id); + if (node) { + childFolderNodes.push({ + ...node, + parentId: folderNode.id, + isBetterFoldersNested: true + }); + } + } + + if (childFolderNodes.length === 0) return originalChildren; + + return [...childFolderNodes, ...originalChildren]; + } catch { + return originalChildren; + } + }, + + getFolderNodeForRender(folderNode: GuildTreeNode): GuildTreeNode { + const children = this.augmentFolderChildren(folderNode, folderNode.children ?? []); + if (children === folderNode.children) return folderNode; + return { + ...folderNode, + children + }; + }, + + getFolderGuildsListClassName( + props: FolderRenderProps | undefined, + baseClassName: string + ): string { + if (props?.isBetterFolders) return baseClassName; + + const folderNode = props?.folderNode; + if (folderNode == null) return baseClassName; + + const children = this.getFolderNodeForRender(folderNode)?.children; + if (!Array.isArray(children)) return baseClassName; + + return children.some(child => child?.type === "folder") + ? `${baseClassName} vc-betterFolders-nested-parent-list` + : baseClassName; + }, + + renderFolderChild(node: GuildTreeNode, posInSet: number, setSize: number): ReactNode | null { + if (node?.type !== "folder") return null; + + try { + if (!FolderItem) return null; + return ( + + ); + } catch { + return null; + } + }, + + handleFolderDrop(dragItem: FolderDragItem, targetNode: GuildTreeNode, _moveToBelow: boolean, isCombine: boolean): boolean { + if (dragItem.type !== "folder") return false; + + if (!isCombine) { + unnestFolder(dragItem.nodeId?.toString()); + return false; + } + + if (targetNode.type !== "folder") return false; + + const childId = dragItem.nodeId?.toString(); + const parentId = targetNode.id?.toString(); + + try { + nestFolder(childId, parentId); + FluxDispatcher.dispatch({ type: "BETTER_FOLDERS_NESTED_UPDATE" }); + return true; + } catch { + return false; + } + }, + + shouldShowCombineTarget(noCombine: boolean, targetNode: GuildTreeNode): boolean { + if (noCombine) return false; + return targetNode.parentId == null || targetNode.type === "folder"; + }, + + getFolderAcceptTypes(targetNode: GuildTreeNode): string[] { + const GUILD = "guild"; + const FOLDER = "folder"; + if (targetNode?.type === FOLDER) return [GUILD, FOLDER]; + return [GUILD]; + }, + + canDropOnFolder(dragItem: FolderDragItem, targetNode: GuildTreeNode, isCombine: boolean): boolean { + if (dragItem.nodeId === targetNode.id) return false; + + if (dragItem.type === "folder" && targetNode.type === "folder") { + if (isCombine) return !hasParentInChain(targetNode.id?.toString(), dragItem.nodeId?.toString()); + return targetNode.parentId == null; + } + + if (isCombine && dragItem.type === "folder") return false; + if (dragItem.type === "folder" && targetNode.parentId != null) return false; + + return true; + }, + + wrapGuildNodeComponent(node: GuildTreeNode, originalComponent: () => ReactNode, isBetterFolders: boolean, expandedFolderIds?: Set) { + if (node.type === "folder") { + const mappedParentId = getParentFolderId(node.id); + if (mappedParentId != null && (node.parentId?.toString() !== mappedParentId || node.isBetterFoldersNested !== true)) { + return ( +
+ {originalComponent()} +
+ ); + } + } - wrapGuildNodeComponent(node: any, originalComponent: () => ReactNode, isBetterFolders: boolean, expandedFolderIds?: Set) { if ( !isBetterFolders || node.type === "folder" && expandedFolderIds?.has(node.id) || - node.type === "guild" && expandedFolderIds?.has(node.parentId) + node.type === "guild" && node.parentId != null && expandedFolderIds?.has(node.parentId) ) { return originalComponent(); } @@ -353,12 +728,10 @@ export default definePlugin({ // can cause hang if intl message is not found const serversIntlMsg = getIntlMessage("SERVERS"); if (!serversIntlMsg) { - new Logger("BetterFolders").error("Failed to get SERVERS intl message"); return true; } return child?.props?.["aria-label"] === serversIntlMsg; - } catch (e) { - console.error(e); + } catch { return true; } }; @@ -372,14 +745,13 @@ export default definePlugin({ try { return filterTreeWithTargetNode(child, child => child?.props?.renderTreeNode != null); - } catch (e) { - console.error(e); + } catch { return true; } }; }, - shouldShowFolderIconAndBackground(isBetterFolders: boolean, expandedFolderIds?: Set) { + shouldShowFolderIconAndBackground(isBetterFolders: boolean, expandedFolderIds?: Set) { if (!isBetterFolders) { return true; } diff --git a/src/plugins/betterFolders/style.css b/src/plugins/betterFolders/style.css index a0a049669..584e4bf89 100644 --- a/src/plugins/betterFolders/style.css +++ b/src/plugins/betterFolders/style.css @@ -2,6 +2,11 @@ grid-area: betterFoldersSidebar } +.vc-betterFolders-nested-parent-list { + height: auto !important; + padding-bottom: 6px !important; +} + /* These area names need to be hardcoded. Only betterFoldersSidebar is added by the plugin. */ .vc-betterFolders-sidebar-grid { /* stylelint-disable-next-line value-keyword-case */ @@ -10,4 +15,4 @@ "titleBar titleBar titleBar titleBar" "guildsList betterFoldersSidebar notice notice" "guildsList betterFoldersSidebar channelsList page"; -} \ No newline at end of file +} diff --git a/src/plugins/betterSettings/index.tsx b/src/plugins/betterSettings/index.tsx index 1c8e8a76b..7b0b3517e 100644 --- a/src/plugins/betterSettings/index.tsx +++ b/src/plugins/betterSettings/index.tsx @@ -7,6 +7,7 @@ import { definePluginSettings } from "@api/Settings"; import { disableStyle, enableStyle } from "@api/Styles"; import { buildPluginMenuEntries, buildThemeMenuEntries } from "@equicordplugins/equicordToolbox/menu"; +import SettingsPlugin from "@plugins/_core/settings"; import { Devs } from "@utils/constants"; import { classNameFactory } from "@utils/css"; import { Logger } from "@utils/Logger"; @@ -17,7 +18,17 @@ import type { HTMLAttributes, ReactElement } from "react"; import fullHeightStyle from "./fullHeightContext.css?managed"; -type SettingsEntry = { section: string, label: string; }; +type SettingsEntry = { + ariaLabel?: string; + element?: any; + label?: string; + newIndicator?: any; + newIndicatorDismissibleContentTypes?: number[]; + predicate?: () => boolean; + searchableTitles?: string[]; + section: string, + tabPredicate?: () => boolean; +}; const cl = classNameFactory(""); const Classes = findCssClassesLazy("animating", "baseLayer", "bg", "layer", "layers"); @@ -126,26 +137,46 @@ export default definePlugin({ ], predicate: () => settings.store.disableFade }, + { // Disable fade animations for settings menu + find: '"data-mana-component":"layer-modal"', + replacement: [ + { + match: /(\i)\.animated\.div(?=,\{"data-mana-component":"layer-modal")/, + replace: '"div"' + }, + { + match: /(?<="data-mana-component":"layer-modal"[^}]*?)style:\i,/, + replace: "style:{}," + } + ], + predicate: () => settings.store.disableFade + }, + { // Disable initial and exit delay for settings menu + find: "headerId:void 0,headerIdIsManaged:!1", + replacement: { + match: /let (\i)=300/, + replace: "let $1=0" + }, + predicate: () => settings.store.disableFade + }, { // Load menu TOC eagerly - find: "#{intl::USER_SETTINGS_WITH_BUILD_OVERRIDE}", + find: "handleOpenSettingsContextMenu=", replacement: { match: /(?=handleOpenSettingsContextMenu=.{0,100}?null!=\i&&.{0,100}?(await [^};]*?\)\)))/, replace: "_vencordBetterSettingsEagerLoad=(async ()=>$1)();" }, predicate: () => settings.store.eagerLoad }, - { - // Settings cog context menu + { // Settings cog context menu find: "#{intl::USER_SETTINGS_ACTIONS_MENU_LABEL}", replacement: [ { match: /=\[\];(\i)(?=\.forEach.{0,200}?"logout"===\i.{0,100}?(\i)\.get\(\i\))/, replace: "=$self.wrapMap([]);$self.transformSettingsEntries($1,$2)", - predicate: () => settings.store.organizeMenu }, { match: /case \i\.\i\.DEVELOPER_OPTIONS:return \i;/, - replace: "$&case 'EquicordPlugins':return $self.buildPluginMenuEntries(true);$&case 'EquicordThemes':return $self.buildThemeMenuEntries();" + replace: "$&case 'EquicordPlugins':return $self.buildPluginMenuEntries(true);case 'EquicordThemes':return $self.buildThemeMenuEntries();" } ] }, @@ -170,21 +201,49 @@ export default definePlugin({ }, transformSettingsEntries(list: SettingsEntry[], keyMap: Map) { - const items = [] as TransformedSettingsEntry[]; + const items: any[] = []; + const equicordItems: SettingsEntry[] = [ + { section: "EquicordSettings", label: "Settings" }, + { section: "EquicordPlugins", label: "Plugins" }, + { section: "EquicordThemes", label: "Themes" }, + { section: "EquicordUpdater", label: "Updater" }, + { section: "EquicordChangelog", label: "Changelog" }, + { section: "EquicordCloud", label: "Cloud" }, + { section: "EquicordBackupAndRestore", label: "Backup & Restore" }, + { section: "EquicordPatchHelper", label: "Patch Helper" }, + ]; - for (const item of list) { - if (item.section === "HEADER") { - keyMap.set(item.label, item.label); - items.push({ section: item.label, items: [] }); - } else if (item.section !== "DIVIDER" && keyMap.has(item.section)) { - items.at(-1)?.items.push(item); + for (const [section, key] of SettingsPlugin.settingsSectionMap) { + const entry = SettingsPlugin.customEntries.find(e => key.endsWith(e.key)); + if (entry) equicordItems.push({ section, label: entry.title }); + } + + if (settings.store.organizeMenu) { + for (const item of list) { + if (!item.label || item.predicate != null && !item.predicate()) continue; + + if (item.section === "HEADER") { + keyMap.set(item.label, item.label); + items.push({ section: item.label, items: [] }); + } else if (item.section !== "DIVIDER" && keyMap.has(item.section)) { + items.at(-1)?.items.push(item); + } } + + keyMap.set("Equicord", "Equicord"); + items.push({ + section: "Equicord", + items: equicordItems + }); + } else { + items.push(...list, ...equicordItems); } return items; }, wrapMap(toWrap: TransformedSettingsEntry[]) { + if (!settings.store.organizeMenu) return toWrap; // @ts-expect-error toWrap.map = function (render: (item: SettingsEntry) => ReactElement) { return this diff --git a/src/plugins/decor/index.tsx b/src/plugins/decor/index.tsx index 605d3055d..64a16e6bb 100644 --- a/src/plugins/decor/index.tsx +++ b/src/plugins/decor/index.tsx @@ -87,7 +87,7 @@ export default definePlugin({ }, // Current user area, at bottom of channels/dm list { - find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}", + find: ".WIDGETS_RTC_UPSELL_COACHMARK),", replacement: [ // Use Decor avatar decoration hook { @@ -99,7 +99,7 @@ export default definePlugin({ ...[ '"Message Username"', // Messages "#{intl::COLLECTIBLES_NAMEPLATE_PREVIEW_A11Y}", // Nameplate preview - "#{intl::ayozFl::raw}", // Avatar preview + "#{intl::COLLECTIBLES_PROFILE_PREVIEW_A11Y}", // Avatar preview ].map(find => ({ find, replacement: { diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx index 5c865d6b5..2ebb81f2d 100644 --- a/src/plugins/experiments/index.tsx +++ b/src/plugins/experiments/index.tsx @@ -91,7 +91,7 @@ export default definePlugin({ { find: "useCanFavoriteChannel", replacement: { - match: /(?<=\i\.id\)\),\i=)\i\.isThread\(\)/, + match: /(?<=isFavorite\(\i\.id\).{0,5})\i\.isThread\(\)/, replace: "false", } }, diff --git a/src/plugins/messageClickActions/ReactEmojiSetting.tsx b/src/plugins/messageClickActions/ReactEmojiSetting.tsx new file mode 100644 index 000000000..44f78ede7 --- /dev/null +++ b/src/plugins/messageClickActions/ReactEmojiSetting.tsx @@ -0,0 +1,170 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import "./styles.css"; + +import { Heading } from "@components/Heading"; +import type { IPluginOptionComponentProps } from "@utils/types"; +import { findComponentByCodeLazy } from "@webpack"; +import { TextInput, useState } from "@webpack/common"; + +import { settings } from "."; + +type EmojiData = { + id?: string | null; + name: string; +}; + +type EmojiSelectPayload = { + id: string | null; + name: string; + animated?: boolean; +}; + +const StatusEmojiPicker = findComponentByCodeLazy("setCustomStatusEmoji", "setIsEmojiPickerOpen", "selectedDefaultStatus"); +export const MAX_ADDITIONAL_REACT_EMOJIS = 8; + +function getEmojiValue(emoji: EmojiData) { + return emoji.id ? `${emoji.name}:${emoji.id}` : emoji.name; +} + +function parseEmojiValue(value: string): EmojiSelectPayload | null { + const trimmed = value.trim(); + if (!trimmed) return null; + + const customEmoji = trimmed.match(/^:?([\w-]+):(\d+)$/); + if (customEmoji) { + return { + id: customEmoji[2], + name: customEmoji[1], + animated: false + }; + } + + return { + id: null, + name: trimmed, + animated: false + }; +} + +function parseEmojiList(value: string) { + return Array.from(new Set( + value + .split(/[\n,]/g) + .map(entry => entry.trim()) + .filter(Boolean) + )).slice(0, MAX_ADDITIONAL_REACT_EMOJIS); +} + +export function ReactEmojiSetting({ setValue }: IPluginOptionComponentProps) { + const [emoji, setEmoji] = useState(settings.store.reactEmoji ?? "💀"); + const [isEmojiPickerOpen, setIsEmojiPickerOpen] = useState(false); + + return ( +
+ Select Emoji For Reactions +
event.stopPropagation()} + onMouseDown={event => event.stopPropagation()} + > + { + if (!selectedEmoji) { + setEmoji(""); + setValue(""); + setIsEmojiPickerOpen(false); + return; + } + + const value = getEmojiValue(selectedEmoji); + setEmoji(value); + setValue(value); + setIsEmojiPickerOpen(false); + }} + selectedDefaultStatus={isEmojiPickerOpen ? null : "online"} + setIsEmojiPickerOpen={setIsEmojiPickerOpen} + defaultStatusVariant="small" + /> +
+
+ ); +} + +export function AdditionalReactEmojisSetting({ setValue }: IPluginOptionComponentProps) { + const { addAdditionalReacts } = settings.use(["addAdditionalReacts"]); + const [emojiList, setEmojiList] = useState(settings.store.additionalReactEmojis ?? ""); + const [isEmojiPickerOpen, setIsEmojiPickerOpen] = useState(false); + const [pickerEmoji, setPickerEmoji] = useState(parseEmojiValue("😀")); + + if (!addAdditionalReacts) return null; + + return ( +
+ Select Additional Emojis +
+ { + setEmojiList(newValue); + setValue(newValue); + const [first] = parseEmojiList(newValue); + setPickerEmoji(parseEmojiValue(first ?? "😀")); + }} + onClick={event => event.stopPropagation()} + onMouseDown={event => event.stopPropagation()} + style={{ + flex: 1 + }} + /> +
event.stopPropagation()} + onMouseDown={event => event.stopPropagation()} + style={{ + display: "inline-flex", + transform: "scale(1.2)", + transformOrigin: "center" + }} + > + { + if (!selectedEmoji) { + setIsEmojiPickerOpen(false); + return; + } + + const value = getEmojiValue(selectedEmoji); + const parsed = parseEmojiList(emojiList); + const merged = parsed.includes(value) + ? parsed + : [...parsed, value].slice(0, MAX_ADDITIONAL_REACT_EMOJIS); + const nextValue = merged.join(", "); + setEmojiList(nextValue); + setValue(nextValue); + setPickerEmoji(selectedEmoji); + setIsEmojiPickerOpen(false); + }} + selectedDefaultStatus={isEmojiPickerOpen ? null : "online"} + setIsEmojiPickerOpen={setIsEmojiPickerOpen} + defaultStatusVariant="small" + /> +
+
+
+ ); +} diff --git a/src/plugins/messageClickActions/index.ts b/src/plugins/messageClickActions/index.ts index 766367bca..4f7968494 100644 --- a/src/plugins/messageClickActions/index.ts +++ b/src/plugins/messageClickActions/index.ts @@ -15,9 +15,14 @@ import type { Channel, Message } from "@vencord/discord-types"; import { ApplicationIntegrationType, MessageFlags } from "@vencord/discord-types/enums"; import { AuthenticationStore, Constants, EditMessageStore, FluxDispatcher, MessageActions, MessageTypeSets, PermissionsBits, PermissionStore, PinActions, RestAPI, Toasts, WindowStore } from "@webpack/common"; +import { AdditionalReactEmojisSetting, MAX_ADDITIONAL_REACT_EMOJIS, ReactEmojiSetting } from "./ReactEmojiSetting"; + type Modifier = "NONE" | "SHIFT" | "CTRL" | "ALT" | "BACKSPACE" | "DELETE"; type ClickAction = "NONE" | "DELETE" | "COPY_LINK" | "COPY_ID" | "COPY_CONTENT" | "COPY_USER_ID" | "EDIT" | "REPLY" | "REACT" | "OPEN_THREAD" | "OPEN_TAB" | "EDIT_REPLY" | "QUOTE" | "PIN"; +const logger = new Logger("MessageClickActions"); +const ADDITIONAL_REACTION_DELAY_MS = 300; // discord seems to rate limit this for 300ms but that might not be constant + const actions: { label: string; value: ClickAction; }[] = [ { label: "None", value: "NONE" }, { label: "Delete", value: "DELETE" }, @@ -130,12 +135,7 @@ let mouseDownCount = 0; let doubleClickDetected = false; let secondMouseDownTime = 0; -const settings = definePluginSettings({ - reactEmoji: { - type: OptionType.STRING, - description: "Emoji to use for react actions", - default: "💀" - }, +export const settings = definePluginSettings({ singleClickAction: { type: OptionType.SELECT, description: "Action on single click (your messages)", @@ -190,6 +190,26 @@ const settings = definePluginSettings({ options: modifiers, default: "NONE" }, + reactEmoji: { + type: OptionType.COMPONENT, + description: "Emoji to use for react actions.", + component: ReactEmojiSetting, + default: "💀" + }, + addAdditionalReacts: { + type: OptionType.BOOLEAN, + description: "Also add additional configured reaction emojis", + default: false + }, + additionalReactEmojis: { + type: OptionType.COMPONENT, + description: `Additional emojis to add when using React action (comma/newline separated, max ${MAX_ADDITIONAL_REACT_EMOJIS})`, + component: AdditionalReactEmojisSetting, + get hidden() { + return !settings.store.addAdditionalReacts; + }, + default: "" + }, disableInDms: { type: OptionType.BOOLEAN, description: "Disable all click actions in direct messages", @@ -215,7 +235,7 @@ const settings = definePluginSettings({ deferDoubleClickForTriple: { type: OptionType.BOOLEAN, description: "Delay double-click to allow triple-click actions (disables triple-click when off)", - default: true + default: false }, selectionHoldTimeout: { type: OptionType.NUMBER, @@ -246,6 +266,51 @@ function showWarning(message: string) { }); } +function clearClickTimeouts() { + if (doubleClickTimeout) { + clearTimeout(doubleClickTimeout); + doubleClickTimeout = null; + } + if (singleClickTimeout) { + clearTimeout(singleClickTimeout); + singleClickTimeout = null; + } +} + +function resetClickState() { + mouseDownCount = 0; + doubleClickDetected = false; + secondMouseDownTime = 0; +} + +function normalizeEmoji(emoji: string): string | null { + const trimmed = emoji.trim(); + if (!trimmed) return null; + + const customMatch = trimmed.match(/^:?([\w-]+):(\d+)$/); + if (customMatch) { + return `${customMatch[1]}:${customMatch[2]}`; + } + + return trimmed; +} + +function getConfiguredReactionEmojis() { + const baseEmoji = normalizeEmoji(settings.store.reactEmoji); + const configured = [baseEmoji]; + + if (settings.store.addAdditionalReacts) { + const extra = settings.store.additionalReactEmojis + .split(/[\n,]/g) + .map(normalizeEmoji) + .filter((emoji): emoji is string => Boolean(emoji)) + .slice(0, MAX_ADDITIONAL_REACT_EMOJIS); + configured.push(...extra); + } + + return Array.from(new Set(configured.filter((emoji): emoji is string => Boolean(emoji)))); +} + const canSend = (channel: Channel) => !channel.guild_id || PermissionStore.can(PermissionsBits.SEND_MESSAGES, channel); @@ -260,19 +325,14 @@ const canReply = (msg: Message) => MessageTypeSets.REPLYABLE.has(msg.type) && !msg.hasFlag(MessageFlags.EPHEMERAL); async function toggleReaction(channelId: string, messageId: string, emoji: string, channel: Channel, msg: Message) { - const trimmed = emoji.trim(); - if (!trimmed) return; + const emojiParam = normalizeEmoji(emoji); + if (!emojiParam) return; if (channel.guild_id && (!PermissionStore.can(PermissionsBits.ADD_REACTIONS, channel) || !PermissionStore.can(PermissionsBits.READ_MESSAGE_HISTORY, channel))) { showWarning("Cannot react: Missing permissions"); return; } - const customMatch = trimmed.match(/^:?([\w-]+):(\d+)$/); - const emojiParam = customMatch - ? `${customMatch[1]}:${customMatch[2]}` - : trimmed; - const hasReacted = msg.reactions?.some(r => { const reactionEmoji = r.emoji.id ? `${r.emoji.name}:${r.emoji.id}` @@ -291,12 +351,47 @@ async function toggleReaction(channelId: string, messageId: string, emoji: strin }); } } catch (e) { - new Logger("MessageClickActions").error("Failed to toggle reaction:", e); + logger.error("Failed to toggle reaction:", e); } } +async function addReaction(channelId: string, messageId: string, emoji: string, channel: Channel) { + const emojiParam = normalizeEmoji(emoji); + if (!emojiParam) return; + + if (channel.guild_id && (!PermissionStore.can(PermissionsBits.ADD_REACTIONS, channel) || !PermissionStore.can(PermissionsBits.READ_MESSAGE_HISTORY, channel))) { + showWarning("Cannot react: Missing permissions"); + return; + } + + try { + await RestAPI.put({ + url: Constants.Endpoints.REACTION(channelId, messageId, emojiParam, "@me") + }); + } catch (e) { + logger.error("Failed to add reaction:", e); + } +} + +async function reactWithConfiguredEmojis(channel: Channel, msg: Message) { + const [primaryEmoji, ...additionalEmojis] = getConfiguredReactionEmojis(); + if (!primaryEmoji) return; + + await toggleReaction(channel.id, msg.id, primaryEmoji, channel, msg); + + for (const emoji of additionalEmojis) { + await new Promise(resolve => setTimeout(resolve, ADDITIONAL_REACTION_DELAY_MS)); + await addReaction(channel.id, msg.id, emoji, channel); + } +} + +function getMessageLink(msg: Message, channel: Channel) { + const guildId = channel.guild_id ?? "@me"; + return `${window.location.origin}/channels/${guildId}/${channel.id}/${msg.id}`; +} + function copyLink(msg: Message, channel: Channel) { - copyWithToast(`https://discord.com/channels/${channel.guild_id ?? "@me"}/${channel.id}/${msg.id}`, "Link copied!"); + copyWithToast(getMessageLink(msg, channel), "Link copied!"); } function togglePin(channel: Channel, msg: Message) { @@ -343,9 +438,7 @@ function quoteMessage(channel: Channel, msg: Message) { } function openInNewTab(msg: Message, channel: Channel) { - const guildId = channel.guild_id ?? "@me"; - const link = `https://discord.com/channels/${guildId}/${channel.id}/${msg.id}`; - VencordNative.native.openExternal(link); + VencordNative.native.openExternal(getMessageLink(msg, channel)); } function openInThread(msg: Message, channel: Channel) { @@ -462,7 +555,7 @@ async function executeAction( break; case "REACT": - await toggleReaction(channel.id, msg.id, settings.store.reactEmoji, channel, msg); + await reactWithConfiguredEmojis(channel, msg); event.preventDefault(); break; @@ -484,7 +577,7 @@ async function executeAction( export default definePlugin({ name: "MessageClickActions", description: "Customize click actions on messages.", - authors: [Devs.Ven, EquicordDevs.keircn, EquicordDevs.ZcraftElite], + authors: [Devs.Ven, EquicordDevs.keircn, EquicordDevs.ZcraftElite, EquicordDevs.omaw], isModified: true, settings, @@ -502,18 +595,9 @@ export default definePlugin({ document.removeEventListener("mousedown", onMouseDown); WindowStore.removeChangeListener(focusChanged); - if (doubleClickTimeout) { - clearTimeout(doubleClickTimeout); - doubleClickTimeout = null; - } - if (singleClickTimeout) { - clearTimeout(singleClickTimeout); - singleClickTimeout = null; - } + clearClickTimeouts(); pendingDoubleClickAction = null; - mouseDownCount = 0; - doubleClickDetected = false; - secondMouseDownTime = 0; + resetClickState(); }, onMessageClick(msg, channel, event) { @@ -547,9 +631,7 @@ export default definePlugin({ if (Date.now() - lastMouseDownTime > settings.store.selectionHoldTimeout) { pressedModifiers.clear(); - mouseDownCount = 0; - doubleClickDetected = false; - secondMouseDownTime = 0; + resetClickState(); return; } @@ -560,9 +642,7 @@ export default definePlugin({ if (isTripleClick) { if (!settings.store.deferDoubleClickForTriple) { - mouseDownCount = 0; - doubleClickDetected = false; - secondMouseDownTime = 0; + resetClickState(); return; } if (doubleClickTimeout) { @@ -576,9 +656,7 @@ export default definePlugin({ pressedModifiers.clear(); } doubleClickFired = false; - mouseDownCount = 0; - doubleClickDetected = false; - secondMouseDownTime = 0; + resetClickState(); return; } @@ -628,9 +706,7 @@ export default definePlugin({ event.preventDefault(); } - mouseDownCount = 0; - doubleClickDetected = false; - secondMouseDownTime = 0; + resetClickState(); return; } @@ -642,9 +718,7 @@ export default definePlugin({ executeAction(singleClickAction, msg, channel, event); pressedModifiers.clear(); } - mouseDownCount = 0; - doubleClickDetected = false; - secondMouseDownTime = 0; + resetClickState(); }; const canDoubleClickWithCurrentModifier = diff --git a/src/plugins/messageClickActions/styles.css b/src/plugins/messageClickActions/styles.css new file mode 100644 index 000000000..dc8358c3f --- /dev/null +++ b/src/plugins/messageClickActions/styles.css @@ -0,0 +1,7 @@ +.vc-message-click-actions-primary-emoji-picker { + margin-top: 8px; + margin-left: 6px; + display: inline-flex; + transform: scale(1.3); + transform-origin: top left; +} diff --git a/src/plugins/showHiddenChannels/index.tsx b/src/plugins/showHiddenChannels/index.tsx index eb5409e87..85b9b3ddf 100644 --- a/src/plugins/showHiddenChannels/index.tsx +++ b/src/plugins/showHiddenChannels/index.tsx @@ -461,11 +461,11 @@ export default definePlugin({ }, }, { - find: 'className:"channelMention",children:', + find: 'getConfig({location:"channel_mention"})', replacement: { // Show inside voice channel instead of trying to join them when clicking on a channel mention - match: /(?<=getChannel\(\i\);null!=(\i))(?=.{0,100}?selectVoiceChannel)/, - replace: (_, channel) => `&&!$self.isHiddenChannel(${channel})` + match: /(?<=getChannel\(\i\);if\(null!=(\i)).{0,200}?return void (?=\i\.default\.selectVoiceChannel)/, + replace: (m, channel) => `${m}!$self.isHiddenChannel(${channel})&&` } }, { diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx index b3dd75307..8b5c8a57b 100644 --- a/src/plugins/showMeYourName/index.tsx +++ b/src/plugins/showMeYourName/index.tsx @@ -13,13 +13,14 @@ import { definePluginSettings } from "@api/Settings"; import { Button, TextButton } from "@components/Button"; import ErrorBoundary from "@components/ErrorBoundary"; import { Heading } from "@components/Heading"; +import ircColors from "@plugins/ircColors"; import mentionAvatars from "@plugins/mentionAvatars"; import { Devs, EquicordDevs } from "@utils/constants"; import { classNameFactory, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, openModal } from "@utils/index"; import definePlugin, { OptionType } from "@utils/types"; import { GuildMember, Message, User } from "@vencord/discord-types"; import { findByCodeLazy, findStoreLazy } from "@webpack"; -import { ChannelStore, GuildMemberStore, GuildStore, Menu, MessageStore, RelationshipStore, StreamerModeStore, TextInput, useEffect, useState } from "@webpack/common"; +import { ChannelStore, GuildMemberStore, GuildRoleStore, GuildStore, Menu, MessageStore, RelationshipStore, StreamerModeStore, TextInput, useEffect, useState } from "@webpack/common"; import { JSX } from "react"; const SMYNC = classNameFactory(); @@ -28,7 +29,6 @@ const wrapEmojis = findByCodeLazy("lastIndex;return"); const adjustColor = findByCodeLazy("light1", "dark1", "toonStroke"); const AccessibilityStore = findStoreLazy("AccessibilityStore"); -const colorPattern = /^#(?:[\da-f]{3}){1,2}$|^#(?:[\da-f]{4}){1,2}$|(rgb|hsl)a?\((\s*-?\d+%?\s*,){2}(\s*-?\d+%?\s*)\)|(rgb|hsl)a?\((\s*-?\d+%?\s*,){3}\s*(0|(0?\.\d+)|1)\)$/iu; const roleColorPattern = /^role((?:\+|-)\d{0,4})?$/iu; const symbolPattern = /^[\p{S}\p{P}]{1,3}$/iu; const templatePattern = /(?:\{(?:custom|friend|nick|display|user)(?:,\s*(?:custom|friend|nick|display|user))*\})/iu; @@ -36,29 +36,59 @@ const templatePattern = /(?:\{(?:custom|friend|nick|display|user)(?:,\s*(?:custo type CustomNicknameData = Record; let customNicknames: CustomNicknameData = {}; -function adjustHex(color: string, percent: number): string { - let hex = color.replace("#", ""); +let toCSSCache: Map | null = null; +let toCSSProbe: HTMLDivElement | null = null; - if (hex.length === 3) { - hex = hex.split("").map(c => c + c).join(""); - } +function toCSS(color: string | number | null | undefined): string | null { + if (color == null) return null; + if (typeof color === "number") return `#${color.toString(16).padStart(6, "0")}`; + if (!color) return null; - const num = parseInt(hex, 16); - let r = (num >> 16) & 0xFF; - let g = (num >> 8) & 0xFF; - let b = num & 0xFF; + const cached = toCSSCache?.get(color); + if (cached !== undefined) return cached ?? null; + if (!toCSSProbe) return null; + + toCSSProbe.style.color = ""; + toCSSProbe.style.color = color; + const result = toCSSProbe.style.color !== "" ? color : null; + toCSSCache?.set(color, result); + return result; +} + +let convertToRGBCanvas: HTMLCanvasElement | null = null; +let convertToRGBCtx: CanvasRenderingContext2D | null = null; +let convertToRGBCache: Map | null = null; + +function convertToRGB(color: string): [number, number, number] | null { + const cached = convertToRGBCache?.get(color); + if (cached !== undefined) return cached ?? null; + + if (!convertToRGBCanvas || !convertToRGBCtx) return null; + + convertToRGBCtx.fillStyle = "#000000"; + convertToRGBCtx.clearRect(0, 0, 1, 1); + convertToRGBCtx.fillStyle = color; + convertToRGBCtx.fillRect(0, 0, 1, 1); + const [r, g, b] = convertToRGBCtx.getImageData(0, 0, 1, 1).data; + const result: [number, number, number] = [r, g, b]; + convertToRGBCache?.set(color, result); + return result; +} + +function adjustBrightness(color: string, percent: number): string { + const rgb = convertToRGB(color); + if (!rgb) return color; + + let [r, g, b] = rgb; r = Math.max(0, Math.min(255, r + Math.round(r * (percent / 100)))); g = Math.max(0, Math.min(255, g + Math.round(g * (percent / 100)))); b = Math.max(0, Math.min(255, b + Math.round(b * (percent / 100)))); - const newColor = ((r << 16) | (g << 8) | b).toString(16).padStart(6, "0"); + const hex = `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, "0")}`; + if (hex === "#ffffff" || hex === "#000000") return color; - if (newColor === "ffffff" || newColor === "000000") { - return color; - } - - return `#${newColor}`; + return hex; } function validColor(color: string) { @@ -73,66 +103,51 @@ function validColor(color: string) { return !isNaN(percentage) && percentage <= 100 && percentage >= -100; } - const colorTestDiv = document.createElement("div"); - colorTestDiv.style.borderColor = color; - - const isValid = colorTestDiv.style.borderColor !== "" && colorPattern.test(color); - colorTestDiv.remove(); - - return isValid; + return !!toCSS(color); } function resolveColor( - user: User | GuildMember, + colorStrings: colorStringsType, + displayNameStyles: { effectId: number; colors: number[]; } | null | undefined, savedColor: string, canUseGradient: boolean, inGuild: boolean, - forceWhite: boolean + ircColorsEnabled: boolean, + isHovering: boolean, ): Record | null { - if (!savedColor.trim()) { return null; } + const defaultColor = getComputedStyle(document.documentElement).getPropertyValue("--text-strong").trim() || null; + + if (!defaultColor) { return null; } + + savedColor = savedColor.trim() || defaultColor; + const isRoleColor = savedColor.toLowerCase().includes("role"); + const forceDefault = !inGuild && !ircColorsEnabled && (isRoleColor ? !isHovering : false); let gradient: any = null; - let primaryColor: any = savedColor; - let secondaryColor: any = savedColor; - let tertiaryColor: any = savedColor; - let primaryAdjusted: any = savedColor; - let secondaryAdjusted: any = savedColor; - let tertiaryAdjusted: any = savedColor; + let primaryColor: any = null; + let secondaryColor: any = null; + let tertiaryColor: any = null; + let primaryAdjusted: any = null; + let secondaryAdjusted: any = null; + let tertiaryAdjusted: any = null; - if (savedColor.toLowerCase().includes("role")) { + if (isRoleColor) { const percentage = roleColorPattern.exec(savedColor)?.[1] || ""; if (percentage && isNaN(parseInt(percentage))) return null; - const colorStrings = (user as any)?.colorStrings || {}; - const displayStyles = !inGuild ? (user as any)?.displayNameStyles || {} : {}; - - primaryColor = forceWhite ? "#ffffff" : colorStrings.primaryColor || displayStyles?.colors?.[0] || "#ffffff"; - if (typeof primaryColor === "number") primaryColor = `#${primaryColor.toString(16).padStart(6, "0")}`; - - secondaryColor = forceWhite ? null : colorStrings.secondaryColor || displayStyles?.colors?.[1] || null; - if (typeof secondaryColor === "number") secondaryColor = `#${secondaryColor.toString(16).padStart(6, "0")}`; - - tertiaryColor = forceWhite ? null : colorStrings.tertiaryColor || displayStyles?.colors?.[2] || null; - if (typeof tertiaryColor === "number") tertiaryColor = `#${tertiaryColor.toString(16).padStart(6, "0")}`; + primaryColor = forceDefault ? defaultColor : (toCSS(colorStrings?.primaryColor) || (!inGuild && toCSS(displayNameStyles?.colors?.[0])) || defaultColor); + secondaryColor = forceDefault ? null : (toCSS(colorStrings?.secondaryColor) || (!inGuild && toCSS(displayNameStyles?.colors?.[1])) || null); + tertiaryColor = forceDefault ? null : (toCSS(colorStrings?.tertiaryColor) || (!inGuild && toCSS(displayNameStyles?.colors?.[2])) || null); + primaryAdjusted = percentage ? adjustBrightness(primaryColor, parseInt(percentage)) : primaryColor; + secondaryAdjusted = secondaryColor && percentage ? adjustBrightness(secondaryColor, parseInt(percentage)) : secondaryColor; + tertiaryAdjusted = tertiaryColor && percentage ? adjustBrightness(tertiaryColor, parseInt(percentage)) : tertiaryColor; + } else { + primaryColor = forceDefault ? defaultColor : toCSS(savedColor); primaryAdjusted = primaryColor; - secondaryAdjusted = secondaryColor; - tertiaryAdjusted = tertiaryColor; - - if (primaryColor && percentage) { - primaryAdjusted = adjustHex(primaryColor, parseInt(percentage)); - } - - if (secondaryColor && percentage) { - secondaryAdjusted = adjustHex(secondaryColor, parseInt(percentage)); - } - - if (tertiaryColor && percentage) { - tertiaryAdjusted = adjustHex(tertiaryColor, parseInt(percentage)); - } } - gradient = !canUseGradient || !secondaryColor || forceWhite + gradient = !canUseGradient || !secondaryColor || forceDefault ? null : tertiaryColor ? "linear-gradient(to right,var(--custom-gradient-color-1),var(--custom-gradient-color-2),var(--custom-gradient-color-3),var(--custom-gradient-color-1))" @@ -164,7 +179,7 @@ function resolveColor( "--custom-gradient-color-2": secondaryColor || primaryColor, "--custom-gradient-color-3": tertiaryColor || primaryColor, "background-image": gradient, - "animation": "smyn-animation 1.5s linear infinite" + "animation": "smyn-animation var(--smyn-gradient-duration) linear infinite" }, static: { original: { @@ -300,6 +315,8 @@ interface mentionProps { interface messageProps { message: Message | null | undefined; + colorString?: string; + colorStrings: colorStringsType; userOverride?: User; isRepliedMessage?: boolean; withMentionPrefix?: boolean; @@ -307,12 +324,14 @@ interface messageProps { interface memberListProfileReactionProps { user: User | null | undefined; - type: "membersList" | "profilesPopout" | "profilesTooltip" | "reactionsTooltip" | "reactionsPopout" | "voiceChannel"; + type: "typingIndicator" | "membersList" | "profilesPopout" | "profilesTooltip" | "reactionsTooltip" | "reactionsPopout" | "voiceChannel"; guildId?: string; tags?: any; } -function getMemberListProfilesReactionsVoiceName( +type colorStringsType = { primaryColor: string | null, secondaryColor: string | null, tertiaryColor: string | null; } | null | undefined; + +function getTypingMemberListProfilesReactionsVoiceName( props: memberListProfileReactionProps, ): [string | null, JSX.Element | null, string | null] { const { user, type } = props; @@ -321,16 +340,16 @@ function getMemberListProfilesReactionsVoiceName( const guildId = props.guildId || props.tags?.props?.displayProfile?.guildId || null; const member = guildId && user ? GuildMemberStore.getMember(guildId, user.id) : null; const author = user && member ? { ...user, ...member } : user || member || null; - const shouldHookless = type === "reactionsTooltip" || type === "profilesTooltip"; + const shouldHookless = ["typingIndicator", "reactionsTooltip", "profilesTooltip"].includes(type); return renderUsername(author, null, null, type, "", shouldHookless, !!guildId); } -function getMemberListProfilesReactionsVoiceNameText(props: memberListProfileReactionProps): string | null { - return getMemberListProfilesReactionsVoiceName(props)[2]; +function getTypingMemberListProfilesReactionsVoiceNameText(props: memberListProfileReactionProps): string | null { + return getTypingMemberListProfilesReactionsVoiceName(props)[2]; } -function getMemberListProfilesReactionsVoiceNameElement(props: memberListProfileReactionProps): JSX.Element | null { - return getMemberListProfilesReactionsVoiceName(props)[1]; +function getTypingMemberListProfilesReactionsVoiceNameElement(props: memberListProfileReactionProps): JSX.Element | null { + return getTypingMemberListProfilesReactionsVoiceName(props)[1]; } function getMessageName(props: messageProps): [string | null, JSX.Element | null, string | null] { @@ -343,7 +362,7 @@ function getMessageName(props: messageProps): [string | null, JSX.Element | null const member = isWebhook ? null : target && channel ? GuildMemberStore.getMember(channel.guild_id, target.id) : null; const author = user && member ? { ...user, ...member } : user || member || null; const mentionSymbol = hideDefaultAtSign && (!isRepliedMessage || replies) ? "" : withMentionPrefix ? "@" : ""; - return renderUsername(author, channel?.id || null, message?.id || null, isRepliedMessage ? "replies" : "messages", mentionSymbol, false, !!channel?.guild_id); + return renderUsername(author, channel?.id || null, message?.id || null, isRepliedMessage ? "replies" : "messages", mentionSymbol, false, !!channel?.guild_id, props.colorString, props.colorStrings); } function getMessageNameElement(props: messageProps): JSX.Element | null { @@ -362,7 +381,20 @@ function getMentionNameElement(props: mentionProps): JSX.Element | null { const member = channel ? GuildMemberStore.getMember(channel.guild_id, userId) : null; const author = user && member ? { ...user, ...member } : user || member || null; const mentionSymbol = hideDefaultAtSign && mentions ? "" : "@"; - return renderUsername(author, channelId || null, nestedProps?.messageId || null, "mentions", mentionSymbol, false, !!channel?.guild_id)[1]; + + let colorString: string | undefined = undefined; + let colorStrings: colorStringsType = undefined; + + if (isPluginEnabled(ircColors.name)) { + const color = ircColors.calculateNameColorForMessageContext({ message: { author: author }, author: author, channel: channel }); + + if (color) { + colorString = color; + colorStrings = { primaryColor: color, secondaryColor: null, tertiaryColor: null }; + } + } + + return renderUsername(author, channelId || null, nestedProps?.messageId || null, "mentions", mentionSymbol, false, !!channel?.guild_id, colorString, colorStrings)[1]; } function getEffectType(effectId: number | null | undefined): string | null { @@ -405,14 +437,17 @@ function renderUsername( author: User | GuildMember | null, channelId: string | null, messageId: string | null, - type: "messages" | "replies" | "mentions" | "membersList" | "profilesPopout" | "profilesTooltip" | "reactionsTooltip" | "reactionsPopout" | "voiceChannel", + type: "messages" | "replies" | "typingIndicator" | "mentions" | "membersList" | "profilesPopout" | "profilesTooltip" | "reactionsTooltip" | "reactionsPopout" | "voiceChannel", mentionSymbol: string, hookless: boolean, - inGuild: boolean + inGuild: boolean, + colorString?: string, + colorStrings?: { primaryColor: string | null, secondaryColor: string | null, tertiaryColor: string | null; } | null ): [string | null, JSX.Element | null, string | null] { const isMessage = type === "messages"; const isReply = type === "replies"; const isMention = type === "mentions"; + const isTyping = type === "typingIndicator"; const isMember = type === "membersList"; const isProfile = type === "profilesPopout"; const isReactionsPopout = type === "reactionsPopout"; @@ -420,8 +455,8 @@ function renderUsername( const isReaction = isReactionsTooltip || isReactionsPopout; const isVoice = type === "voiceChannel"; - const config = hookless ? settings.store : settings.use(["messages", "replies", "mentions", "memberList", "profilePopout", "reactions", "friendNameOnlyInDirectMessages", "customNameOnlyInDirectMessages", "discriminators", "hideDefaultAtSign", "truncateAllNamesWithStreamerMode", "removeDuplicates", "ignoreGradients", "ignoreFonts", "animateGradients", "includedNames", "customNameColor", "friendNameColor", "nicknameColor", "displayNameColor", "usernameColor", "nameSeparator", "triggerNameRerender"]); - const { messages, replies, mentions, memberList, profilePopout, reactions, friendNameOnlyInDirectMessages, customNameOnlyInDirectMessages, discriminators, truncateAllNamesWithStreamerMode, removeDuplicates, ignoreGradients, ignoreFonts, animateGradients, includedNames, customNameColor, friendNameColor, nicknameColor, displayNameColor, usernameColor, nameSeparator, triggerNameRerender } = config; + const config = hookless ? settings.store : settings.use(["messages", "replies", "mentions", "typingIndicator", "memberList", "profilePopout", "reactions", "friendNameOnlyInDirectMessages", "customNameOnlyInDirectMessages", "discriminators", "hideDefaultAtSign", "truncateAllNamesWithStreamerMode", "removeDuplicates", "ignoreGradients", "ignoreFonts", "animateGradients", "includedNames", "customNameColor", "friendNameColor", "nicknameColor", "displayNameColor", "usernameColor", "nameSeparator", "triggerNameRerender"]); + const { messages, replies, mentions, typingIndicator, memberList, profilePopout, reactions, friendNameOnlyInDirectMessages, customNameOnlyInDirectMessages, discriminators, truncateAllNamesWithStreamerMode, removeDuplicates, ignoreGradients, ignoreFonts, animateGradients, includedNames, customNameColor, friendNameColor, nicknameColor, displayNameColor, usernameColor, nameSeparator, triggerNameRerender } = config; const channel = channelId ? ChannelStore.getChannel(channelId) || null : null; const message = channelId && messageId ? MessageStore.getMessage(channelId, messageId) : null; @@ -435,27 +470,39 @@ function renderUsername( ? hoveringReactionPopoutSet.has((author as User).id) : false; - const authorDisplayNameStyles = (!inGuild && (author as any)?.displayNameStyles) || null; + if (colorString && !colorStrings) { + colorStrings = { + primaryColor: colorString, + secondaryColor: null, + tertiaryColor: null + }; + } + + const ircColorsEnabled = isPluginEnabled(ircColors.name); + + const authorTopRole = (author as GuildMember)?.guildId && (author as any)?.highestRoleId; + const authorTopRoleColor = authorTopRole && GuildRoleStore.getRole((author as GuildMember).guildId, authorTopRole)?.colorStrings; + const authorColorStrings = colorStrings || (author as any)?.colorStrings || authorTopRoleColor || null; + const authorDisplayNameStyles = (!inGuild && !ircColorsEnabled && (author as any)?.displayNameStyles) || null; const effectType = authorDisplayNameStyles ? getEffectType(authorDisplayNameStyles.effectId) : null; const effectCSSVars = authorDisplayNameStyles ? computeEffectCSSVars(authorDisplayNameStyles) : {}; const hasEffect = !!effectType; const needsEffectDataAttr = effectType === "neon" || effectType === "toon" || effectType === "pop"; const shouldShowEffect = hasEffect && isHovering; const shouldAnimateEffect = shouldShowEffect && !AccessibilityStore.useReducedMotion; - const shouldUseDMDefault = !inGuild && !isHovering; const canUseGradient = ((author as GuildMember)?.guildId ? (GuildStore.getGuild((author as GuildMember).guildId) ?? {}).premiumFeatures?.features.includes("ENHANCED_ROLE_COLORS") : !inGuild); - const useTopRoleStyle = isMention || isReactionsPopout || channel?.isDM() || channel?.isGroupDM(); - const topRoleStyle = author ? resolveColor(author, "Role", canUseGradient, inGuild, shouldUseDMDefault) : null; - const hasGradient = !!topRoleStyle?.gradient && Object.keys(topRoleStyle.gradient).length > 0; + const useTopStyle = isMention || isReactionsPopout || channel?.isDM() || channel?.isGroupDM(); + const topStyle = author ? resolveColor(authorColorStrings, authorDisplayNameStyles, "Role", canUseGradient, inGuild, ircColorsEnabled, isHovering) : null; + const hasGradient = !!topStyle?.gradient && Object.keys(topStyle.gradient).length > 0; const textMutedValue = getComputedStyle(document.documentElement)?.getPropertyValue("--text-muted")?.trim() || "#72767d"; const options = splitTemplate(includedNames); - const resolvedUsernameColor = author ? resolveColor(author, usernameColor.trim(), canUseGradient, inGuild, shouldUseDMDefault) : null; - const resolvedDisplayNameColor = author ? resolveColor(author, displayNameColor.trim(), canUseGradient, inGuild, shouldUseDMDefault) : null; - const resolvedNicknameColor = author ? resolveColor(author, nicknameColor.trim(), canUseGradient, inGuild, shouldUseDMDefault) : null; - const resolvedFriendNameColor = author ? resolveColor(author, friendNameColor.trim(), canUseGradient, inGuild, shouldUseDMDefault) : null; - const resolvedCustomNameColor = author ? resolveColor(author, customNameColor.trim(), canUseGradient, inGuild, shouldUseDMDefault) : null; + const resolvedUsernameColor = author ? resolveColor(authorColorStrings, authorDisplayNameStyles, usernameColor.trim(), canUseGradient, inGuild, ircColorsEnabled, isHovering) : null; + const resolvedDisplayNameColor = author ? resolveColor(authorColorStrings, authorDisplayNameStyles, displayNameColor.trim(), canUseGradient, inGuild, ircColorsEnabled, isHovering) : null; + const resolvedNicknameColor = author ? resolveColor(authorColorStrings, authorDisplayNameStyles, nicknameColor.trim(), canUseGradient, inGuild, ircColorsEnabled, isHovering) : null; + const resolvedFriendNameColor = author ? resolveColor(authorColorStrings, authorDisplayNameStyles, friendNameColor.trim(), canUseGradient, inGuild, ircColorsEnabled, isHovering) : null; + const resolvedCustomNameColor = author ? resolveColor(authorColorStrings, authorDisplayNameStyles, customNameColor.trim(), canUseGradient, inGuild, ircColorsEnabled, isHovering) : null; const affixColor = { color: textMutedValue, "-webkit-text-fill-color": textMutedValue, isolation: "isolate", "white-space": "pre", "font-family": "var(--font-primary)", "letter-spacing": "normal" }; const { username, display, nick, friend, custom } = getProcessedNames(author, truncateAllNamesWithStreamerMode, discriminators, inGuild, friendNameOnlyInDirectMessages, customNameOnlyInDirectMessages); @@ -551,6 +598,8 @@ function renderUsername( return [null, null, null]; } else if (isMention && !mentions) { return [null, null, null]; + } else if (isTyping && !typingIndicator) { + return [null, null, null]; } else if (isMember && !memberList) { return [null, null, null]; } else if (isProfile && !profilePopout) { @@ -580,6 +629,7 @@ function renderUsername( } const remainingNames = [first, second, third, fourth, fifth].filter(Boolean); + first = remainingNames.shift(); second = remainingNames.shift(); third = remainingNames.shift(); @@ -591,53 +641,56 @@ function renderUsername( const shouldAnimateSecondaryNames = animateGradients && !ignoreGradients; const firstDataText = mentionSymbol + first.name; - const secondDataText = second && shouldAnimateSecondaryNames ? (second.prefix + second.name + second.suffix) : ""; - const thirdDataText = third && shouldAnimateSecondaryNames ? (third.prefix + third.name + third.suffix) : ""; - const fourthDataText = fourth && shouldAnimateSecondaryNames ? (fourth.prefix + fourth.name + fourth.suffix) : ""; - const fifthDataText = fifth && shouldAnimateSecondaryNames ? (fifth.prefix + fifth.name + fifth.suffix) : ""; + const secondDataText = second && shouldAnimateSecondaryNames ? second.name : ""; + const thirdDataText = third && shouldAnimateSecondaryNames ? third.name : ""; + const fourthDataText = fourth && shouldAnimateSecondaryNames ? fourth.name : ""; + const fifthDataText = fifth && shouldAnimateSecondaryNames ? fifth.name : ""; const allDataText = [firstDataText, secondDataText, thirdDataText, fourthDataText, fifthDataText].filter(Boolean).join(nameSeparator).trim(); // Only mentions and reactions popouts should patch in the gradient glow or else a double glow will appear on messages. - const hoveringClass = (isHovering ? " show-me-your-name-gradient-hovered" : ""); - const gradientClasses = useTopRoleStyle - ? "show-me-your-name-gradient show-me-your-name-gradient-inherit-bg" + hoveringClass - : "show-me-your-name-gradient show-me-your-name-gradient-unset-bg" + hoveringClass; + const hoveringClass = (isHovering ? " smyn-gradient-hovered" : ""); + const gradientClasses = useTopStyle + ? "smyn-gradient smyn-gradient-inherit-bg" + hoveringClass + : "smyn-gradient smyn-gradient-unset-bg" + hoveringClass; - const firstGroupClasses = "show-me-your-name-name-group show-me-your-name-first-name-group"; - const secondGroupClasses = "show-me-your-name-name-group show-me-your-name-second-name-group"; - const thirdGroupClasses = "show-me-your-name-name-group show-me-your-name-third-name-group"; - const fourthGroupClasses = "show-me-your-name-name-group show-me-your-name-fourth-name-group"; - const fifthGroupClasses = "show-me-your-name-name-group show-me-your-name-fifth-name-group"; - const firstNameClasses = "show-me-your-name-name show-me-your-name-first-name"; - const secondNameClasses = "show-me-your-name-name show-me-your-name-second-name"; - const thirdNameClasses = "show-me-your-name-name show-me-your-name-third-name"; - const fourthNameClasses = "show-me-your-name-name show-me-your-name-fourth-name"; - const fifthNameClasses = "show-me-your-name-name show-me-your-name-fifth-name"; - const prefixClasses = "show-me-your-name-affix show-me-your-name-prefix"; - const suffixClasses = "show-me-your-name-affix show-me-your-name-suffix"; + const firstGroupClasses = "smyn-name-group smyn-first-name-group"; + const secondGroupClasses = "smyn-name-group smyn-second-name-group"; + const thirdGroupClasses = "smyn-name-group smyn-third-name-group"; + const fourthGroupClasses = "smyn-name-group smyn-fourth-name-group"; + const fifthGroupClasses = "smyn-name-group smyn-fifth-name-group"; + const firstNameClasses = "smyn-name smyn-first-name"; + const secondNameClasses = "smyn-name smyn-second-name"; + const thirdNameClasses = "smyn-name smyn-third-name"; + const fourthNameClasses = "smyn-name smyn-fourth-name"; + const fifthNameClasses = "smyn-name smyn-fifth-name"; + const prefixClasses = "smyn-affix smyn-prefix"; + const suffixClasses = "smyn-affix smyn-suffix"; + + const animationDuration = Math.max(1, 1.5 * (first.name.length / 12)); const topLevelStyle = { // Allows names to wrap in reaction popouts. ...(isReactionsPopout ? { display: "flex", flexWrap: "wrap", lineHeight: "1.1em", fontSize: "0.9em" } : {}), - ...(hasEffect ? effectCSSVars : {}) + ...(hasEffect ? effectCSSVars : {}), + "--smyn-gradient-duration": `${animationDuration}s` } as React.CSSProperties; const nameElement = ( {mentionSymbol && {mentionSymbol}} {( {first.wrapped} @@ -667,9 +720,7 @@ function renderUsername( ].map(({ name, dataText, groupClass, nameClass, position }) => name && ( {nameSeparator} @@ -677,10 +728,12 @@ function renderUsername( { setValue(""); delete customNicknames[user.id]; @@ -826,7 +879,7 @@ function CustomNicknameModal({ modalProps, user }: { modalProps: ModalProps; use
- +