@forgeax/engine-audio-webaudio 0.0.0-dev.8d955ade1c79

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.
Files changed (65) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +135 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/audio-bus-name-owner.test-d.d.ts +2 -0
  5. package/dist/__tests__/audio-bus-name-owner.test-d.d.ts.map +1 -0
  6. package/dist/__tests__/audio-loader-contract.test.d.ts +2 -0
  7. package/dist/__tests__/audio-loader-contract.test.d.ts.map +1 -0
  8. package/dist/__tests__/audio-local-artifacts.test.d.ts +2 -0
  9. package/dist/__tests__/audio-local-artifacts.test.d.ts.map +1 -0
  10. package/dist/__tests__/audio-webaudio.browser.test.d.ts +2 -0
  11. package/dist/__tests__/audio-webaudio.browser.test.d.ts.map +1 -0
  12. package/dist/__tests__/audio-webaudio.unit.test.d.ts +2 -0
  13. package/dist/__tests__/audio-webaudio.unit.test.d.ts.map +1 -0
  14. package/dist/__tests__/gain-automation.unit.test.d.ts +2 -0
  15. package/dist/__tests__/gain-automation.unit.test.d.ts.map +1 -0
  16. package/dist/__tests__/host-audio-consumer.unit.test.d.ts +2 -0
  17. package/dist/__tests__/host-audio-consumer.unit.test.d.ts.map +1 -0
  18. package/dist/__tests__/root-surface.unit.test.d.ts +2 -0
  19. package/dist/__tests__/root-surface.unit.test.d.ts.map +1 -0
  20. package/dist/__tests__/spatial-cleanup.test.d.ts +2 -0
  21. package/dist/__tests__/spatial-cleanup.test.d.ts.map +1 -0
  22. package/dist/__tests__/web-audio-engine-decode-recovery.browser.test.d.ts +2 -0
  23. package/dist/__tests__/web-audio-engine-decode-recovery.browser.test.d.ts.map +1 -0
  24. package/dist/__tests__/web-audio-engine-decode-recovery.unit.test.d.ts +2 -0
  25. package/dist/__tests__/web-audio-engine-decode-recovery.unit.test.d.ts.map +1 -0
  26. package/dist/audio-importer.d.ts +17 -0
  27. package/dist/audio-importer.d.ts.map +1 -0
  28. package/dist/audio-importer.mjs +90 -0
  29. package/dist/audio-importer.mjs.map +1 -0
  30. package/dist/audio-listener-sync-system.d.ts +42 -0
  31. package/dist/audio-listener-sync-system.d.ts.map +1 -0
  32. package/dist/audio-loader.d.ts +4 -0
  33. package/dist/audio-loader.d.ts.map +1 -0
  34. package/dist/clip-loader.d.ts +4 -0
  35. package/dist/clip-loader.d.ts.map +1 -0
  36. package/dist/host-audio-consumer.d.ts +11 -0
  37. package/dist/host-audio-consumer.d.ts.map +1 -0
  38. package/dist/index.d.ts +7 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.mjs +544 -0
  41. package/dist/index.mjs.map +1 -0
  42. package/dist/plugin.d.ts +3 -0
  43. package/dist/plugin.d.ts.map +1 -0
  44. package/dist/web-audio-engine.d.ts +43 -0
  45. package/dist/web-audio-engine.d.ts.map +1 -0
  46. package/package.json +67 -0
  47. package/src/__tests__/audio-bus-name-owner.test-d.ts +21 -0
  48. package/src/__tests__/audio-loader-contract.test.ts +103 -0
  49. package/src/__tests__/audio-local-artifacts.test.ts +34 -0
  50. package/src/__tests__/audio-webaudio.browser.test.ts +311 -0
  51. package/src/__tests__/audio-webaudio.unit.test.ts +3031 -0
  52. package/src/__tests__/gain-automation.unit.test.ts +173 -0
  53. package/src/__tests__/host-audio-consumer.unit.test.ts +195 -0
  54. package/src/__tests__/root-surface.unit.test.ts +8 -0
  55. package/src/__tests__/spatial-cleanup.test.ts +85 -0
  56. package/src/__tests__/web-audio-engine-decode-recovery.browser.test.ts +125 -0
  57. package/src/__tests__/web-audio-engine-decode-recovery.unit.test.ts +93 -0
  58. package/src/audio-importer.ts +149 -0
  59. package/src/audio-listener-sync-system.ts +98 -0
  60. package/src/audio-loader.ts +55 -0
  61. package/src/clip-loader.ts +53 -0
  62. package/src/host-audio-consumer.ts +168 -0
  63. package/src/index.ts +31 -0
  64. package/src/plugin.ts +15 -0
  65. package/src/web-audio-engine.ts +411 -0
@@ -0,0 +1,17 @@
1
+ import { type Importer } from '@forgeax/engine-types';
2
+ /** Audio output identity is semantic and independent of source path/index. */
3
+ export declare function sourceKeyForAudioOutput(kind?: string): string | undefined;
4
+ /**
5
+ * The audio {@link Importer}. Register it into an `ImporterRegistry` so the
6
+ * import runner dispatches `meta.importer === 'audio'` sidecars here.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { ImporterRegistry } from '@forgeax/engine-import';
11
+ * import { audioImporter } from '@forgeax/engine-audio-webaudio/audio-importer';
12
+ * const importers = new ImporterRegistry();
13
+ * importers.register(audioImporter);
14
+ * ```
15
+ */
16
+ export declare const audioImporter: Importer;
17
+ //# sourceMappingURL=audio-importer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-importer.d.ts","sourceRoot":"","sources":["../src/audio-importer.ts"],"names":[],"mappings":"AA0BA,OAAO,EAKL,KAAK,QAAQ,EAEd,MAAM,uBAAuB,CAAC;AAE/B,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,IAAI,SAAU,GAAG,MAAM,GAAG,SAAS,CAG1E;AA8FD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,EAAE,QAG3B,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { ImportError, IMPORT_ERROR_HINTS } from '@forgeax/engine-types';
2
+
3
+ // src/audio-importer.ts
4
+ function sourceKeyForAudioOutput(kind = "audio") {
5
+ const normalizedKind = kind.trim();
6
+ return normalizedKind.length === 0 ? void 0 : `audio:${normalizedKind}`;
7
+ }
8
+ function audioMediaType(source) {
9
+ const lower = source.toLowerCase();
10
+ if (lower.endsWith(".wav")) return "audio/wav";
11
+ if (lower.endsWith(".mp3")) return "audio/mpeg";
12
+ if (lower.endsWith(".ogg")) return "audio/ogg";
13
+ if (lower.endsWith(".flac")) return "audio/flac";
14
+ return "application/octet-stream";
15
+ }
16
+ function validateAudioOutputTopology(ctx) {
17
+ if (ctx.subAssets.length === 1 && ctx.subAssets[0]?.kind === "audio") return void 0;
18
+ const actual = ctx.subAssets.length === 0 ? "subAssets[] is empty" : ctx.subAssets.map((sub, index) => `subAssets[${index}]=${sub.kind}:${sub.guid}`).join(", ");
19
+ return new ImportError({
20
+ code: "source-validation-failed",
21
+ expected: 'exactly one subAssets[] entry with kind "audio"',
22
+ actual,
23
+ hint: IMPORT_ERROR_HINTS["source-validation-failed"],
24
+ detail: {
25
+ diagnostics: [
26
+ {
27
+ code: "audio-subasset-topology",
28
+ severity: "error",
29
+ sourcePath: `${ctx.source}#subAssets`,
30
+ sourceRange: { start: 0, end: 0, line: 1, column: 1 },
31
+ rule: "audio-required-single-output",
32
+ expected: 'exactly one subAssets[] entry with kind "audio"',
33
+ actual,
34
+ hint: "declare exactly one audio sub-asset and remove foreign or duplicate entries"
35
+ }
36
+ ]
37
+ }
38
+ });
39
+ }
40
+ async function importAudio(ctx) {
41
+ const topologyError = validateAudioOutputTopology(ctx);
42
+ if (topologyError !== void 0) return { ok: false, error: topologyError };
43
+ const read = await ctx.readSource();
44
+ if (!read.ok) {
45
+ return {
46
+ ok: false,
47
+ error: new ImportError({
48
+ code: "source-read-failed",
49
+ expected: `readable source file at meta.source "${ctx.source}"`,
50
+ hint: IMPORT_ERROR_HINTS["source-read-failed"],
51
+ detail: {
52
+ source: ctx.source,
53
+ reason: read.error instanceof Error ? read.error.message : String(read.error)
54
+ }
55
+ })
56
+ };
57
+ }
58
+ const out = [];
59
+ for (const sub of ctx.subAssets) {
60
+ if (sub.kind !== "audio") continue;
61
+ const payload = {
62
+ kind: "audio",
63
+ mediaType: audioMediaType(ctx.source),
64
+ source: ctx.source,
65
+ bytes: read.value
66
+ };
67
+ out.push({
68
+ guid: sub.guid,
69
+ kind: "audio",
70
+ payload,
71
+ refs: [],
72
+ artifacts: {
73
+ source: {
74
+ mediaType: audioMediaType(ctx.source),
75
+ assetCodec: { name: "browser-audio" },
76
+ bytes: read.value
77
+ }
78
+ }
79
+ });
80
+ }
81
+ return { ok: true, value: { assets: out, sourceDependencies: [ctx.source] } };
82
+ }
83
+ var audioImporter = {
84
+ key: "audio",
85
+ import: importAudio
86
+ };
87
+
88
+ export { audioImporter, sourceKeyForAudioOutput };
89
+ //# sourceMappingURL=audio-importer.mjs.map
90
+ //# sourceMappingURL=audio-importer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/audio-importer.ts"],"names":[],"mappings":"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","file":"audio-importer.mjs","sourcesContent":["// audio-importer.ts - the build-time audioImporter (feat-20260603-asset-import-loader-injection M3 / w25).\n//\n// The `{ key: 'audio', import }` Importer the @forgeax/engine-import runner\n// dispatches a `*.meta.json` with `importer: 'audio'` to.\n//\n// SEMANTIC HETEROGENEITY (plan-strategy D-3 / requirements AC-18 callout):\n// audio is NOT like image / gltf. There is no JS decoder to strip out of the\n// runtime bundle -- the runtime decodes audio with the native Web Audio\n// `AudioContext.decodeAudioData` (clip-loader.ts), and the browser owns codec\n// selection (wav / mp3 / ogg / flac). So this importer is NOT a bundle\n// optimization: AC-16's bundle-delta evidence is image-only and does NOT\n// apply to audio. The audioImporter's value is the UNIFIED IMPORT ENTRY -- it\n// lets an audio source flow through the same declare -> import -> load\n// pipeline (meta.importer='audio') as every other asset family, so an AI user\n// reads one consistent import surface instead of an audio special case.\n//\n// The importer body MUST NOT call `AudioContext` / `decodeAudioData`: decode is\n// the runtime loader's job (clip-loader.ts, which fetches the source URL and\n// decodes in the browser). A decoded `AudioClipAsset` carries an `AudioBuffer`,\n// a runtime-only Web Audio object that cannot be produced at build time. The\n// importer therefore emits a thin pass-through descriptor (`kind: 'audio'` +\n// the source path) under the meta-declared GUID; the runtime resolves it to a\n// decoded clip at load time.\n//\n// GUID import-stable iron law: every produced GUID comes from `ctx.subAssets[]`.\n\nimport {\n IMPORT_ERROR_HINTS,\n type ImportContext,\n ImportError,\n type ImportedAsset,\n type Importer,\n type ImportResult,\n} from '@forgeax/engine-types';\n\n/** Audio output identity is semantic and independent of source path/index. */\nexport function sourceKeyForAudioOutput(kind = 'audio'): string | undefined {\n const normalizedKind = kind.trim();\n return normalizedKind.length === 0 ? undefined : `audio:${normalizedKind}`;\n}\n\nfunction audioMediaType(source: string): string {\n const lower = source.toLowerCase();\n if (lower.endsWith('.wav')) return 'audio/wav';\n if (lower.endsWith('.mp3')) return 'audio/mpeg';\n if (lower.endsWith('.ogg')) return 'audio/ogg';\n if (lower.endsWith('.flac')) return 'audio/flac';\n return 'application/octet-stream';\n}\n\nfunction validateAudioOutputTopology(ctx: ImportContext): ImportError | undefined {\n if (ctx.subAssets.length === 1 && ctx.subAssets[0]?.kind === 'audio') return undefined;\n\n const actual =\n ctx.subAssets.length === 0\n ? 'subAssets[] is empty'\n : ctx.subAssets.map((sub, index) => `subAssets[${index}]=${sub.kind}:${sub.guid}`).join(', ');\n\n return new ImportError({\n code: 'source-validation-failed',\n expected: 'exactly one subAssets[] entry with kind \"audio\"',\n actual,\n hint: IMPORT_ERROR_HINTS['source-validation-failed'],\n detail: {\n diagnostics: [\n {\n code: 'audio-subasset-topology',\n severity: 'error',\n sourcePath: `${ctx.source}#subAssets`,\n sourceRange: { start: 0, end: 0, line: 1, column: 1 },\n rule: 'audio-required-single-output',\n expected: 'exactly one subAssets[] entry with kind \"audio\"',\n actual,\n hint: 'declare exactly one audio sub-asset and remove foreign or duplicate entries',\n },\n ],\n },\n });\n}\n\nasync function importAudio(ctx: ImportContext): Promise<ImportResult> {\n const topologyError = validateAudioOutputTopology(ctx);\n if (topologyError !== undefined) return { ok: false, error: topologyError };\n\n // Probe the source is readable so a missing file fails the build (the runner\n // already probes, but this keeps the importer self-validating, P3). No decode\n // happens here -- decodeAudioData is the runtime loader's job.\n const read = await ctx.readSource();\n if (!read.ok) {\n return {\n ok: false,\n error: new ImportError({\n code: 'source-read-failed',\n expected: `readable source file at meta.source \"${ctx.source}\"`,\n hint: IMPORT_ERROR_HINTS['source-read-failed'],\n detail: {\n source: ctx.source,\n reason: read.error instanceof Error ? read.error.message : String(read.error),\n },\n }),\n };\n }\n\n const out: ImportedAsset[] = [];\n for (const sub of ctx.subAssets) {\n if (sub.kind !== 'audio') continue;\n // Thin pass-through descriptor: the runtime audio loader fetches the source\n // URL and decodes via the browser, so the build-time payload carries only\n // the source reference (no AudioBuffer; cast through the Asset slot like the\n // other importers' build-time POD-vs-runtime-handle bridges).\n const payload = {\n kind: 'audio',\n mediaType: audioMediaType(ctx.source),\n source: ctx.source,\n bytes: read.value,\n } as unknown as ImportedAsset['payload'];\n out.push({\n guid: sub.guid,\n kind: 'audio',\n payload,\n refs: [],\n artifacts: {\n source: {\n mediaType: audioMediaType(ctx.source),\n assetCodec: { name: 'browser-audio' },\n bytes: read.value,\n },\n },\n });\n }\n return { ok: true, value: { assets: out, sourceDependencies: [ctx.source] } };\n}\n\n/**\n * The audio {@link Importer}. Register it into an `ImporterRegistry` so the\n * import runner dispatches `meta.importer === 'audio'` sidecars here.\n *\n * @example\n * ```ts\n * import { ImporterRegistry } from '@forgeax/engine-import';\n * import { audioImporter } from '@forgeax/engine-audio-webaudio/audio-importer';\n * const importers = new ImporterRegistry();\n * importers.register(audioImporter);\n * ```\n */\nexport const audioImporter: Importer = {\n key: 'audio',\n import: importAudio,\n};\n"]}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Resolved world transform shape (feat-20260601 D-6): a single column-major
3
+ * mat4 carried as 16 contiguous floats -- the `Transform.world` column array
4
+ * view written by propagateTransforms.
5
+ */
6
+ export interface WorldMatrixData {
7
+ readonly worldMatrix: Float32Array;
8
+ }
9
+ /**
10
+ * Pure function: write a world mat4's position/orientation to the Web Audio
11
+ * listener's AudioParams.
12
+ *
13
+ * Exported for unit testing (listener-sync.test.ts) and for host assembly (the
14
+ * host reads `Transform.world` + AudioListener from the World and calls this
15
+ * each frame).
16
+ *
17
+ * - position = `mat4.getTranslation(world)` (col3, copied directly, not normalized)
18
+ * - forward = `mat4.getForward(world)` (-col2, normalized -- removes scale)
19
+ * - up = `mat4.getUp(world)` (col1, normalized -- removes scale)
20
+ *
21
+ * @param listener The Web Audio API AudioListener (from AudioContext.listener)
22
+ * @param worldMatrix The resolved world mat4 (16 column-major floats) of the
23
+ * entity carrying AudioListener.
24
+ */
25
+ export declare function syncListenerFromWorldMatrix(listener: AudioListener, worldMatrix: Float32Array): void;
26
+ /**
27
+ * Run the audio listener sync system for a host-owned audio context.
28
+ *
29
+ * The host is responsible for:
30
+ * 1. Querying the World for entities with AudioListener
31
+ * 2. Taking the first AudioListener entity (E-3)
32
+ * 3. Reading its `Transform.world` mat4 (16-float Float32Array)
33
+ * 4. Calling this function with the AudioContext's listener
34
+ *
35
+ * This function is a convenience wrapper that calls
36
+ * `syncListenerFromWorldMatrix(ctx.listener, worldMatrix)`.
37
+ *
38
+ * @param ctx The Web Audio AudioContext (whose .listener receives position/orientation)
39
+ * @param worldMatrix The `Transform.world` mat4 from the AudioListener entity
40
+ */
41
+ export declare function audioListenerSyncSystem(ctx: AudioContext, worldMatrix: Float32Array): void;
42
+ //# sourceMappingURL=audio-listener-sync-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-listener-sync-system.d.ts","sourceRoot":"","sources":["../src/audio-listener-sync-system.ts"],"names":[],"mappings":"AAiCA;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;CACpC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,YAAY,GACxB,IAAI,CAiBN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,GAAG,IAAI,CAE1F"}
@@ -0,0 +1,4 @@
1
+ import { type Loader } from '@forgeax/engine-types';
2
+ /** Loads an audio catalog row through the browser's native decoder. */
3
+ export declare const audioLoader: Loader;
4
+ //# sourceMappingURL=audio-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-loader.d.ts","sourceRoot":"","sources":["../src/audio-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,MAAM,EAA0B,MAAM,uBAAuB,CAAC;AAGxF,uEAAuE;AACvE,eAAO,MAAM,WAAW,EAAE,MAkDzB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { AudioError } from '@forgeax/engine-audio';
2
+ import { type AudioClipAsset, type Result } from '@forgeax/engine-types';
3
+ export declare function decodeAudioClipBytes(guid: string, bytes: Uint8Array, mediaType: `audio/${string}`): Promise<Result<AudioClipAsset, AudioError>>;
4
+ //# sourceMappingURL=clip-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clip-loader.d.ts","sourceRoot":"","sources":["../src/clip-loader.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,cAAc,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAElF,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CA6B7C"}
@@ -0,0 +1,11 @@
1
+ import { type AudioBackend, type AudioIntent, type AudioState } from '@forgeax/engine-audio';
2
+ import { WebAudioEngine } from './web-audio-engine';
3
+ export interface HostAudioConsumer {
4
+ consume(intent: AudioIntent): void;
5
+ state(): AudioState;
6
+ dispose(): void;
7
+ readonly engine: WebAudioEngine;
8
+ }
9
+ export declare function createHostAudioConsumer(engine?: WebAudioEngine): HostAudioConsumer;
10
+ export declare function createWebAudioBackend(): AudioBackend;
11
+ //# sourceMappingURL=host-audio-consumer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-audio-consumer.d.ts","sourceRoot":"","sources":["../src/host-audio-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAEhB,KAAK,UAAU,EAEhB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AASpD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACnC,KAAK,IAAI,UAAU,CAAC;IACpB,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AA0BD,wBAAgB,uBAAuB,CAAC,MAAM,iBAAuB,GAAG,iBAAiB,CA8GxF;AAED,wBAAgB,qBAAqB,IAAI,YAAY,CAOpD"}
@@ -0,0 +1,7 @@
1
+ export { AUDIO_ENGINE_RESOURCE_KEY, type AudioBackend } from '@forgeax/engine-audio';
2
+ export { audioListenerSyncSystem, syncListenerFromWorldMatrix, } from './audio-listener-sync-system';
3
+ export { audioLoader } from './audio-loader';
4
+ export { createHostAudioConsumer, createWebAudioBackend, type HostAudioConsumer, } from './host-audio-consumer';
5
+ export { webAudioPlugin } from './plugin';
6
+ export { WebAudioEngine } from './web-audio-engine';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,yBAAyB,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErF,OAAO,EACL,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}