@veryfront/ext-content-mdx 0.1.1186 → 0.1.1189

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 (163) hide show
  1. package/esm/_dnt.polyfills.d.ts +6 -6
  2. package/esm/_dnt.polyfills.d.ts.map +1 -1
  3. package/esm/deno.d.ts +18 -0
  4. package/esm/deno.js +30 -9
  5. package/esm/src/config/defaults.d.ts +31 -24
  6. package/esm/src/config/defaults.d.ts.map +1 -1
  7. package/esm/src/config/defaults.js +25 -18
  8. package/esm/src/errors/diagnostic-policy.d.ts +35 -0
  9. package/esm/src/errors/diagnostic-policy.d.ts.map +1 -0
  10. package/esm/src/errors/diagnostic-policy.js +100 -0
  11. package/esm/src/errors/error-registry/boundary.d.ts +2 -0
  12. package/esm/src/errors/error-registry/boundary.d.ts.map +1 -1
  13. package/esm/src/errors/error-registry/boundary.js +8 -0
  14. package/esm/src/errors/error-registry/config.d.ts.map +1 -1
  15. package/esm/src/errors/error-registry/config.js +3 -3
  16. package/esm/src/errors/error-registry/deploy.js +1 -1
  17. package/esm/src/errors/error-registry/server.d.ts +2 -0
  18. package/esm/src/errors/error-registry/server.d.ts.map +1 -1
  19. package/esm/src/errors/error-registry/server.js +8 -0
  20. package/esm/src/errors/error-registry-helpers.d.ts +11 -2
  21. package/esm/src/errors/error-registry-helpers.d.ts.map +1 -1
  22. package/esm/src/errors/error-registry-helpers.js +70 -1
  23. package/esm/src/errors/error-registry.d.ts +85 -73
  24. package/esm/src/errors/error-registry.d.ts.map +1 -1
  25. package/esm/src/errors/error-registry.js +2 -14
  26. package/esm/src/errors/types.d.ts +44 -5
  27. package/esm/src/errors/types.d.ts.map +1 -1
  28. package/esm/src/errors/types.js +148 -24
  29. package/esm/src/errors/veryfront-error.d.ts +25 -2
  30. package/esm/src/errors/veryfront-error.d.ts.map +1 -1
  31. package/esm/src/errors/veryfront-error.js +638 -28
  32. package/esm/src/observability/limits.d.ts +20 -0
  33. package/esm/src/observability/limits.d.ts.map +1 -0
  34. package/esm/src/observability/limits.js +19 -0
  35. package/esm/src/observability/telemetry-error.d.ts +22 -0
  36. package/esm/src/observability/telemetry-error.d.ts.map +1 -0
  37. package/esm/src/observability/telemetry-error.js +377 -0
  38. package/esm/src/observability/tracing/api-shim.d.ts +39 -0
  39. package/esm/src/observability/tracing/api-shim.d.ts.map +1 -1
  40. package/esm/src/observability/tracing/api-shim.js +196 -69
  41. package/esm/src/observability/tracing/context-callback.d.ts +14 -0
  42. package/esm/src/observability/tracing/context-callback.d.ts.map +1 -0
  43. package/esm/src/observability/tracing/context-callback.js +111 -0
  44. package/esm/src/observability/tracing/otlp-setup.d.ts.map +1 -1
  45. package/esm/src/observability/tracing/otlp-setup.js +190 -46
  46. package/esm/src/platform/adapters/base.d.ts +51 -7
  47. package/esm/src/platform/adapters/base.d.ts.map +1 -1
  48. package/esm/src/platform/adapters/base.js +4 -2
  49. package/esm/src/platform/adapters/bounded-file-read.d.ts +9 -0
  50. package/esm/src/platform/adapters/bounded-file-read.d.ts.map +1 -1
  51. package/esm/src/platform/adapters/bounded-file-read.js +11 -5
  52. package/esm/src/platform/adapters/file-snapshot-error.d.ts +2 -0
  53. package/esm/src/platform/adapters/file-snapshot-error.d.ts.map +1 -1
  54. package/esm/src/platform/adapters/file-snapshot-error.js +2 -0
  55. package/esm/src/platform/adapters/file-system-capabilities.d.ts +74 -0
  56. package/esm/src/platform/adapters/file-system-capabilities.d.ts.map +1 -0
  57. package/esm/src/platform/adapters/file-system-capabilities.js +508 -0
  58. package/esm/src/platform/adapters/native-file-system-provenance.d.ts +6 -0
  59. package/esm/src/platform/adapters/native-file-system-provenance.d.ts.map +1 -0
  60. package/esm/src/platform/adapters/native-file-system-provenance.js +15 -0
  61. package/esm/src/platform/adapters/runtime/deno/filesystem-adapter.d.ts +45 -0
  62. package/esm/src/platform/adapters/runtime/deno/filesystem-adapter.d.ts.map +1 -0
  63. package/esm/src/platform/adapters/runtime/deno/filesystem-adapter.js +291 -0
  64. package/esm/src/platform/adapters/runtime/shared/node-filesystem-adapter.d.ts +71 -0
  65. package/esm/src/platform/adapters/runtime/shared/node-filesystem-adapter.d.ts.map +1 -0
  66. package/esm/src/platform/adapters/runtime/shared/node-filesystem-adapter.js +471 -0
  67. package/esm/src/platform/adapters/runtime/shared/shared-watcher.d.ts +16 -0
  68. package/esm/src/platform/adapters/runtime/shared/shared-watcher.d.ts.map +1 -0
  69. package/esm/src/platform/adapters/runtime/shared/shared-watcher.js +140 -0
  70. package/esm/src/platform/adapters/runtime/shared/temp-dir.d.ts +2 -0
  71. package/esm/src/platform/adapters/runtime/shared/temp-dir.d.ts.map +1 -0
  72. package/esm/src/platform/adapters/runtime/shared/temp-dir.js +10 -0
  73. package/esm/src/platform/adapters/runtime/shared/watcher-queue.d.ts +5 -0
  74. package/esm/src/platform/adapters/runtime/shared/watcher-queue.d.ts.map +1 -0
  75. package/esm/src/platform/adapters/runtime/shared/watcher-queue.js +75 -0
  76. package/esm/src/platform/compat/abort-signal.d.ts +20 -0
  77. package/esm/src/platform/compat/abort-signal.d.ts.map +1 -0
  78. package/esm/src/platform/compat/abort-signal.js +64 -0
  79. package/esm/src/platform/compat/constants.d.ts +2 -2
  80. package/esm/src/platform/compat/constants.d.ts.map +1 -1
  81. package/esm/src/platform/compat/constants.js +2 -2
  82. package/esm/src/platform/compat/error-introspection.d.ts +37 -0
  83. package/esm/src/platform/compat/error-introspection.d.ts.map +1 -0
  84. package/esm/src/platform/compat/error-introspection.js +258 -0
  85. package/esm/src/platform/compat/fs.d.ts +29 -8
  86. package/esm/src/platform/compat/fs.d.ts.map +1 -1
  87. package/esm/src/platform/compat/fs.js +123 -57
  88. package/esm/src/platform/compat/native-brand-checks.d.ts +14 -0
  89. package/esm/src/platform/compat/native-brand-checks.d.ts.map +1 -0
  90. package/esm/src/platform/compat/native-brand-checks.js +68 -0
  91. package/esm/src/platform/compat/not-found-error.d.ts +8 -3
  92. package/esm/src/platform/compat/not-found-error.d.ts.map +1 -1
  93. package/esm/src/platform/compat/not-found-error.js +164 -31
  94. package/esm/src/platform/compat/path/security.d.ts.map +1 -1
  95. package/esm/src/platform/compat/path/security.js +3 -5
  96. package/esm/src/platform/compat/process/command.d.ts +24 -1
  97. package/esm/src/platform/compat/process/command.d.ts.map +1 -1
  98. package/esm/src/platform/compat/process/command.js +393 -78
  99. package/esm/src/platform/compat/process/env.d.ts +11 -0
  100. package/esm/src/platform/compat/process/env.d.ts.map +1 -1
  101. package/esm/src/platform/compat/process/env.js +28 -38
  102. package/esm/src/platform/compat/process/global-error.d.ts +19 -0
  103. package/esm/src/platform/compat/process/global-error.d.ts.map +1 -0
  104. package/esm/src/platform/compat/process/global-error.js +57 -0
  105. package/esm/src/platform/compat/process/lifecycle.d.ts +10 -3
  106. package/esm/src/platform/compat/process/lifecycle.d.ts.map +1 -1
  107. package/esm/src/platform/compat/process/lifecycle.js +74 -23
  108. package/esm/src/platform/compat/process/project-env-contract.d.ts +19 -0
  109. package/esm/src/platform/compat/process/project-env-contract.d.ts.map +1 -0
  110. package/esm/src/platform/compat/process/project-env-contract.js +19 -0
  111. package/esm/src/platform/compat/runtime.d.ts +14 -5
  112. package/esm/src/platform/compat/runtime.d.ts.map +1 -1
  113. package/esm/src/platform/compat/runtime.js +34 -9
  114. package/esm/src/platform/compat/std/front-matter-yaml.d.ts +12 -0
  115. package/esm/src/platform/compat/std/front-matter-yaml.d.ts.map +1 -1
  116. package/esm/src/platform/compat/std/front-matter-yaml.js +35 -3
  117. package/esm/src/platform/compat/temp-directory-prefix.d.ts +8 -0
  118. package/esm/src/platform/compat/temp-directory-prefix.d.ts.map +1 -0
  119. package/esm/src/platform/compat/temp-directory-prefix.js +15 -0
  120. package/esm/src/utils/abort.d.ts +10 -0
  121. package/esm/src/utils/abort.d.ts.map +1 -0
  122. package/esm/src/utils/abort.js +35 -0
  123. package/esm/src/utils/constants/build.d.ts +3 -0
  124. package/esm/src/utils/constants/build.d.ts.map +1 -1
  125. package/esm/src/utils/constants/build.js +5 -1
  126. package/esm/src/utils/constants/cache.d.ts +21 -0
  127. package/esm/src/utils/constants/cache.d.ts.map +1 -1
  128. package/esm/src/utils/constants/cache.js +101 -39
  129. package/esm/src/utils/constants/css.d.ts +20 -0
  130. package/esm/src/utils/constants/css.d.ts.map +1 -0
  131. package/esm/src/utils/constants/css.js +19 -0
  132. package/esm/src/utils/constants/limits.d.ts +4 -0
  133. package/esm/src/utils/constants/limits.d.ts.map +1 -1
  134. package/esm/src/utils/constants/limits.js +4 -0
  135. package/esm/src/utils/constants/project-identity.d.ts +5 -0
  136. package/esm/src/utils/constants/project-identity.d.ts.map +1 -0
  137. package/esm/src/utils/constants/project-identity.js +4 -0
  138. package/esm/src/utils/constants/retry.d.ts +18 -0
  139. package/esm/src/utils/constants/retry.d.ts.map +1 -1
  140. package/esm/src/utils/constants/retry.js +18 -0
  141. package/esm/src/utils/constants/security.d.ts +4 -0
  142. package/esm/src/utils/constants/security.d.ts.map +1 -1
  143. package/esm/src/utils/constants/security.js +4 -0
  144. package/esm/src/utils/index.d.ts +3 -1
  145. package/esm/src/utils/index.d.ts.map +1 -1
  146. package/esm/src/utils/index.js +3 -1
  147. package/esm/src/utils/logger/core.d.ts +5 -0
  148. package/esm/src/utils/logger/core.d.ts.map +1 -1
  149. package/esm/src/utils/logger/core.js +67 -2
  150. package/esm/src/utils/logger/redact.d.ts +36 -13
  151. package/esm/src/utils/logger/redact.d.ts.map +1 -1
  152. package/esm/src/utils/logger/redact.js +573 -83
  153. package/esm/src/utils/parallel.d.ts.map +1 -1
  154. package/esm/src/utils/parallel.js +11 -1
  155. package/esm/src/utils/project-identity.d.ts +11 -0
  156. package/esm/src/utils/project-identity.d.ts.map +1 -0
  157. package/esm/src/utils/project-identity.js +69 -0
  158. package/esm/src/utils/version-constant.d.ts +1 -1
  159. package/esm/src/utils/version-constant.js +1 -1
  160. package/package.json +3 -3
  161. package/esm/src/platform/adapters/runtime/shared/native-file-capabilities.d.ts +0 -33
  162. package/esm/src/platform/adapters/runtime/shared/native-file-capabilities.d.ts.map +0 -1
  163. package/esm/src/platform/adapters/runtime/shared/native-file-capabilities.js +0 -205
@@ -36,6 +36,71 @@ export const LEVEL_COLORS = {
36
36
  // ============================================================================
37
37
  // Pure Formatting Functions (no dependencies)
38
38
  // ============================================================================
39
+ function consumeControlSequence(value, start, kind) {
40
+ if (kind === "csi") {
41
+ for (let index = start; index < value.length; index++) {
42
+ const code = value.charCodeAt(index);
43
+ if (code >= 0x40 && code <= 0x7e)
44
+ return index + 1;
45
+ }
46
+ return value.length;
47
+ }
48
+ for (let index = start; index < value.length; index++) {
49
+ const code = value.charCodeAt(index);
50
+ if (code === 0x07 || code === 0x9c)
51
+ return index + 1;
52
+ if (code === 0x1b && value.charCodeAt(index + 1) === 0x5c)
53
+ return index + 2;
54
+ }
55
+ return value.length;
56
+ }
57
+ /**
58
+ * Neutralize terminal control sequences and line-breaking control characters
59
+ * in untrusted log text before framework-owned ANSI styling is applied.
60
+ */
61
+ export function sanitizeLogText(value) {
62
+ let sanitized = "";
63
+ for (let index = 0; index < value.length;) {
64
+ const code = value.charCodeAt(index);
65
+ if (code === 0x1b) {
66
+ const next = value.charCodeAt(index + 1);
67
+ if (next === 0x5b) {
68
+ index = consumeControlSequence(value, index + 2, "csi");
69
+ }
70
+ else if (next === 0x5d) {
71
+ index = consumeControlSequence(value, index + 2, "osc");
72
+ }
73
+ else {
74
+ index += Number.isNaN(next) ? 1 : 2;
75
+ }
76
+ continue;
77
+ }
78
+ if (code === 0x9b) {
79
+ index = consumeControlSequence(value, index + 1, "csi");
80
+ continue;
81
+ }
82
+ if (code === 0x9d) {
83
+ index = consumeControlSequence(value, index + 1, "osc");
84
+ continue;
85
+ }
86
+ if ((code >= 0x09 && code <= 0x0d) ||
87
+ code === 0x85 ||
88
+ code === 0x2028 ||
89
+ code === 0x2029) {
90
+ if (!sanitized.endsWith(" "))
91
+ sanitized += " ";
92
+ index++;
93
+ continue;
94
+ }
95
+ if (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) {
96
+ index++;
97
+ continue;
98
+ }
99
+ sanitized += value[index];
100
+ index++;
101
+ }
102
+ return sanitized;
103
+ }
39
104
  /**
40
105
  * Pad or truncate a tag to fixed width for aligned output.
41
106
  */
@@ -63,7 +128,7 @@ export function colorize(text, color, enable) {
63
128
  * Normalize whitespace in text (collapse multiple spaces to single space).
64
129
  */
65
130
  export function normalizeText(value) {
66
- return value.replace(/\s+/g, " ");
131
+ return sanitizeLogText(value).replace(/\s+/g, " ");
67
132
  }
68
133
  /**
69
134
  * Truncate text to maxLength, adding ellipsis if truncated.
@@ -127,7 +192,7 @@ export function serializeError(error) {
127
192
  export function formatContextText(context, error, enableColor) {
128
193
  const entries = Object.entries(context)
129
194
  .filter(([_, value]) => value !== undefined)
130
- .map(([key, value]) => `${key}=${formatValue(value)}`);
195
+ .map(([key, value]) => `${normalizeText(key)}=${formatValue(value)}`);
131
196
  if (error)
132
197
  entries.push(`err=${formatErrorText(error)}`);
133
198
  if (entries.length === 0)
@@ -9,15 +9,24 @@
9
9
  * credential before serialization, so an accidental
10
10
  * `logger.info("...", { authorization: token })` cannot leak the secret.
11
11
  *
12
- * Scope is intentionally key-based: we do not attempt to find secrets embedded
13
- * in free-form message strings (too lossy). The deny-list errs toward
14
- * over-redaction — masking a benign `tokenCount` is acceptable; leaking a real
15
- * token is not. The traversal fails *closed*: on a cycle, depth overflow, or a
16
- * throwing getter it returns {@link REDACTED} rather than risk emitting an
17
- * unredacted object.
12
+ * Sensitive keys are masked and every string value is scrubbed for credentials
13
+ * embedded in URL userinfo, query parameters, or fragment parameters. The
14
+ * deny-list errs toward over-redaction — masking a benign `tokenCount` is
15
+ * acceptable; leaking a real token is not. The traversal fails *closed*: on a
16
+ * cycle, depth overflow, or a throwing getter it returns {@link REDACTED}
17
+ * rather than risk emitting an unredacted object.
18
18
  */
19
19
  /** Replacement value substituted for any sensitive field. */
20
20
  export declare const REDACTED = "[REDACTED]";
21
+ /**
22
+ * Replace every non-overlapping occurrence of a trusted path in untrusted text.
23
+ *
24
+ * Comparison treats slash and backslash as equivalent. Windows drive and UNC
25
+ * paths additionally use ASCII-only case folding, matching Windows path
26
+ * identity without locale-sensitive conversion. The linear-time matcher keeps
27
+ * the path literal: regex syntax in either input cannot change what matches.
28
+ */
29
+ export declare function redactPathFromText(input: string, path: string, replacement: string): string;
21
30
  /**
22
31
  * Whether a context key names a credential and should have its value masked.
23
32
  *
@@ -27,14 +36,27 @@ export declare const REDACTED = "[REDACTED]";
27
36
  * normalizes to `author`, which contains none of the patterns.
28
37
  */
29
38
  export declare function isSensitiveKey(key: string): boolean;
39
+ export type RedactedValue = string | number | boolean | null | RedactedValue[] | {
40
+ [key: string]: RedactedValue;
41
+ };
30
42
  /**
31
- * Returns a redacted deep copy of `context`. Any property whose key is
32
- * {@link isSensitiveKey} has its value replaced with {@link REDACTED}; nested
33
- * plain objects, class instances, and arrays are traversed. The input is never
34
- * mutated, and the pass fails closed (returns {@link REDACTED}) on cycles,
35
- * depth overflow, or a throwing getter.
43
+ * Returns a redacted copy of `context` while preserving the established source
44
+ * and runtime value shapes. Any property whose key is {@link isSensitiveKey}
45
+ * is replaced with {@link REDACTED}; nested records and arrays are traversed,
46
+ * while primitives and scalar-serializing objects retain their original types.
47
+ * The input is never mutated.
48
+ *
49
+ * Use {@link redactForSerialization} at JSON/logging boundaries where BigInt,
50
+ * functions, symbols, and custom `toJSON` implementations must be normalized.
36
51
  */
37
52
  export declare function redactSensitive<T>(context: T): T;
53
+ /**
54
+ * Returns a JSON-safe redacted snapshot of `context`. Sensitive keys are
55
+ * masked, nested values are traversed, BigInts become decimal strings,
56
+ * non-finite numbers become `null`, and unsupported or unreadable values fail
57
+ * closed. Objects with `toJSON` are snapshotted exactly once before redaction.
58
+ */
59
+ export declare function redactForSerialization(context: unknown): RedactedValue;
38
60
  /**
39
61
  * Strip credentials from URL-shaped strings so they can be safely emitted in
40
62
  * free-form text (error messages, stacks, lifted `request_url` fields). Unlike
@@ -47,7 +69,7 @@ export declare function redactSensitive<T>(context: T): T;
47
69
  * It is intentionally tolerant: it operates on any string (a DSN, a Mongo URI,
48
70
  * an axios error message containing a URL) via regex rather than requiring a
49
71
  * parseable URL, so malformed or partial URLs in error text are still scrubbed.
50
- * Non-URL strings pass through unchanged.
72
+ * Strings without credential-shaped content pass through unchanged.
51
73
  */
52
74
  export declare function sanitizeUrlCredentials(input: string): string;
53
75
  /**
@@ -61,13 +83,14 @@ export declare function sanitizeUrlCredentials(input: string): string;
61
83
  */
62
84
  export declare function sanitizeUrlForSpan(input: string): string;
63
85
  /**
64
- * Apply {@link sanitizeUrlCredentials} to the `message` and `stack` of a
86
+ * Apply {@link sanitizeUrlCredentials} to the `name`, `message`, and `stack` of a
65
87
  * serialized-error-shaped object, returning a new object. Used by the logger's
66
88
  * JSON and text paths so errors carrying DSNs, Mongo URIs, or
67
89
  * `?access_token=`-bearing URLs do not leak credentials (the serialized error
68
90
  * bypasses the key-based redactor). Returns the input unchanged when falsy.
69
91
  */
70
92
  export declare function sanitizeSerializedError<T extends {
93
+ name?: unknown;
71
94
  message?: unknown;
72
95
  stack?: unknown;
73
96
  } | undefined>(error: T): T;
@@ -1 +1 @@
1
- {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../../src/src/utils/logger/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,eAAe,CAAC;AAmDrC;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAcnD;AAoFD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAEhD;AA6BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyB5D;AAqBD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,CAAC,SAAS;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAC5D,KAAK,EAAE,CAAC,GAAG,CAAC,CAMb"}
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../../src/src/utils/logger/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,eAAe,CAAC;AAmErC;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,MAAM,CAiDR;AAoDD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAmBnD;AAED,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,aAAa,EAAE,GACf;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,CAAC;AAsKrC;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAKhD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAKtE;AAiSD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA8F5D;AAqBD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA2BxD;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAC5E,KAAK,EAAE,CAAC,GAAG,CAAC,CAOb"}