@lucaismyname/ginger 0.0.57 → 0.0.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/dist/client.cjs +1 -1
- package/dist/client.js +2 -2
- package/dist/components/tracks/GingerDeclarativeMergeContext.d.ts +12 -0
- package/dist/components/tracks/GingerDeclarativeMergeContext.d.ts.map +1 -0
- package/dist/components/tracks/GingerTrack.d.ts +17 -0
- package/dist/components/tracks/GingerTrack.d.ts.map +1 -0
- package/dist/components/tracks/GingerTracks.d.ts +21 -0
- package/dist/components/tracks/GingerTracks.d.ts.map +1 -0
- package/dist/components/tracks/GingerTracks.test.d.ts +2 -0
- package/dist/components/tracks/GingerTracks.test.d.ts.map +1 -0
- package/dist/components/tracks/GingerTracksRegistryContext.d.ts +13 -0
- package/dist/components/tracks/GingerTracksRegistryContext.d.ts.map +1 -0
- package/dist/components/tracks/index.d.ts +5 -0
- package/dist/components/tracks/index.d.ts.map +1 -0
- package/dist/components/tracks/mergeDeclarativeQueue.d.ts +6 -0
- package/dist/components/tracks/mergeDeclarativeQueue.d.ts.map +1 -0
- package/dist/context/GingerProvider.d.ts.map +1 -1
- package/dist/{ginger-BHu7Ofna.js → ginger-Bc_8qZYi.js} +902 -766
- package/dist/ginger-Bc_8qZYi.js.map +1 -0
- package/dist/ginger-DJwWdIp0.cjs +2 -0
- package/dist/ginger-DJwWdIp0.cjs.map +1 -0
- package/dist/ginger.d.ts +5 -0
- package/dist/ginger.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/testing/index.cjs +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/{useGingerChapterProgress-DAIWjAtG.js → useGingerChapterProgress-CGe9W-te.js} +2 -2
- package/dist/{useGingerChapterProgress-DAIWjAtG.js.map → useGingerChapterProgress-CGe9W-te.js.map} +1 -1
- package/dist/{useGingerChapterProgress-DLx-LayX.cjs → useGingerChapterProgress-EbJNY5jt.cjs} +2 -2
- package/dist/{useGingerChapterProgress-DLx-LayX.cjs.map → useGingerChapterProgress-EbJNY5jt.cjs.map} +1 -1
- package/package.json +2 -2
- package/dist/ginger-B-W73LQC.cjs +0 -2
- package/dist/ginger-B-W73LQC.cjs.map +0 -1
- package/dist/ginger-BHu7Ofna.js.map +0 -1
package/README.md
CHANGED
|
@@ -847,6 +847,32 @@ function PlaylistManual() {
|
|
|
847
847
|
}
|
|
848
848
|
```
|
|
849
849
|
|
|
850
|
+
### `Ginger.Tracks` and `Ginger.Track`
|
|
851
|
+
|
|
852
|
+
Declare queue entries in JSX instead of (or in addition to) the `initialTracks` array. **`Ginger.Track`** renders nothing; it registers a [`Track`](#track) with the nearest **`Ginger.Tracks`** wrapper, which syncs the merged queue on each update. **`Ginger.Playlist.Track`** remains the **row UI** (it takes an **`index`** into the existing queue); **`Ginger.Track`** is **data only**.
|
|
853
|
+
|
|
854
|
+
| Prop (`Ginger.Tracks`) | Type | Default | Description |
|
|
855
|
+
|--------|------|---------|-------------|
|
|
856
|
+
| `merge` | `"append" \| "prepend" \| "replace"` | `"append"` | How to combine declarative tracks with `initialTracks` from `Ginger.Provider`: **`append`** → `[...initialTracks, ...declarative]`; **`prepend`** → `[...declarative, ...initialTracks]`; **`replace`** → declarative tracks only (snapshot of `initialTracks` from props is ignored for this subtree’s sync). |
|
|
857
|
+
| `...rest` | `HTMLAttributes<HTMLDivElement>` | - | Passed to a wrapper with `display: contents` (layout-neutral). |
|
|
858
|
+
|
|
859
|
+
**`Ginger.Track`** accepts the same fields as [`Track`](#track). **`title`** is required; provide **`fileUrl`** or **`src`** (alias for `fileUrl`). Optional **`id`** keeps a stable identity when reordering JSX.
|
|
860
|
+
|
|
861
|
+
The merge snapshot uses the provider’s latest **`initialTracks` props** (via an internal ref). If you change the queue only with **`setQueue()`** and not via props, a later sync from **`Ginger.Tracks`** can realign the queue with props + declarative children again—prefer updating **`initialTracks`** when mixing approaches, or rely on **`merge="replace"`** with only declarative children.
|
|
862
|
+
|
|
863
|
+
**Shuffle:** each declarative sync dispatches **`SET_QUEUE`**, which clears shuffle state (same as imperative `setQueue`). Avoid heavy declarative churn while shuffle is on if you need shuffle to persist.
|
|
864
|
+
|
|
865
|
+
```tsx
|
|
866
|
+
<Ginger.Provider initialTracks={[{ id: "a", title: "Intro", fileUrl: "/a.mp3" }]}>
|
|
867
|
+
<Ginger.Tracks merge="append">
|
|
868
|
+
<Ginger.Track title="Main" src="/b.mp3" artist="Band" />
|
|
869
|
+
<Ginger.Track title="Outro" fileUrl="/c.mp3" />
|
|
870
|
+
</Ginger.Tracks>
|
|
871
|
+
<Ginger.Player />
|
|
872
|
+
<Ginger.Playlist />
|
|
873
|
+
</Ginger.Provider>
|
|
874
|
+
```
|
|
875
|
+
|
|
850
876
|
## Types
|
|
851
877
|
|
|
852
878
|
### `Track`
|
package/dist/client.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ginger-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ginger-DJwWdIp0.cjs"),s=require("./useGinger-BMRLzjmr.cjs"),r=require("./useGingerChapterProgress-EbJNY5jt.cjs"),a=require("./liveAudioGraph-0cpHD_Ic.cjs"),n=require("./selectors-CEGlYoFu.cjs"),i=require("./GingerSplitContexts-KSB0vQ5F.cjs");exports.Chapters=e.Chapters;exports.Ginger=e.Ginger;exports.LyricsSynced=e.LyricsSynced;exports.Pause=e.Pause;exports.Play=e.Play;exports.RepeatGlyph=e.RepeatGlyph;exports.ShuffleIcon=e.ShuffleIcon;exports.SkipBack=e.SkipBack;exports.SkipForward=e.SkipForward;exports.Volume2=e.Volume2;exports.VolumeX=e.VolumeX;exports.Wrapper=e.Wrapper;exports.clampPlaybackRate=e.clampPlaybackRate;exports.clampVolume=e.clampVolume;exports.defaultGingerLocale=e.defaultGingerLocale;exports.parseLrc=e.parseLrc;exports.useGingerChapters=e.useGingerChapters;exports.useGingerLocale=e.useGingerLocale;exports.useGingerLyricsSync=e.useGingerLyricsSync;exports.usePlayPauseBinding=e.usePlayPauseBinding;exports.useSeekBarBinding=e.useSeekBarBinding;exports.useVolumeSlider=e.useVolumeSlider;exports.useGinger=s.useGinger;exports.createGingerStore=r.createGingerStore;exports.useGingerChapterProgress=r.useGingerChapterProgress;exports.useGingerDebugLog=r.useGingerDebugLog;exports.useGingerKeyboardShortcuts=r.useGingerKeyboardShortcuts;exports.useGingerLiveAnalyzer=r.useGingerLiveAnalyzer;exports.useGingerPlaybackHistory=r.useGingerPlaybackHistory;exports.useGingerSleepTimer=r.useGingerSleepTimer;exports.useGingerVolumeFade=r.useGingerVolumeFade;exports.useNextTrackPrefetch=r.useNextTrackPrefetch;exports.useSeekDrag=r.useSeekDrag;exports.attachLiveAnalyser=a.attachLiveAnalyser;exports.detachLiveAnalyser=a.detachLiveAnalyser;exports.setProcessingChain=a.setProcessingChain;exports.derivePlaybackUiState=n.derivePlaybackUiState;exports.gingerStateFromContextValues=i.gingerStateFromContextValues;exports.gingerStateFromContexts=i.gingerStateFromContexts;exports.useGingerMedia=i.useGingerMedia;exports.useGingerMediaControls=i.useGingerMediaControls;exports.useGingerPlayback=i.useGingerPlayback;exports.useGingerState=i.useGingerState;exports.useGingerTime=i.useGingerTime;
|
|
2
2
|
//# sourceMappingURL=client.cjs.map
|
package/dist/client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { C as s, G as r, L as i, P as u, a as n, R as t, S as o, b as g, c as l, V as c, d as G, W as p, e as d, f as m, g as y, p as S, u as f, h, i as P, j as k, k as L, l as b } from "./ginger-
|
|
1
|
+
import { C as s, G as r, L as i, P as u, a as n, R as t, S as o, b as g, c as l, V as c, d as G, W as p, e as d, f as m, g as y, p as S, u as f, h, i as P, j as k, k as L, l as b } from "./ginger-Bc_8qZYi.js";
|
|
2
2
|
import { u as C } from "./useGinger-DKrHZ4NU.js";
|
|
3
|
-
import { c as v, u as B, a as F, b as A, d as R, e as T, f as D, g as M, h as W, i as j } from "./useGingerChapterProgress-
|
|
3
|
+
import { c as v, u as B, a as F, b as A, d as R, e as T, f as D, g as M, h as W, i as j } from "./useGingerChapterProgress-CGe9W-te.js";
|
|
4
4
|
import { a as z, d as H, s as I } from "./liveAudioGraph-DvPaxBCP.js";
|
|
5
5
|
import { d as N } from "./selectors-BT3WSsKN.js";
|
|
6
6
|
import { g as X, a as q, u as E, b as J, c as O, d as Q, e as Y } from "./GingerSplitContexts-DQ3rESBu.js";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { Track } from '../../types';
|
|
3
|
+
export type GingerDeclarativeMergeContextValue = {
|
|
4
|
+
/** Latest `initialTracks` from `Ginger.Provider` props (via `latestInitRef`). */
|
|
5
|
+
getInitialTracksSnapshot: () => Track[];
|
|
6
|
+
};
|
|
7
|
+
export declare function GingerDeclarativeMergeProvider({ children, value, }: {
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
value: GingerDeclarativeMergeContextValue;
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function useGingerDeclarativeMerge(): GingerDeclarativeMergeContextValue | null;
|
|
12
|
+
//# sourceMappingURL=GingerDeclarativeMergeContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerDeclarativeMergeContext.d.ts","sourceRoot":"","sources":["../../../src/components/tracks/GingerDeclarativeMergeContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAA6B,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,kCAAkC,GAAG;IAC/C,iFAAiF;IACjF,wBAAwB,EAAE,MAAM,KAAK,EAAE,CAAC;CACzC,CAAC;AAMF,wBAAgB,8BAA8B,CAAC,EAC7C,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,kCAAkC,CAAC;CAC3C,2CAMA;AAED,wBAAgB,yBAAyB,IAAI,kCAAkC,GAAG,IAAI,CAErF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Track } from '../../types';
|
|
2
|
+
/** Props for declarative queue entries; `title` and `fileUrl` or `src` are required. */
|
|
3
|
+
export type GingerTrackProps = Omit<Partial<Track>, "fileUrl" | "title"> & {
|
|
4
|
+
title: string;
|
|
5
|
+
fileUrl?: string;
|
|
6
|
+
/** Alias for `fileUrl`. */
|
|
7
|
+
src?: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Declarative queue entry. Renders nothing; registers a {@link Track} with the nearest parent
|
|
11
|
+
* {@link GingerTracks}. Must be a descendant of `<Ginger.Tracks>`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function GingerTrack(props: GingerTrackProps): null;
|
|
14
|
+
export declare namespace GingerTrack {
|
|
15
|
+
var displayName: string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=GingerTrack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerTrack.d.ts","sourceRoot":"","sources":["../../../src/components/tracks/GingerTrack.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,wFAAwF;AACxF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAmDF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,QAUlD;yBAVe,WAAW"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import { GingerTracksMergeMode } from './mergeDeclarativeQueue';
|
|
3
|
+
export type GingerTracksProps = Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
/**
|
|
6
|
+
* How to combine declarative `Ginger.Track` entries with `initialTracks` from `Ginger.Provider`.
|
|
7
|
+
* - `append` (default): `[...initialTracks, ...declarative]`
|
|
8
|
+
* - `prepend`: `[...declarative, ...initialTracks]`
|
|
9
|
+
* - `replace`: declarative tracks only (`initialTracks` ignored for this subtree’s sync)
|
|
10
|
+
*/
|
|
11
|
+
merge?: GingerTracksMergeMode;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Declarative queue definition via `Ginger.Track` children. Coexists with `initialTracks` on the
|
|
15
|
+
* provider and imperative APIs; see `merge` for combination rules.
|
|
16
|
+
*/
|
|
17
|
+
export declare function GingerTracks({ children, merge, style, hidden: _hidden, ...rest }: GingerTracksProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export declare namespace GingerTracks {
|
|
19
|
+
var displayName: string;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=GingerTracks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerTracks.d.ts","sourceRoot":"","sources":["../../../src/components/tracks/GingerTracks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAA2B,MAAM,OAAO,CAAC;AAMrF,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IACjF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B,CAAC;AAqCF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,KAAgB,EAChB,KAAK,EACL,MAAM,EAAE,OAAO,EACf,GAAG,IAAI,EACR,EAAE,iBAAiB,2CAiBnB;yBAvBe,YAAY"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerTracks.test.d.ts","sourceRoot":"","sources":["../../../src/components/tracks/GingerTracks.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { Track } from '../../types';
|
|
3
|
+
/** Mutable registry cleared at the start of each `Ginger.Tracks` render, then filled by child `Ginger.Track` renders. */
|
|
4
|
+
export type GingerTracksRegistry = {
|
|
5
|
+
slots: Map<string, Track>;
|
|
6
|
+
order: string[];
|
|
7
|
+
};
|
|
8
|
+
export declare function GingerTracksRegistryProvider({ children, value, }: {
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
value: GingerTracksRegistry;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function useGingerTracksRegistry(): GingerTracksRegistry;
|
|
13
|
+
//# sourceMappingURL=GingerTracksRegistryContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GingerTracksRegistryContext.d.ts","sourceRoot":"","sources":["../../../src/components/tracks/GingerTracksRegistryContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAA6B,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,yHAAyH;AACzH,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAIF,wBAAgB,4BAA4B,CAAC,EAC3C,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,oBAAoB,CAAC;CAC7B,2CAMA;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAM9D"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { GingerDeclarativeMergeProvider, useGingerDeclarativeMerge, type GingerDeclarativeMergeContextValue, } from './GingerDeclarativeMergeContext';
|
|
2
|
+
export { GingerTrack, type GingerTrackProps } from './GingerTrack';
|
|
3
|
+
export { GingerTracks, type GingerTracksProps } from './GingerTracks';
|
|
4
|
+
export { type GingerTracksMergeMode, mergeDeclarativeQueue, tracksQueueShallowEqual, } from './mergeDeclarativeQueue';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/tracks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,KAAK,kCAAkC,GACxC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,KAAK,qBAAqB,EAC1B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Track } from '../../types';
|
|
2
|
+
export type GingerTracksMergeMode = "append" | "prepend" | "replace";
|
|
3
|
+
export declare function mergeDeclarativeQueue(merge: GingerTracksMergeMode, initialSnapshot: Track[], declarative: Track[]): Track[];
|
|
4
|
+
/** Avoids redundant `SET_QUEUE` dispatches when merged queue is unchanged. */
|
|
5
|
+
export declare function tracksQueueShallowEqual(a: Track[], b: Track[]): boolean;
|
|
6
|
+
//# sourceMappingURL=mergeDeclarativeQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeDeclarativeQueue.d.ts","sourceRoot":"","sources":["../../../src/components/tracks/mergeDeclarativeQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,qBAAqB,EAC5B,eAAe,EAAE,KAAK,EAAE,EACxB,WAAW,EAAE,KAAK,EAAE,GACnB,KAAK,EAAE,CAWT;AAED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,CAgBvE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GingerProvider.d.ts","sourceRoot":"","sources":["../../src/context/GingerProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GingerProvider.d.ts","sourceRoot":"","sources":["../../src/context/GingerProvider.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAEV,mBAAmB,EAMpB,MAAM,UAAU,CAAC;AA2BlB,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,aAAkB,EAClB,YAAgB,EAChB,mBAA0B,EAC1B,cAAsB,EACtB,iBAAyB,EACzB,mBAAgC,EAChC,aAAoB,EACpB,aAAiB,EACjB,YAAoB,EACpB,mBAAuB,EACvB,eAAe,EACf,MAAM,EACN,YAAoB,EACpB,UAAU,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAsB,EACtB,mBAA2B,EAC3B,QAAgB,EAChB,OAAe,EACf,SAAS,EACT,KAAK,EACL,GAAG,EAAE,OAAO,EACZ,2BAA+B,EAC/B,aAAa,EACb,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,MAAM,EACN,UAAU,GACX,EAAE,mBAAmB,2CA8yBrB"}
|