@qoretechnologies/reqraft 0.10.38 → 0.10.39-pr.95.g3503e91

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 (102) hide show
  1. package/.claude/CLAUDE.md +12 -0
  2. package/dist/components/codeSize/index.d.ts +37 -0
  3. package/dist/components/codeSize/index.d.ts.map +1 -0
  4. package/dist/components/codeSize/index.js +87 -0
  5. package/dist/components/codeSize/index.js.map +1 -0
  6. package/dist/components/form/engine/CompactRow.d.ts +20 -1
  7. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  8. package/dist/components/form/engine/CompactRow.js +357 -30
  9. package/dist/components/form/engine/CompactRow.js.map +1 -1
  10. package/dist/components/form/engine/FormEngine.d.ts +24 -1
  11. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  12. package/dist/components/form/engine/FormEngine.js +179 -39
  13. package/dist/components/form/engine/FormEngine.js.map +1 -1
  14. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts +37 -0
  15. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -0
  16. package/dist/components/form/engine/_structuredData/SchemaDataView.js +335 -0
  17. package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -0
  18. package/dist/components/form/engine/compactRowStyles.d.ts +13 -0
  19. package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
  20. package/dist/components/form/engine/compactRowStyles.js +30 -5
  21. package/dist/components/form/engine/compactRowStyles.js.map +1 -1
  22. package/dist/components/form/engine/readFirst.d.ts +73 -1
  23. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  24. package/dist/components/form/engine/readFirst.js +175 -5
  25. package/dist/components/form/engine/readFirst.js.map +1 -1
  26. package/dist/components/form/fields/Field.d.ts.map +1 -1
  27. package/dist/components/form/fields/Field.js +1 -1
  28. package/dist/components/form/fields/Field.js.map +1 -1
  29. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +12 -2
  30. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  31. package/dist/components/form/fields/allowed-values/AllowedValues.js +16 -6
  32. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  33. package/dist/components/form/fields/array/ArrayAuto.d.ts.map +1 -1
  34. package/dist/components/form/fields/array/ArrayAuto.js +51 -21
  35. package/dist/components/form/fields/array/ArrayAuto.js.map +1 -1
  36. package/dist/components/form/fields/array/ArrayAutoField.d.ts.map +1 -1
  37. package/dist/components/form/fields/array/ArrayAutoField.js +42 -25
  38. package/dist/components/form/fields/array/ArrayAutoField.js.map +1 -1
  39. package/dist/components/form/fields/auto/AutoFormField.d.ts +4 -0
  40. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  41. package/dist/components/form/fields/auto/AutoFormField.js +29 -4
  42. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  43. package/dist/components/form/fields/long-string/LongString.d.ts +9 -1
  44. package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
  45. package/dist/components/form/fields/long-string/LongString.js +25 -4
  46. package/dist/components/form/fields/long-string/LongString.js.map +1 -1
  47. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  48. package/dist/components/form/fields/template/TemplateField.js +12 -2
  49. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  50. package/dist/helpers/common.d.ts +8 -1
  51. package/dist/helpers/common.d.ts.map +1 -1
  52. package/dist/helpers/common.js +9 -1
  53. package/dist/helpers/common.js.map +1 -1
  54. package/dist/helpers/optionUiTypes.d.ts +30 -0
  55. package/dist/helpers/optionUiTypes.d.ts.map +1 -0
  56. package/dist/helpers/optionUiTypes.js +148 -0
  57. package/dist/helpers/optionUiTypes.js.map +1 -0
  58. package/dist/helpers/options.d.ts +19 -0
  59. package/dist/helpers/options.d.ts.map +1 -1
  60. package/dist/helpers/options.js +25 -1
  61. package/dist/helpers/options.js.map +1 -1
  62. package/dist/helpers/providerValue.d.ts +68 -0
  63. package/dist/helpers/providerValue.d.ts.map +1 -0
  64. package/dist/helpers/providerValue.js +50 -0
  65. package/dist/helpers/providerValue.js.map +1 -0
  66. package/dist/helpers/singleLineString.d.ts +37 -0
  67. package/dist/helpers/singleLineString.d.ts.map +1 -0
  68. package/dist/helpers/singleLineString.js +66 -0
  69. package/dist/helpers/singleLineString.js.map +1 -0
  70. package/dist/helpers/validations.d.ts +85 -2
  71. package/dist/helpers/validations.d.ts.map +1 -1
  72. package/dist/helpers/validations.js +802 -76
  73. package/dist/helpers/validations.js.map +1 -1
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +1 -0
  77. package/dist/index.js.map +1 -1
  78. package/package.json +1 -1
  79. package/src/components/codeSize/index.tsx +79 -0
  80. package/src/components/form/engine/CompactRow.tsx +436 -31
  81. package/src/components/form/engine/FormEngine.stories.tsx +802 -15
  82. package/src/components/form/engine/FormEngine.tsx +180 -13
  83. package/src/components/form/engine/_structuredData/SchemaDataView.stories.tsx +233 -0
  84. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +630 -0
  85. package/src/components/form/engine/compactRowStyles.ts +44 -2
  86. package/src/components/form/engine/readFirst.ts +201 -5
  87. package/src/components/form/fields/Field.tsx +3 -1
  88. package/src/components/form/fields/allowed-values/AllowedValues.tsx +24 -2
  89. package/src/components/form/fields/array/ArrayAuto.tsx +35 -4
  90. package/src/components/form/fields/array/ArrayAutoField.stories.tsx +134 -0
  91. package/src/components/form/fields/array/ArrayAutoField.tsx +22 -4
  92. package/src/components/form/fields/auto/AutoFormField.tsx +30 -1
  93. package/src/components/form/fields/long-string/LongString.tsx +46 -5
  94. package/src/components/form/fields/template/TemplateField.tsx +16 -1
  95. package/src/helpers/common.ts +11 -1
  96. package/src/helpers/optionUiTypes.ts +153 -0
  97. package/src/helpers/options.ts +23 -0
  98. package/src/helpers/providerValue.ts +125 -0
  99. package/src/helpers/singleLineString.ts +61 -0
  100. package/src/helpers/validations.ts +1105 -80
  101. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +23 -2
  102. package/src/index.tsx +1 -0
package/.claude/CLAUDE.md CHANGED
@@ -174,6 +174,18 @@ yarn build:test # Type-check without emit
174
174
  `.github/workflows/beta_release.yml` runs on **every push to `develop`** and publishes to NPM using whatever `version` is in `package.json` at push time. A merge without a bump therefore tries to re-publish an already-published version and **fails** (NPM refuses to re-publish). This applies to **every** PR — features, fixes, chores, and docs-only changes alike. There is no exception.
175
175
 
176
176
  - Bump the **patch** for an ordinary PR while in beta (pre-1.0) — e.g. `0.10.9` → `0.10.10`. Do NOT bump minor/major for ordinary feature/fix PRs.
177
+ - Bump **exactly once per PR**, not once per commit. If the branch has already bumped, leave it alone —
178
+ a second bump does not make the merge any more publishable, it just burns a version that never ships.
179
+ Check before you reach for it: `git diff $(git merge-base origin/develop HEAD) -- package.json`. A PR
180
+ that walked 0.10.36 → 0.10.46 one commit at a time is what this line exists to prevent (#95), and its
181
+ prereleases are stamped from `package.json`, so a base that moves every push hands consumers what look
182
+ like ten different release lines instead of successive previews of one.
183
+ - Bump **exactly once per PR**, not once per commit. If the branch has already bumped, leave it alone —
184
+ a second bump does not make the merge any more publishable, it just burns a version that never ships.
185
+ Check before you reach for it: `git diff $(git merge-base origin/develop HEAD) -- package.json`. A PR
186
+ that walked 0.10.36 → 0.10.46 one commit at a time is what this line exists to prevent (#95), and its
187
+ prereleases are stamped from `package.json`, so a base that moves every push hands consumers what look
188
+ like ten different release lines instead of successive previews of one.
177
189
  - Bump in `package.json` only (no git tag): `npm version patch --no-git-tag-version`, and include the bump in the PR's commit.
178
190
  - If another PR bumps to the same version before yours merges, rebase and bump again — the version at merge time must be strictly greater than the last published one.
179
191
 
@@ -0,0 +1,37 @@
1
+ /// <reference types="react" />
2
+ import { IReqoreTagProps } from '@qoretechnologies/reqore/dist/components/Tag';
3
+ export interface IReqraftCodeSize {
4
+ /** Number of lines, counting a trailing newline's empty last line. */
5
+ lines: number;
6
+ /** Number of characters (UTF-16 code units, as `String.length` reports). */
7
+ chars: number;
8
+ }
9
+ /**
10
+ * Measure a block of code. Split out from the tag so the numbers can be
11
+ * asserted without rendering, and reused by callers that want to phrase the
12
+ * size themselves.
13
+ *
14
+ * An empty string is one line of zero characters, which is what an editor
15
+ * showing it displays — not zero lines.
16
+ */
17
+ export declare function describeCodeSize(code: string): IReqraftCodeSize;
18
+ /** `4 lines` / `1 line` — the label half of the chip. */
19
+ export declare function formatCodeLines(lines: number): string;
20
+ /** `92 chars` / `1 char` — the key half of the chip. */
21
+ export declare function formatCodeChars(chars: number): string;
22
+ /**
23
+ * The chip as plain `ReqoreTag` props. Needed wherever a host takes tag
24
+ * *props* rather than an element — a `ReqorePanel` `badge`, a button badge —
25
+ * which is most of Reqore's badge surface.
26
+ */
27
+ export declare function codeSizeTagProps(code: string): IReqoreTagProps;
28
+ export interface IReqraftCodeSizeTagProps extends Omit<IReqoreTagProps, 'label' | 'labelKey'> {
29
+ /** The code being summarised. */
30
+ code: string;
31
+ }
32
+ /**
33
+ * `N chars | N lines` chip summarising a block of source. Every prop of
34
+ * `ReqoreTag` passes through except the two labels, which are the point.
35
+ */
36
+ export declare const ReqraftCodeSizeTag: import("react").MemoExoticComponent<({ code, ...rest }: IReqraftCodeSizeTagProps) => import("react/jsx-runtime").JSX.Element>;
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/codeSize/index.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAG/E,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAE/D;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAW9D;AAED,MAAM,WAAW,wBACf,SAAQ,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,UAAU,CAAC;IACnD,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,0DACT,wBAAwB,6CAK7C,CAAC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
+ t[p[i]] = s[p[i]];
21
+ }
22
+ return t;
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.ReqraftCodeSizeTag = exports.codeSizeTagProps = exports.formatCodeChars = exports.formatCodeLines = exports.describeCodeSize = void 0;
26
+ var jsx_runtime_1 = require("react/jsx-runtime");
27
+ // Copyright 2026 Qore Technologies, s.r.o.
28
+ // How much code is there? — the one answer, rendered one way.
29
+ //
30
+ // A read-only view of source has to say something about the code it is not
31
+ // showing in full: how many lines, how much text. The compact form engine
32
+ // grew that chip first (a `code-editor` value's read summary); detail pages
33
+ // outside the form engine want the identical affordance. It lives here so
34
+ // there is one renderer rather than one per caller, each drifting in
35
+ // pluralisation, icon and intent.
36
+ var reqore_1 = require("@qoretechnologies/reqore");
37
+ var react_1 = require("react");
38
+ /**
39
+ * Measure a block of code. Split out from the tag so the numbers can be
40
+ * asserted without rendering, and reused by callers that want to phrase the
41
+ * size themselves.
42
+ *
43
+ * An empty string is one line of zero characters, which is what an editor
44
+ * showing it displays — not zero lines.
45
+ */
46
+ function describeCodeSize(code) {
47
+ return { lines: code.split('\n').length, chars: code.length };
48
+ }
49
+ exports.describeCodeSize = describeCodeSize;
50
+ /** `4 lines` / `1 line` — the label half of the chip. */
51
+ function formatCodeLines(lines) {
52
+ return "".concat(lines, " ").concat(lines === 1 ? 'line' : 'lines');
53
+ }
54
+ exports.formatCodeLines = formatCodeLines;
55
+ /** `92 chars` / `1 char` — the key half of the chip. */
56
+ function formatCodeChars(chars) {
57
+ return "".concat(chars, " ").concat(chars === 1 ? 'char' : 'chars');
58
+ }
59
+ exports.formatCodeChars = formatCodeChars;
60
+ /**
61
+ * The chip as plain `ReqoreTag` props. Needed wherever a host takes tag
62
+ * *props* rather than an element — a `ReqorePanel` `badge`, a button badge —
63
+ * which is most of Reqore's badge surface.
64
+ */
65
+ function codeSizeTagProps(code) {
66
+ var _a = describeCodeSize(code), lines = _a.lines, chars = _a.chars;
67
+ return {
68
+ size: 'small',
69
+ minimal: true,
70
+ intent: 'info',
71
+ icon: 'CodeLine',
72
+ label: formatCodeLines(lines),
73
+ labelKey: formatCodeChars(chars),
74
+ };
75
+ }
76
+ exports.codeSizeTagProps = codeSizeTagProps;
77
+ /**
78
+ * `N chars | N lines` chip summarising a block of source. Every prop of
79
+ * `ReqoreTag` passes through except the two labels, which are the point.
80
+ */
81
+ exports.ReqraftCodeSizeTag = (0, react_1.memo)(function (_a) {
82
+ var code = _a.code, rest = __rest(_a, ["code"]);
83
+ var _b = codeSizeTagProps(code), label = _b.label, labelKey = _b.labelKey, defaults = __rest(_b, ["label", "labelKey"]);
84
+ return (0, jsx_runtime_1.jsx)(reqore_1.ReqoreTag, __assign({}, defaults, rest, { label: label, labelKey: labelKey }));
85
+ });
86
+ exports.ReqraftCodeSizeTag.displayName = 'ReqraftCodeSizeTag';
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/codeSize/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA2C;AAC3C,8DAA8D;AAC9D,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,4EAA4E;AAC5E,0EAA0E;AAC1E,qEAAqE;AACrE,kCAAkC;AAElC,mDAAqD;AAErD,+BAA6B;AAS7B;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAChE,CAAC;AAFD,4CAEC;AAED,yDAAyD;AACzD,SAAgB,eAAe,CAAC,KAAa;IAC3C,OAAO,UAAG,KAAK,cAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAE,CAAC;AACtD,CAAC;AAFD,0CAEC;AAED,wDAAwD;AACxD,SAAgB,eAAe,CAAC,KAAa;IAC3C,OAAO,UAAG,KAAK,cAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAE,CAAC;AACtD,CAAC;AAFD,0CAEC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,IAAY;IACrC,IAAA,KAAmB,gBAAgB,CAAC,IAAI,CAAC,EAAvC,KAAK,WAAA,EAAE,KAAK,WAA2B,CAAC;IAEhD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC;QAC7B,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC;KACjC,CAAC;AACJ,CAAC;AAXD,4CAWC;AAQD;;;GAGG;AACU,QAAA,kBAAkB,GAAG,IAAA,YAAI,EACpC,UAAC,EAA2C;IAAzC,IAAA,IAAI,UAAA,EAAK,IAAI,cAAf,QAAiB,CAAF;IACd,IAAM,KAAmC,gBAAgB,CAAC,IAAI,CAAC,EAAvD,KAAK,WAAA,EAAE,QAAQ,cAAA,EAAK,QAAQ,cAA9B,qBAAgC,CAAyB,CAAC;IAEhE,OAAO,uBAAC,kBAAS,eAAK,QAAQ,EAAM,IAAI,IAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;AACjF,CAAC,CACF,CAAC;AACF,0BAAkB,CAAC,WAAW,GAAG,oBAAoB,CAAC"}
@@ -1,9 +1,28 @@
1
1
  import { IQorusFormField } from '@qoretechnologies/ts-toolkit';
2
2
  import React from 'react';
3
- export declare const CompactRow: React.MemoExoticComponent<({ optionName, optionField, hidden, clustered, clusterFirst, clusterLast, }: {
3
+ /**
4
+ * The text inside a rich-text envelope, when a list item is one.
5
+ *
6
+ * An option like Gmail's `to` is `type: "list"`, `element_type: "string"`,
7
+ * `supports_templates: true`: each element is a plain string that may carry
8
+ * template tags, so its editor is a rich-text one and the element value arrives
9
+ * wrapped as `{type: "richtext", value: [{type: "paragraph", …}]}`.
10
+ *
11
+ * That envelope is a string in a coat, not structured data. The hash-list test
12
+ * unwraps `item.value`, found the Slate document — an object — and classed a
13
+ * list of email addresses as a list of hashes, so the row drew an expandable
14
+ * `type / children / text` tree instead of the address the operator typed.
15
+ */
16
+ export declare const richtextItemText: (item: unknown) => string | undefined;
17
+ export declare const CompactRow: React.MemoExoticComponent<({ optionName, optionField, hidden, clustered, clusterFirst, clusterLast, absorbedFields, }: {
4
18
  optionName: string;
5
19
  optionField: IQorusFormField;
6
20
  hidden?: boolean;
21
+ /** Siblings this row renders inside its own container instead of leaving
22
+ * them a row each — declared by the schema's `absorb_fields`. The pair it
23
+ * exists for is a code editor and its language: one decision, so one
24
+ * element. */
25
+ absorbedFields?: string[];
7
26
  clustered?: boolean;
8
27
  clusterFirst?: boolean;
9
28
  clusterLast?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"CompactRow.d.ts","sourceRoot":"","sources":["../../../../src/components/form/engine/CompactRow.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,eAAe,EAAqC,MAAM,8BAA8B,CAAC;AAGlG,OAAO,KAAe,MAAM,OAAO,CAAC;AAkHpC,eAAO,MAAM,UAAU,yGAQlB;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,eAAe,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IAIjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,6CA4gDF,CAAC"}
1
+ {"version":3,"file":"CompactRow.d.ts","sourceRoot":"","sources":["../../../../src/components/form/engine/CompactRow.tsx"],"names":[],"mappings":"AAcA,OAAO,EACL,eAAe,EAIhB,MAAM,8BAA8B,CAAC;AAItC,OAAO,KAAe,MAAM,OAAO,CAAC;AAsHpC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB,SAAU,OAAO,KAAG,MAAM,GAAG,SAK7C,CAAC;AAEd,eAAO,MAAM,UAAU,yHASlB;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,eAAe,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;mBAGe;IACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAI1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,6CA63DF,CAAC"}