@assistant-ui/react-generative-ui 0.0.18 → 0.0.20

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 (152) hide show
  1. package/dist/JSONGenerativeUI.client.d.ts +15 -17
  2. package/dist/JSONGenerativeUI.client.d.ts.map +1 -1
  3. package/dist/JSONGenerativeUI.client.js +28 -8
  4. package/dist/JSONGenerativeUI.client.js.map +1 -1
  5. package/dist/JSONGenerativeUI.server.d.ts +6 -9
  6. package/dist/JSONGenerativeUI.server.d.ts.map +1 -1
  7. package/dist/JSONGenerativeUI.shared.d.ts +42 -44
  8. package/dist/JSONGenerativeUI.shared.d.ts.map +1 -1
  9. package/dist/a2ui/convert.d.ts +7 -8
  10. package/dist/a2ui/convert.d.ts.map +1 -1
  11. package/dist/a2ui/convert.js +115 -16
  12. package/dist/a2ui/convert.js.map +1 -1
  13. package/dist/a2ui/reducer.d.ts +2 -5
  14. package/dist/a2ui/reducer.d.ts.map +1 -1
  15. package/dist/a2ui/reducer.js +8 -0
  16. package/dist/a2ui/reducer.js.map +1 -1
  17. package/dist/a2ui/snapshot.d.ts +3 -0
  18. package/dist/a2ui/snapshot.d.ts.map +1 -0
  19. package/dist/a2ui/snapshot.js +33 -0
  20. package/dist/a2ui/snapshot.js.map +1 -0
  21. package/dist/a2ui/types.d.ts +67 -58
  22. package/dist/a2ui/types.d.ts.map +1 -1
  23. package/dist/a2ui/types.js.map +1 -1
  24. package/dist/a2ui.d.ts +5 -4
  25. package/dist/a2ui.d.ts.map +1 -0
  26. package/dist/a2ui.js +2 -1
  27. package/dist/actionRegistry.d.ts +17 -20
  28. package/dist/actionRegistry.d.ts.map +1 -1
  29. package/dist/actionRegistry.js.map +1 -1
  30. package/dist/buildPresentParameters.d.ts +3 -6
  31. package/dist/buildPresentParameters.d.ts.map +1 -1
  32. package/dist/buildPresentParameters.js +16 -4
  33. package/dist/buildPresentParameters.js.map +1 -1
  34. package/dist/constants.d.ts +2 -4
  35. package/dist/constants.d.ts.map +1 -1
  36. package/dist/constants.js +2 -1
  37. package/dist/constants.js.map +1 -1
  38. package/dist/convert/boundSpec.d.ts +7 -10
  39. package/dist/convert/boundSpec.d.ts.map +1 -1
  40. package/dist/convert/copyBounded.d.ts +3 -6
  41. package/dist/convert/copyBounded.d.ts.map +1 -1
  42. package/dist/convert/isElement.d.ts +2 -5
  43. package/dist/convert/isElement.d.ts.map +1 -1
  44. package/dist/convert/takeRun.d.ts +4 -7
  45. package/dist/convert/takeRun.d.ts.map +1 -1
  46. package/dist/defineGenerativeComponents.d.ts +2 -5
  47. package/dist/defineGenerativeComponents.d.ts.map +1 -1
  48. package/dist/generativeUIToJSX.d.ts +6 -9
  49. package/dist/generativeUIToJSX.d.ts.map +1 -1
  50. package/dist/index.d.ts +3 -13
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.server.d.ts +3 -13
  53. package/dist/index.server.d.ts.map +1 -0
  54. package/dist/index.shared.d.ts +15 -11
  55. package/dist/index.shared.d.ts.map +1 -0
  56. package/dist/ir.d.ts +45 -48
  57. package/dist/ir.d.ts.map +1 -1
  58. package/dist/renderGenerativeUI.d.ts +3 -6
  59. package/dist/renderGenerativeUI.d.ts.map +1 -1
  60. package/dist/scopeSchema.d.ts +6 -0
  61. package/dist/scopeSchema.d.ts.map +1 -0
  62. package/dist/scopeSchema.js +56 -0
  63. package/dist/scopeSchema.js.map +1 -0
  64. package/dist/slack/constants.d.ts +43 -45
  65. package/dist/slack/constants.d.ts.map +1 -1
  66. package/dist/slack/decodeBlockAction.d.ts +2 -5
  67. package/dist/slack/decodeBlockAction.d.ts.map +1 -1
  68. package/dist/slack/fromSlackBlocks.d.ts +2 -5
  69. package/dist/slack/fromSlackBlocks.d.ts.map +1 -1
  70. package/dist/slack/toSlackBlocks.d.ts +2 -5
  71. package/dist/slack/toSlackBlocks.d.ts.map +1 -1
  72. package/dist/slack/toSlackBlocks.js +1 -1
  73. package/dist/slack/types.d.ts +110 -113
  74. package/dist/slack/types.d.ts.map +1 -1
  75. package/dist/slack.d.ts +5 -5
  76. package/dist/slack.d.ts.map +1 -0
  77. package/dist/teams/constants.d.ts +15 -18
  78. package/dist/teams/constants.d.ts.map +1 -1
  79. package/dist/teams/decodeSubmitData.d.ts +2 -5
  80. package/dist/teams/decodeSubmitData.d.ts.map +1 -1
  81. package/dist/teams/toAdaptiveCard.d.ts +10 -13
  82. package/dist/teams/toAdaptiveCard.d.ts.map +1 -1
  83. package/dist/teams/toTeamsAttachments.d.ts +2 -5
  84. package/dist/teams/toTeamsAttachments.d.ts.map +1 -1
  85. package/dist/teams/types.d.ts +136 -138
  86. package/dist/teams/types.d.ts.map +1 -1
  87. package/dist/teams.d.ts +5 -5
  88. package/dist/teams.d.ts.map +1 -0
  89. package/dist/types.d.ts +45 -47
  90. package/dist/types.d.ts.map +1 -1
  91. package/dist/vocabulary/alert.d.ts +22 -25
  92. package/dist/vocabulary/alert.d.ts.map +1 -1
  93. package/dist/vocabulary/collectFormValues.d.ts +12 -13
  94. package/dist/vocabulary/collectFormValues.d.ts.map +1 -1
  95. package/dist/vocabulary/collectFormValues.js +3 -2
  96. package/dist/vocabulary/collectFormValues.js.map +1 -1
  97. package/dist/vocabulary/data.d.ts +46 -49
  98. package/dist/vocabulary/data.d.ts.map +1 -1
  99. package/dist/vocabulary/dispatch.d.ts +4 -7
  100. package/dist/vocabulary/dispatch.d.ts.map +1 -1
  101. package/dist/vocabulary/fact.d.ts +9 -12
  102. package/dist/vocabulary/fact.d.ts.map +1 -1
  103. package/dist/vocabulary/form.d.ts +8 -11
  104. package/dist/vocabulary/form.d.ts.map +1 -1
  105. package/dist/vocabulary/icon.d.ts +38 -41
  106. package/dist/vocabulary/icon.d.ts.map +1 -1
  107. package/dist/vocabulary/index.d.ts +2 -5
  108. package/dist/vocabulary/index.d.ts.map +1 -1
  109. package/dist/vocabulary/interactive.d.ts +88 -87
  110. package/dist/vocabulary/interactive.d.ts.map +1 -1
  111. package/dist/vocabulary/interactive.js +6 -4
  112. package/dist/vocabulary/interactive.js.map +1 -1
  113. package/dist/vocabulary/layout.d.ts +76 -79
  114. package/dist/vocabulary/layout.d.ts.map +1 -1
  115. package/dist/vocabulary/list.d.ts +11 -14
  116. package/dist/vocabulary/list.d.ts.map +1 -1
  117. package/dist/vocabulary/media.d.ts +22 -25
  118. package/dist/vocabulary/media.d.ts.map +1 -1
  119. package/dist/vocabulary/text.d.ts +54 -57
  120. package/dist/vocabulary/text.d.ts.map +1 -1
  121. package/dist/vocabulary/toTextContent.d.ts +1 -4
  122. package/dist/vocabulary/toTextContent.d.ts.map +1 -1
  123. package/package.json +12 -10
  124. package/src/JSONGenerativeUI.client.tsx +57 -15
  125. package/src/JSONGenerativeUI.test.tsx +298 -4
  126. package/src/a2ui/convert.test.ts +496 -0
  127. package/src/a2ui/convert.ts +170 -25
  128. package/src/a2ui/reducer.test.ts +18 -0
  129. package/src/a2ui/reducer.ts +16 -0
  130. package/src/a2ui/snapshot.test.ts +52 -0
  131. package/src/a2ui/snapshot.ts +52 -0
  132. package/src/a2ui/types.ts +16 -0
  133. package/src/a2ui.ts +2 -0
  134. package/src/actionRegistry.ts +5 -5
  135. package/src/buildPresentParameters.test.ts +246 -0
  136. package/src/buildPresentParameters.ts +18 -3
  137. package/src/constants.ts +2 -0
  138. package/src/scopeSchema.test.ts +72 -0
  139. package/src/scopeSchema.ts +71 -0
  140. package/src/slack/fromSlackBlocks.test.ts +4 -1
  141. package/src/slack/toSlackBlocks.test.ts +8 -4
  142. package/src/teams/toAdaptiveCard.test.ts +5 -3
  143. package/src/vocabulary/collectFormValues.test.ts +38 -0
  144. package/src/vocabulary/collectFormValues.ts +11 -2
  145. package/src/vocabulary/form.test.tsx +1 -0
  146. package/src/vocabulary/interactive.dispatch.test.tsx +17 -3
  147. package/src/vocabulary/interactive.test.tsx +33 -1
  148. package/src/vocabulary/interactive.tsx +12 -2
  149. package/src/vocabulary/layout.test.tsx +1 -0
  150. package/src/vocabulary/list.test.tsx +5 -4
  151. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +0 -141
  152. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +0 -1
@@ -1,7 +1,9 @@
1
1
  import { describe, it, expect } from "vitest";
2
2
  import { renderToStaticMarkup } from "react-dom/server";
3
+ import { GENERATED_NAME_ATTR } from "../constants";
3
4
  import { renderGenerativeUI } from "../renderGenerativeUI";
4
5
  import { interactiveVocabulary } from "./interactive";
6
+ import { defaultGenerativeUILibrary } from "./index";
5
7
 
6
8
  const render = (node: unknown) =>
7
9
  renderToStaticMarkup(<>{renderGenerativeUI(node, interactiveVocabulary)}</>);
@@ -213,6 +215,24 @@ describe("interactiveVocabulary", () => {
213
215
  expect(html).toContain("Large");
214
216
  });
215
217
 
218
+ it("RadioGroup renders model-provided children after the options inside the fieldset", () => {
219
+ const html = renderToStaticMarkup(
220
+ <>
221
+ {renderGenerativeUI(
222
+ {
223
+ $type: "RadioGroup",
224
+ options: [{ label: "Small", value: "sm" }],
225
+ children: { $type: "Text", value: "Additional context" },
226
+ },
227
+ defaultGenerativeUILibrary,
228
+ )}
229
+ </>,
230
+ );
231
+ expect(html).toMatch(
232
+ /^<fieldset data-aui="radiogroup">.*data-aui="radiogroup-option".*Small<\/label>.*Additional context.*<\/fieldset>$/,
233
+ );
234
+ });
235
+
216
236
  it("RadioGroup renders an aria-label from the label prop", () => {
217
237
  const html = render({
218
238
  $type: "RadioGroup",
@@ -232,6 +252,7 @@ describe("interactiveVocabulary", () => {
232
252
  ],
233
253
  });
234
254
  expect((html.match(/name="size"/g) ?? []).length).toBe(2);
255
+ expect(html).not.toContain(GENERATED_NAME_ATTR);
235
256
  });
236
257
 
237
258
  it("RadioGroup falls back to a generated shared name when name is omitted", () => {
@@ -242,10 +263,21 @@ describe("interactiveVocabulary", () => {
242
263
  { label: "Large", value: "lg" },
243
264
  ],
244
265
  });
245
- const names = [...html.matchAll(/name="([^"]*)"/g)].map((m) => m[1]);
266
+ const names = [...html.matchAll(/ name="([^"]*)"/g)].map((m) => m[1]);
246
267
  expect(names.length).toBe(2);
247
268
  expect(names[0]).toBe(names[1]);
248
269
  expect(names[0]).toBeTruthy();
270
+ expect(html.split(`${GENERATED_NAME_ATTR}=""`).length - 1).toBe(2);
271
+ });
272
+
273
+ it("RadioGroup marks a generated shared name when name is null", () => {
274
+ const html = render({
275
+ $type: "RadioGroup",
276
+ name: null,
277
+ options: [{ label: "Small", value: "sm" }],
278
+ });
279
+
280
+ expect(html).toContain(`${GENERATED_NAME_ATTR}=""`);
249
281
  });
250
282
 
251
283
  it("RadioGroup marks the option matching defaultValue as checked", () => {
@@ -1,8 +1,13 @@
1
- import { useId } from "react";
1
+ import { useId, type ReactNode } from "react";
2
2
  import { z } from "zod";
3
+ import { GENERATED_NAME_ATTR } from "../constants";
3
4
  import type { Action } from "../ir";
4
5
  import { BUTTON_STYLES } from "../ir";
5
- import type { GenerativeUIDispatch, GenerativeUILibrary } from "../types";
6
+ import type {
7
+ GenerativeUIDispatch,
8
+ GenerativeUILibrary,
9
+ GenerativeUIStatus,
10
+ } from "../types";
6
11
  import { actionAttr, fire } from "./dispatch";
7
12
  import { toTextContent } from "./toTextContent";
8
13
 
@@ -26,6 +31,8 @@ type RadioGroupRenderProps = {
26
31
  name?: string;
27
32
  label?: string;
28
33
  defaultValue?: string;
34
+ children?: ReactNode;
35
+ $status: GenerativeUIStatus;
29
36
  $action?: Action;
30
37
  $dispatch?: GenerativeUIDispatch;
31
38
  };
@@ -35,6 +42,7 @@ function RadioGroupRender({
35
42
  name,
36
43
  label,
37
44
  defaultValue,
45
+ children,
38
46
  $action,
39
47
  $dispatch,
40
48
  }: RadioGroupRenderProps) {
@@ -53,6 +61,7 @@ function RadioGroupRender({
53
61
  <input
54
62
  type="radio"
55
63
  name={fieldName}
64
+ {...(name == null ? { [GENERATED_NAME_ATTR]: "" } : {})}
56
65
  value={option.value}
57
66
  defaultChecked={defaultValue === option.value}
58
67
  onChange={() => fire($action, $dispatch, option.value)}
@@ -61,6 +70,7 @@ function RadioGroupRender({
61
70
  </label>
62
71
  ) : null,
63
72
  )}
73
+ {children}
64
74
  </fieldset>
65
75
  );
66
76
  }
@@ -16,6 +16,7 @@ const el = (
16
16
  type: "text",
17
17
  value: "",
18
18
  disabled: false,
19
+ hasAttribute: () => false,
19
20
  ...partial,
20
21
  });
21
22
 
@@ -3,6 +3,7 @@ import type { ReactElement } from "react";
3
3
  import { renderToStaticMarkup } from "react-dom/server";
4
4
  import { renderGenerativeUI } from "../renderGenerativeUI";
5
5
  import { createActionRegistry } from "../actionRegistry";
6
+ import type { GenerativeUIDispatch } from "../types";
6
7
  import { listVocabulary } from "./list";
7
8
 
8
9
  const render = (node: unknown) =>
@@ -55,13 +56,13 @@ describe("listVocabulary", () => {
55
56
  });
56
57
 
57
58
  describe("listVocabulary $action dispatch", () => {
58
- const rowOut = (dispatch: (a: unknown) => unknown) =>
59
+ const rowOut = (dispatch: GenerativeUIDispatch) =>
59
60
  listVocabulary.ListViewItem.render({
60
61
  $status: "done",
61
62
  $action: { type: "open" },
62
63
  $dispatch: dispatch,
63
64
  children: "row",
64
- }) as ReactElement;
65
+ }) as ReactElement<{ children: ReactElement }>;
65
66
 
66
67
  it("clicking the trigger fires $action with no $input", () => {
67
68
  const handler = vi.fn();
@@ -83,8 +84,8 @@ describe("listVocabulary $action dispatch", () => {
83
84
  preventDefault: () => void;
84
85
  };
85
86
 
86
- const getOnKeyDown = (dispatch: (a: unknown) => unknown) => {
87
- const trigger = rowOut(dispatch).props.children as ReactElement;
87
+ const getOnKeyDown = (dispatch: GenerativeUIDispatch) => {
88
+ const trigger = rowOut(dispatch).props.children;
88
89
  return (trigger.props as { onKeyDown: (e: KeyDownEvent) => void })
89
90
  .onKeyDown;
90
91
  };
@@ -1,141 +0,0 @@
1
- //#region ../../node_modules/.pnpm/@types+json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts
2
- // ==================================================================================================
3
- // JSON Schema Draft 07
4
- // ==================================================================================================
5
- // https://tools.ietf.org/html/draft-handrews-json-schema-validation-01
6
- // --------------------------------------------------------------------------------------------------
7
- /**
8
- * Primitive type
9
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.1.1
10
- */
11
- type JSONSchema7TypeName = "string" //
12
- | "number" | "integer" | "boolean" | "object" | "array" | "null";
13
- /**
14
- * Primitive type
15
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.1.1
16
- */
17
- type JSONSchema7Type = string //
18
- | number | boolean | JSONSchema7Object | JSONSchema7Array | null;
19
- // Workaround for infinite type recursion
20
- interface JSONSchema7Object {
21
- [key: string]: JSONSchema7Type;
22
- }
23
- // Workaround for infinite type recursion
24
- // https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
25
- interface JSONSchema7Array extends Array<JSONSchema7Type> {}
26
- /**
27
- * Meta schema
28
- *
29
- * Recommended values:
30
- * - 'http://json-schema.org/schema#'
31
- * - 'http://json-schema.org/hyper-schema#'
32
- * - 'http://json-schema.org/draft-07/schema#'
33
- * - 'http://json-schema.org/draft-07/hyper-schema#'
34
- *
35
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5
36
- */
37
- type JSONSchema7Version = string;
38
- /**
39
- * JSON Schema v7
40
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01
41
- */
42
- type JSONSchema7Definition = JSONSchema7 | boolean;
43
- interface JSONSchema7 {
44
- $id?: string | undefined;
45
- $ref?: string | undefined;
46
- $schema?: JSONSchema7Version | undefined;
47
- $comment?: string | undefined;
48
- /**
49
- * @see https://datatracker.ietf.org/doc/html/draft-bhutton-json-schema-00#section-8.2.4
50
- * @see https://datatracker.ietf.org/doc/html/draft-bhutton-json-schema-validation-00#appendix-A
51
- */
52
- $defs?: {
53
- [key: string]: JSONSchema7Definition;
54
- } | undefined;
55
- /**
56
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.1
57
- */
58
- type?: JSONSchema7TypeName | JSONSchema7TypeName[] | undefined;
59
- enum?: JSONSchema7Type[] | undefined;
60
- const?: JSONSchema7Type | undefined;
61
- /**
62
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.2
63
- */
64
- multipleOf?: number | undefined;
65
- maximum?: number | undefined;
66
- exclusiveMaximum?: number | undefined;
67
- minimum?: number | undefined;
68
- exclusiveMinimum?: number | undefined;
69
- /**
70
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.3
71
- */
72
- maxLength?: number | undefined;
73
- minLength?: number | undefined;
74
- pattern?: string | undefined;
75
- /**
76
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.4
77
- */
78
- items?: JSONSchema7Definition | JSONSchema7Definition[] | undefined;
79
- additionalItems?: JSONSchema7Definition | undefined;
80
- maxItems?: number | undefined;
81
- minItems?: number | undefined;
82
- uniqueItems?: boolean | undefined;
83
- contains?: JSONSchema7Definition | undefined;
84
- /**
85
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5
86
- */
87
- maxProperties?: number | undefined;
88
- minProperties?: number | undefined;
89
- required?: string[] | undefined;
90
- properties?: {
91
- [key: string]: JSONSchema7Definition;
92
- } | undefined;
93
- patternProperties?: {
94
- [key: string]: JSONSchema7Definition;
95
- } | undefined;
96
- additionalProperties?: JSONSchema7Definition | undefined;
97
- dependencies?: {
98
- [key: string]: JSONSchema7Definition | string[];
99
- } | undefined;
100
- propertyNames?: JSONSchema7Definition | undefined;
101
- /**
102
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.6
103
- */
104
- if?: JSONSchema7Definition | undefined;
105
- then?: JSONSchema7Definition | undefined;
106
- else?: JSONSchema7Definition | undefined;
107
- /**
108
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.7
109
- */
110
- allOf?: JSONSchema7Definition[] | undefined;
111
- anyOf?: JSONSchema7Definition[] | undefined;
112
- oneOf?: JSONSchema7Definition[] | undefined;
113
- not?: JSONSchema7Definition | undefined;
114
- /**
115
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-7
116
- */
117
- format?: string | undefined;
118
- /**
119
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-8
120
- */
121
- contentMediaType?: string | undefined;
122
- contentEncoding?: string | undefined;
123
- /**
124
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9
125
- */
126
- definitions?: {
127
- [key: string]: JSONSchema7Definition;
128
- } | undefined;
129
- /**
130
- * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-10
131
- */
132
- title?: string | undefined;
133
- description?: string | undefined;
134
- default?: JSONSchema7Type | undefined;
135
- readOnly?: boolean | undefined;
136
- writeOnly?: boolean | undefined;
137
- examples?: JSONSchema7Type | undefined;
138
- }
139
- //#endregion
140
- export { JSONSchema7, JSONSchema7Array, JSONSchema7Definition, JSONSchema7Object, JSONSchema7Type, JSONSchema7TypeName, JSONSchema7Version };
141
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../../../../../../node_modules/.pnpm/@types+json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;KA+iBY;;;;;;KAaA;sBAIN,oBACA;;UAIW;GACZ,cAAc;;;;UAKF,yBAAyB,MAAM;;;;;;;;;;;;KAapC;;;;;KAMA,wBAAwB;UACnB;EACb;EACA;EACA,UAAU;EACV;;;;;EAMA;KACK,cAAc;;;;;EAMnB,OAAO,sBAAsB;EAC7B,OAAO;EACP,QAAQ;;;;EAKR;EACA;EACA;EACA;EACA;;;;EAKA;EACA;EACA;;;;EAKA,QAAQ,wBAAwB;EAChC,kBAAkB;EAClB;EACA;EACA;EACA,WAAW;;;;EAKX;EACA;EACA;EACA;KACK,cAAc;;EAEnB;KACK,cAAc;;EAEnB,uBAAuB;EACvB;KACK,cAAc;;EAEnB,gBAAgB;;;;EAKhB,KAAK;EACL,OAAO;EACP,OAAO;;;;EAKP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,MAAM;;;;EAKN;;;;EAKA;EACA;;;;EAKA;KACK,cAAc;;;;;EAMnB;EACA;EACA,UAAU;EACV;EACA;EACA,WAAW"}