diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c3eff6f4..98002b6e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -23,3 +23,4 @@ jobs: SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} SENTRY_URL: ${{ secrets.SENTRY_URL }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/element-call.yaml b/.github/workflows/element-call.yaml index eaa392be..7924140d 100644 --- a/.github/workflows/element-call.yaml +++ b/.github/workflows/element-call.yaml @@ -14,6 +14,8 @@ on: required: true SENTRY_AUTH_TOKEN: required: true + CODECOV_TOKEN: + required: false jobs: build: @@ -36,6 +38,7 @@ jobs: SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} SENTRY_URL: ${{ secrets.SENTRY_URL }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} VITE_APP_VERSION: ${{ inputs.vite_app_version }} NODE_OPTIONS: "--max-old-space-size=4096" - name: Upload Artifact diff --git a/package.json b/package.json index 5b5b148f..b1015050 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ "@babel/preset-env": "^7.22.20", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", + "@codecov/vite-plugin": "^1.3.0", + "@fontsource/inconsolata": "^5.1.0", + "@fontsource/inter": "^5.1.0", "@formatjs/intl-durationformat": "^0.6.1", "@formatjs/intl-segmenter": "^11.7.3", "@livekit/components-core": "^0.11.0", @@ -48,8 +51,9 @@ "@types/content-type": "^1.1.5", "@types/grecaptcha": "^3.0.9", "@types/jsdom": "^21.1.7", - "@types/lodash": "^4.14.199", + "@types/lodash-es": "^4.17.12", "@types/node": "^20.0.0", + "@types/pako": "^2.0.3", "@types/qrcode": "^1.5.5", "@types/react-dom": "^18.3.0", "@types/react-router-dom": "^5.3.3", @@ -85,7 +89,7 @@ "jsdom": "^25.0.0", "knip": "^5.27.2", "livekit-client": "^2.5.7", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "loglevel": "^1.9.1", "matrix-js-sdk": "matrix-org/matrix-js-sdk#8e9a04cdec0f88fc876bbbf406db55b0677f005d", "matrix-widget-api": "^1.10.0", @@ -108,7 +112,7 @@ "typescript": "^5.1.6", "typescript-eslint-language-service": "^5.0.5", "unique-names-generator": "^4.6.0", - "vaul": "^0.9.0", + "vaul": "^1.0.0", "vite": "^5.0.0", "vite-plugin-html-template": "^1.1.0", "vite-plugin-svgr": "^4.0.0", diff --git a/public/fonts/Inter/Inter-Bold.woff b/public/fonts/Inter/Inter-Bold.woff deleted file mode 100644 index 2ec7ac3d..00000000 Binary files a/public/fonts/Inter/Inter-Bold.woff and /dev/null differ diff --git a/public/fonts/Inter/Inter-Bold.woff2 b/public/fonts/Inter/Inter-Bold.woff2 deleted file mode 100644 index 6989c992..00000000 Binary files a/public/fonts/Inter/Inter-Bold.woff2 and /dev/null differ diff --git a/public/fonts/Inter/Inter-BoldItalic.woff b/public/fonts/Inter/Inter-BoldItalic.woff deleted file mode 100644 index aa35b797..00000000 Binary files a/public/fonts/Inter/Inter-BoldItalic.woff and /dev/null differ diff --git a/public/fonts/Inter/Inter-BoldItalic.woff2 b/public/fonts/Inter/Inter-BoldItalic.woff2 deleted file mode 100644 index 18b4c1ce..00000000 Binary files a/public/fonts/Inter/Inter-BoldItalic.woff2 and /dev/null differ diff --git a/public/fonts/Inter/Inter-Italic.woff b/public/fonts/Inter/Inter-Italic.woff deleted file mode 100644 index 4b765bd5..00000000 Binary files a/public/fonts/Inter/Inter-Italic.woff and /dev/null differ diff --git a/public/fonts/Inter/Inter-Italic.woff2 b/public/fonts/Inter/Inter-Italic.woff2 deleted file mode 100644 index bd5f255a..00000000 Binary files a/public/fonts/Inter/Inter-Italic.woff2 and /dev/null differ diff --git a/public/fonts/Inter/Inter-Medium.woff b/public/fonts/Inter/Inter-Medium.woff deleted file mode 100644 index 7d55f34c..00000000 Binary files a/public/fonts/Inter/Inter-Medium.woff and /dev/null differ diff --git a/public/fonts/Inter/Inter-Medium.woff2 b/public/fonts/Inter/Inter-Medium.woff2 deleted file mode 100644 index a916b47f..00000000 Binary files a/public/fonts/Inter/Inter-Medium.woff2 and /dev/null differ diff --git a/public/fonts/Inter/Inter-MediumItalic.woff b/public/fonts/Inter/Inter-MediumItalic.woff deleted file mode 100644 index 422ab057..00000000 Binary files a/public/fonts/Inter/Inter-MediumItalic.woff and /dev/null differ diff --git a/public/fonts/Inter/Inter-MediumItalic.woff2 b/public/fonts/Inter/Inter-MediumItalic.woff2 deleted file mode 100644 index f623924a..00000000 Binary files a/public/fonts/Inter/Inter-MediumItalic.woff2 and /dev/null differ diff --git a/public/fonts/Inter/Inter-Regular.woff b/public/fonts/Inter/Inter-Regular.woff deleted file mode 100644 index 7ff51b7d..00000000 Binary files a/public/fonts/Inter/Inter-Regular.woff and /dev/null differ diff --git a/public/fonts/Inter/Inter-Regular.woff2 b/public/fonts/Inter/Inter-Regular.woff2 deleted file mode 100644 index 554aed66..00000000 Binary files a/public/fonts/Inter/Inter-Regular.woff2 and /dev/null differ diff --git a/public/fonts/Inter/Inter-SemiBold.woff b/public/fonts/Inter/Inter-SemiBold.woff deleted file mode 100644 index 76e507a5..00000000 Binary files a/public/fonts/Inter/Inter-SemiBold.woff and /dev/null differ diff --git a/public/fonts/Inter/Inter-SemiBold.woff2 b/public/fonts/Inter/Inter-SemiBold.woff2 deleted file mode 100644 index 93079989..00000000 Binary files a/public/fonts/Inter/Inter-SemiBold.woff2 and /dev/null differ diff --git a/public/fonts/Inter/Inter-SemiBoldItalic.woff b/public/fonts/Inter/Inter-SemiBoldItalic.woff deleted file mode 100644 index 38218121..00000000 Binary files a/public/fonts/Inter/Inter-SemiBoldItalic.woff and /dev/null differ diff --git a/public/fonts/Inter/Inter-SemiBoldItalic.woff2 b/public/fonts/Inter/Inter-SemiBoldItalic.woff2 deleted file mode 100644 index f19f5505..00000000 Binary files a/public/fonts/Inter/Inter-SemiBoldItalic.woff2 and /dev/null differ diff --git a/public/locales/de/app.json b/public/locales/de/app.json index d946ff9e..744fa792 100644 --- a/public/locales/de/app.json +++ b/public/locales/de/app.json @@ -115,7 +115,7 @@ "matrix_id": "Matrix-ID: {{id}}", "microphone_off": "Mikrofon aus", "microphone_on": "Mikrofon an", - "mute_microphone_button_label": "Mikrofon deaktivieren", + "mute_microphone_button_label": "Mikrofon stumm schalten", "participant_count_one": "{{count, number}}", "participant_count_other": "{{count, number}}", "qr_code": "QR-Code", @@ -184,14 +184,15 @@ "unauthenticated_view_body": "Noch nicht registriert? <2>Konto erstellen", "unauthenticated_view_eula_caption": "Mit einem Klick auf „Los geht’s“ akzeptierst du unseren <2>Endbenutzer-Lizenzvertrag (EULA)", "unauthenticated_view_login_button": "Melde dich mit deinem Konto an", - "unmute_microphone_button_label": "Mikrofon aktivieren", + "unmute_microphone_button_label": "Mikrofon einschalten", "version": "{{productName}} Version: {{version}}", "video_tile": { "always_show": "Immer anzeigen", "change_fit_contain": "An Fenster anpassen", "collapse": "Minimieren", "expand": "Erweitern", - "mute_for_me": "Für mich stummschalten", + "mute_for_me": "Für mich stumm schalten", + "muted_for_me": "Für mich stumm geschaltet", "volume": "Lautstärke" } } diff --git a/public/locales/en-GB/app.json b/public/locales/en-GB/app.json index dc1b6010..ca91d517 100644 --- a/public/locales/en-GB/app.json +++ b/public/locales/en-GB/app.json @@ -192,6 +192,7 @@ "collapse": "Collapse", "expand": "Expand", "mute_for_me": "Mute for me", + "muted_for_me": "Muted for me", "volume": "Volume" } } diff --git a/src/__snapshots__/Modal.test.tsx.snap b/src/__snapshots__/Modal.test.tsx.snap index 6b7091e5..8772c543 100644 --- a/src/__snapshots__/Modal.test.tsx.snap +++ b/src/__snapshots__/Modal.test.tsx.snap @@ -39,13 +39,16 @@ exports[`the modal renders as a drawer in mobile viewports 1`] = ` aria-labelledby="radix-:ra:" class="overlay modal drawer" data-state="open" + data-vaul-animate="true" + data-vaul-custom-container="false" + data-vaul-delayed-snap-points="false" + data-vaul-drawer="" + data-vaul-drawer-direction="bottom" + data-vaul-snap-points="false" id="radix-:r9:" role="dialog" style="pointer-events: auto;" tabindex="-1" - vaul-drawer="" - vaul-drawer-direction="bottom" - vaul-drawer-visible="true" >
{ +const gzip = async (text: string): Promise => { + // pako is relatively large (200KB), so we only import it when needed + const { gzip: pakoGzip } = await import("pako"); + // encode as UTF-8 const buf = new TextEncoder().encode(text); // compress - return new Blob([pako.gzip(buf)]); + return new Blob([pakoGzip(buf)]); }; /** @@ -253,12 +253,14 @@ export function useSubmitRageshake(): { const logs = await getLogsForReport(); for (const entry of logs) { - body.append("compressed-log", gzip(entry.lines), entry.id); + body.append("compressed-log", await gzip(entry.lines), entry.id); } body.append( "file", - gzip(ElementCallOpenTelemetry.instance.rageshakeProcessor!.dump()), + await gzip( + ElementCallOpenTelemetry.instance.rageshakeProcessor!.dump(), + ), "traces.json.gz", ); } diff --git a/src/state/CallViewModel.test.ts b/src/state/CallViewModel.test.ts index 5af59711..1fe2fa74 100644 --- a/src/state/CallViewModel.test.ts +++ b/src/state/CallViewModel.test.ts @@ -23,7 +23,7 @@ import { RemoteParticipant, } from "livekit-client"; import * as ComponentsCore from "@livekit/components-core"; -import { isEqual } from "lodash"; +import { isEqual } from "lodash-es"; import { CallMembership, MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc"; import { CallViewModel, Layout } from "./CallViewModel"; diff --git a/src/state/CallViewModel.ts b/src/state/CallViewModel.ts index 70486bb0..dcfe456a 100644 --- a/src/state/CallViewModel.ts +++ b/src/state/CallViewModel.ts @@ -764,7 +764,7 @@ export class CallViewModel extends ViewModel { this.gridModeUserSelection.next(value); } - private readonly gridLayout: Observable = combineLatest( + private readonly gridLayoutMedia: Observable = combineLatest( [this.grid, this.spotlight], (grid, spotlight) => ({ type: "grid", @@ -775,30 +775,29 @@ export class CallViewModel extends ViewModel { }), ); - private spotlightLandscapeLayout: Observable = combineLatest( - [this.grid, this.spotlight], - (grid, spotlight) => ({ + private readonly spotlightLandscapeLayoutMedia: Observable = + combineLatest([this.grid, this.spotlight], (grid, spotlight) => ({ type: "spotlight-landscape", spotlight, grid, }), ); - private readonly spotlightPortraitLayout: Observable = + private readonly spotlightPortraitLayoutMedia: Observable = combineLatest([this.grid, this.spotlight], (grid, spotlight) => ({ type: "spotlight-portrait", spotlight, grid, })); - private readonly spotlightExpandedLayout: Observable = + private readonly spotlightExpandedLayoutMedia: Observable = combineLatest([this.spotlight, this.pip], (spotlight, pip) => ({ type: "spotlight-expanded", spotlight, pip: pip ?? undefined, })); - private readonly oneOnOneLayout: Observable = + private readonly oneOnOneLayoutMedia: Observable = this.mediaItems.pipe( map((mediaItems) => { if (mediaItems.length !== 2) return null; @@ -816,9 +815,8 @@ export class CallViewModel extends ViewModel { }), ); - private readonly pipLayout: Observable = this.spotlight.pipe( - map((spotlight) => ({ type: "pip", spotlight })), - ); + private readonly pipLayoutMedia: Observable = + this.spotlight.pipe(map((spotlight) => ({ type: "pip", spotlight }))); /** * The media to be used to produce a layout. @@ -831,24 +829,24 @@ export class CallViewModel extends ViewModel { switchMap((gridMode) => { switch (gridMode) { case "grid": - return this.oneOnOneLayout.pipe( + return this.oneOnOneLayoutMedia.pipe( switchMap((oneOnOne) => - oneOnOne === null ? this.gridLayout : of(oneOnOne), + oneOnOne === null ? this.gridLayoutMedia : of(oneOnOne), ), ); case "spotlight": return this.spotlightExpanded.pipe( switchMap((expanded) => expanded - ? this.spotlightExpandedLayout - : this.spotlightLandscapeLayout, + ? this.spotlightExpandedLayoutMedia + : this.spotlightLandscapeLayoutMedia, ), ); } }), ); case "narrow": - return this.oneOnOneLayout.pipe( + return this.oneOnOneLayoutMedia.pipe( switchMap((oneOnOne) => oneOnOne === null ? combineLatest( @@ -856,12 +854,12 @@ export class CallViewModel extends ViewModel { (grid, spotlight) => grid.length > smallMobileCallThreshold || spotlight.some((vm) => vm instanceof ScreenShareViewModel) - ? this.spotlightPortraitLayout - : this.gridLayout, + ? this.spotlightPortraitLayoutMedia + : this.gridLayoutMedia, ).pipe(switchAll()) : // The expanded spotlight layout makes for a better one-on-one // experience in narrow windows - this.spotlightExpandedLayout, + this.spotlightExpandedLayoutMedia, ), ); case "flat": @@ -871,14 +869,14 @@ export class CallViewModel extends ViewModel { case "grid": // Yes, grid mode actually gets you a "spotlight" layout in // this window mode. - return this.spotlightLandscapeLayout; + return this.spotlightLandscapeLayoutMedia; case "spotlight": - return this.spotlightExpandedLayout; + return this.spotlightExpandedLayoutMedia; } }), ); case "pip": - return this.pipLayout; + return this.pipLayoutMedia; } }), this.scope.state(), diff --git a/src/tile/GridTile.tsx b/src/tile/GridTile.tsx index 43fe3845..94ce1f3d 100644 --- a/src/tile/GridTile.tsx +++ b/src/tile/GridTile.tsx @@ -26,6 +26,7 @@ import { VisibilityOnIcon, UserProfileIcon, ExpandIcon, + VolumeOffSolidIcon, } from "@vector-im/compound-design-tokens/assets/web/icons"; import { ContextMenu, @@ -62,6 +63,7 @@ interface TileProps { interface UserMediaTileProps extends TileProps { vm: UserMediaViewModel; mirror: boolean; + locallyMuted: boolean; menuStart?: ReactNode; menuEnd?: ReactNode; } @@ -71,6 +73,7 @@ const UserMediaTile = forwardRef( { vm, showSpeakingIndicators, + locallyMuted, menuStart, menuEnd, className, @@ -96,7 +99,16 @@ const UserMediaTile = forwardRef( ); const { raisedHands, lowerHand, reactions } = useReactions(); - const MicIcon = audioEnabled ? MicOnSolidIcon : MicOffSolidIcon; + const AudioIcon = locallyMuted + ? VolumeOffSolidIcon + : audioEnabled + ? MicOnSolidIcon + : MicOffSolidIcon; + const audioIconLabel = locallyMuted + ? t("video_tile.muted_for_me") + : audioEnabled + ? t("microphone_on") + : t("microphone_off"); const [menuOpen, setMenuOpen] = useState(false); const menu = ( @@ -134,11 +146,11 @@ const UserMediaTile = forwardRef( [styles.handRaised]: !showSpeaking && !!handRaised, })} nameTagLeadingIcon={ - } @@ -199,6 +211,7 @@ const LocalUserMediaTile = forwardRef( diff --git a/vite.config.js b/vite.config.js index 141cd80c..b92f717b 100644 --- a/vite.config.js +++ b/vite.config.js @@ -8,6 +8,7 @@ Please see LICENSE in the repository root for full details. import { defineConfig, loadEnv } from "vite"; import svgrPlugin from "vite-plugin-svgr"; import htmlTemplate from "vite-plugin-html-template"; +import { codecovVitePlugin } from "@codecov/vite-plugin"; import { sentryVitePlugin } from "@sentry/vite-plugin"; import react from "@vitejs/plugin-react"; import basicSsl from "@vitejs/plugin-basic-ssl"; @@ -31,6 +32,12 @@ export default defineConfig(({ mode }) => { title: env.VITE_PRODUCT_NAME || "Element Call", }, }), + + codecovVitePlugin({ + enableBundleAnalysis: process.env.CODECOV_TOKEN !== undefined, + bundleName: "element-call", + uploadToken: process.env.CODECOV_TOKEN, + }), ]; if ( diff --git a/yarn.lock b/yarn.lock index d2936e6b..5057090b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,44 @@ # yarn lockfile v1 +"@actions/core@^1.10.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.11.1.tgz#ae683aac5112438021588030efb53b1adb86f172" + integrity sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A== + dependencies: + "@actions/exec" "^1.1.1" + "@actions/http-client" "^2.0.1" + +"@actions/exec@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@actions/exec/-/exec-1.1.1.tgz#2e43f28c54022537172819a7cf886c844221a611" + integrity sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w== + dependencies: + "@actions/io" "^1.0.1" + +"@actions/github@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@actions/github/-/github-6.0.0.tgz#65883433f9d81521b782a64cc1fd45eef2191ea7" + integrity sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g== + dependencies: + "@actions/http-client" "^2.2.0" + "@octokit/core" "^5.0.1" + "@octokit/plugin-paginate-rest" "^9.0.0" + "@octokit/plugin-rest-endpoint-methods" "^10.0.0" + +"@actions/http-client@^2.0.1", "@actions/http-client@^2.2.0": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.3.tgz#31fc0b25c0e665754ed39a9f19a8611fc6dab674" + integrity sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA== + dependencies: + tunnel "^0.0.6" + undici "^5.25.4" + +"@actions/io@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.1.3.tgz#4cdb6254da7962b07473ff5c335f3da485d94d71" + integrity sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q== + "@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" @@ -957,6 +995,26 @@ resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-1.10.0.tgz#1a67ac889c2d464a3492b3e54c38f80517963b16" integrity sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag== +"@codecov/bundler-plugin-core@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@codecov/bundler-plugin-core/-/bundler-plugin-core-1.3.0.tgz#6b2e2eeabd20dc085f281dcb4fb173f66e745ef7" + integrity sha512-Zs0uTDou/QnYnnXl8BWxX4Tc4bGeUAPzgAyZCdtXT2BIcyb5zjymXByyN7zbqPgiU0Ymbg3DgsK6v726shiq3w== + dependencies: + "@actions/core" "^1.10.1" + "@actions/github" "^6.0.0" + chalk "4.1.2" + semver "^7.5.4" + unplugin "^1.10.1" + zod "^3.22.4" + +"@codecov/vite-plugin@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@codecov/vite-plugin/-/vite-plugin-1.3.0.tgz#502e19427fca4416685f475b891ee10cff1ec274" + integrity sha512-OiseFReYsl5bHYfFd7AZ46ptII+bSQLTRD1qv7CFOmQQLzfrxWtkfqZ+5wQs+9emaWyzERpFI4odDFDvMMS6EA== + dependencies: + "@codecov/bundler-plugin-core" "^1.3.0" + unplugin "^1.10.1" + "@csstools/cascade-layer-name-parser@^2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz#64d128529397aa1e1c986f685713363b262b81b1" @@ -1558,6 +1616,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + "@floating-ui/core@^1.6.0": version "1.6.8" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" @@ -1594,6 +1657,16 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== +"@fontsource/inconsolata@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@fontsource/inconsolata/-/inconsolata-5.1.0.tgz#f6a76680173336d02d2ce4009699821a6be239ce" + integrity sha512-vYPdG3R46MhK+99De8e8MMyNad5BAb1oTnHMpojlctZyWJIcin8bKHFPUpQSNRhZ4HQL/+DCW+RTiG2RbnweTw== + +"@fontsource/inter@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@fontsource/inter/-/inter-5.1.0.tgz#ab629b2c662457022d2d6a29854b8dc8ba538c47" + integrity sha512-zKZR3kf1G0noIes1frLfOHP5EXVVm0M7sV/l9f/AaYf+M/DId35FO4LkigWjqWYjTJZGgplhdv4cB+ssvCqr5A== + "@formatjs/ecma402-abstract@2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.3.tgz#dc5a032e1971c709b32b9ab511fa35504a7d3bc9" @@ -1771,6 +1844,98 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== + +"@octokit/core@^5.0.1": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" + integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.1.0" + "@octokit/request" "^8.3.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^9.0.1": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" + integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== + dependencies: + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" + integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== + dependencies: + "@octokit/request" "^8.3.0" + "@octokit/types" "^13.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^20.0.0": + version "20.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" + integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== + +"@octokit/openapi-types@^22.2.0": + version "22.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" + integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== + +"@octokit/plugin-paginate-rest@^9.0.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz#2e2a2f0f52c9a4b1da1a3aa17dabe3c459b9e401" + integrity sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw== + dependencies: + "@octokit/types" "^12.6.0" + +"@octokit/plugin-rest-endpoint-methods@^10.0.0": + version "10.4.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz#41ba478a558b9f554793075b2e20cd2ef973be17" + integrity sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg== + dependencies: + "@octokit/types" "^12.6.0" + +"@octokit/request-error@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" + integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== + dependencies: + "@octokit/types" "^13.1.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^8.3.0", "@octokit/request@^8.3.1": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" + integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== + dependencies: + "@octokit/endpoint" "^9.0.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/types@^12.6.0": + version "12.6.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2" + integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw== + dependencies: + "@octokit/openapi-types" "^20.0.0" + +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0": + version "13.6.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.6.1.tgz#432fc6c0aaae54318e5b2d3e15c22ac97fc9b15f" + integrity sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g== + dependencies: + "@octokit/openapi-types" "^22.2.0" + "@opentelemetry/api-logs@0.54.2": version "0.54.2" resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.54.2.tgz#bb8aa11cdc69b327b58d7e10cc2bc26bf540421f" @@ -2852,7 +3017,14 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/lodash@^4.14.199": +"@types/lodash-es@^4.17.12": + version "4.17.12" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" + integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": version "4.17.13" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== @@ -2888,6 +3060,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== +"@types/pako@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/pako/-/pako-2.0.3.tgz#b6993334f3af27c158f3fe0dfeeba987c578afb1" + integrity sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q== + "@types/prop-types@*": version "15.7.13" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" @@ -3246,7 +3423,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.1: +acorn@^8.14.0, acorn@^8.8.1: version "8.14.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== @@ -3554,6 +3731,11 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + bent@~7.3.6: version "7.3.12" resolved "https://registry.yarnpkg.com/bent/-/bent-7.3.12.tgz#e0a2775d4425e7674c64b78b242af4f49da6b035" @@ -3723,6 +3905,14 @@ chai@^5.1.2: loupe "^3.1.0" pathval "^2.0.0" +chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@~4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3732,14 +3922,6 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@~4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -4152,6 +4334,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +deprecation@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -5913,11 +6100,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - loglevel@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.1.tgz#d63976ac9bcd03c7c873116d41c2a85bafff1be7" @@ -7389,7 +7571,7 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.7, semver@^7.5.3, semver@^7.6.0, semver@^7.6.3: +semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -7926,6 +8108,11 @@ tsutils@^3.0.0, tsutils@^3.17.1, tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -8032,6 +8219,13 @@ undici-types@~6.19.2, undici-types@~6.19.8: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici@^5.25.4: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + undici@^6.19.5: version "6.19.7" resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.7.tgz#7d4cf26dc689838aa8b6753a3c5c4288fc1e0216" @@ -8070,6 +8264,11 @@ unique-names-generator@^4.6.0: resolved "https://registry.yarnpkg.com/unique-names-generator/-/unique-names-generator-4.7.1.tgz#966407b12ba97f618928f77322cfac8c80df5597" integrity sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow== +universal-user-agent@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -8090,6 +8289,14 @@ unplugin@1.0.1: webpack-sources "^3.2.3" webpack-virtual-modules "^0.5.0" +unplugin@^1.10.1: + version "1.16.0" + resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.16.0.tgz#ca0f248bf8798cd752dd02e5b381223b737cef72" + integrity sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ== + dependencies: + acorn "^8.14.0" + webpack-virtual-modules "^0.6.2" + update-browserslist-db@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" @@ -8155,13 +8362,6 @@ value-or-function@^4.0.0: resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-4.0.0.tgz#70836b6a876a010dc3a2b884e7902e9db064378d" integrity sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg== -vaul@^0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/vaul/-/vaul-0.9.1.tgz#3640198e04636b209b1f907fcf3079bec6ecc66b" - integrity sha512-fAhd7i4RNMinx+WEm6pF3nOl78DFkAazcN04ElLPFF9BMCNGbY/kou8UMhIcicm0rJCNePJP0Yyza60gGOD0Jw== - dependencies: - "@radix-ui/react-dialog" "^1.0.4" - vaul@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/vaul/-/vaul-1.1.0.tgz#7da4bc965e0b184ada632f1208096b0f5575d920" @@ -8346,6 +8546,11 @@ webpack-virtual-modules@^0.5.0: resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz#362f14738a56dae107937ab98ea7062e8bdd3b6c" integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== +webpack-virtual-modules@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8" + integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== + webrtc-adapter@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/webrtc-adapter/-/webrtc-adapter-9.0.1.tgz#d4efa22ca9604cb2c8cdb9e492815ba37acfa0b2"