@effect-uai/core 0.17.0 → 0.18.0

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 (79) hide show
  1. package/README.md +1 -1
  2. package/dist/decision-model/Decision.test.mjs +4 -4
  3. package/dist/dist-C8RmtoR8.mjs +172 -0
  4. package/dist/dist-C8RmtoR8.mjs.map +1 -0
  5. package/dist/dist-CorQTQL-.mjs +1533 -0
  6. package/dist/dist-CorQTQL-.mjs.map +1 -0
  7. package/dist/dist-DNeuh84d.mjs +7 -0
  8. package/dist/dist-DNeuh84d.mjs.map +1 -0
  9. package/dist/dist-DzeSyeYF.mjs +10253 -0
  10. package/dist/dist-DzeSyeYF.mjs.map +1 -0
  11. package/dist/domain/Transcript.test.mjs +3 -3
  12. package/dist/domain/Turn.test.mjs +2 -2
  13. package/dist/embedding-model/EmbeddingModel.test.mjs +2 -2
  14. package/dist/embedding-model/EmbeddingModel.test.mjs.map +1 -1
  15. package/dist/index.C4tKZ0yW-LuFnBtmu.mjs +7042 -0
  16. package/dist/index.C4tKZ0yW-LuFnBtmu.mjs.map +1 -0
  17. package/dist/language-model/LanguageModel.test.mjs +2 -2
  18. package/dist/loop/Loop.mjs.map +1 -1
  19. package/dist/loop/Loop.test.mjs +3 -3
  20. package/dist/math/Probability.test.mjs +2 -2
  21. package/dist/messenger/MessengerAdapter.test.mjs +3 -3
  22. package/dist/music-generator/MusicGenerator.test.mjs +3 -3
  23. package/dist/observability/Metrics.test.mjs +3 -3
  24. package/dist/observability/Telemetry.d.mts +1 -1
  25. package/dist/observability/Telemetry.mjs +1 -1
  26. package/dist/observability/Telemetry.mjs.map +1 -1
  27. package/dist/observability/Telemetry.test.mjs +4 -4
  28. package/dist/observability/Telemetry.test.mjs.map +1 -1
  29. package/dist/realtime/RealtimeSession.test.mjs +4 -4
  30. package/dist/retry/Retry.test.mjs +2 -2
  31. package/dist/speech-synthesizer/SpeechSynthesizer.test.mjs +3 -3
  32. package/dist/streaming/JSONL.test.mjs +2 -2
  33. package/dist/streaming/Multipart.d.mts +1 -1
  34. package/dist/streaming/Multipart.mjs +1 -1
  35. package/dist/streaming/Multipart.mjs.map +1 -1
  36. package/dist/streaming/SSE.d.mts +1 -1
  37. package/dist/streaming/SSE.mjs +2 -2
  38. package/dist/streaming/SSE.mjs.map +1 -1
  39. package/dist/streaming/SSE.test.mjs +2 -2
  40. package/dist/streaming/Settle.test.mjs +3 -3
  41. package/dist/streaming/WebSocketSession.d.mts +5 -3
  42. package/dist/streaming/WebSocketSession.d.mts.map +1 -1
  43. package/dist/streaming/WebSocketSession.mjs +22 -10
  44. package/dist/streaming/WebSocketSession.mjs.map +1 -1
  45. package/dist/streaming/WebSocketSession.test.mjs +41 -5
  46. package/dist/streaming/WebSocketSession.test.mjs.map +1 -1
  47. package/dist/structured-format/StructuredFormat.mjs.map +1 -1
  48. package/dist/structured-format/StructuredFormat.test.mjs +2 -2
  49. package/dist/testing/FakeWebSocket.d.mts +5 -1
  50. package/dist/testing/FakeWebSocket.d.mts.map +1 -1
  51. package/dist/testing/FakeWebSocket.mjs +12 -6
  52. package/dist/testing/FakeWebSocket.mjs.map +1 -1
  53. package/dist/tool/Approval.test.mjs +2 -2
  54. package/dist/tool/Tool.mjs.map +1 -1
  55. package/dist/tool/Tool.test.mjs +3 -3
  56. package/dist/tool/Toolkit.test.mjs +3 -3
  57. package/dist/transcriber/Transcriber.test.mjs +3 -3
  58. package/package.json +3 -3
  59. package/src/embedding-model/EmbeddingModel.test.ts +2 -2
  60. package/src/loop/Loop.ts +1 -1
  61. package/src/observability/Telemetry.test.ts +1 -1
  62. package/src/observability/Telemetry.ts +2 -2
  63. package/src/streaming/Multipart.ts +1 -1
  64. package/src/streaming/SSE.ts +2 -2
  65. package/src/streaming/WebSocketSession.test.ts +54 -2
  66. package/src/streaming/WebSocketSession.ts +27 -6
  67. package/src/structured-format/StructuredFormat.ts +1 -1
  68. package/src/testing/FakeWebSocket.ts +21 -6
  69. package/src/tool/Tool.ts +1 -1
  70. package/dist/dist-BaenoU1A.mjs +0 -145
  71. package/dist/dist-BaenoU1A.mjs.map +0 -1
  72. package/dist/dist-nohcnkD6.mjs +0 -182
  73. package/dist/dist-nohcnkD6.mjs.map +0 -1
  74. package/dist/magic-string.es-CB2hOw9v.mjs +0 -1014
  75. package/dist/magic-string.es-CB2hOw9v.mjs.map +0 -1
  76. package/dist/test.DNmyFkvJ-YPzDR0Co.mjs +0 -10254
  77. package/dist/test.DNmyFkvJ-YPzDR0Co.mjs.map +0 -1
  78. package/dist/utils-CiH_DjFW.mjs +0 -3918
  79. package/dist/utils-CiH_DjFW.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { accumulatePartials } from "./Transcript.mjs";
2
- import { o as describe } from "../utils-CiH_DjFW.mjs";
3
- import { n as globalExpect } from "../test.DNmyFkvJ-YPzDR0Co.mjs";
4
- import { t as it } from "../dist-nohcnkD6.mjs";
2
+ import { m as describe } from "../dist-DzeSyeYF.mjs";
3
+ import { n as globalExpect } from "../index.C4tKZ0yW-LuFnBtmu.mjs";
4
+ import { t as it } from "../dist-C8RmtoR8.mjs";
5
5
  import { Effect, Queue, Ref, Stream } from "effect";
6
6
  import { TestClock } from "effect/testing";
7
7
  //#region src/domain/Transcript.test.ts
@@ -1,7 +1,7 @@
1
1
  import { assistantText, systemText, userText } from "./Items.mjs";
2
2
  import { assistantText as assistantText$1, assistantTexts } from "./Turn.mjs";
3
- import { m as it, o as describe } from "../utils-CiH_DjFW.mjs";
4
- import { n as globalExpect } from "../test.DNmyFkvJ-YPzDR0Co.mjs";
3
+ import { b as it, m as describe } from "../dist-DzeSyeYF.mjs";
4
+ import { n as globalExpect } from "../index.C4tKZ0yW-LuFnBtmu.mjs";
5
5
  //#region src/domain/Turn.test.ts
6
6
  const turnOf = (items) => ({
7
7
  items,
@@ -1,6 +1,6 @@
1
1
  import { embed, embedMany } from "./EmbeddingModel.mjs";
2
- import { m as it, o as describe } from "../utils-CiH_DjFW.mjs";
3
- import { t as import_dist } from "../dist-BaenoU1A.mjs";
2
+ import { b as it, m as describe } from "../dist-DzeSyeYF.mjs";
3
+ import { t as import_dist } from "../dist-DNeuh84d.mjs";
4
4
  //#region src/embedding-model/EmbeddingModel.test.ts
5
5
  describe("EmbedResponse<E> conditional narrowing", () => {
6
6
  it("defaults to Float32Embedding when E is undefined", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddingModel.test.mjs","names":[],"sources":["../../src/embedding-model/EmbeddingModel.test.ts"],"sourcesContent":["import { Effect } from \"effect\"\nimport { describe, expectTypeOf, it } from \"vitest\"\nimport type * as AiError from \"../domain/AiError.js\"\nimport type {\n BinaryEmbedding,\n Float32Embedding,\n Int8Embedding,\n MultivectorEmbedding,\n SparseEmbedding,\n} from \"./Embedding.js\"\nimport {\n type EmbedEncoding,\n embed,\n embedMany,\n type EmbedManyResponse,\n type EmbedResponse,\n EmbeddingModel,\n} from \"./EmbeddingModel.js\"\n\n// Type-level tests only. The actual narrowing happens at the type system\n// boundary — the runtime impl is exercised in provider-specific test files.\ndescribe(\"EmbedResponse<E> conditional narrowing\", () => {\n it(\"defaults to Float32Embedding when E is undefined\", () => {\n expectTypeOf<EmbedResponse>().toEqualTypeOf<{\n readonly embedding: Float32Embedding\n readonly usage: import(\"./Embedding.js\").Usage\n }>()\n })\n\n it(\"maps each encoding literal to the matching Embedding variant\", () => {\n expectTypeOf<EmbedResponse<\"float32\">[\"embedding\"]>().toEqualTypeOf<Float32Embedding>()\n expectTypeOf<EmbedResponse<\"int8\">[\"embedding\"]>().toEqualTypeOf<Int8Embedding>()\n expectTypeOf<EmbedResponse<\"binary\">[\"embedding\"]>().toEqualTypeOf<BinaryEmbedding>()\n expectTypeOf<EmbedResponse<\"sparse\">[\"embedding\"]>().toEqualTypeOf<SparseEmbedding>()\n expectTypeOf<EmbedResponse<\"multivector\">[\"embedding\"]>().toEqualTypeOf<MultivectorEmbedding>()\n })\n\n it(\"falls back to the open Embedding union when E is the full EmbedEncoding\", () => {\n expectTypeOf<EmbedResponse<EmbedEncoding>[\"embedding\"]>().toEqualTypeOf<\n Float32Embedding | Int8Embedding | BinaryEmbedding | SparseEmbedding | MultivectorEmbedding\n >()\n })\n})\n\ndescribe(\"EmbedManyResponse<E> mirrors EmbedResponse<E>\", () => {\n it(\"defaults to ReadonlyArray<Float32Embedding>\", () => {\n expectTypeOf<EmbedManyResponse[\"embeddings\"]>().toEqualTypeOf<ReadonlyArray<Float32Embedding>>()\n })\n\n it(\"narrows per encoding\", () => {\n expectTypeOf<EmbedManyResponse<\"int8\">[\"embeddings\"]>().toEqualTypeOf<\n ReadonlyArray<Int8Embedding>\n >()\n })\n})\n\ndescribe(\"embed / embedMany free exports preserve E in their return type\", () => {\n it(\"embed with no encoding returns EmbedResponse<undefined> = Float32\", () => {\n const result = embed({ input: \"x\", model: \"m\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<undefined>, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"embed with encoding: int8 returns EmbedResponse<int8>\", () => {\n const result = embed({ input: \"x\", model: \"m\", encoding: \"int8\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<\"int8\">, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"embedMany with encoding: binary returns EmbedManyResponse<binary>\", () => {\n const result = embedMany({ inputs: [\"x\"], model: \"m\", encoding: \"binary\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedManyResponse<\"binary\">, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"rejects non-dense encodings on the generic path (trimmed EmbedEncoding)\", () => {\n // `sparse` / `multivector` are Jina-only representation kinds, not part\n // of the cross-provider request set. Requesting them on the generic\n // helper is a compile error; they're reachable only via the typed\n // `JinaEmbedding` tag.\n // These calls exist only to assert the encoding is a compile error; they\n // are intentionally never run, so the floating-effect check is off here.\n // @effect-diagnostics effect/floatingEffect:off\n // @ts-expect-error \"multivector\" is not an EmbedEncoding\n embedMany({ inputs: [\"x\"], model: \"m\", encoding: \"multivector\" })\n // @ts-expect-error \"sparse\" is not an EmbedEncoding\n embed({ input: \"x\", model: \"m\", encoding: \"sparse\" })\n // @effect-diagnostics effect/floatingEffect:error\n })\n\n it(\"when the request is widened to CommonEmbedRequest, the response is the open union\", () => {\n // Demonstrates the documented case: annotating the request type erases\n // the literal `encoding` and the response falls back to `Embedding`.\n const req: { input: string; model: string; encoding?: EmbedEncoding } = {\n input: \"x\",\n model: \"m\",\n encoding: \"int8\",\n }\n const result = embed(req)\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<EmbedEncoding>, AiError.AiError, EmbeddingModel>\n >()\n })\n})\n"],"mappings":";;;;AAqBA,SAAS,gDAAgD;CACvD,GAAG,0DAA0D;EAC3D,CAAA,GAAA,YAAA,aAAA,CAA4B,CAAC,CAAC,cAG3B;CACL,CAAC;CAED,GAAG,sEAAsE;EACvE,CAAA,GAAA,YAAA,aAAA,CAAoD,CAAC,CAAC,cAAgC;EACtF,CAAA,GAAA,YAAA,aAAA,CAAiD,CAAC,CAAC,cAA6B;EAChF,CAAA,GAAA,YAAA,aAAA,CAAmD,CAAC,CAAC,cAA+B;EACpF,CAAA,GAAA,YAAA,aAAA,CAAmD,CAAC,CAAC,cAA+B;EACpF,CAAA,GAAA,YAAA,aAAA,CAAwD,CAAC,CAAC,cAAoC;CAChG,CAAC;CAED,GAAG,iFAAiF;EAClF,CAAA,GAAA,YAAA,aAAA,CAAwD,CAAC,CAAC,cAExD;CACJ,CAAC;AACH,CAAC;AAED,SAAS,uDAAuD;CAC9D,GAAG,qDAAqD;EACtD,CAAA,GAAA,YAAA,aAAA,CAA8C,CAAC,CAAC,cAA+C;CACjG,CAAC;CAED,GAAG,8BAA8B;EAC/B,CAAA,GAAA,YAAA,aAAA,CAAsD,CAAC,CAAC,cAEtD;CACJ,CAAC;AACH,CAAC;AAED,SAAS,wEAAwE;CAC/E,GAAG,2EAA2E;EAC5E,MAAM,SAAS,MAAM;GAAE,OAAO;GAAK,OAAO;EAAI,CAAC;EAC/C,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;CAED,GAAG,+DAA+D;EAChE,MAAM,SAAS,MAAM;GAAE,OAAO;GAAK,OAAO;GAAK,UAAU;EAAO,CAAC;EACjE,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;CAED,GAAG,2EAA2E;EAC5E,MAAM,SAAS,UAAU;GAAE,QAAQ,CAAC,GAAG;GAAG,OAAO;GAAK,UAAU;EAAS,CAAC;EAC1E,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;CAED,GAAG,iFAAiF;EASlF,UAAU;GAAE,QAAQ,CAAC,GAAG;GAAG,OAAO;GAAK,UAAU;EAAc,CAAC;EAEhE,MAAM;GAAE,OAAO;GAAK,OAAO;GAAK,UAAU;EAAS,CAAC;CAEtD,CAAC;CAED,GAAG,2FAA2F;EAQ5F,MAAM,SAAS,MAAM;GAJnB,OAAO;GACP,OAAO;GACP,UAAU;EAEW,CAAC;EACxB,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"EmbeddingModel.test.mjs","names":[],"sources":["../../src/embedding-model/EmbeddingModel.test.ts"],"sourcesContent":["import { Effect } from \"effect\"\nimport { describe, expectTypeOf, it } from \"vitest\"\nimport type * as AiError from \"../domain/AiError.js\"\nimport type {\n BinaryEmbedding,\n Float32Embedding,\n Int8Embedding,\n MultivectorEmbedding,\n SparseEmbedding,\n} from \"./Embedding.js\"\nimport {\n type EmbedEncoding,\n embed,\n embedMany,\n type EmbedManyResponse,\n type EmbedResponse,\n EmbeddingModel,\n} from \"./EmbeddingModel.js\"\n\n// Type-level tests only. The actual narrowing happens at the type system\n// boundary — the runtime impl is exercised in provider-specific test files.\ndescribe(\"EmbedResponse<E> conditional narrowing\", () => {\n it(\"defaults to Float32Embedding when E is undefined\", () => {\n expectTypeOf<EmbedResponse>().toEqualTypeOf<{\n readonly embedding: Float32Embedding\n readonly usage: import(\"./Embedding.js\").Usage\n }>()\n })\n\n it(\"maps each encoding literal to the matching Embedding variant\", () => {\n expectTypeOf<EmbedResponse<\"float32\">[\"embedding\"]>().toEqualTypeOf<Float32Embedding>()\n expectTypeOf<EmbedResponse<\"int8\">[\"embedding\"]>().toEqualTypeOf<Int8Embedding>()\n expectTypeOf<EmbedResponse<\"binary\">[\"embedding\"]>().toEqualTypeOf<BinaryEmbedding>()\n expectTypeOf<EmbedResponse<\"sparse\">[\"embedding\"]>().toEqualTypeOf<SparseEmbedding>()\n expectTypeOf<EmbedResponse<\"multivector\">[\"embedding\"]>().toEqualTypeOf<MultivectorEmbedding>()\n })\n\n it(\"falls back to the open Embedding union when E is the full EmbedEncoding\", () => {\n expectTypeOf<EmbedResponse<EmbedEncoding>[\"embedding\"]>().toEqualTypeOf<\n Float32Embedding | Int8Embedding | BinaryEmbedding | SparseEmbedding | MultivectorEmbedding\n >()\n })\n})\n\ndescribe(\"EmbedManyResponse<E> mirrors EmbedResponse<E>\", () => {\n it(\"defaults to ReadonlyArray<Float32Embedding>\", () => {\n expectTypeOf<EmbedManyResponse[\"embeddings\"]>().toEqualTypeOf<ReadonlyArray<Float32Embedding>>()\n })\n\n it(\"narrows per encoding\", () => {\n expectTypeOf<EmbedManyResponse<\"int8\">[\"embeddings\"]>().toEqualTypeOf<\n ReadonlyArray<Int8Embedding>\n >()\n })\n})\n\ndescribe(\"embed / embedMany free exports preserve E in their return type\", () => {\n it(\"embed with no encoding returns EmbedResponse<undefined> = Float32\", () => {\n const result = embed({ input: \"x\", model: \"m\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<undefined>, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"embed with encoding: int8 returns EmbedResponse<int8>\", () => {\n const result = embed({ input: \"x\", model: \"m\", encoding: \"int8\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<\"int8\">, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"embedMany with encoding: binary returns EmbedManyResponse<binary>\", () => {\n const result = embedMany({ inputs: [\"x\"], model: \"m\", encoding: \"binary\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedManyResponse<\"binary\">, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"rejects non-dense encodings on the generic path (trimmed EmbedEncoding)\", () => {\n // `sparse` / `multivector` are Jina-only representation kinds, not part\n // of the cross-provider request set. Requesting them on the generic\n // helper is a compile error; they're reachable only via the typed\n // `JinaEmbedding` tag.\n // These calls exist only to assert the encoding is a compile error; they\n // are intentionally never run, so the floating-effect check is off here.\n // @effect-diagnostics floatingEffect:off\n // @ts-expect-error \"multivector\" is not an EmbedEncoding\n embedMany({ inputs: [\"x\"], model: \"m\", encoding: \"multivector\" })\n // @ts-expect-error \"sparse\" is not an EmbedEncoding\n embed({ input: \"x\", model: \"m\", encoding: \"sparse\" })\n // @effect-diagnostics floatingEffect:error\n })\n\n it(\"when the request is widened to CommonEmbedRequest, the response is the open union\", () => {\n // Demonstrates the documented case: annotating the request type erases\n // the literal `encoding` and the response falls back to `Embedding`.\n const req: { input: string; model: string; encoding?: EmbedEncoding } = {\n input: \"x\",\n model: \"m\",\n encoding: \"int8\",\n }\n const result = embed(req)\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<EmbedEncoding>, AiError.AiError, EmbeddingModel>\n >()\n })\n})\n"],"mappings":";;;;AAqBA,SAAS,gDAAgD;CACvD,GAAG,0DAA0D;EAC3D,CAAA,GAAA,YAAA,aAAA,CAA4B,CAAC,CAAC,cAG3B;CACL,CAAC;CAED,GAAG,sEAAsE;EACvE,CAAA,GAAA,YAAA,aAAA,CAAoD,CAAC,CAAC,cAAgC;EACtF,CAAA,GAAA,YAAA,aAAA,CAAiD,CAAC,CAAC,cAA6B;EAChF,CAAA,GAAA,YAAA,aAAA,CAAmD,CAAC,CAAC,cAA+B;EACpF,CAAA,GAAA,YAAA,aAAA,CAAmD,CAAC,CAAC,cAA+B;EACpF,CAAA,GAAA,YAAA,aAAA,CAAwD,CAAC,CAAC,cAAoC;CAChG,CAAC;CAED,GAAG,iFAAiF;EAClF,CAAA,GAAA,YAAA,aAAA,CAAwD,CAAC,CAAC,cAExD;CACJ,CAAC;AACH,CAAC;AAED,SAAS,uDAAuD;CAC9D,GAAG,qDAAqD;EACtD,CAAA,GAAA,YAAA,aAAA,CAA8C,CAAC,CAAC,cAA+C;CACjG,CAAC;CAED,GAAG,8BAA8B;EAC/B,CAAA,GAAA,YAAA,aAAA,CAAsD,CAAC,CAAC,cAEtD;CACJ,CAAC;AACH,CAAC;AAED,SAAS,wEAAwE;CAC/E,GAAG,2EAA2E;EAC5E,MAAM,SAAS,MAAM;GAAE,OAAO;GAAK,OAAO;EAAI,CAAC;EAC/C,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;CAED,GAAG,+DAA+D;EAChE,MAAM,SAAS,MAAM;GAAE,OAAO;GAAK,OAAO;GAAK,UAAU;EAAO,CAAC;EACjE,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;CAED,GAAG,2EAA2E;EAC5E,MAAM,SAAS,UAAU;GAAE,QAAQ,CAAC,GAAG;GAAG,OAAO;GAAK,UAAU;EAAS,CAAC;EAC1E,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;CAED,GAAG,iFAAiF;EASlF,UAAU;GAAE,QAAQ,CAAC,GAAG;GAAG,OAAO;GAAK,UAAU;EAAc,CAAC;EAEhE,MAAM;GAAE,OAAO;GAAK,OAAO;GAAK,UAAU;EAAS,CAAC;CAEtD,CAAC;CAED,GAAG,2FAA2F;EAQ5F,MAAM,SAAS,MAAM;GAJnB,OAAO;GACP,OAAO;GACP,UAAU;EAEW,CAAC;EACxB,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;AACH,CAAC"}