@typespec/tspd 0.70.0-dev.1 → 0.70.0-dev.3

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 (50) hide show
  1. package/dist/src/cli.js +85 -103
  2. package/dist/src/gen-extern-signatures/components/decorator-signature-tests.d.ts +8 -0
  3. package/dist/src/gen-extern-signatures/components/decorator-signature-tests.d.ts.map +1 -0
  4. package/dist/src/gen-extern-signatures/components/decorator-signature-tests.js +16 -0
  5. package/dist/src/gen-extern-signatures/components/decorator-signature-tests.jsx +12 -0
  6. package/dist/src/gen-extern-signatures/components/decorator-signature-tests.jsx.map +1 -0
  7. package/dist/src/gen-extern-signatures/components/decorator-signature-type.d.ts +16 -0
  8. package/dist/src/gen-extern-signatures/components/decorator-signature-type.d.ts.map +1 -0
  9. package/dist/src/gen-extern-signatures/components/decorator-signature-type.js +404 -0
  10. package/dist/src/gen-extern-signatures/components/decorator-signature-type.jsx +316 -0
  11. package/dist/src/gen-extern-signatures/components/decorator-signature-type.jsx.map +1 -0
  12. package/dist/src/gen-extern-signatures/components/decorators-signatures.d.ts +12 -0
  13. package/dist/src/gen-extern-signatures/components/decorators-signatures.d.ts.map +1 -0
  14. package/dist/src/gen-extern-signatures/components/decorators-signatures.js +107 -0
  15. package/dist/src/gen-extern-signatures/components/decorators-signatures.jsx +60 -0
  16. package/dist/src/gen-extern-signatures/components/decorators-signatures.jsx.map +1 -0
  17. package/dist/src/gen-extern-signatures/components/dollar-decorators-type.d.ts +10 -0
  18. package/dist/src/gen-extern-signatures/components/dollar-decorators-type.d.ts.map +1 -0
  19. package/dist/src/gen-extern-signatures/components/dollar-decorators-type.js +39 -0
  20. package/dist/src/gen-extern-signatures/components/dollar-decorators-type.jsx +18 -0
  21. package/dist/src/gen-extern-signatures/components/dollar-decorators-type.jsx.map +1 -0
  22. package/dist/src/gen-extern-signatures/components/tspd-context.d.ts +10 -0
  23. package/dist/src/gen-extern-signatures/components/tspd-context.d.ts.map +1 -0
  24. package/dist/src/gen-extern-signatures/components/tspd-context.js +22 -0
  25. package/dist/src/gen-extern-signatures/components/tspd-context.js.map +1 -0
  26. package/dist/src/gen-extern-signatures/doc-builder.js +10 -12
  27. package/dist/src/gen-extern-signatures/external-packages/compiler.d.ts +17 -0
  28. package/dist/src/gen-extern-signatures/external-packages/compiler.d.ts.map +1 -0
  29. package/dist/src/gen-extern-signatures/external-packages/compiler.js +10 -0
  30. package/dist/src/gen-extern-signatures/external-packages/compiler.js.map +1 -0
  31. package/dist/src/gen-extern-signatures/gen-extern-signatures.d.ts.map +1 -1
  32. package/dist/src/gen-extern-signatures/gen-extern-signatures.js +109 -102
  33. package/dist/src/gen-extern-signatures/gen-extern-signatures.js.map +1 -1
  34. package/dist/src/gen-extern-signatures/types.js +1 -2
  35. package/dist/src/ref-doc/api-docs.js +56 -56
  36. package/dist/src/ref-doc/emitters/docusaurus.js +156 -209
  37. package/dist/src/ref-doc/emitters/markdown.js +278 -327
  38. package/dist/src/ref-doc/emitters/starlight.js +154 -190
  39. package/dist/src/ref-doc/experimental.js +48 -45
  40. package/dist/src/ref-doc/extractor.js +486 -449
  41. package/dist/src/ref-doc/index.js +1 -2
  42. package/dist/src/ref-doc/lib.js +29 -26
  43. package/dist/src/ref-doc/types.js +1 -2
  44. package/dist/src/ref-doc/utils/markdown.js +37 -44
  45. package/dist/src/ref-doc/utils/type-signature.js +89 -98
  46. package/package.json +10 -6
  47. package/dist/src/gen-extern-signatures/decorators-signatures.d.ts +0 -5
  48. package/dist/src/gen-extern-signatures/decorators-signatures.d.ts.map +0 -1
  49. package/dist/src/gen-extern-signatures/decorators-signatures.js +0 -338
  50. package/dist/src/gen-extern-signatures/decorators-signatures.js.map +0 -1
@@ -1,5 +1,4 @@
1
1
  export * from "./api-docs.js";
2
2
  export * from "./experimental.js";
3
3
  export * from "./extractor.js";
4
- export * from "./lib.js";
5
- //# sourceMappingURL=index.js.map
4
+ export * from "./lib.js";
@@ -1,31 +1,34 @@
1
1
  import { createTypeSpecLibrary, paramMessage } from "@typespec/compiler";
2
2
  export const libDef = {
3
- name: "@typespec/tspd",
4
- diagnostics: {
5
- "exports-missing": {
6
- severity: "error",
7
- messages: {
8
- default: `exports field is missing in package.json`,
9
- missingCondition: `exports field is missing one export with the typespec condition`,
10
- },
11
- },
12
- "documentation-missing": {
13
- severity: "warning",
14
- messages: {
15
- decorator: paramMessage `Missing documentation for decorator '${"name"}'.`,
16
- decoratorParam: paramMessage `Missing documentation for decorator parameter '${"name"}.${"param"}'.`,
17
- templateParam: paramMessage `Missing documentation for template parameter '${"name"}.${"param"}'.`,
18
- model: paramMessage `Missing documentation for model '${"name"}'.`,
19
- union: paramMessage `Missing documentation for union '${"name"}'.`,
20
- enum: paramMessage `Missing documentation for enum '${"name"}'.`,
21
- interface: paramMessage `Missing documentation for interface '${"name"}'.`,
22
- interfaceOperation: paramMessage `Missing documentation for interface operation '${"name"}'.`,
23
- operation: paramMessage `Missing documentation for operation '${"name"}'.`,
24
- scalar: paramMessage `Missing documentation for scalar '${"name"}'.`,
25
- },
26
- },
3
+ name: "@typespec/tspd",
4
+ diagnostics: {
5
+ "exports-missing": {
6
+ severity: "error",
7
+ messages: {
8
+ default: `exports field is missing in package.json`,
9
+ missingCondition: `exports field is missing one export with the typespec condition`
10
+ }
27
11
  },
12
+ "documentation-missing": {
13
+ severity: "warning",
14
+ messages: {
15
+ decorator: paramMessage`Missing documentation for decorator '${"name"}'.`,
16
+ decoratorParam: paramMessage`Missing documentation for decorator parameter '${"name"}.${"param"}'.`,
17
+ templateParam: paramMessage`Missing documentation for template parameter '${"name"}.${"param"}'.`,
18
+ model: paramMessage`Missing documentation for model '${"name"}'.`,
19
+ union: paramMessage`Missing documentation for union '${"name"}'.`,
20
+ enum: paramMessage`Missing documentation for enum '${"name"}'.`,
21
+ interface: paramMessage`Missing documentation for interface '${"name"}'.`,
22
+ interfaceOperation: paramMessage`Missing documentation for interface operation '${"name"}'.`,
23
+ operation: paramMessage`Missing documentation for operation '${"name"}'.`,
24
+ scalar: paramMessage`Missing documentation for scalar '${"name"}'.`
25
+ }
26
+ }
27
+ }
28
28
  };
29
29
  export const $lib = createTypeSpecLibrary(libDef);
30
- export const { reportDiagnostic, createStateSymbol, createDiagnostic } = $lib;
31
- //# sourceMappingURL=lib.js.map
30
+ export const {
31
+ reportDiagnostic,
32
+ createStateSymbol,
33
+ createDiagnostic
34
+ } = $lib;
@@ -1,2 +1 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
1
+ export {};
@@ -1,62 +1,55 @@
1
1
  export const headings = {
2
- h1: hx(1),
3
- h2: hx(2),
4
- h3: hx(3),
5
- h4: hx(4),
6
- h5: hx(5),
7
- hx: (number, title) => {
8
- return "#".repeat(number) + " " + title;
9
- },
2
+ h1: hx(1),
3
+ h2: hx(2),
4
+ h3: hx(3),
5
+ h4: hx(4),
6
+ h5: hx(5),
7
+ hx: (number, title) => {
8
+ return "#".repeat(number) + " " + title;
9
+ }
10
10
  };
11
11
  function hx(number) {
12
- const prefix = "#".repeat(number) + " ";
13
- return (title) => prefix + title;
12
+ const prefix = "#".repeat(number) + " ";
13
+ return title => prefix + title;
14
14
  }
15
15
  export function codeblock(code, lang = "") {
16
- return "```" + lang + "\n" + code + "\n" + "```";
16
+ return "```" + lang + "\n" + code + "\n" + "```";
17
17
  }
18
18
  export function inlinecode(code) {
19
- return "`" + code + "`";
19
+ return "`" + code + "`";
20
20
  }
21
21
  export function link(text, url) {
22
- return `[${text}](${url})`;
22
+ return `[${text}](${url})`;
23
23
  }
24
24
  function escapeMarkdownTable(text) {
25
- return text.replace(/([^\\])(\|)/g, "$1\\$2").replace(/\n/g, "<br />");
25
+ return text.replace(/([^\\])(\|)/g, "$1\\$2").replace(/\n/g, "<br />");
26
26
  }
27
27
  export function table([header, ...rows]) {
28
- const renderRow = (row) => `| ${row.map(escapeMarkdownTable).join(" | ")} |`;
29
- return [
30
- renderRow(header),
31
- "|" + header.map((x) => "-".repeat(x.length + 2)).join("|") + "|",
32
- ...rows.map(renderRow),
33
- ].join("\n");
28
+ const renderRow = row => `| ${row.map(escapeMarkdownTable).join(" | ")} |`;
29
+ return [renderRow(header), "|" + header.map(x => "-".repeat(x.length + 2)).join("|") + "|", ...rows.map(renderRow)].join("\n");
34
30
  }
35
31
  export function renderMarkdowDoc(doc, heading = 1) {
36
- const flattened = [];
37
- let currentHeading = heading;
38
- function render(doc) {
39
- if (typeof doc === "string") {
40
- flattened.push(doc);
41
- }
42
- else if (Array.isArray(doc)) {
43
- doc.forEach(render);
44
- }
45
- else {
46
- flattened.push(headings.hx(currentHeading, doc.title));
47
- currentHeading++;
48
- render(doc.body);
49
- currentHeading--;
50
- }
32
+ const flattened = [];
33
+ let currentHeading = heading;
34
+ function render(doc) {
35
+ if (typeof doc === "string") {
36
+ flattened.push(doc);
37
+ } else if (Array.isArray(doc)) {
38
+ doc.forEach(render);
39
+ } else {
40
+ flattened.push(headings.hx(currentHeading, doc.title));
41
+ currentHeading++;
42
+ render(doc.body);
43
+ currentHeading--;
51
44
  }
52
- render(doc);
53
- return flattened.join("\n");
45
+ }
46
+ render(doc);
47
+ return flattened.join("\n");
54
48
  }
55
49
  export function section(title, body) {
56
- return {
57
- kind: "section",
58
- title,
59
- body,
60
- };
61
- }
62
- //# sourceMappingURL=markdown.js.map
50
+ return {
51
+ kind: "section",
52
+ title,
53
+ body
54
+ };
55
+ }
@@ -1,122 +1,113 @@
1
- import { compilerAssert, getEntityName, getTypeName, } from "@typespec/compiler";
1
+ import { compilerAssert, getEntityName, getTypeName } from "@typespec/compiler";
2
2
  /** @internal */
3
3
  export function getTypeSignature(type) {
4
- if (isReflectionType(type)) {
5
- return type.name;
6
- }
7
- switch (type.kind) {
8
- case "Scalar":
9
- case "Enum":
10
- case "Union":
11
- case "Model":
12
- case "Namespace":
13
- return `${type.kind.toLowerCase()} ${getTypeName(type)}`;
14
- case "Interface":
15
- return getInterfaceSignature(type);
16
- case "Decorator":
17
- return getDecoratorSignature(type);
18
- case "Operation":
19
- return getOperationSignature(type);
20
- case "String":
21
- return `(string) ${`"${type.value}"`}`;
22
- case "Boolean":
23
- return `(boolean) ${type.value ? "true" : "false"}`;
24
- case "Number":
25
- return `(number) ${type.value.toString()}`;
26
- case "Intrinsic":
27
- return `(intrinsic) ${type.name}`;
28
- case "FunctionParameter":
29
- return getFunctionParameterSignature(type);
30
- case "ScalarConstructor":
31
- return `(scalar constructor) ${getTypeName(type)}`;
32
- case "StringTemplate":
33
- return `(string template)\n${getStringTemplateSignature(type)}`;
34
- case "StringTemplateSpan":
35
- return `(string template span)\n${getTypeName(type.type)}`;
36
- case "ModelProperty":
37
- return `(model property) ${`${type.name}: ${getTypeName(type.type)}`}`;
38
- case "EnumMember":
39
- return `(enum member) ${getEnumMemberSignature(type)}`;
40
- case "TemplateParameter":
41
- return type.node.id.sv;
42
- case "UnionVariant":
43
- return `(union variant) ${getUnionVariantSignature(type)}`;
44
- case "Tuple":
45
- return `(tuple) [${type.values.map(getTypeSignature).join(", ")}]`;
46
- default:
47
- const _assertNever = type;
48
- compilerAssert(false, "Unexpected type kind");
49
- }
4
+ if (isReflectionType(type)) {
5
+ return type.name;
6
+ }
7
+ switch (type.kind) {
8
+ case "Scalar":
9
+ case "Enum":
10
+ case "Union":
11
+ case "Model":
12
+ case "Namespace":
13
+ return `${type.kind.toLowerCase()} ${getTypeName(type)}`;
14
+ case "Interface":
15
+ return getInterfaceSignature(type);
16
+ case "Decorator":
17
+ return getDecoratorSignature(type);
18
+ case "Operation":
19
+ return getOperationSignature(type);
20
+ case "String":
21
+ return `(string) ${`"${type.value}"`}`;
22
+ case "Boolean":
23
+ return `(boolean) ${type.value ? "true" : "false"}`;
24
+ case "Number":
25
+ return `(number) ${type.value.toString()}`;
26
+ case "Intrinsic":
27
+ return `(intrinsic) ${type.name}`;
28
+ case "FunctionParameter":
29
+ return getFunctionParameterSignature(type);
30
+ case "ScalarConstructor":
31
+ return `(scalar constructor) ${getTypeName(type)}`;
32
+ case "StringTemplate":
33
+ return `(string template)\n${getStringTemplateSignature(type)}`;
34
+ case "StringTemplateSpan":
35
+ return `(string template span)\n${getTypeName(type.type)}`;
36
+ case "ModelProperty":
37
+ return `(model property) ${`${type.name}: ${getTypeName(type.type)}`}`;
38
+ case "EnumMember":
39
+ return `(enum member) ${getEnumMemberSignature(type)}`;
40
+ case "TemplateParameter":
41
+ return type.node.id.sv;
42
+ case "UnionVariant":
43
+ return `(union variant) ${getUnionVariantSignature(type)}`;
44
+ case "Tuple":
45
+ return `(tuple) [${type.values.map(getTypeSignature).join(", ")}]`;
46
+ default:
47
+ const _assertNever = type;
48
+ compilerAssert(false, "Unexpected type kind");
49
+ }
50
50
  }
51
51
  function isReflectionType(type) {
52
- return (type.kind === "Model" &&
53
- type.namespace?.name === "Reflection" &&
54
- type.namespace?.namespace?.name === "TypeSpec");
52
+ return type.kind === "Model" && type.namespace?.name === "Reflection" && type.namespace?.namespace?.name === "TypeSpec";
55
53
  }
56
54
  function getDecoratorSignature(type) {
57
- const ns = getQualifier(type.namespace);
58
- const name = type.name.slice(1);
59
- const parameters = [...type.parameters].map((x) => getFunctionParameterSignature(x));
60
- let signature = `@${ns}${name}`;
61
- if (parameters.length > 0) {
62
- signature += `(${parameters.join(", ")})`;
63
- }
64
- return signature;
55
+ const ns = getQualifier(type.namespace);
56
+ const name = type.name.slice(1);
57
+ const parameters = [...type.parameters].map(x => getFunctionParameterSignature(x));
58
+ let signature = `@${ns}${name}`;
59
+ if (parameters.length > 0) {
60
+ signature += `(${parameters.join(", ")})`;
61
+ }
62
+ return signature;
65
63
  }
66
64
  function getInterfaceSignature(type) {
67
- const ns = getQualifier(type.namespace);
68
- const templateParams = type.node?.templateParameters
69
- ? getTemplateParameters(type.node.templateParameters)
70
- : "";
71
- return `interface ${ns}${type.name}${templateParams}`;
65
+ const ns = getQualifier(type.namespace);
66
+ const templateParams = type.node?.templateParameters ? getTemplateParameters(type.node.templateParameters) : "";
67
+ return `interface ${ns}${type.name}${templateParams}`;
72
68
  }
73
69
  function getTemplateParameters(templateParameters) {
74
- const params = templateParameters.map((x) => `${x.id.sv}`);
75
- return `<${params.join(", ")}>`;
70
+ const params = templateParameters.map(x => `${x.id.sv}`);
71
+ return `<${params.join(", ")}>`;
76
72
  }
77
73
  function getOperationSignature(type) {
78
- const qualifier = getQualifier(type.interface ?? type.namespace);
79
- const parameters = [...type.parameters.properties.values()].map(getModelPropertySignature);
80
- return `op ${qualifier}${type.name}(${parameters.join(", ")}): ${getTypeName(type.returnType)}`;
74
+ const qualifier = getQualifier(type.interface ?? type.namespace);
75
+ const parameters = [...type.parameters.properties.values()].map(getModelPropertySignature);
76
+ return `op ${qualifier}${type.name}(${parameters.join(", ")}): ${getTypeName(type.returnType)}`;
81
77
  }
82
78
  function getFunctionParameterSignature(parameter) {
83
- const rest = parameter.rest ? "..." : "";
84
- const optional = parameter.optional ? "?" : "";
85
- return `${rest}${parameter.name}${optional}: ${getEntityName(parameter.type)}`;
79
+ const rest = parameter.rest ? "..." : "";
80
+ const optional = parameter.optional ? "?" : "";
81
+ return `${rest}${parameter.name}${optional}: ${getEntityName(parameter.type)}`;
86
82
  }
87
83
  function getStringTemplateSignature(stringTemplate) {
88
- return ("`" +
89
- [
90
- stringTemplate.spans.map((span) => {
91
- return span.isInterpolated ? "${" + getTypeName(span.type) + "}" : span.type.value;
92
- }),
93
- ].join("") +
94
- "`");
84
+ return "`" + [stringTemplate.spans.map(span => {
85
+ return span.isInterpolated ? "${" + getTypeName(span.type) + "}" : span.type.value;
86
+ })].join("") + "`";
95
87
  }
96
88
  function getModelPropertySignature(property) {
97
- const ns = getQualifier(property.model);
98
- return `${ns}${property.name}: ${getTypeName(property.type)}`;
89
+ const ns = getQualifier(property.model);
90
+ return `${ns}${property.name}: ${getTypeName(property.type)}`;
99
91
  }
100
92
  function getUnionVariantSignature(variant) {
101
- if (typeof variant.name !== "string") {
102
- return getTypeName(variant.type);
103
- }
104
- const ns = getQualifier(variant.union);
105
- return `${ns}${variant.name}: ${getTypeName(variant.type)}`;
93
+ if (typeof variant.name !== "string") {
94
+ return getTypeName(variant.type);
95
+ }
96
+ const ns = getQualifier(variant.union);
97
+ return `${ns}${variant.name}: ${getTypeName(variant.type)}`;
106
98
  }
107
99
  function getEnumMemberSignature(member) {
108
- const ns = getQualifier(member.enum);
109
- const value = typeof member.value === "string" ? `"${member.value}"` : member.value;
110
- return value === undefined ? `${ns}${member.name}` : `${ns}${member.name}: ${value}`;
100
+ const ns = getQualifier(member.enum);
101
+ const value = typeof member.value === "string" ? `"${member.value}"` : member.value;
102
+ return value === undefined ? `${ns}${member.name}` : `${ns}${member.name}: ${value}`;
111
103
  }
112
104
  export function getQualifier(parent) {
113
- if (!parent?.name || typeof parent.name !== "string") {
114
- return "";
115
- }
116
- const parentName = getTypeName(parent);
117
- if (!parentName || parentName === "TypeSpec") {
118
- return "";
119
- }
120
- return parentName + ".";
121
- }
122
- //# sourceMappingURL=type-signature.js.map
105
+ if (!parent?.name || typeof parent.name !== "string") {
106
+ return "";
107
+ }
108
+ const parentName = getTypeName(parent);
109
+ if (!parentName || parentName === "TypeSpec") {
110
+ return "";
111
+ }
112
+ return parentName + ".";
113
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typespec/tspd",
3
- "version": "0.70.0-dev.1",
3
+ "version": "0.70.0-dev.3",
4
4
  "author": "Microsoft Corporation",
5
5
  "description": "TypeSpec library for generating TypeSpec docs",
6
6
  "homepage": "https://typespec.io",
@@ -44,6 +44,8 @@
44
44
  "!dist/test/**"
45
45
  ],
46
46
  "dependencies": {
47
+ "@alloy-js/core": "^0.15.0",
48
+ "@alloy-js/typescript": "^0.15.0",
47
49
  "@typespec/compiler": "^1.0.0-rc.1",
48
50
  "picocolors": "~1.1.1",
49
51
  "prettier": "~3.5.3",
@@ -53,23 +55,25 @@
53
55
  "typedoc-plugin-markdown": "^4.5.2"
54
56
  },
55
57
  "devDependencies": {
58
+ "@alloy-js/cli": "^0.15.0",
59
+ "@alloy-js/rollup-plugin": "^0.1.0",
56
60
  "@types/node": "~22.13.11",
57
61
  "@types/yargs": "~17.0.33",
58
62
  "@typespec/compiler": "^1.0.0-rc.1",
59
63
  "@typespec/prettier-plugin-typespec": "^1.0.0-rc.1",
60
- "@vitest/coverage-v8": "^3.0.9",
61
- "@vitest/ui": "^3.0.9",
64
+ "@vitest/coverage-v8": "^3.1.2",
65
+ "@vitest/ui": "^3.1.2",
62
66
  "c8": "^10.1.3",
63
67
  "rimraf": "~6.0.1",
64
68
  "source-map-support": "~0.5.21",
65
69
  "typescript": "~5.8.2",
66
- "vitest": "^3.0.9"
70
+ "vitest": "^3.1.2"
67
71
  },
68
72
  "peerDependencies": {},
69
73
  "scripts": {
70
74
  "clean": "rimraf ./dist ./temp",
71
- "build": "tsc -p .",
72
- "watch": "tsc -p . --watch",
75
+ "build": "alloy build",
76
+ "watch": "alloy build --watch",
73
77
  "test": "vitest run",
74
78
  "test:watch": "vitest --watch",
75
79
  "test:ui": "vitest --ui",
@@ -1,5 +0,0 @@
1
- import { Program } from "@typespec/compiler";
2
- import { DecoratorSignature } from "./types.js";
3
- export declare function generateSignatureTests(namespaceName: string, importName: string, decoratorSignatureImport: string, decorators: DecoratorSignature[]): string;
4
- export declare function generateSignatures(program: Program, decorators: DecoratorSignature[], namespaceName: string): string;
5
- //# sourceMappingURL=decorators-signatures.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decorators-signatures.d.ts","sourceRoot":"","sources":["../../../src/gen-extern-signatures/decorators-signatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,OAAO,EAMR,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGhD,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,wBAAwB,EAAE,MAAM,EAChC,UAAU,EAAE,kBAAkB,EAAE,GAC/B,MAAM,CAsBR;AAKD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,kBAAkB,EAAE,EAChC,aAAa,EAAE,MAAM,GACpB,MAAM,CAmQR"}